diff --git a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/PlayerPacketTests.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/PlayerPacketTests.cs index 04527d609..2e20a6f80 100644 --- a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/PlayerPacketTests.cs +++ b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/PlayerPacketTests.cs @@ -42,15 +42,13 @@ namespace Server.Tests.Network AssertThat.Equal(result, expected); } - [Theory] - [InlineData(false)] - [InlineData(true)] - public void TestDeathStatus(bool dead) + [Fact] + public void TestDeathStatus() { - var expected = new DeathStatus(dead).Compile(); + var expected = new DeathStatus(false).Compile(); var ns = PacketTestUtilities.CreateTestNetState(); - ns.SendDeathStatus(dead); + ns.SendDeathStatus(); var result = ns.SendPipe.Reader.AvailableToRead(); AssertThat.Equal(result, expected); diff --git a/Projects/Server/Items/Item.cs b/Projects/Server/Items/Item.cs index d78731611..055995644 100644 --- a/Projects/Server/Items/Item.cs +++ b/Projects/Server/Items/Item.cs @@ -585,7 +585,8 @@ public class Item : IHued, IComparable, ISpawnable, IObjectPropertyListEnt } } - [CommandProperty(AccessLevel.GameMaster, AccessLevel.Developer)] + // Note: Setting the parent via command/props causes problems. + [CommandProperty(AccessLevel.GameMaster, readOnly: true)] public IEntity Parent { get => m_Parent; diff --git a/Projects/Server/Mobiles/Mobile.cs b/Projects/Server/Mobiles/Mobile.cs index 632dc7507..986cd7c47 100644 --- a/Projects/Server/Mobiles/Mobile.cs +++ b/Projects/Server/Mobiles/Mobile.cs @@ -4564,7 +4564,6 @@ public partial class Mobile : IHued, IComparable, ISpawnable, IObjectPro } } - SendIncomingPacket(); SendIncomingPacket(); OnAfterResurrect(); @@ -4860,7 +4859,7 @@ public partial class Mobile : IHued, IComparable, ISpawnable, IObjectPro } else { - m_NetState.SendDeathStatus(true); + m_NetState.SendDeathStatus(); Warmode = false; @@ -4886,8 +4885,6 @@ public partial class Mobile : IHued, IComparable, ISpawnable, IObjectPro ProcessDelta(); - m_NetState.SendDeathStatus(false); - CheckStatTimers(); } } @@ -6923,14 +6920,8 @@ public partial class Mobile : IHued, IComparable, ISpawnable, IObjectPro if (ns.StygianAbyss) { - if (m.Blessed || m.YellowHealthbar) - { - ns.SendMobileHealthbar(m, Healthbar.Yellow); - } - else if (m.Poisoned) - { - ns.SendMobileHealthbar(m, Healthbar.Poison); - } + ns.SendMobileHealthbar(m, Healthbar.Yellow); + ns.SendMobileHealthbar(m, Healthbar.Poison); } if (m.IsDeadBondedPet) diff --git a/Projects/Server/Network/Packets/OutgoingPlayerPackets.cs b/Projects/Server/Network/Packets/OutgoingPlayerPackets.cs index c774b6607..f12fc388f 100644 --- a/Projects/Server/Network/Packets/OutgoingPlayerPackets.cs +++ b/Projects/Server/Network/Packets/OutgoingPlayerPackets.cs @@ -60,8 +60,8 @@ public static class OutgoingPlayerPackets ns?.Send(stackalloc byte[] { 0xC8, range }); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void SendDeathStatus(this NetState ns, bool dead) => - ns?.Send(stackalloc byte[] { 0x2C, dead ? (byte)0 : (byte)2 }); + public static void SendDeathStatus(this NetState ns) => + ns?.Send(stackalloc byte[] { 0x2C, 2 }); public static void SendDisplayProfile(this NetState ns, Serial m, string header, string body, string footer) { diff --git a/Projects/UOContent/Gumps/Props/PropsGump.cs b/Projects/UOContent/Gumps/Props/PropsGump.cs index 2a66c32ed..caced7f81 100644 --- a/Projects/UOContent/Gumps/Props/PropsGump.cs +++ b/Projects/UOContent/Gumps/Props/PropsGump.cs @@ -303,7 +303,7 @@ namespace Server.Gumps var type = prop.PropertyType; - if (IsType(type, OfMobile) || IsType(type, OfItem)) + if (IsType(type, OfEntity)) { from.SendGump(new SetObjectGump(prop, from, m_Object, type, this)); } diff --git a/Projects/UOContent/Mobiles/BaseCreature.cs b/Projects/UOContent/Mobiles/BaseCreature.cs index 1705d0df6..9dcd892ec 100644 --- a/Projects/UOContent/Mobiles/BaseCreature.cs +++ b/Projects/UOContent/Mobiles/BaseCreature.cs @@ -3223,7 +3223,6 @@ namespace Server.Mobiles ProcessDelta(); SendIncomingPacket(); - SendIncomingPacket(); // TODO: This can be done in Parallel if there are lots of them. var aggressors = Aggressors; @@ -3841,7 +3840,6 @@ namespace Server.Mobiles OutgoingMobilePackets.CreateBondedStatus(buffer, Serial, false); Effects.SendPacket(Location, Map, buffer); - SendIncomingPacket(); SendIncomingPacket(); OnAfterResurrect(); diff --git a/Projects/UOContent/Utilities/Types.cs b/Projects/UOContent/Utilities/Types.cs index faf482a6c..4860f2269 100644 --- a/Projects/UOContent/Utilities/Types.cs +++ b/Projects/UOContent/Utilities/Types.cs @@ -137,8 +137,9 @@ namespace Server { constructed = null; var isSerial = IsType(type, OfSerial); + var isEntity = IsType(type, OfEntity); - if (isSerial) // mutate into int32 + if (isSerial || isEntity) // mutate into int32 { type = OfInt; } @@ -194,19 +195,33 @@ namespace Server constructed = parsed; return null; } - + return "Not a valid boolean string."; } - if (value.StartsWithOrdinal("0x") && IsNumeric(type)) + if (IsNumeric(type)) { try { - if (ulong.TryParse(value.AsSpan(2), NumberStyles.HexNumber, null, out var num)) + var isHex = value.StartsWithOrdinal("0x"); + var index = isHex ? 2 : 0; + if (ulong.TryParse(value.AsSpan(index), isHex ? NumberStyles.HexNumber : NumberStyles.Integer, null, out var num)) { - constructed = Convert.ChangeType(num, type); + if (isEntity) + { + constructed = World.FindEntity((Serial)num); + } + else if (isSerial) + { + constructed = (Serial)num; + } + else + { + constructed = Convert.ChangeType(num, type); + } + + return null; } - return null; } catch { @@ -230,11 +245,6 @@ namespace Server try { constructed = Convert.ChangeType(value, type); - if (isSerial) // mutate back - { - constructed = (Serial)(constructed ?? Serial.MinusOne); - } - return null; } catch