From e4178bb495e563d7da0247ea19436caf6964baf5 Mon Sep 17 00:00:00 2001 From: Bohica <53943479+Bohicatv@users.noreply.github.com> Date: Thu, 5 Feb 2026 15:38:39 -0800 Subject: [PATCH] fix: pets will now fallback to follow/stay/guard after combat (#2325) --- .../UOContent/Mobiles/AI/BaseAI/PetOrders.cs | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/Projects/UOContent/Mobiles/AI/BaseAI/PetOrders.cs b/Projects/UOContent/Mobiles/AI/BaseAI/PetOrders.cs index 3e3d70a67..3e76343cd 100644 --- a/Projects/UOContent/Mobiles/AI/BaseAI/PetOrders.cs +++ b/Projects/UOContent/Mobiles/AI/BaseAI/PetOrders.cs @@ -17,6 +17,8 @@ namespace Server.Mobiles; public abstract partial class BaseAI { + private OrderType _lastPetOrder = OrderType.None; + public virtual bool Obey() => !Mobile.Deleted && Mobile.ControlOrder switch { @@ -41,6 +43,32 @@ public abstract partial class BaseAI Mobile.Warmode = IsValidCombatant(Mobile.Combatant); + if (_lastPetOrder == OrderType.Guard) + { + DebugSay("Target lost, resuming guard duty."); + + Mobile.ControlOrder = OrderType.Guard; + _lastPetOrder = OrderType.None; + return true; + } + else if (_lastPetOrder == OrderType.Stay) + { + DebugSay("Target lost, resuming stay position."); + + Mobile.ControlOrder = OrderType.Stay; + _lastPetOrder = OrderType.None; + return true; + } + else if (_lastPetOrder == OrderType.Follow) + { + DebugSay("Target lost, resuming follow command."); + + Mobile.ControlTarget = Mobile.ControlMaster; + Mobile.ControlOrder = OrderType.Follow; + _lastPetOrder = OrderType.None; + return true; + } + WalkRandom(3, 2, 1); return true; } @@ -78,6 +106,8 @@ public abstract partial class BaseAI if (Mobile.ControlTarget?.Deleted == false && Mobile.ControlTarget != Mobile) { + _lastPetOrder = OrderType.Follow; + FollowTarget(); } else @@ -266,7 +296,7 @@ public abstract partial class BaseAI return true; } - Action = ActionType.Guard; + _lastPetOrder = OrderType.Guard; FindCombatant(); @@ -442,6 +472,8 @@ public abstract partial class BaseAI this.DebugSayFormatted($"I have been ordered to stay by {Mobile.ControlMaster?.Name ?? "Unknown"}."); } + _lastPetOrder = OrderType.Stay; + WalkRandomInHome(3, 2, 1); return true; }