From bb2999d3ab21c6f03bbc8557d55eff0e9fa24837 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Sat, 16 Oct 2021 19:22:19 -0700 Subject: [PATCH] WIP-broken --- .../UOContent/Mobiles/AI/BehaviorTreeAI.cs | 18 ++--- .../Mobiles/BT/Actions/CastSpellActionNode.cs | 8 +- .../Mobiles/BT/Actions/MageComboNode.cs | 4 + .../Mobiles/BehaviorAI/Core/Behavior.cs | 11 ++- .../Mobiles/BehaviorAI/Core/BehaviorTree.cs | 77 +++++++------------ .../Mobiles/BehaviorAI/Core/Composite.cs | 2 +- .../Mobiles/BehaviorAI/Core/Decorator.cs | 8 +- .../Mobiles/BehaviorAI/Leaf/CastSpell.cs | 8 +- 8 files changed, 63 insertions(+), 73 deletions(-) diff --git a/Projects/UOContent/Mobiles/AI/BehaviorTreeAI.cs b/Projects/UOContent/Mobiles/AI/BehaviorTreeAI.cs index 25426ab0a..123fd5f60 100644 --- a/Projects/UOContent/Mobiles/AI/BehaviorTreeAI.cs +++ b/Projects/UOContent/Mobiles/AI/BehaviorTreeAI.cs @@ -13,8 +13,8 @@ namespace Server.Mobiles.AI public class BehaviorTreeAI : BaseAI { private Blackboard blackboard; - private BehaviorTree behaviorTree; - private BehaviorTreeContext behaviorTreeContext; + private readonly BehaviorTree behaviorTree; + private readonly BehaviorTreeContext behaviorTreeContext; public BehaviorTreeAI(BaseCreature m) : base(m) { // blackboard = new Blackboard(); @@ -25,13 +25,13 @@ namespace Server.Mobiles.AI new Selector(behaviorTree) .AddChild(new MageCombat(behaviorTree)) .AddChild(new MagePassive(behaviorTree)) - /* - new Sequence(behaviorTree) - .AddChild(new Condition(behaviorTree, (context) => context.Mobile.RawStr - context.Mobile.Str == 0)) - .AddChild(new CastSpell(behaviorTree, (context) => new BlessSpell(context.Mobile))) - .AddChild(new WaitForTarget(behaviorTree)) - .AddChild(new DynamicTarget(behaviorTree, (context) => context.Mobile)) - */ + /* + new Sequence(behaviorTree) + .AddChild(new Condition(behaviorTree, (context) => context.Mobile.RawStr - context.Mobile.Str == 0)) + .AddChild(new CastSpell(behaviorTree, (context) => new BlessSpell(context.Mobile))) + .AddChild(new WaitForTarget(behaviorTree)) + .AddChild(new DynamicTarget(behaviorTree, (context) => context.Mobile)) + */ ); behaviorTree.Start(behaviorTreeContext); diff --git a/Projects/UOContent/Mobiles/BT/Actions/CastSpellActionNode.cs b/Projects/UOContent/Mobiles/BT/Actions/CastSpellActionNode.cs index 232331ccc..831491cbd 100644 --- a/Projects/UOContent/Mobiles/BT/Actions/CastSpellActionNode.cs +++ b/Projects/UOContent/Mobiles/BT/Actions/CastSpellActionNode.cs @@ -40,16 +40,20 @@ namespace Server.Mobiles.BT } if (!string.IsNullOrEmpty(spell.Mantra)) + { mob.PublicOverheadMessage(Network.MessageType.Spell, 0, false, spell.Mantra, false); + } return Result.Running; } - else if (mob.Spell.IsCasting) + + if (mob.Spell.IsCasting) { mob.DebugSay("Still casting..."); return Result.Running; } - else if (!mob.Spell.IsCasting) + + if (!mob.Spell.IsCasting) { mob.DebugSay("Finished casting..."); return Result.Success; diff --git a/Projects/UOContent/Mobiles/BT/Actions/MageComboNode.cs b/Projects/UOContent/Mobiles/BT/Actions/MageComboNode.cs index b6ff1ec06..f55ddb194 100644 --- a/Projects/UOContent/Mobiles/BT/Actions/MageComboNode.cs +++ b/Projects/UOContent/Mobiles/BT/Actions/MageComboNode.cs @@ -73,14 +73,18 @@ namespace Server.Mobiles.BT } if (mob.Combatant.Meditating) + { return true; + } return false; } private static bool shouldContinueCombo(BaseCreature mob, Blackboard board) { if (mob.Combatant == null || mob.Combatant.Deleted) + { return false; + } if (mob.Combatant.HitsMax - mob.Combatant.Hits >= 70) { diff --git a/Projects/UOContent/Mobiles/BehaviorAI/Core/Behavior.cs b/Projects/UOContent/Mobiles/BehaviorAI/Core/Behavior.cs index e0f6a2f21..4e534fcdf 100644 --- a/Projects/UOContent/Mobiles/BehaviorAI/Core/Behavior.cs +++ b/Projects/UOContent/Mobiles/BehaviorAI/Core/Behavior.cs @@ -7,13 +7,15 @@ namespace Server.Mobiles.BehaviorAI { Success, Failure, - Running + Running, + Terminated } public abstract class Behavior { public BehaviorTree Tree { get; protected set; } public BehaviorObserver Observer { get; protected set; } - private Dictionary lastResultCache; + private readonly Dictionary lastResultCache; + public virtual bool IsRunning(BehaviorTreeContext context) => GetResult(context) == Result.Running; public Behavior(BehaviorTree tree) { @@ -30,14 +32,15 @@ namespace Server.Mobiles.BehaviorAI { if (!lastResultCache.TryGetValue(context.Mobile, out Result result)) { - result = Result.Failure; + result = Result.Terminated; lastResultCache.Add(context.Mobile, result); } + return result; } public void SetResult(BehaviorTreeContext context, Result result) { - if (!lastResultCache.TryGetValue(context.Mobile, out Result old)) + if (!lastResultCache.TryGetValue(context.Mobile, out _)) { lastResultCache.Add(context.Mobile, Result.Failure); } diff --git a/Projects/UOContent/Mobiles/BehaviorAI/Core/BehaviorTree.cs b/Projects/UOContent/Mobiles/BehaviorAI/Core/BehaviorTree.cs index b8a1bb08f..b913dc5b0 100644 --- a/Projects/UOContent/Mobiles/BehaviorAI/Core/BehaviorTree.cs +++ b/Projects/UOContent/Mobiles/BehaviorAI/Core/BehaviorTree.cs @@ -9,12 +9,12 @@ namespace Server.Mobiles.BehaviorAI public class BehaviorTree { public Behavior Root { get; private set; } - private Dictionary> behaviorQueueCache; - private Dictionary executingCache; + private readonly Dictionary> _behaviorQueueCache; + private readonly Dictionary _executingCache; public BehaviorTree() { - behaviorQueueCache = new Dictionary>(); - executingCache = new Dictionary(); + _behaviorQueueCache = new Dictionary>(); + _executingCache = new Dictionary(); } public bool TryAddRoot(Composite behavior) { @@ -38,30 +38,29 @@ namespace Server.Mobiles.BehaviorAI } public virtual void Tick(BehaviorTreeContext context) { - if (!executingCache.TryGetValue(context.Mobile, out bool executing)) + if (!_executingCache.TryGetValue(context.Mobile, out bool executing)) { executing = false; - executingCache[context.Mobile] = executing; + _executingCache[context.Mobile] = executing; } if (!executing) { - executingCache[context.Mobile] = true; + _executingCache[context.Mobile] = true; Queue queue = getQueue(context); queue.Enqueue(null); while (Step(context)) { } - executingCache[context.Mobile] = false; + _executingCache[context.Mobile] = false; } } public virtual bool Step(BehaviorTreeContext context) { Queue queue = getQueue(context); - BehaviorQueueEntry current = queue.Dequeue(); - if (current == null || current.Behavior == null || current.Context == null) + if (current?.Behavior == null || current.Context == null) { return false; } @@ -70,10 +69,8 @@ namespace Server.Mobiles.BehaviorAI if (!current.Behavior.IsRunning(current.Context)) { - if (current.Observer != null) - { - current.Observer(current.Context, current.Behavior.GetResult(current.Context)); - } + current.Observer?.Invoke(current.Context, current.Behavior.GetResult(current.Context)); + current.Behavior.SetResult(context, Result.Terminated); return true; } @@ -86,20 +83,20 @@ namespace Server.Mobiles.BehaviorAI } public void Enqueue(BehaviorTreeContext context, Behavior behavior, BehaviorObserver observer) { - if (!behaviorQueueCache.TryGetValue(context.Mobile, out Queue queue)) + if (!_behaviorQueueCache.TryGetValue(context.Mobile, out Queue queue)) { queue = new Queue(); - behaviorQueueCache.Add(context.Mobile, queue); + _behaviorQueueCache.Add(context.Mobile, queue); } queue.Enqueue(new BehaviorQueueEntry(context, behavior, observer)); } private Queue getQueue(BehaviorTreeContext context) { - if (!behaviorQueueCache.TryGetValue(context.Mobile, out Queue queue)) + if (!_behaviorQueueCache.TryGetValue(context.Mobile, out Queue queue)) { queue = new Queue(); - behaviorQueueCache.Add(context.Mobile, queue); + _behaviorQueueCache.Add(context.Mobile, queue); } return queue; @@ -195,38 +192,18 @@ namespace Server.Mobiles.BehaviorAI { var random = Utility.Random(0, 32); - Direction direction; - - switch (random) + Direction direction = random switch { - case 0: - direction = Direction.Up; - break; - case 1: - direction = Direction.North; - break; - case 2: - direction = Direction.Left; - break; - case 3: - direction = Direction.West; - break; - case 5: - direction = Direction.Down; - break; - case 6: - direction = Direction.South; - break; - case 7: - direction = Direction.Right; - break; - case 8: - direction = Direction.East; - break; - default: - direction = mob.Direction; - break; - } + 0 => Direction.Up, + 1 => Direction.North, + 2 => Direction.Left, + 3 => Direction.West, + 5 => Direction.Down, + 6 => Direction.South, + 7 => Direction.Right, + 8 => Direction.East, + _ => mob.Direction + }; DoMove(context, direction, run); } @@ -327,7 +304,9 @@ namespace Server.Mobiles.BehaviorAI } if (obstacles.Count > 0) + { blocked = true; + } while (obstacles.Count > 0) { diff --git a/Projects/UOContent/Mobiles/BehaviorAI/Core/Composite.cs b/Projects/UOContent/Mobiles/BehaviorAI/Core/Composite.cs index 163816218..7965185e6 100644 --- a/Projects/UOContent/Mobiles/BehaviorAI/Core/Composite.cs +++ b/Projects/UOContent/Mobiles/BehaviorAI/Core/Composite.cs @@ -27,7 +27,7 @@ namespace Server.Mobiles.BehaviorAI currentChildCache.Add(context.Mobile, currentChild); } - if (GetResult(context) != Result.Running) + if (GetResult(context) != Result.Terminated) { currentChild = 0; currentChildCache[context.Mobile] = currentChild; diff --git a/Projects/UOContent/Mobiles/BehaviorAI/Core/Decorator.cs b/Projects/UOContent/Mobiles/BehaviorAI/Core/Decorator.cs index feb48dedf..91a36841a 100644 --- a/Projects/UOContent/Mobiles/BehaviorAI/Core/Decorator.cs +++ b/Projects/UOContent/Mobiles/BehaviorAI/Core/Decorator.cs @@ -12,19 +12,15 @@ namespace Server.Mobiles.BehaviorAI } public virtual Decorator AddChild(Behavior child) { - if (Child == null) - { - Child = child; - } + Child ??= child; return this; } public override void Tick(BehaviorTreeContext context) { - if (Child != null && GetResult(context) != Result.Running) + if (Child != null && GetResult(context) != Result.Terminated) { Tree.Enqueue(context, Child, OnChildComplete); SetResult(context, Result.Running); - return; } } public virtual void OnChildComplete(BehaviorTreeContext context, Result lastResult) diff --git a/Projects/UOContent/Mobiles/BehaviorAI/Leaf/CastSpell.cs b/Projects/UOContent/Mobiles/BehaviorAI/Leaf/CastSpell.cs index 29afb006b..5d06eee49 100644 --- a/Projects/UOContent/Mobiles/BehaviorAI/Leaf/CastSpell.cs +++ b/Projects/UOContent/Mobiles/BehaviorAI/Leaf/CastSpell.cs @@ -41,18 +41,22 @@ namespace Server.Mobiles.BehaviorAI owner.DebugSay("Casting {0}...", spell.Name); if (!string.IsNullOrEmpty(spell.Mantra)) + { owner.PublicOverheadMessage(Network.MessageType.Spell, owner.SpeechHue, false, spell.Mantra, false); + } SetResult(context, Result.Running); return; } - else if (owner.Spell.IsCasting) + + if (owner.Spell.IsCasting) { SetResult(context, Result.Running); owner.DebugSay("Already casting {0}...", ((Spell)owner.Spell).Name); return; } - else if (!owner.Spell.IsCasting && ((Spell)owner.Spell).State == SpellState.Sequencing) + + if (!owner.Spell.IsCasting && ((Spell)owner.Spell).State == SpellState.Sequencing) { SetResult(context, Result.Success); owner.DebugSay("Finished casting {0}...", ((Spell)owner.Spell).Name);