fix(core): Converts MobileUpdate packet (#369)

- [X] Converts mobile update packet
This commit is contained in:
Kamron Batman 2020-12-28 01:50:17 -08:00 • committed by GitHub
parent 3d98e6e193
commit 9d4161b3e4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 72 additions and 106 deletions

View file

@ -256,76 +256,23 @@ namespace Server.Tests.Network
AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); AssertThat.Equal(result.Buffer[0].AsSpan(0), expected);
} }
[Fact] [Theory]
public void TestMobileUpdate() [InlineData(ProtocolChanges.None, 0)]
[InlineData(ProtocolChanges.StygianAbyss, 100)]
public void TestMobileUpdate(ProtocolChanges changes, int solidHueOverride)
{ {
var m = new Mobile(0x1); var m = new Mobile(0x1);
m.DefaultMobileInit(); m.DefaultMobileInit();
m.SolidHueOverride = solidHueOverride;
var data = new MobileUpdate(m, true).Compile(); using var ns = PacketTestUtilities.CreateTestNetState();
ns.ProtocolChanges = changes;
Span<byte> expectedData = stackalloc byte[19]; var expected = new MobileUpdate(m, ns.StygianAbyss).Compile();
var pos = 0; ns.SendMobileUpdate(m);
var hue = m.SolidHueOverride >= 0 ? m.SolidHueOverride : m.Hue; var result = ns.SendPipe.Reader.TryRead();
AssertThat.Equal(result.Buffer[0].AsSpan(0), expected);
expectedData.Write(ref pos, (byte)0x20); // Packet ID
expectedData.Write(ref pos, m.Serial);
expectedData.Write(ref pos, (ushort)m.Body);
#if NO_LOCAL_INIT
expectedData.Write(ref pos, (byte)0); // Unknown
#else
pos++;
#endif
expectedData.Write(ref pos, (ushort)hue);
expectedData.Write(ref pos, (byte)m.GetPacketFlags(true));
expectedData.Write(ref pos, (ushort)m.X);
expectedData.Write(ref pos, (ushort)m.Y);
#if NO_LOCAL_INIT
expectedData.Write(ref pos, (ushort)2); // Unknown
#else
pos += 2;
#endif
expectedData.Write(ref pos, (byte)m.Direction);
expectedData.Write(ref pos, (byte)m.Z);
AssertThat.Equal(data, expectedData);
}
[Fact]
public void TestMobileUpdateOld()
{
var m = new Mobile(0x1);
m.DefaultMobileInit();
var data = new MobileUpdate(m, false).Compile();
Span<byte> expectedData = stackalloc byte[19];
var pos = 0;
var hue = m.SolidHueOverride >= 0 ? m.SolidHueOverride : m.Hue;
expectedData.Write(ref pos, (byte)0x20); // Packet ID
expectedData.Write(ref pos, m.Serial);
expectedData.Write(ref pos, (ushort)m.Body);
#if NO_LOCAL_INIT
expectedData.Write(ref pos, (byte)0); // Unknown
#else
pos++;
#endif
expectedData.Write(ref pos, (ushort)hue);
expectedData.Write(ref pos, (byte)m.GetPacketFlags(false));
expectedData.Write(ref pos, (ushort)m.X);
expectedData.Write(ref pos, (ushort)m.Y);
#if NO_LOCAL_INIT
expectedData.Write(ref pos, (ushort)2); // Unknown
#else
pos += 2;
#endif
expectedData.Write(ref pos, (byte)m.Direction);
expectedData.Write(ref pos, (byte)m.Z);
AssertThat.Equal(data, expectedData);
} }
[Theory] [Theory]

View file

@ -462,4 +462,28 @@ namespace Server.Tests.Network
AttributeNormalizer.WriteReverse(Stream, current, maximum); AttributeNormalizer.WriteReverse(Stream, current, maximum);
} }
} }
public sealed class MobileUpdate : Packet
{
public MobileUpdate(Mobile m, bool stygianAbyss) : base(0x20, 19)
{
var hue = m.Hue;
if (m.SolidHueOverride >= 0)
{
hue = m.SolidHueOverride;
}
Stream.Write(m.Serial);
Stream.Write((short)m.Body);
Stream.Write((byte)0);
Stream.Write((short)hue);
Stream.Write((byte)m.GetPacketFlags(stygianAbyss));
Stream.Write((short)m.X);
Stream.Write((short)m.Y);
Stream.Write((short)0);
Stream.Write((byte)m.Direction);
Stream.Write((sbyte)m.Z);
}
}
} }

View file

@ -2827,27 +2827,24 @@ namespace Server
ns.Send(SeasonChange.Instantiate(GetSeason(), true)); ns.Send(SeasonChange.Instantiate(GetSeason(), true));
ns.Send(new MobileUpdate(this, ns.StygianAbyss)); ns.SendMobileUpdate(this);
Send(new ServerChange(m_Location, m_Map)); Send(new ServerChange(m_Location, m_Map));
} }
ns.Send(new MobileIncoming(ns, this, this)); ns.Send(new MobileIncoming(ns, this, this));
ns.Send(new MobileUpdate(this, ns.StygianAbyss)); ns.SendMobileUpdate(this);
CheckLightLevels(true); CheckLightLevels(true);
ns.Send(new MobileUpdate(this, ns.StygianAbyss)); ns.SendMobileUpdate(this);
} }
SendEverything(); SendEverything();
SendIncomingPacket(); SendIncomingPacket();
if (ns != null) ns?.Send(new MobileIncoming(ns, this, this));
{ ns.SendSupportedFeature();
ns.Send(new MobileIncoming(ns, this, this)); ns.SendMobileUpdate(this);
ns.SendSupportedFeature(); ns.SendMobileAttributes(this);
ns.Send(new MobileUpdate(this, ns.StygianAbyss));
ns.SendMobileAttributes(this);
}
OnMapChange(oldMap); OnMapChange(oldMap);
} }
@ -3042,7 +3039,7 @@ namespace Server
if (sendUpdate) if (sendUpdate)
{ {
ourState.Sequence = 0; ourState.Sequence = 0;
ourState.Send(new MobileUpdate(this, ourState.StygianAbyss)); ourState.SendMobileUpdate(this);
} }
if (sendIncoming) if (sendIncoming)
@ -7513,7 +7510,7 @@ namespace Server
if (isTeleport && m_NetState != null && (!m_NetState.HighSeas || !NoMoveHS)) if (isTeleport && m_NetState != null && (!m_NetState.HighSeas || !NoMoveHS))
{ {
m_NetState.Sequence = 0; m_NetState.Sequence = 0;
m_NetState.Send(new MobileUpdate(this, m_NetState.StygianAbyss)); m_NetState.SendMobileUpdate(this);
} }
var map = m_Map; var map = m_Map;

View file

@ -316,12 +316,12 @@ namespace Server.Network
state.Sequence = 0; state.Sequence = 0;
state.Send(new MobileUpdate(m, state.StygianAbyss)); state.SendMobileUpdate(m);
state.Send(new MobileUpdate(m, state.StygianAbyss)); state.SendMobileUpdate(m);
m.CheckLightLevels(true); m.CheckLightLevels(true);
state.Send(new MobileUpdate(m, state.StygianAbyss)); state.SendMobileUpdate(m);
state.Send(new MobileIncoming(state, m, m)); state.Send(new MobileIncoming(state, m, m));
@ -331,7 +331,7 @@ namespace Server.Network
m.SendEverything(); m.SendEverything();
state.SendSupportedFeature(); state.SendSupportedFeature();
state.Send(new MobileUpdate(m, state.StygianAbyss)); state.SendMobileUpdate(m);
state.SendMobileStatus(m); state.SendMobileStatus(m);
state.SendSetWarMode(m.Warmode); state.SendSetWarMode(m.Warmode);

View file

@ -473,8 +473,7 @@ namespace Server.Network
return; return;
} }
state.Send(new MobileUpdate(from, state.StygianAbyss)); state.SendMobileUpdate(from);
state.Send(new MobileIncoming(state, from, from)); state.Send(new MobileIncoming(state, from, from));
from.SendEverything(); from.SendEverything();

View file

@ -17,30 +17,6 @@ using System.Threading;
namespace Server.Network namespace Server.Network
{ {
public sealed class MobileUpdate : Packet
{
public MobileUpdate(Mobile m, bool stygianAbyss) : base(0x20, 19)
{
var hue = m.Hue;
if (m.SolidHueOverride >= 0)
{
hue = m.SolidHueOverride;
}
Stream.Write(m.Serial);
Stream.Write((short)m.Body);
Stream.Write((byte)0);
Stream.Write((short)hue);
Stream.Write((byte)m.GetPacketFlags(stygianAbyss));
Stream.Write((short)m.X);
Stream.Write((short)m.Y);
Stream.Write((short)0);
Stream.Write((byte)m.Direction);
Stream.Write((sbyte)m.Z);
}
}
public sealed class MobileIncoming : Packet public sealed class MobileIncoming : Packet
{ {
private static readonly ThreadLocal<int[]> m_DupedLayersTL = new(() => new int[256]); private static readonly ThreadLocal<int[]> m_DupedLayersTL = new(() => new int[256]);

View file

@ -513,5 +513,28 @@ namespace Server.Network
return writer.Position; return writer.Position;
} }
public static void SendMobileUpdate(this NetState ns, Mobile m)
{
if (ns == null || !ns.GetSendBuffer(out var buffer))
{
return;
}
var writer = new CircularBufferWriter(buffer);
writer.Write((byte)0x20); // Packet ID
writer.Write(m.Serial);
writer.Write((short)m.Body);
writer.Write((byte)0);
writer.Write((short)(m.SolidHueOverride >= 0 ? m.SolidHueOverride : m.Hue));
writer.Write((byte)m.GetPacketFlags(ns.StygianAbyss));
writer.Write((short)m.X);
writer.Write((short)m.Y);
writer.Write((short)0);
writer.Write((byte)m.Direction);
writer.Write((sbyte)m.Z);
ns.Send(ref buffer, writer.Position);
}
} }
} }