diff --git a/Projects/UOContent/Engines/Ethics/Core/Ethic.cs b/Projects/UOContent/Engines/Ethics/Core/Ethic.cs index 22bb85c79..7c38c8c36 100644 --- a/Projects/UOContent/Engines/Ethics/Core/Ethic.cs +++ b/Projects/UOContent/Engines/Ethics/Core/Ethic.cs @@ -10,37 +10,23 @@ namespace Server.Ethics; [SerializationGenerator(1)] public abstract partial class Ethic : EthicsEntity { - public static Ethic Hero { get; private set; } - public static Ethic Evil { get; private set; } + public static Ethic Hero => Ethics[0]; + public static Ethic Evil => Ethics[1]; - public static readonly Ethic[] Ethics = - { - Hero, - Evil - }; + private static Ethic[] Ethics => [null, null]; public static bool RegisterEthic(Ethic ethic) { - if (ethic is HeroEthic) + if (ethic is HeroEthic && Hero == null) { - if (Hero == null) - { - Hero = ethic; - return true; - } - - return false; + Ethics[0] = ethic; + return true; } - if (ethic is EvilEthic) + if (ethic is EvilEthic && Evil == null) { - if (Evil == null) - { - Evil = ethic; - return true; - } - - return false; + Ethics[1] = ethic; + return true; } return false; @@ -58,6 +44,11 @@ public abstract partial class Ethic : EthicsEntity { if ((item.SavedFlags & 0x100) != 0) { + if (Hero == null) + { + return null; + } + if (item.Hue == Hero.Definition.PrimaryHue) { return Hero; @@ -68,6 +59,11 @@ public abstract partial class Ethic : EthicsEntity if ((item.SavedFlags & 0x200) != 0) { + if (Evil == null) + { + return null; + } + if (item.Hue == Evil.Definition.PrimaryHue) { return Evil; @@ -172,7 +168,7 @@ public abstract partial class Ethic : EthicsEntity { var ethic = Ethics[i]; - if (!ethic.IsEligible(e.Mobile)) + if (ethic?.IsEligible(e.Mobile) != true) { continue; } @@ -240,11 +236,7 @@ public abstract partial class Ethic : EthicsEntity } } - public static Ethic Find(Mobile mob) => Find(mob, false, false); - - public static Ethic Find(Mobile mob, bool inherit) => Find(mob, inherit, false); - - public static Ethic Find(Mobile mob, bool inherit, bool allegiance) + public static Ethic Find(Mobile mob, bool inherit = false, bool allegiance = false) { var pl = Player.Find(mob); @@ -255,14 +247,10 @@ public abstract partial class Ethic : EthicsEntity if (inherit && mob is BaseCreature bc) { - if (bc.Controlled) + var master = bc.GetMaster(); + if (master != null) { - return Find(bc.ControlMaster, false); - } - - if (bc.Summoned) - { - return Find(bc.SummonMaster, false); + return Find(master); } if (allegiance) diff --git a/Projects/UOContent/Engines/Ethics/Evil/Mobiles/UnholyFamiliar.cs b/Projects/UOContent/Engines/Ethics/Evil/Mobiles/UnholyFamiliar.cs index 84632e394..6b46807d6 100644 --- a/Projects/UOContent/Engines/Ethics/Evil/Mobiles/UnholyFamiliar.cs +++ b/Projects/UOContent/Engines/Ethics/Evil/Mobiles/UnholyFamiliar.cs @@ -54,15 +54,19 @@ public partial class UnholyFamiliar : BaseCreature public override string ApplyNameSuffix(string suffix) { - if (suffix.Length == 0) + var ethic = Ethic.Evil; + if (ethic == null) { - suffix = Ethic.Evil.Definition.Adjunct.String; - } - else - { - suffix = $"{suffix} {Ethic.Evil.Definition.Adjunct.String}"; + return base.ApplyNameSuffix(""); } - return base.ApplyNameSuffix(suffix); + var adjunct = ethic.Definition.Adjunct; + + if (suffix.Length == 0) + { + return base.ApplyNameSuffix(adjunct); + } + + return base.ApplyNameSuffix($"{suffix} {adjunct}"); } } diff --git a/Projects/UOContent/Engines/Ethics/Evil/Mobiles/UnholySteed.cs b/Projects/UOContent/Engines/Ethics/Evil/Mobiles/UnholySteed.cs index 9c8360e66..7ac77c40c 100644 --- a/Projects/UOContent/Engines/Ethics/Evil/Mobiles/UnholySteed.cs +++ b/Projects/UOContent/Engines/Ethics/Evil/Mobiles/UnholySteed.cs @@ -53,17 +53,25 @@ public partial class UnholySteed : BaseMount public override string ApplyNameSuffix(string suffix) { - if (suffix.Length == 0) + var ethic = Ethic.Evil; + if (ethic == null) { - return base.ApplyNameSuffix(Ethic.Evil.Definition.Adjunct.String); + return base.ApplyNameSuffix(""); } - return base.ApplyNameSuffix($"{suffix} {Ethic.Evil.Definition.Adjunct.String}"); + var adjunct = ethic.Definition.Adjunct; + + if (suffix.Length == 0) + { + return base.ApplyNameSuffix(adjunct); + } + + return base.ApplyNameSuffix($"{suffix} {adjunct}"); } public override void OnDoubleClick(Mobile from) { - if (Ethic.Find(from) != Ethic.Evil) + if (Ethic.Evil == null || Ethic.Find(from) != Ethic.Evil) { from.SendMessage("You may not ride this steed."); } diff --git a/Projects/UOContent/Engines/Ethics/Hero/Mobiles/HolyFamiliar.cs b/Projects/UOContent/Engines/Ethics/Hero/Mobiles/HolyFamiliar.cs index 37dc99fba..9acdc8b1e 100644 --- a/Projects/UOContent/Engines/Ethics/Hero/Mobiles/HolyFamiliar.cs +++ b/Projects/UOContent/Engines/Ethics/Hero/Mobiles/HolyFamiliar.cs @@ -55,15 +55,19 @@ public partial class HolyFamiliar : BaseCreature public override string ApplyNameSuffix(string suffix) { - if (suffix.Length == 0) + var ethic = Ethic.Hero; + if (ethic == null) { - suffix = Ethic.Hero.Definition.Adjunct.String; - } - else - { - suffix = $"{suffix} {Ethic.Hero.Definition.Adjunct.String}"; + return base.ApplyNameSuffix(""); } - return base.ApplyNameSuffix(suffix); + var adjunct = ethic.Definition.Adjunct; + + if (suffix.Length == 0) + { + return base.ApplyNameSuffix(adjunct); + } + + return base.ApplyNameSuffix($"{suffix} {adjunct}"); } } diff --git a/Projects/UOContent/Engines/Ethics/Hero/Mobiles/HolySteed.cs b/Projects/UOContent/Engines/Ethics/Hero/Mobiles/HolySteed.cs index 7bb0eab5c..edb076b79 100644 --- a/Projects/UOContent/Engines/Ethics/Hero/Mobiles/HolySteed.cs +++ b/Projects/UOContent/Engines/Ethics/Hero/Mobiles/HolySteed.cs @@ -53,17 +53,25 @@ public partial class HolySteed : BaseMount public override string ApplyNameSuffix(string suffix) { - if (suffix.Length == 0) + var ethic = Ethic.Hero; + if (ethic == null) { - return base.ApplyNameSuffix(Ethic.Hero.Definition.Adjunct.String); + return base.ApplyNameSuffix(""); } - return base.ApplyNameSuffix($"{suffix} {Ethic.Hero.Definition.Adjunct.String}"); + var adjunct = ethic.Definition.Adjunct; + + if (suffix.Length == 0) + { + return base.ApplyNameSuffix(adjunct); + } + + return base.ApplyNameSuffix($"{suffix} {adjunct}"); } public override void OnDoubleClick(Mobile from) { - if (Ethic.Find(from) != Ethic.Hero) + if (Ethic.Hero == null || Ethic.Find(from) != Ethic.Hero) { from.SendMessage("You may not ride this steed."); } diff --git a/Projects/UOContent/Mobiles/PlayerMobile.cs b/Projects/UOContent/Mobiles/PlayerMobile.cs index 61b1a01ad..f9b607cc9 100644 --- a/Projects/UOContent/Mobiles/PlayerMobile.cs +++ b/Projects/UOContent/Mobiles/PlayerMobile.cs @@ -1327,32 +1327,13 @@ namespace Server.Mobiles } var item = items[i]; + var itemEthic = Ethic.Find(item); - if ((item.SavedFlags & 0x100) != 0) + if (itemEthic != null && itemEthic != ethic) { - if (item.Hue != Ethic.Hero.Definition.PrimaryHue) - { - item.SavedFlags &= ~0x100; - } - else if (ethic != Ethic.Hero) - { - from.AddToBackpack(item); - moved = true; - continue; - } - } - else if ((item.SavedFlags & 0x200) != 0) - { - if (item.Hue != Ethic.Evil.Definition.PrimaryHue) - { - item.SavedFlags &= ~0x200; - } - else if (ethic != Ethic.Evil) - { - from.AddToBackpack(item); - moved = true; - continue; - } + from.AddToBackpack(item); + moved = true; + continue; } if (item is BaseWeapon weapon)