From 8f8b650ab5329d44ac4d96e9a997b25be0a1e6fd Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Sun, 27 Dec 2020 23:22:21 -0800 Subject: [PATCH] fix(core): Converts healthbar packets (#367) - [X] Converts healthbar packets --- .../Packets/Outgoing/MobilePacketTests.cs | 86 ++++++++--------- .../Network/Packets/Outgoing/MobilePackets.cs | 46 +++++++++ Projects/Server/ClientVersion.cs | 1 - Projects/Server/Geometry/Rectangle2D.cs | 2 - Projects/Server/Guild.cs | 1 - Projects/Server/Mobiles/Mobile.cs | 95 ++++++++----------- .../Server/Network/Packets/MobilePackets.cs | 46 --------- .../Network/Packets/OutgoingMobilePackets.cs | 47 +++++++++ Projects/Server/Utilities/Utility.cs | 1 - .../Implementors/BaseCommandImplementor.cs | 1 - Projects/UOContent/Commands/HelpInfo.cs | 1 - Projects/UOContent/Commands/SignParser.cs | 1 - .../Engines/Chat/ChatActionHandlers.cs | 2 - .../UOContent/Engines/Spawners/BaseSpawner.cs | 1 - .../Gumps/Guilds/GuildDeclareWarPrompt.cs | 1 - .../Guilds/New Guild System/BaseGuildGump.cs | 1 - Projects/UOContent/Items/Body Parts/Head.cs | 2 - Projects/UOContent/Items/Books/BaseBook.cs | 1 - Projects/UOContent/Items/Misc/Teleporter.cs | 1 - Projects/UOContent/Misc/InhumanSpeech.cs | 1 - .../Mobiles/Vendors/NPC/AnimalTrainer.cs | 1 - Projects/UOContent/Skills/ForensicEval.cs | 1 - 22 files changed, 174 insertions(+), 166 deletions(-) diff --git a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePacketTests.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePacketTests.cs index 28982f24b..e70a20c44 100644 --- a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePacketTests.cs +++ b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePacketTests.cs @@ -133,6 +133,47 @@ namespace Server.Tests.Network AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); } + [Theory] + [InlineData("None")] + [InlineData("Lesser")] + [InlineData("Lethal")] + public void TestHealthbarPoison(string pName) + { + var p = Poison.GetPoison(pName); + var m = new Mobile(0x1); + m.DefaultMobileInit(); + m.Poison = p; + + var expected = new HealthbarPoison(m).Compile(); + + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.SendMobileHealthbar(m, Healthbar.Poison); + + var result = ns.SendPipe.Reader.TryRead(); + AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); + } + + [Theory] + [InlineData(false, false)] + [InlineData(true, false)] + [InlineData(false, true)] + [InlineData(true, true)] + public void TestYellowBar(bool isBlessed, bool isYellowHealth) + { + var m = new Mobile(0x1); + m.DefaultMobileInit(); + m.Blessed = isBlessed; + m.YellowHealthbar = isYellowHealth; + + var expected = new HealthbarYellow(m).Compile(); + + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.SendMobileHealthbar(m, Healthbar.Yellow); + + var result = ns.SendPipe.Reader.TryRead(); + AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); + } + [Fact] public void TestMobileStatusCompact() { @@ -279,51 +320,6 @@ namespace Server.Tests.Network AssertThat.Equal(data, expectedData); } - [Theory, InlineData("None"), InlineData("Lesser"), InlineData("Lethal")] - public void TestHealthbarPoison(string pName) - { - var p = Poison.GetPoison(pName); - var m = new Mobile(0x1); - m.DefaultMobileInit(); - m.Poison = p; - - var data = new HealthbarPoison(m).Compile(); - - Span expectedData = stackalloc byte[12]; - var pos = 0; - - expectedData.Write(ref pos, (byte)0x17); // Packet ID - expectedData.Write(ref pos, (ushort)12); // Length - expectedData.Write(ref pos, m.Serial); - expectedData.Write(ref pos, 0x10001); // Show Bar?, Poison Bar - expectedData.Write(ref pos, (byte)((p?.Level ?? -1) + 1)); - - AssertThat.Equal(data, expectedData); - Assert.Equal(p?.Level, m.Poison?.Level); - } - - [Theory, InlineData(false, false), InlineData(true, false), InlineData(false, true), InlineData(true, true)] - public void TestYellowBar(bool isBlessed, bool isYellowHealth) - { - var m = new Mobile(0x1); - m.DefaultMobileInit(); - m.Blessed = isBlessed; - m.YellowHealthbar = isYellowHealth; - - var data = new HealthbarYellow(m).Compile(); - - Span expectedData = stackalloc byte[12]; - var pos = 0; - - expectedData.Write(ref pos, (byte)0x17); // Packet ID - expectedData.Write(ref pos, (ushort)12); // Length - expectedData.Write(ref pos, m.Serial); - expectedData.Write(ref pos, 0x10002); // Show Bar?, Yellow Bar - expectedData.Write(ref pos, isBlessed || isYellowHealth); - - AssertThat.Equal(data, expectedData); - } - [Fact] public void TestMobileUpdate() { diff --git a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePackets.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePackets.cs index da6128ebb..9d57c2e45 100644 --- a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePackets.cs +++ b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MobilePackets.cs @@ -174,4 +174,50 @@ namespace Server.Tests.Network Stream.Write((byte)delay); } } + + public sealed class HealthbarPoison : Packet + { + public HealthbarPoison(Mobile m) : base(0x17) + { + EnsureCapacity(12); + + Stream.Write(m.Serial); + Stream.Write((short)1); // Show Bar? + + Stream.Write((short)1); // Poison Bar + + var p = m.Poison; + + if (p != null) + { + Stream.Write((byte)(p.Level + 1)); + } + else + { + Stream.Write((byte)0); + } + } + } + + public sealed class HealthbarYellow : Packet + { + public HealthbarYellow(Mobile m) : base(0x17) + { + EnsureCapacity(12); + + Stream.Write(m.Serial); + Stream.Write((short)1); + + Stream.Write((short)2); + + if (m.Blessed || m.YellowHealthbar) + { + Stream.Write((byte)1); + } + else + { + Stream.Write((byte)0); + } + } + } } diff --git a/Projects/Server/ClientVersion.cs b/Projects/Server/ClientVersion.cs index 63f7216ea..31d7a025a 100644 --- a/Projects/Server/ClientVersion.cs +++ b/Projects/Server/ClientVersion.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Text; using Server.Buffers; namespace Server diff --git a/Projects/Server/Geometry/Rectangle2D.cs b/Projects/Server/Geometry/Rectangle2D.cs index 1d079abeb..7c334377d 100644 --- a/Projects/Server/Geometry/Rectangle2D.cs +++ b/Projects/Server/Geometry/Rectangle2D.cs @@ -13,8 +13,6 @@ * along with this program. If not, see . * *************************************************************************/ -using System; - namespace Server { [NoSort, Parsable, PropertyObject] diff --git a/Projects/Server/Guild.cs b/Projects/Server/Guild.cs index ce5196210..4678e7bbf 100644 --- a/Projects/Server/Guild.cs +++ b/Projects/Server/Guild.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.IO; using System.Linq; namespace Server.Guilds diff --git a/Projects/Server/Mobiles/Mobile.cs b/Projects/Server/Mobiles/Mobile.cs index f47122699..a9181c149 100644 --- a/Projects/Server/Mobiles/Mobile.cs +++ b/Projects/Server/Mobiles/Mobile.cs @@ -5,7 +5,6 @@ using System.IO; using System.Linq; using System.Runtime.CompilerServices; using System.Runtime.Serialization; -using System.Text; using Server.Accounting; using Server.Buffers; using Server.ContextMenus; @@ -345,6 +344,13 @@ namespace Server Attributes = 0x0000001C } + public enum Healthbar + { + Normal, + Poison, + Yellow + } + public enum AccessLevel { Player, @@ -2978,17 +2984,6 @@ namespace Server sendIncoming = true; } - /*if ((delta & MobileDelta.Hue) != 0) - { - sendNonlocalIncoming = true; - sendUpdate = true; - } - else if ((delta & (MobileDelta.Direction | MobileDelta.Body)) != 0) - { - sendNonlocalMoving = true; - sendUpdate = true; - } - else*/ if ((delta & (MobileDelta.Flags | MobileDelta.Noto)) != 0) { sendMoving = true; @@ -3066,12 +3061,12 @@ namespace Server { if (sendHealthbarPoison) { - ourState.Send(new HealthbarPoison(m)); + ourState.SendMobileHealthbar(m, Healthbar.Poison); } if (sendHealthbarYellow) { - ourState.Send(new HealthbarYellow(m)); + ourState.SendMobileHealthbar(m, Healthbar.Yellow); } } @@ -3164,6 +3159,12 @@ namespace Server var eable = m.Map.GetClientsInRange(m.m_Location); + Span hbpBuffer = stackalloc byte[OutgoingMobilePackets.MobileHealthbarPacketLength]; + hbpBuffer.InitializePacket(); + + Span hbyBuffer = stackalloc byte[OutgoingMobilePackets.MobileHealthbarPacketLength]; + hbyBuffer.InitializePacket(); + Span deadBuffer = stackalloc byte[OutgoingMobilePackets.BondedStatusPacketLength]; deadBuffer.InitializePacket(); @@ -3216,14 +3217,20 @@ namespace Server { if (sendHealthbarPoison) { - hbpPacket ??= Packet.Acquire(new HealthbarPoison(m)); + if (hbpBuffer[0] == 0) + { + OutgoingMobilePackets.CreateMobileHealthbar(hbpBuffer, m, Healthbar.Poison); + } state.Send(hbpPacket); } if (sendHealthbarYellow) { - hbyPacket ??= Packet.Acquire(new HealthbarYellow(m)); + if (hbyBuffer[0] == 0) + { + OutgoingMobilePackets.CreateMobileHealthbar(hbyBuffer, m, Healthbar.Yellow); + } state.Send(hbyPacket); } @@ -7150,15 +7157,8 @@ namespace Server if (ns.StygianAbyss) { - if (m.Poisoned) - { - ns.Send(new HealthbarPoison(m)); - } - - if (m.Blessed || m.YellowHealthbar) - { - ns.Send(new HealthbarYellow(m)); - } + ns.SendMobileHealthbar(m, Healthbar.Poison); + ns.SendMobileHealthbar(m, Healthbar.Yellow); } if (m.IsDeadBondedPet) @@ -7562,27 +7562,25 @@ namespace Server } var inOldRange = Utility.InUpdateRange(oldLocation, m.m_Location); + var ns = m.m_NetState; - if (m.m_NetState != null && - (isTeleport && (!m.m_NetState.HighSeas || !NoMoveHS) || !inOldRange) && m.CanSee(this)) + if (ns != null && + (isTeleport && (!ns.HighSeas || !NoMoveHS) || !inOldRange) && m.CanSee(this)) { - m.m_NetState.Send(new MobileIncoming(m.m_NetState, m, this)); + ns.Send(new MobileIncoming(m.m_NetState, m, this)); - if (m.m_NetState.StygianAbyss) + if (ns.StygianAbyss) { - // if (m_Poison != null) - m.m_NetState.Send(new HealthbarPoison(this)); - - // if (m_Blessed || m_YellowHealthbar) - m.m_NetState.Send(new HealthbarYellow(this)); + ns.SendMobileHealthbar(this, Healthbar.Poison); + ns.SendMobileHealthbar(this, Healthbar.Yellow); } if (IsDeadBondedPet) { - m.m_NetState.SendBondedStatus(Serial, true); + ns.SendBondedStatus(Serial, true); } - SendOPLPacketTo(m.m_NetState); + SendOPLPacketTo(ns); } if (inOldRange || !CanSee(m)) @@ -7594,11 +7592,8 @@ namespace Server if (ourState.StygianAbyss) { - // if (m.Poisoned) - ourState.Send(new HealthbarPoison(m)); - - // if (m.Blessed || m.YellowHealthbar) - ourState.Send(new HealthbarYellow(m)); + ourState.SendMobileHealthbar(m, Healthbar.Poison); + ourState.SendMobileHealthbar(m, Healthbar.Yellow); } if (m.IsDeadBondedPet) @@ -7626,11 +7621,8 @@ namespace Server if (ns.StygianAbyss) { - // if (m_Poison != null) - ns.Send(new HealthbarPoison(this)); - - // if (m_Blessed || m_YellowHealthbar) - ns.Send(new HealthbarYellow(this)); + ns.SendMobileHealthbar(this, Healthbar.Poison); + ns.SendMobileHealthbar(this, Healthbar.Yellow); } if (IsDeadBondedPet) @@ -7707,15 +7699,8 @@ namespace Server if (state.StygianAbyss) { - if (m_Poison != null) - { - state.Send(new HealthbarPoison(this)); - } - - if (m_Blessed || m_YellowHealthbar) - { - state.Send(new HealthbarYellow(this)); - } + state.SendMobileHealthbar(this, Healthbar.Poison); + state.SendMobileHealthbar(this, Healthbar.Yellow); } if (IsDeadBondedPet) diff --git a/Projects/Server/Network/Packets/MobilePackets.cs b/Projects/Server/Network/Packets/MobilePackets.cs index fe5546629..632afd723 100644 --- a/Projects/Server/Network/Packets/MobilePackets.cs +++ b/Projects/Server/Network/Packets/MobilePackets.cs @@ -259,52 +259,6 @@ namespace Server.Network } } - public sealed class HealthbarPoison : Packet - { - public HealthbarPoison(Mobile m) : base(0x17) - { - EnsureCapacity(12); - - Stream.Write(m.Serial); - Stream.Write((short)1); // Show Bar? - - Stream.Write((short)1); // Poison Bar - - var p = m.Poison; - - if (p != null) - { - Stream.Write((byte)(p.Level + 1)); - } - else - { - Stream.Write((byte)0); - } - } - } - - public sealed class HealthbarYellow : Packet - { - public HealthbarYellow(Mobile m) : base(0x17) - { - EnsureCapacity(12); - - Stream.Write(m.Serial); - Stream.Write((short)1); - - Stream.Write((short)2); - - if (m.Blessed || m.YellowHealthbar) - { - Stream.Write((byte)1); - } - else - { - Stream.Write((byte)0); - } - } - } - public sealed class MobileUpdate : Packet { public MobileUpdate(Mobile m, bool stygianAbyss) : base(0x20, 19) diff --git a/Projects/Server/Network/Packets/OutgoingMobilePackets.cs b/Projects/Server/Network/Packets/OutgoingMobilePackets.cs index 2a2921dbb..3afe90b6d 100644 --- a/Projects/Server/Network/Packets/OutgoingMobilePackets.cs +++ b/Projects/Server/Network/Packets/OutgoingMobilePackets.cs @@ -30,6 +30,7 @@ namespace Server.Network public const int MobileAttributesPacketLength = 17; public const int MobileAnimationPacketLength = 14; public const int NewMobileAnimationPacketLength = 10; + public const int MobileHealthbarPacketLength = 12; public static void CreateBondedStatus(Span buffer, Serial serial, bool bonded) { @@ -327,5 +328,51 @@ namespace Server.Network CreateNewMobileAnimation(span, mobile, action, frameCount, delay); ns.Send(span); } + + public static void SendMobileHealthbar(this NetState ns, Mobile m, Healthbar healthbar) + { + if (ns == null) + { + return; + } + + Span span = stackalloc byte[MobileHealthbarPacketLength]; + CreateMobileHealthbar(span, m, healthbar); + ns.Send(span); + } + + public static void CreateMobileHealthbar(Span buffer, Mobile m, Healthbar healthbar) + { + switch (healthbar) + { + case Healthbar.Poison: + { + CreateMobileHealthbar(buffer, m.Serial, Healthbar.Poison, m.Poison?.Level + 1 ?? 0); + break; + } + case Healthbar.Yellow: + { + CreateMobileHealthbar(buffer, m.Serial, Healthbar.Yellow, m.Blessed || m.YellowHealthbar ? 1 : 0); + break; + } + default: + { + Console.WriteLine("Packets: Invalid Healthbar {0} in {1}", healthbar, nameof(CreateMobileHealthbar)); + CreateMobileHealthbar(buffer, m.Serial, Healthbar.Normal, 0); + break; + } + } + } + + public static void CreateMobileHealthbar(Span buffer, Serial serial, Healthbar healthbar, int level) + { + var writer = new SpanWriter(buffer); + writer.Write((byte)0x17); // Packet ID + writer.Write((ushort)12); + writer.Write(serial); + writer.Write((short)1); // Show bar + writer.Write((short)healthbar); + writer.Write((byte)level); // 0 is off for that bar type + } } } diff --git a/Projects/Server/Utilities/Utility.cs b/Projects/Server/Utilities/Utility.cs index 32b445038..365ed271b 100644 --- a/Projects/Server/Utilities/Utility.cs +++ b/Projects/Server/Utilities/Utility.cs @@ -1,6 +1,5 @@ using System; using System.Buffers.Binary; -using System.Collections; using System.Collections.Generic; using System.Globalization; using System.IO; diff --git a/Projects/UOContent/Commands/Generic/Implementors/BaseCommandImplementor.cs b/Projects/UOContent/Commands/Generic/Implementors/BaseCommandImplementor.cs index f6eb94211..41f4114af 100644 --- a/Projects/UOContent/Commands/Generic/Implementors/BaseCommandImplementor.cs +++ b/Projects/UOContent/Commands/Generic/Implementors/BaseCommandImplementor.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Text; using Server.Buffers; namespace Server.Commands.Generic diff --git a/Projects/UOContent/Commands/HelpInfo.cs b/Projects/UOContent/Commands/HelpInfo.cs index 01bce89f3..322bc67f5 100644 --- a/Projects/UOContent/Commands/HelpInfo.cs +++ b/Projects/UOContent/Commands/HelpInfo.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.Text; using Server.Commands.Generic; diff --git a/Projects/UOContent/Commands/SignParser.cs b/Projects/UOContent/Commands/SignParser.cs index c26f5fe5d..d0df6070d 100644 --- a/Projects/UOContent/Commands/SignParser.cs +++ b/Projects/UOContent/Commands/SignParser.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.IO; using Server.Items; diff --git a/Projects/UOContent/Engines/Chat/ChatActionHandlers.cs b/Projects/UOContent/Engines/Chat/ChatActionHandlers.cs index 64e071a75..472eb6ce2 100644 --- a/Projects/UOContent/Engines/Chat/ChatActionHandlers.cs +++ b/Projects/UOContent/Engines/Chat/ChatActionHandlers.cs @@ -1,5 +1,3 @@ -using System; - namespace Server.Engines.Chat { public static class ChatActionHandlers diff --git a/Projects/UOContent/Engines/Spawners/BaseSpawner.cs b/Projects/UOContent/Engines/Spawners/BaseSpawner.cs index b497f6117..4a4ce4c7f 100644 --- a/Projects/UOContent/Engines/Spawners/BaseSpawner.cs +++ b/Projects/UOContent/Engines/Spawners/BaseSpawner.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Reflection; using System.Text.Json; using Server.Commands; diff --git a/Projects/UOContent/Gumps/Guilds/GuildDeclareWarPrompt.cs b/Projects/UOContent/Gumps/Guilds/GuildDeclareWarPrompt.cs index 0b98e5ebd..323c9f981 100644 --- a/Projects/UOContent/Gumps/Guilds/GuildDeclareWarPrompt.cs +++ b/Projects/UOContent/Gumps/Guilds/GuildDeclareWarPrompt.cs @@ -1,4 +1,3 @@ -using System.Linq; using Server.Guilds; using Server.Prompts; diff --git a/Projects/UOContent/Gumps/Guilds/New Guild System/BaseGuildGump.cs b/Projects/UOContent/Gumps/Guilds/New Guild System/BaseGuildGump.cs index 6d32a40ca..e3ef78fac 100644 --- a/Projects/UOContent/Gumps/Guilds/New Guild System/BaseGuildGump.cs +++ b/Projects/UOContent/Gumps/Guilds/New Guild System/BaseGuildGump.cs @@ -1,4 +1,3 @@ -using System; using Server.Gumps; using Server.Misc; using Server.Mobiles; diff --git a/Projects/UOContent/Items/Body Parts/Head.cs b/Projects/UOContent/Items/Body Parts/Head.cs index 8af56e53c..7eb019426 100644 --- a/Projects/UOContent/Items/Body Parts/Head.cs +++ b/Projects/UOContent/Items/Body Parts/Head.cs @@ -1,5 +1,3 @@ -using System; - namespace Server.Items { public enum HeadType diff --git a/Projects/UOContent/Items/Books/BaseBook.cs b/Projects/UOContent/Items/Books/BaseBook.cs index 655fbd872..a571d3e2a 100644 --- a/Projects/UOContent/Items/Books/BaseBook.cs +++ b/Projects/UOContent/Items/Books/BaseBook.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Text; using Server.Buffers; using Server.ContextMenus; using Server.Gumps; diff --git a/Projects/UOContent/Items/Misc/Teleporter.cs b/Projects/UOContent/Items/Misc/Teleporter.cs index 778811f00..d56398fb8 100644 --- a/Projects/UOContent/Items/Misc/Teleporter.cs +++ b/Projects/UOContent/Items/Misc/Teleporter.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Text; using Server.Buffers; using Server.Mobiles; using Server.Network; diff --git a/Projects/UOContent/Misc/InhumanSpeech.cs b/Projects/UOContent/Misc/InhumanSpeech.cs index 9ca52dca5..1791082e1 100644 --- a/Projects/UOContent/Misc/InhumanSpeech.cs +++ b/Projects/UOContent/Misc/InhumanSpeech.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Text; using Server.Buffers; namespace Server.Misc diff --git a/Projects/UOContent/Mobiles/Vendors/NPC/AnimalTrainer.cs b/Projects/UOContent/Mobiles/Vendors/NPC/AnimalTrainer.cs index 6c22c1a7b..e7e9f4ca3 100644 --- a/Projects/UOContent/Mobiles/Vendors/NPC/AnimalTrainer.cs +++ b/Projects/UOContent/Mobiles/Vendors/NPC/AnimalTrainer.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using Server.ContextMenus; using Server.Gumps; diff --git a/Projects/UOContent/Skills/ForensicEval.cs b/Projects/UOContent/Skills/ForensicEval.cs index 92cb749f1..24ad06a9a 100644 --- a/Projects/UOContent/Skills/ForensicEval.cs +++ b/Projects/UOContent/Skills/ForensicEval.cs @@ -1,5 +1,4 @@ using System; -using System.Text; using Server.Buffers; using Server.Items; using Server.Mobiles;