fix(core): Converts BB packets (#406)

- [X] Organizes and splits up bulletin boards
- [X] Converts packets
This commit is contained in:
Kamron Batman 2021-01-13 22:28:31 -08:00 • committed by GitHub
parent bae568d856
commit c58aad733d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
32 changed files with 952 additions and 737 deletions

View file

@ -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)
{
}
}
}

View 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;
}
}