Fixes vendor packets (#184)
This commit is contained in:
parent
ff3a28ab84
commit
21b02a7508
2 changed files with 29 additions and 32 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue