Update Readers/Writers for Buffers & Fixes bugs (#283)

- [X] Renames PacketReader to CircularBufferReader
- [X] Fixes bugs with CircularBufferReader
- [X] Adds CircularBufferWriter
- [X] Adds SpanWriter
- [X] Adds SpanReader

Bumps release version
This commit is contained in:
Kamron Batman 2020-10-24 14:46:59 -07:00 committed by GitHub
parent 3b7f648c27
commit 6bd4f0d265
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
26 changed files with 1302 additions and 351 deletions

View file

@ -283,7 +283,7 @@ namespace Server.Network
public static int ProcessPacket(NetState ns, ArraySegment<byte>[] segments)
{
var reader = new PacketReader(segments);
var reader = new CircularBufferReader(segments);
var packetId = reader.ReadByte();
@ -360,11 +360,11 @@ namespace Server.Network
return packetLength;
}
private static void UnhandledBF(NetState state, PacketReader reader)
private static void UnhandledBF(NetState state, CircularBufferReader reader)
{
}
public static void Empty(NetState state, PacketReader reader)
public static void Empty(NetState state, CircularBufferReader reader)
{
}
@ -383,7 +383,7 @@ namespace Server.Network
EventSink.InvokeQuestGumpRequest(state.Mobile);
}
public static void EncodedCommand(NetState state, PacketReader reader)
public static void EncodedCommand(NetState state, CircularBufferReader reader)
{
var e = World.FindEntity(reader.ReadUInt32());
int packetId = reader.ReadUInt16();
@ -415,7 +415,7 @@ namespace Server.Network
}
}
public static void RenameRequest(NetState state, PacketReader reader)
public static void RenameRequest(NetState state, CircularBufferReader reader)
{
var from = state.Mobile;
var targ = World.FindMobile(reader.ReadUInt32());
@ -426,7 +426,7 @@ namespace Server.Network
}
}
public static void SecureTrade(NetState state, PacketReader reader)
public static void SecureTrade(NetState state, CircularBufferReader reader)
{
switch (reader.ReadByte())
{
@ -498,7 +498,7 @@ namespace Server.Network
}
}
public static void VendorBuyReply(NetState state, PacketReader reader)
public static void VendorBuyReply(NetState state, CircularBufferReader reader)
{
var vendor = World.FindMobile(reader.ReadUInt32());
var flag = reader.ReadByte();
@ -545,7 +545,7 @@ namespace Server.Network
}
}
public static void VendorSellReply(NetState state, PacketReader reader)
public static void VendorSellReply(NetState state, CircularBufferReader reader)
{
Serial serial = reader.ReadUInt32();
var vendor = World.FindMobile(serial);
@ -587,7 +587,7 @@ namespace Server.Network
}
}
public static void DeleteCharacter(NetState state, PacketReader reader)
public static void DeleteCharacter(NetState state, CircularBufferReader reader)
{
reader.Seek(30, SeekOrigin.Current);
var index = reader.ReadInt32();
@ -595,12 +595,12 @@ namespace Server.Network
EventSink.InvokeDeleteRequest(state, index);
}
public static void DeathStatusResponse(NetState state, PacketReader reader)
public static void DeathStatusResponse(NetState state, CircularBufferReader reader)
{
// Ignored
}
public static void ObjectHelpRequest(NetState state, PacketReader reader)
public static void ObjectHelpRequest(NetState state, CircularBufferReader reader)
{
var from = state.Mobile;
@ -629,7 +629,7 @@ namespace Server.Network
}
}
public static void MobileNameRequest(NetState state, PacketReader reader)
public static void MobileNameRequest(NetState state, CircularBufferReader reader)
{
var m = World.FindMobile(reader.ReadUInt32());
@ -639,13 +639,13 @@ namespace Server.Network
}
}
public static void RequestScrollWindow(NetState state, PacketReader reader)
public static void RequestScrollWindow(NetState state, CircularBufferReader reader)
{
int lastTip = reader.ReadInt16();
int type = reader.ReadByte();
}
public static void AttackReq(NetState state, PacketReader reader)
public static void AttackReq(NetState state, CircularBufferReader reader)
{
var from = state.Mobile;
var m = World.FindMobile(reader.ReadUInt32());
@ -656,7 +656,7 @@ namespace Server.Network
}
}
public static void HuePickerResponse(NetState state, PacketReader reader)
public static void HuePickerResponse(NetState state, CircularBufferReader reader)
{
var serial = reader.ReadUInt32();
_ = reader.ReadInt16(); // Item ID
@ -677,7 +677,7 @@ namespace Server.Network
}
}
public static void SystemInfo(NetState state, PacketReader reader)
public static void SystemInfo(NetState state, CircularBufferReader reader)
{
int v1 = reader.ReadByte();
int v2 = reader.ReadUInt16();
@ -693,11 +693,11 @@ namespace Server.Network
var v8 = reader.ReadInt32();
}
public static void AccountID(NetState state, PacketReader reader)
public static void AccountID(NetState state, CircularBufferReader reader)
{
}
public static void TextCommand(NetState state, PacketReader reader)
public static void TextCommand(NetState state, CircularBufferReader reader)
{
int type = reader.ReadByte();
var command = reader.ReadAscii();
@ -790,7 +790,7 @@ namespace Server.Network
}
}
public static void AsciiPromptResponse(NetState state, PacketReader reader)
public static void AsciiPromptResponse(NetState state, CircularBufferReader reader)
{
var serial = reader.ReadUInt32();
var prompt = reader.ReadInt32();
@ -820,7 +820,7 @@ namespace Server.Network
}
}
public static void UnicodePromptResponse(NetState state, PacketReader reader)
public static void UnicodePromptResponse(NetState state, CircularBufferReader reader)
{
var serial = reader.ReadUInt32();
var prompt = reader.ReadInt32();
@ -851,7 +851,7 @@ namespace Server.Network
}
}
public static void MenuResponse(NetState state, PacketReader reader)
public static void MenuResponse(NetState state, CircularBufferReader reader)
{
var serial = reader.ReadUInt32();
int menuID = reader.ReadInt16(); // unused in our implementation
@ -881,7 +881,7 @@ namespace Server.Network
}
}
public static void ProfileReq(NetState state, PacketReader reader)
public static void ProfileReq(NetState state, CircularBufferReader reader)
{
int type = reader.ReadByte();
Serial serial = reader.ReadUInt32();
@ -921,12 +921,12 @@ namespace Server.Network
}
}
public static void Disconnect(NetState state, PacketReader reader)
public static void Disconnect(NetState state, CircularBufferReader reader)
{
var minusOne = reader.ReadInt32();
}
public static void LiftReq(NetState state, PacketReader reader)
public static void LiftReq(NetState state, CircularBufferReader reader)
{
Serial serial = reader.ReadUInt32();
int amount = reader.ReadUInt16();
@ -935,7 +935,7 @@ namespace Server.Network
state.Mobile.Lift(item, amount, out var rejected, out var reject);
}
public static void EquipReq(NetState state, PacketReader reader)
public static void EquipReq(NetState state, CircularBufferReader reader)
{
var from = state.Mobile;
var item = from.Holding;
@ -960,7 +960,7 @@ namespace Server.Network
item.ClearBounce();
}
public static void DropReq(NetState state, PacketReader reader)
public static void DropReq(NetState state, CircularBufferReader reader)
{
reader.ReadInt32(); // serial, ignored
int x = reader.ReadInt16();
@ -997,7 +997,7 @@ namespace Server.Network
}
}
public static void DropReq6017(NetState state, PacketReader reader)
public static void DropReq6017(NetState state, CircularBufferReader reader)
{
reader.ReadInt32(); // serial, ignored
int x = reader.ReadInt16();
@ -1035,28 +1035,28 @@ namespace Server.Network
}
}
public static void ConfigurationFile(NetState state, PacketReader reader)
public static void ConfigurationFile(NetState state, CircularBufferReader reader)
{
}
public static void LogoutReq(NetState state, PacketReader reader)
public static void LogoutReq(NetState state, CircularBufferReader reader)
{
state.Send(new LogoutAck());
}
public static void ChangeSkillLock(NetState state, PacketReader reader)
public static void ChangeSkillLock(NetState state, CircularBufferReader reader)
{
var s = state.Mobile.Skills[reader.ReadInt16()];
s?.SetLockNoRelay((SkillLock)reader.ReadByte());
}
public static void HelpRequest(NetState state, PacketReader reader)
public static void HelpRequest(NetState state, CircularBufferReader reader)
{
EventSink.InvokeHelpRequest(state.Mobile);
}
public static void TargetResponse(NetState state, PacketReader reader)
public static void TargetResponse(NetState state, CircularBufferReader reader)
{
int type = reader.ReadByte();
var targetID = reader.ReadInt32();
@ -1170,7 +1170,7 @@ namespace Server.Network
}
}
public static void DisplayGumpResponse(NetState state, PacketReader reader)
public static void DisplayGumpResponse(NetState state, CircularBufferReader reader)
{
var serial = reader.ReadUInt32();
var typeID = reader.ReadInt32();
@ -1292,12 +1292,12 @@ namespace Server.Network
}
}
public static void SetWarMode(NetState state, PacketReader reader)
public static void SetWarMode(NetState state, CircularBufferReader reader)
{
state.Mobile.DelayChangeWarmode(reader.ReadBoolean());
}
public static void Resynchronize(NetState state, PacketReader reader)
public static void Resynchronize(NetState state, CircularBufferReader reader)
{
var m = state.Mobile;
@ -1319,7 +1319,7 @@ namespace Server.Network
m.ClearFastwalkStack();
}
public static void AsciiSpeech(NetState state, PacketReader reader)
public static void AsciiSpeech(NetState state, CircularBufferReader reader)
{
var from = state.Mobile;
@ -1341,7 +1341,7 @@ namespace Server.Network
from.DoSpeech(text, m_EmptyInts, type, Utility.ClipDyedHue(hue));
}
public static void UnicodeSpeech(NetState state, PacketReader reader)
public static void UnicodeSpeech(NetState state, CircularBufferReader reader)
{
var from = state.Mobile;
@ -1420,7 +1420,7 @@ namespace Server.Network
from.DoSpeech(text, keywords, type, Utility.ClipDyedHue(hue));
}
public static void UseReq(NetState state, PacketReader reader)
public static void UseReq(NetState state, CircularBufferReader reader)
{
var from = state.Mobile;
@ -1464,7 +1464,7 @@ namespace Server.Network
}
}
public static void LookReq(NetState state, PacketReader reader)
public static void LookReq(NetState state, CircularBufferReader reader)
{
var from = state.Mobile;
@ -1513,17 +1513,17 @@ namespace Server.Network
}
}
public static void PingReq(NetState state, PacketReader reader)
public static void PingReq(NetState state, CircularBufferReader reader)
{
state.Send(PingAck.Instantiate(reader.ReadByte()));
}
public static void SetUpdateRange(NetState state, PacketReader reader)
public static void SetUpdateRange(NetState state, CircularBufferReader reader)
{
state.Send(ChangeUpdateRange.Instantiate(18));
}
public static void MovementReq(NetState state, PacketReader reader)
public static void MovementReq(NetState state, CircularBufferReader reader)
{
var dir = (Direction)reader.ReadByte();
int seq = reader.ReadByte();
@ -1551,7 +1551,7 @@ namespace Server.Network
}
}
public static void Animate(NetState state, PacketReader reader)
public static void Animate(NetState state, CircularBufferReader reader)
{
var from = state.Mobile;
var action = reader.ReadInt32();
@ -1569,7 +1569,7 @@ namespace Server.Network
}
}
public static void QuestArrow(NetState state, PacketReader reader)
public static void QuestArrow(NetState state, CircularBufferReader reader)
{
var rightClick = reader.ReadBoolean();
var from = state.Mobile;
@ -1577,7 +1577,7 @@ namespace Server.Network
from?.QuestArrow?.OnClick(rightClick);
}
public static void ExtendedCommand(NetState state, PacketReader reader)
public static void ExtendedCommand(NetState state, CircularBufferReader reader)
{
int packetID = reader.ReadUInt16();
@ -1607,7 +1607,7 @@ namespace Server.Network
}
}
public static void CastSpell(NetState state, PacketReader reader)
public static void CastSpell(NetState state, CircularBufferReader reader)
{
var from = state.Mobile;
@ -1628,7 +1628,7 @@ namespace Server.Network
EventSink.InvokeCastSpellRequest(from, spellID, spellbook);
}
public static void BandageTarget(NetState state, PacketReader reader)
public static void BandageTarget(NetState state, CircularBufferReader reader)
{
var from = state.Mobile;
@ -1663,12 +1663,12 @@ namespace Server.Network
}
}
public static void ToggleFlying(NetState state, PacketReader reader)
public static void ToggleFlying(NetState state, CircularBufferReader reader)
{
state.Mobile.ToggleFlying();
}
public static void BatchQueryProperties(NetState state, PacketReader reader)
public static void BatchQueryProperties(NetState state, CircularBufferReader reader)
{
if (!ObjectPropertyList.Enabled)
{
@ -1710,7 +1710,7 @@ namespace Server.Network
}
}
public static void QueryProperties(NetState state, PacketReader reader)
public static void QueryProperties(NetState state, CircularBufferReader reader)
{
if (!ObjectPropertyList.Enabled)
{
@ -1742,7 +1742,7 @@ namespace Server.Network
}
}
public static void PartyMessage(NetState state, PacketReader reader)
public static void PartyMessage(NetState state, CircularBufferReader reader)
{
if (state.Mobile == null)
{
@ -1778,17 +1778,17 @@ namespace Server.Network
}
}
public static void PartyMessage_AddMember(NetState state, PacketReader reader)
public static void PartyMessage_AddMember(NetState state, CircularBufferReader reader)
{
PartyCommands.Handler?.OnAdd(state.Mobile);
}
public static void PartyMessage_RemoveMember(NetState state, PacketReader reader)
public static void PartyMessage_RemoveMember(NetState state, CircularBufferReader reader)
{
PartyCommands.Handler?.OnRemove(state.Mobile, World.FindMobile(reader.ReadUInt32()));
}
public static void PartyMessage_PrivateMessage(NetState state, PacketReader reader)
public static void PartyMessage_PrivateMessage(NetState state, CircularBufferReader reader)
{
PartyCommands.Handler?.OnPrivateMessage(
state.Mobile,
@ -1797,37 +1797,37 @@ namespace Server.Network
);
}
public static void PartyMessage_PublicMessage(NetState state, PacketReader reader)
public static void PartyMessage_PublicMessage(NetState state, CircularBufferReader reader)
{
PartyCommands.Handler?.OnPublicMessage(state.Mobile, reader.ReadBigUniSafe());
}
public static void PartyMessage_SetCanLoot(NetState state, PacketReader reader)
public static void PartyMessage_SetCanLoot(NetState state, CircularBufferReader reader)
{
PartyCommands.Handler?.OnSetCanLoot(state.Mobile, reader.ReadBoolean());
}
public static void PartyMessage_Accept(NetState state, PacketReader reader)
public static void PartyMessage_Accept(NetState state, CircularBufferReader reader)
{
PartyCommands.Handler?.OnAccept(state.Mobile, World.FindMobile(reader.ReadUInt32()));
}
public static void PartyMessage_Decline(NetState state, PacketReader reader)
public static void PartyMessage_Decline(NetState state, CircularBufferReader reader)
{
PartyCommands.Handler?.OnDecline(state.Mobile, World.FindMobile(reader.ReadUInt32()));
}
public static void StunRequest(NetState state, PacketReader reader)
public static void StunRequest(NetState state, CircularBufferReader reader)
{
EventSink.InvokeStunRequest(state.Mobile);
}
public static void DisarmRequest(NetState state, PacketReader reader)
public static void DisarmRequest(NetState state, CircularBufferReader reader)
{
EventSink.InvokeDisarmRequest(state.Mobile);
}
public static void StatLockChange(NetState state, PacketReader reader)
public static void StatLockChange(NetState state, CircularBufferReader reader)
{
int stat = reader.ReadByte();
int lockValue = reader.ReadByte();
@ -1856,13 +1856,13 @@ namespace Server.Network
}
}
public static void ScreenSize(NetState state, PacketReader reader)
public static void ScreenSize(NetState state, CircularBufferReader reader)
{
var width = reader.ReadInt32();
var unk = reader.ReadInt32();
}
public static void ContextMenuResponse(NetState state, PacketReader reader)
public static void ContextMenuResponse(NetState state, CircularBufferReader reader)
{
var from = state.Mobile;
@ -1918,7 +1918,7 @@ namespace Server.Network
}
}
public static void ContextMenuRequest(NetState state, PacketReader reader)
public static void ContextMenuRequest(NetState state, CircularBufferReader reader)
{
var from = state.Mobile;
var target = World.FindEntity(reader.ReadUInt32());
@ -1962,12 +1962,12 @@ namespace Server.Network
}
}
public static void CloseStatus(NetState state, PacketReader reader)
public static void CloseStatus(NetState state, CircularBufferReader reader)
{
Serial serial = reader.ReadUInt32();
}
public static void Language(NetState state, PacketReader reader)
public static void Language(NetState state, CircularBufferReader reader)
{
var lang = reader.ReadAscii(4);
@ -1977,20 +1977,20 @@ namespace Server.Network
}
}
public static void AssistVersion(NetState state, PacketReader reader)
public static void AssistVersion(NetState state, CircularBufferReader reader)
{
var unk = reader.ReadInt32();
var av = reader.ReadAscii();
}
public static void ClientVersion(NetState state, PacketReader reader)
public static void ClientVersion(NetState state, CircularBufferReader reader)
{
var version = state.Version = new CV(reader.ReadAscii());
EventSink.InvokeClientVersionReceived(state, version);
}
public static void ClientType(NetState state, PacketReader reader)
public static void ClientType(NetState state, CircularBufferReader reader)
{
reader.ReadUInt16();
@ -2000,7 +2000,7 @@ namespace Server.Network
EventSink.InvokeClientVersionReceived(state, version);
}
public static void MobileQuery(NetState state, PacketReader reader)
public static void MobileQuery(NetState state, CircularBufferReader reader)
{
var from = state.Mobile;
@ -2031,7 +2031,7 @@ namespace Server.Network
}
}
public static void PlayCharacter(NetState state, PacketReader reader)
public static void PlayCharacter(NetState state, CircularBufferReader reader)
{
reader.ReadInt32(); // 0xEDEDEDED
@ -2093,7 +2093,7 @@ namespace Server.Network
}
}
public static void ShowPublicHouseContent(NetState state, PacketReader reader)
public static void ShowPublicHouseContent(NetState state, CircularBufferReader reader)
{
var showPublicHouseContent = reader.ReadBoolean();
}
@ -2201,7 +2201,7 @@ namespace Server.Network
m.ClearFastwalkStack();
}
public static void CreateCharacter(NetState state, PacketReader reader)
public static void CreateCharacter(NetState state, CircularBufferReader reader)
{
var unk1 = reader.ReadInt32();
var unk2 = reader.ReadInt32();
@ -2337,7 +2337,7 @@ namespace Server.Network
}
}
public static void CreateCharacter70160(NetState state, PacketReader reader)
public static void CreateCharacter70160(NetState state, CircularBufferReader reader)
{
var unk1 = reader.ReadInt32();
var unk2 = reader.ReadInt32();
@ -2499,7 +2499,7 @@ namespace Server.Network
return authID;
}
public static void GameLogin(NetState state, PacketReader reader)
public static void GameLogin(NetState state, CircularBufferReader reader)
{
if (state.SentFirstPacket)
{
@ -2567,7 +2567,7 @@ namespace Server.Network
}
}
public static void PlayServer(NetState state, PacketReader reader)
public static void PlayServer(NetState state, CircularBufferReader reader)
{
int index = reader.ReadInt16();
var info = state.ServerInfo;
@ -2588,7 +2588,7 @@ namespace Server.Network
}
}
public static void LoginServerSeed(NetState state, PacketReader reader)
public static void LoginServerSeed(NetState state, CircularBufferReader reader)
{
state.m_Seed = reader.ReadInt32();
state.Seeded = true;
@ -2608,7 +2608,7 @@ namespace Server.Network
state.Version = new ClientVersion(clientMaj, clientMin, clientRev, clientPat);
}
public static void CrashReport(NetState state, PacketReader reader)
public static void CrashReport(NetState state, CircularBufferReader reader)
{
var clientMaj = reader.ReadByte();
var clientMin = reader.ReadByte();
@ -2642,7 +2642,7 @@ namespace Server.Network
}
}
public static void AccountLogin(NetState state, PacketReader reader)
public static void AccountLogin(NetState state, CircularBufferReader reader)
{
if (state.SentFirstPacket)
{
@ -2696,7 +2696,7 @@ namespace Server.Network
state.Dispose();
}
public static void EquipMacro(NetState state, PacketReader reader)
public static void EquipMacro(NetState state, CircularBufferReader reader)
{
int count = reader.ReadByte();
var serialList = new List<Serial>(count);
@ -2708,7 +2708,7 @@ namespace Server.Network
EventSink.InvokeEquipMacro(state.Mobile, serialList);
}
public static void UnequipMacro(NetState state, PacketReader reader)
public static void UnequipMacro(NetState state, CircularBufferReader reader)
{
int count = reader.ReadByte();
var layers = new List<Layer>(count);
@ -2720,21 +2720,21 @@ namespace Server.Network
EventSink.InvokeUnequipMacro(state.Mobile, layers);
}
public static void TargetedSpell(NetState state, PacketReader reader)
public static void TargetedSpell(NetState state, CircularBufferReader reader)
{
var spellId = (short)(reader.ReadInt16() - 1); // zero based;
EventSink.InvokeTargetedSpell(state.Mobile, World.FindEntity(reader.ReadUInt32()), spellId);
}
public static void TargetedSkillUse(NetState state, PacketReader reader)
public static void TargetedSkillUse(NetState state, CircularBufferReader reader)
{
var skillId = reader.ReadInt16();
EventSink.InvokeTargetedSkillUse(state.Mobile, World.FindEntity(reader.ReadUInt32()), skillId);
}
public static void TargetByResourceMacro(NetState state, PacketReader reader)
public static void TargetByResourceMacro(NetState state, CircularBufferReader reader)
{
Serial serial = reader.ReadUInt32();