Fixes vendor packets (#184)

This commit is contained in:
Kamron Batman 2020-07-25 21:55:07 -07:00 committed by GitHub
parent ff3a28ab84
commit 21b02a7508
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 32 deletions

View file

@ -26,7 +26,7 @@ namespace Server.Network
{
public interface IMessagePumpService
{
void QueueWork(NetState ns, IMemoryOwner<byte> memOwner, OnPacketReceive onReceive);
void QueueWork(NetState ns, IMemoryOwner<byte> memOwner, int length, OnPacketReceive onReceive);
void DoWork();
}
@ -34,9 +34,9 @@ namespace Server.Network
{
private readonly ConcurrentQueue<Work> m_WorkQueue = new ConcurrentQueue<Work>();
public void QueueWork(NetState ns, IMemoryOwner<byte> memOwner, OnPacketReceive onReceive)
public void QueueWork(NetState ns, IMemoryOwner<byte> 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<byte>(work.MemoryOwner.Memory)));
var seq = new ReadOnlySequence<byte>(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<byte> MemoryOwner;
public readonly int Length;
public readonly OnPacketReceive OnReceive;
public Work(NetState ns, IMemoryOwner<byte> memOwner, OnPacketReceive onReceive)
public Work(NetState ns, IMemoryOwner<byte> memOwner, int length, OnPacketReceive onReceive)
{
State = ns;
MemoryOwner = memOwner;
OnReceive = onReceive;
Length = length;
}
}
}

View file

@ -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<SellItemResponse>(count);
for (var i = 0; i < count; i++)
{
var sellList = new List<SellItemResponse>(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();