From 21b02a7508e01fb93c7e2418addd2ab3055adde8 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Sat, 25 Jul 2020 21:55:07 -0700 Subject: [PATCH] Fixes vendor packets (#184) --- Projects/Server/Network/MessagePumpService.cs | 15 +++--- Projects/Server/Network/PacketHandlers.cs | 46 +++++++++---------- 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/Projects/Server/Network/MessagePumpService.cs b/Projects/Server/Network/MessagePumpService.cs index 5725325b7..da54e0989 100644 --- a/Projects/Server/Network/MessagePumpService.cs +++ b/Projects/Server/Network/MessagePumpService.cs @@ -26,7 +26,7 @@ namespace Server.Network { public interface IMessagePumpService { - void QueueWork(NetState ns, IMemoryOwner memOwner, OnPacketReceive onReceive); + void QueueWork(NetState ns, IMemoryOwner memOwner, int length, OnPacketReceive onReceive); void DoWork(); } @@ -34,9 +34,9 @@ namespace Server.Network { private readonly ConcurrentQueue m_WorkQueue = new ConcurrentQueue(); - public void QueueWork(NetState ns, IMemoryOwner memOwner, OnPacketReceive onReceive) + public void QueueWork(NetState ns, IMemoryOwner memOwner, int length, OnPacketReceive onReceive) { - m_WorkQueue.Enqueue(new Work(ns, memOwner, onReceive)); + m_WorkQueue.Enqueue(new Work(ns, memOwner, length, onReceive)); Core.Set(); } @@ -48,7 +48,8 @@ namespace Server.Network if (!m_WorkQueue.TryDequeue(out var work)) break; - work.OnReceive(work.State, new PacketReader(new ReadOnlySequence(work.MemoryOwner.Memory))); + var seq = new ReadOnlySequence(work.MemoryOwner.Memory.Slice(0, work.Length)); + work.OnReceive(work.State, new PacketReader(seq)); work.MemoryOwner.Dispose(); } } @@ -56,16 +57,16 @@ namespace Server.Network private class Work { public readonly NetState State; - - // TODO: Force dispose? public readonly IMemoryOwner MemoryOwner; + public readonly int Length; public readonly OnPacketReceive OnReceive; - public Work(NetState ns, IMemoryOwner memOwner, OnPacketReceive onReceive) + public Work(NetState ns, IMemoryOwner memOwner, int length, OnPacketReceive onReceive) { State = ns; MemoryOwner = memOwner; OnReceive = onReceive; + Length = length; } } } diff --git a/Projects/Server/Network/PacketHandlers.cs b/Projects/Server/Network/PacketHandlers.cs index 4e0edd4c9..625a7fa17 100644 --- a/Projects/Server/Network/PacketHandlers.cs +++ b/Projects/Server/Network/PacketHandlers.cs @@ -341,18 +341,19 @@ namespace Server.Network return -1; } - var throttler = handler.ThrottleCallback; var throttled = handler.ThrottleCallback?.Invoke(ns) ?? TimeSpan.Zero; if (throttled > TimeSpan.Zero) ns.ThrottledUntil = DateTime.UtcNow + throttled; var packet = seq.Slice(r.Position); - var memOwner = _memoryPool.Rent((int)packet.Length); + int length = (int)packet.Length; + var memOwner = _memoryPool.Rent(length); + // TODO: This is slow, find another way packet.CopyTo(memOwner.Memory.Span); - pump.QueueWork(ns, memOwner, handler.OnReceive); + pump.QueueWork(ns, memOwner, length, handler.OnReceive); return packetLength; } @@ -497,9 +498,6 @@ namespace Server.Network public static void VendorBuyReply(NetState state, PacketReader pvSrc) { - pvSrc.Seek(1, SeekOrigin.Begin); - - int msgSize = pvSrc.ReadUInt16(); var vendor = World.FindMobile(pvSrc.ReadUInt32()); var flag = pvSrc.ReadByte(); @@ -514,7 +512,7 @@ namespace Server.Network if (flag == 0x02) { - msgSize -= 1 + 2 + 4 + 1; + int msgSize = (int)pvSrc.Remaining; if (msgSize / 7 > 100) return; @@ -554,22 +552,22 @@ namespace Server.Network int count = pvSrc.ReadUInt16(); - if (count < 100 && pvSrc.Length == 4 + 2 + count * 6) + if (count >= 100 || pvSrc.Remaining != count * 6) + return; + + var sellList = new List(count); + + for (var i = 0; i < count; i++) { - var sellList = new List(count); + var item = World.FindItem(pvSrc.ReadUInt32()); + int amount = pvSrc.ReadInt16(); - for (var i = 0; i < count; i++) - { - var item = World.FindItem(pvSrc.ReadUInt32()); - int amount = pvSrc.ReadInt16(); - - if (item != null && amount > 0) - sellList.Add(new SellItemResponse(item, amount)); - } - - if (sellList.Count > 0 && vendor is IVendor v && v.OnSellItems(state.Mobile, sellList)) - state.Send(new EndVendorSell(vendor)); + if (item != null && amount > 0) + sellList.Add(new SellItemResponse(item, amount)); } + + if (sellList.Count > 0 && vendor is IVendor v && v.OnSellItems(state.Mobile, sellList)) + state.Send(new EndVendorSell(vendor)); } public static void DeleteCharacter(NetState state, PacketReader pvSrc) @@ -1553,14 +1551,12 @@ namespace Server.Network var from = state.Mobile; - var length = pvSrc.Length; + var length = pvSrc.Remaining; - if (length < 0 || length % 4 != 0) + if (length % 4 != 0) return; - var count = length / 4; - - for (var i = 0; i < count; ++i) + while (pvSrc.Remaining > 0) { Serial s = pvSrc.ReadUInt32();