From b51bab5f1d50f69f70083c0dec0aa4462d4ab2f6 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Sat, 10 Apr 2021 21:48:07 -0700 Subject: [PATCH] fix(core): Fixes item mask in incoming mobile packet (#568) - [X] FIxes the item mask in incoming mobile packet - [X] Streamlines some of the send info stuff - [X] Adds a few missing packet initializations --- .../Network/Packets/Outgoing/MobilePackets.cs | 6 +++--- Projects/Server/Items/Item.cs | 4 ++-- .../Network/Packets/OutgoingEntityPackets.cs | 8 ++++---- .../Network/Packets/OutgoingItemPackets.cs | 17 +++++++++-------- .../Network/Packets/OutgoingMobilePackets.cs | 6 +++--- Projects/UOContent/Items/Misc/Blocker.cs | 4 ++-- Projects/UOContent/Items/Misc/LOSBlocker.cs | 4 ++-- Projects/UOContent/Multis/Boats/BoatPackets.cs | 5 +---- Projects/UOContent/Network/EntityPackets.cs | 5 +---- 9 files changed, 27 insertions(+), 32 deletions(-) diff --git a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePackets.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePackets.cs index 65d5ba6d8..c703f8642 100644 --- a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePackets.cs +++ b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePackets.cs @@ -554,7 +554,7 @@ namespace Server.Tests.Network var itemID = item.ItemID & itemIdMask; var writeHue = newPacket || hue != 0; - if (!newPacket) + if (!newPacket && writeHue) { itemID |= 0x8000; } @@ -585,7 +585,7 @@ namespace Server.Tests.Network var itemID = beheld.HairItemID & itemIdMask; var writeHue = newPacket || hue != 0; - if (!newPacket) + if (!newPacket && writeHue) { itemID |= 0x8000; } @@ -616,7 +616,7 @@ namespace Server.Tests.Network var itemID = beheld.FacialHairItemID & itemIdMask; var writeHue = newPacket || hue != 0; - if (!newPacket) + if (!newPacket && writeHue) { itemID |= 0x8000; } diff --git a/Projects/Server/Items/Item.cs b/Projects/Server/Items/Item.cs index cb14751ea..c63a36b50 100644 --- a/Projects/Server/Items/Item.cs +++ b/Projects/Server/Items/Item.cs @@ -1147,7 +1147,7 @@ namespace Server { if (state.HighSeas) { - var length = OutgoingEntityPackets.CreateWorldEntity(hsWorldItem, this, true, true); + var length = OutgoingEntityPackets.CreateWorldEntity(hsWorldItem, this, true); if (length != hsWorldItem.Length) { hsWorldItem = hsWorldItem.SliceToLength(length); @@ -1157,7 +1157,7 @@ namespace Server } else if (state.StygianAbyss) { - var length = OutgoingEntityPackets.CreateWorldEntity(saWorldItem, this, true, false); + var length = OutgoingEntityPackets.CreateWorldEntity(saWorldItem, this, false); if (length != saWorldItem.Length) { saWorldItem = saWorldItem.SliceToLength(length); diff --git a/Projects/Server/Network/Packets/OutgoingEntityPackets.cs b/Projects/Server/Network/Packets/OutgoingEntityPackets.cs index 37c902bbe..893699042 100644 --- a/Projects/Server/Network/Packets/OutgoingEntityPackets.cs +++ b/Projects/Server/Network/Packets/OutgoingEntityPackets.cs @@ -51,7 +51,7 @@ namespace Server.Network return; } - Span buffer = stackalloc byte[OPLPacketLength]; + Span buffer = stackalloc byte[OPLPacketLength].InitializePacket(); CreateOPLInfo(buffer, serial, hash); ns.Send(buffer); @@ -82,7 +82,7 @@ namespace Server.Network ns.Send(buffer); } - public static int CreateWorldEntity(Span buffer, IEntity entity, bool isSA, bool isHS) + public static int CreateWorldEntity(Span buffer, IEntity entity, bool isHS) { if (buffer[0] != 0) { @@ -121,7 +121,7 @@ namespace Server.Network type = 1; gfx = mobile.BodyValue; hue = mobile.Hue; - flags = mobile.GetPacketFlags(isSA); + flags = mobile.GetPacketFlags(true); } writer.Write((byte)type); @@ -136,7 +136,7 @@ namespace Server.Network writer.Write((short)(entity.Y & 0x3FFF)); writer.Write((sbyte)entity.Z); - writer.Write((byte)light); + writer.Write(light); writer.Write((short)hue); writer.Write((byte)flags); diff --git a/Projects/Server/Network/Packets/OutgoingItemPackets.cs b/Projects/Server/Network/Packets/OutgoingItemPackets.cs index 47777823e..20ac036c5 100644 --- a/Projects/Server/Network/Packets/OutgoingItemPackets.cs +++ b/Projects/Server/Network/Packets/OutgoingItemPackets.cs @@ -25,12 +25,13 @@ namespace Server.Network { if (buffer[0] != 0) { + // This assumes the packet was sliced properly return buffer.Length; } var itemID = item is BaseMulti ? item.ItemID | 0x4000 : item.ItemID & 0x3FFF; - var hasAmount = item.Amount != 0; var amount = item.Amount; + var hasAmount = amount != 0; var serial = hasAmount ? item.Serial | 0x80000000 : item.Serial & 0x7FFFFFFF; var loc = item.Location; var hue = item.Hue; @@ -52,7 +53,7 @@ namespace Server.Network writer.Write(serial); writer.Write((ushort)itemID); - if (amount != 0) + if (hasAmount) { writer.Write((ushort)amount); } @@ -60,24 +61,24 @@ namespace Server.Network writer.Write((ushort)x); writer.Write((ushort)y); - if (direction != 0) + if (hasDirection) { writer.Write((byte)direction); } writer.Write((sbyte)loc.Z); - if (hue != 0) + if (hasHue) { writer.Write((ushort)hue); } - if (flags != 0) + if (hasFlags) { writer.Write((byte)flags); } - return writer.Position; + return writer.BytesWritten; } public static void SendWorldItem(this NetState ns, Item item) @@ -87,10 +88,10 @@ namespace Server.Network return; } - Span buffer = stackalloc byte[OutgoingEntityPackets.MaxWorldEntityPacketLength]; + Span buffer = stackalloc byte[OutgoingEntityPackets.MaxWorldEntityPacketLength].InitializePacket(); var length = ns.StygianAbyss ? - OutgoingEntityPackets.CreateWorldEntity(buffer, item, ns.StygianAbyss, ns.HighSeas) : + OutgoingEntityPackets.CreateWorldEntity(buffer, item, ns.HighSeas) : CreateWorldItem(buffer, item); ns.Send(buffer.SliceToLength(length)); diff --git a/Projects/Server/Network/Packets/OutgoingMobilePackets.cs b/Projects/Server/Network/Packets/OutgoingMobilePackets.cs index b62ff6c63..29acf88f7 100644 --- a/Projects/Server/Network/Packets/OutgoingMobilePackets.cs +++ b/Projects/Server/Network/Packets/OutgoingMobilePackets.cs @@ -628,7 +628,7 @@ namespace Server.Network var itemID = item.ItemID & itemIdMask; var writeHue = newPacket || hue != 0; - if (!newPacket) + if (!newPacket && writeHue) { itemID |= 0x8000; } @@ -651,7 +651,7 @@ namespace Server.Network var itemID = beheld.HairItemID & itemIdMask; var writeHue = newPacket || hue != 0; - if (!newPacket) + if (!newPacket && writeHue) { itemID |= 0x8000; } @@ -674,7 +674,7 @@ namespace Server.Network var itemID = beheld.FacialHairItemID & itemIdMask; var writeHue = newPacket || hue != 0; - if (!newPacket) + if (!newPacket && writeHue) { itemID |= 0x8000; } diff --git a/Projects/UOContent/Items/Misc/Blocker.cs b/Projects/UOContent/Items/Misc/Blocker.cs index 8a60e7119..0ab6b0d6e 100644 --- a/Projects/UOContent/Items/Misc/Blocker.cs +++ b/Projects/UOContent/Items/Misc/Blocker.cs @@ -32,13 +32,13 @@ namespace Server.Items private void SendGMItem(NetState ns) { // GM Packet - Span buffer = stackalloc byte[OutgoingEntityPackets.MaxWorldEntityPacketLength]; + Span buffer = stackalloc byte[OutgoingEntityPackets.MaxWorldEntityPacketLength].InitializePacket(); int length; if (ns.StygianAbyss) { - length = OutgoingEntityPackets.CreateWorldEntity(buffer, this, ns.StygianAbyss, ns.HighSeas); + length = OutgoingEntityPackets.CreateWorldEntity(buffer, this, ns.HighSeas); BinaryPrimitives.WriteUInt16BigEndian(buffer.Slice(8, 2), GMItemId); } else diff --git a/Projects/UOContent/Items/Misc/LOSBlocker.cs b/Projects/UOContent/Items/Misc/LOSBlocker.cs index 48d5952b8..3fe0cfb5e 100644 --- a/Projects/UOContent/Items/Misc/LOSBlocker.cs +++ b/Projects/UOContent/Items/Misc/LOSBlocker.cs @@ -38,13 +38,13 @@ namespace Server.Items private void SendGMItem(NetState ns) { // GM Packet - Span buffer = stackalloc byte[OutgoingEntityPackets.MaxWorldEntityPacketLength]; + Span buffer = stackalloc byte[OutgoingEntityPackets.MaxWorldEntityPacketLength].InitializePacket(); int length; if (ns.StygianAbyss) { - length = OutgoingEntityPackets.CreateWorldEntity(buffer, this, ns.StygianAbyss, ns.HighSeas); + length = OutgoingEntityPackets.CreateWorldEntity(buffer, this, ns.HighSeas); BinaryPrimitives.WriteUInt16BigEndian(buffer.Slice(8, 2), GMItemId); } else diff --git a/Projects/UOContent/Multis/Boats/BoatPackets.cs b/Projects/UOContent/Multis/Boats/BoatPackets.cs index a274ec86a..65a074123 100644 --- a/Projects/UOContent/Multis/Boats/BoatPackets.cs +++ b/Projects/UOContent/Multis/Boats/BoatPackets.cs @@ -76,9 +76,6 @@ namespace Server.Multis.Boats return; } - bool isSA = ns.StygianAbyss; - bool isHS = ns.HighSeas; - var minLength = PacketContainerBuilder.MinPacketLength + OutgoingEntityPackets.MaxWorldEntityPacketLength * 5; // Minimum of boat, hold, planks, and the player @@ -95,7 +92,7 @@ namespace Server.Multis.Boats } buffer.InitializePacket(); - var bytesWritten = OutgoingEntityPackets.CreateWorldEntity(buffer, entity, isSA, isHS); + var bytesWritten = OutgoingEntityPackets.CreateWorldEntity(buffer, entity, true); builder.Advance(bytesWritten); } diff --git a/Projects/UOContent/Network/EntityPackets.cs b/Projects/UOContent/Network/EntityPackets.cs index b1e99a624..678b91b56 100644 --- a/Projects/UOContent/Network/EntityPackets.cs +++ b/Projects/UOContent/Network/EntityPackets.cs @@ -32,9 +32,6 @@ namespace Server.Network return; } - bool isSA = ns.StygianAbyss; - bool isHS = ns.HighSeas; - var minLength = PacketContainerBuilder.MinPacketLength + OutgoingEntityPackets.MaxWorldEntityPacketLength * estimatedCount; @@ -46,7 +43,7 @@ namespace Server.Network foreach (var entity in entities) { buffer.InitializePacket(); - var bytesWritten = OutgoingEntityPackets.CreateWorldEntity(buffer, entity, isSA, isHS); + var bytesWritten = OutgoingEntityPackets.CreateWorldEntity(buffer, entity, true); builder.Advance(bytesWritten); }