fix(core): Converts BB packets (#406)
- [X] Organizes and splits up bulletin boards - [X] Converts packets
This commit is contained in:
parent
bae568d856
commit
c58aad733d
32 changed files with 952 additions and 737 deletions
|
|
@ -0,0 +1,68 @@
|
|||
using System;
|
||||
using Server;
|
||||
using Server.Items;
|
||||
using Server.Network;
|
||||
using Server.Tests;
|
||||
using Server.Tests.Network;
|
||||
using Xunit;
|
||||
|
||||
namespace UOContent.Tests
|
||||
{
|
||||
public class BulletinBoardPacketTests : IClassFixture<ServerFixture>
|
||||
{
|
||||
[Theory]
|
||||
[InlineData("Test Name")]
|
||||
[InlineData(null)]
|
||||
[InlineData("🅵🅰🅽🅲🆈 🆃🅴🆇🆃")]
|
||||
public void TestSendBBDisplayBoard(string boardName)
|
||||
{
|
||||
var bb = new TestBulletinBoard(0x234) { BoardName = boardName };
|
||||
|
||||
var expected = new BBDisplayBoard(bb).Compile();
|
||||
|
||||
using var ns = PacketTestUtilities.CreateTestNetState();
|
||||
ns.SendBBDisplayBoard(bb);
|
||||
|
||||
var result = ns.SendPipe.Reader.TryRead();
|
||||
AssertThat.Equal(result.Buffer[0].AsSpan(0), expected);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("The Subject", false, "First Line", "Second Line", "Third Line")]
|
||||
[InlineData("", false, "")]
|
||||
[InlineData("🅵🅰🅽🅲🆈 🆃🅴🆇🆃", false, "First Line", "Second Line")]
|
||||
[InlineData("The Subject", true, "First Line", "Second Line", "Third Line")]
|
||||
[InlineData("", true, "")]
|
||||
[InlineData("🅵🅰🅽🅲🆈 🆃🅴🆇🆃", true, "First Line", "Second Line")]
|
||||
public void TestSendBBHeaderMessage(string subject, bool content, params string[] lines)
|
||||
{
|
||||
var poster = new Mobile(0x1024u) { Name = "Kamron" };
|
||||
poster.DefaultMobileInit();
|
||||
|
||||
var bb = new TestBulletinBoard(0x234);
|
||||
bb.PostMessage(poster, null, subject, lines);
|
||||
|
||||
var msg = bb.Items[0] as BulletinMessage;
|
||||
|
||||
var expected = (content ?
|
||||
(Packet)new BBMessageContent(bb, msg) : new BBMessageHeader(bb, msg)).Compile();
|
||||
|
||||
using var ns = PacketTestUtilities.CreateTestNetState();
|
||||
ns.SendBBMessage(bb, msg, content);
|
||||
|
||||
var result = ns.SendPipe.Reader.TryRead();
|
||||
AssertThat.Equal(result.Buffer[0].AsSpan(0), expected);
|
||||
}
|
||||
}
|
||||
|
||||
internal class TestBulletinBoard : BaseBulletinBoard
|
||||
{
|
||||
public TestBulletinBoard(int itemID) : base(itemID)
|
||||
{
|
||||
}
|
||||
|
||||
public TestBulletinBoard(Serial serial) : base(serial)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
149
Projects/UOContent.Tests/Tests/Items/Bulletin Boards/Packets.cs
Normal file
149
Projects/UOContent.Tests/Tests/Items/Bulletin Boards/Packets.cs
Normal file
|
|
@ -0,0 +1,149 @@
|
|||
using Server.Items;
|
||||
using Server.Text;
|
||||
|
||||
namespace Server.Network
|
||||
{
|
||||
public class BBDisplayBoard : Packet
|
||||
{
|
||||
public BBDisplayBoard(BaseBulletinBoard board) : base(0x71)
|
||||
{
|
||||
EnsureCapacity(38);
|
||||
|
||||
var buffer = (board.BoardName ?? "").GetBytesUtf8();
|
||||
|
||||
Stream.Write((byte)0x00); // PacketID
|
||||
Stream.Write(board.Serial); // Bulletin board serial
|
||||
|
||||
// Bulletin board name
|
||||
if (buffer.Length >= 29)
|
||||
{
|
||||
Stream.Write(buffer, 0, 29);
|
||||
Stream.Write((byte)0);
|
||||
}
|
||||
else
|
||||
{
|
||||
Stream.Write(buffer, 0, buffer.Length);
|
||||
Stream.Fill(30 - buffer.Length);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class BBMessageHeader : Packet
|
||||
{
|
||||
public BBMessageHeader(BaseBulletinBoard board, BulletinMessage msg) : base(0x71)
|
||||
{
|
||||
var poster = SafeString(msg.PostedName);
|
||||
var subject = SafeString(msg.Subject);
|
||||
var time = SafeString(msg.GetTimeAsString());
|
||||
|
||||
EnsureCapacity(22 + poster.Length + subject.Length + time.Length);
|
||||
|
||||
Stream.Write((byte)0x01); // PacketID
|
||||
Stream.Write(board.Serial); // Bulletin board serial
|
||||
Stream.Write(msg.Serial); // Message serial
|
||||
|
||||
Stream.Write(msg.Thread?.Serial ?? Serial.Zero); // Thread serial--parent
|
||||
|
||||
WriteString(poster);
|
||||
WriteString(subject);
|
||||
WriteString(time);
|
||||
}
|
||||
|
||||
public void WriteString(string v)
|
||||
{
|
||||
var buffer = v.GetBytesUtf8();
|
||||
var len = buffer.Length + 1;
|
||||
|
||||
if (len > 255)
|
||||
{
|
||||
len = 255;
|
||||
}
|
||||
|
||||
Stream.Write((byte)len);
|
||||
Stream.Write(buffer, 0, len - 1);
|
||||
Stream.Write((byte)0);
|
||||
}
|
||||
|
||||
public string SafeString(string v) => v ?? string.Empty;
|
||||
}
|
||||
|
||||
public class BBMessageContent : Packet
|
||||
{
|
||||
public BBMessageContent(BaseBulletinBoard board, BulletinMessage msg) : base(0x71)
|
||||
{
|
||||
var poster = SafeString(msg.PostedName);
|
||||
var subject = SafeString(msg.Subject);
|
||||
var time = SafeString(msg.GetTimeAsString());
|
||||
|
||||
EnsureCapacity(22 + poster.Length + subject.Length + time.Length);
|
||||
|
||||
Stream.Write((byte)0x02); // PacketID
|
||||
Stream.Write(board.Serial); // Bulletin board serial
|
||||
Stream.Write(msg.Serial); // Message serial
|
||||
|
||||
WriteString(poster);
|
||||
WriteString(subject);
|
||||
WriteString(time);
|
||||
|
||||
Stream.Write((short)msg.PostedBody);
|
||||
Stream.Write((short)msg.PostedHue);
|
||||
|
||||
var len = msg.PostedEquip.Length;
|
||||
|
||||
if (len > 255)
|
||||
{
|
||||
len = 255;
|
||||
}
|
||||
|
||||
Stream.Write((byte)len);
|
||||
|
||||
for (var i = 0; i < len; ++i)
|
||||
{
|
||||
var eq = msg.PostedEquip[i];
|
||||
|
||||
Stream.Write((short)eq.itemID);
|
||||
Stream.Write((short)eq.hue);
|
||||
}
|
||||
|
||||
len = msg.Lines.Length;
|
||||
|
||||
if (len > 255)
|
||||
{
|
||||
len = 255;
|
||||
}
|
||||
|
||||
Stream.Write((byte)len);
|
||||
|
||||
for (var i = 0; i < len; ++i)
|
||||
{
|
||||
WriteString(msg.Lines[i], true);
|
||||
}
|
||||
}
|
||||
|
||||
public void WriteString(string v, bool padding = false)
|
||||
{
|
||||
var buffer = v.GetBytesUtf8();
|
||||
var tail = padding ? 2 : 1;
|
||||
var len = buffer.Length + tail;
|
||||
|
||||
if (len > 255)
|
||||
{
|
||||
len = 255;
|
||||
}
|
||||
|
||||
Stream.Write((byte)len);
|
||||
Stream.Write(buffer, 0, len - tail);
|
||||
|
||||
if (padding)
|
||||
{
|
||||
Stream.Write((short)0); // padding compensates for a client bug
|
||||
}
|
||||
else
|
||||
{
|
||||
Stream.Write((byte)0);
|
||||
}
|
||||
}
|
||||
|
||||
public string SafeString(string v) => v ?? string.Empty;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue