From b749d0d275d14712ee3e7bda59cfb1ee50e19d6d Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 19 Nov 2022 08:07:52 +1100 Subject: [PATCH] Remove NPC IEntityManager resolves (#12648) --- .../CoordinatesInRangePrecondition.cs | 6 +++--- .../CoordinatesNotInRangePrecondition.cs | 6 +++--- .../HTN/Preconditions/TargetInLOSPrecondition.cs | 5 +++-- .../HTN/Preconditions/TargetInRangePrecondition.cs | 6 +++--- .../Operators/Melee/MeleeOperator.cs | 2 +- .../HTN/PrimitiveTasks/Operators/MoveToOperator.cs | 14 +++++++------- .../PrimitiveTasks/Operators/NPCCombatOperator.cs | 2 +- .../Operators/PickAccessibleComponentOperator.cs | 6 +++--- .../Operators/PickAccessibleOperator.cs | 3 ++- .../HTN/PrimitiveTasks/Operators/RandomOperator.cs | 5 +++-- .../Operators/Ranged/RangedOperator.cs | 6 +++--- .../Operators/Specific/MedibotInjectOperator.cs | 2 +- .../Specific/PickNearbyInjectableOperator.cs | 2 +- .../HTN/PrimitiveTasks/Operators/WaitOperator.cs | 4 +++- Content.Server/NPC/NPCBlackboard.cs | 14 ++++++-------- .../NPC/Pathfinding/PathfindingSystem.cs | 7 +++---- 16 files changed, 46 insertions(+), 44 deletions(-) diff --git a/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs b/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs index a04a446c93..9d388fc762 100644 --- a/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs @@ -16,12 +16,12 @@ public sealed class CoordinatesInRangePrecondition : HTNPrecondition public override bool IsMet(NPCBlackboard blackboard) { - if (!blackboard.TryGetValue(NPCBlackboard.OwnerCoordinates, out var coordinates)) + if (!blackboard.TryGetValue(NPCBlackboard.OwnerCoordinates, out var coordinates, _entManager)) return false; - if (!blackboard.TryGetValue(TargetKey, out var target)) + if (!blackboard.TryGetValue(TargetKey, out var target, _entManager)) return false; - return coordinates.InRange(_entManager, target, blackboard.GetValueOrDefault(RangeKey)); + return coordinates.InRange(_entManager, target, blackboard.GetValueOrDefault(RangeKey, _entManager)); } } diff --git a/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs b/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs index d62e4af291..0688fb7e85 100644 --- a/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs @@ -16,13 +16,13 @@ public sealed class CoordinatesNotInRangePrecondition : HTNPrecondition public override bool IsMet(NPCBlackboard blackboard) { - if (!blackboard.TryGetValue(NPCBlackboard.OwnerCoordinates, out var coordinates)) + if (!blackboard.TryGetValue(NPCBlackboard.OwnerCoordinates, out var coordinates, _entManager)) return false; - if (!blackboard.TryGetValue(TargetKey, out var target)) + if (!blackboard.TryGetValue(TargetKey, out var target, _entManager)) return false; - return !coordinates.InRange(_entManager, target, blackboard.GetValueOrDefault(RangeKey)); + return !coordinates.InRange(_entManager, target, blackboard.GetValueOrDefault(RangeKey, _entManager)); } } diff --git a/Content.Server/NPC/HTN/Preconditions/TargetInLOSPrecondition.cs b/Content.Server/NPC/HTN/Preconditions/TargetInLOSPrecondition.cs index 165ea6911f..b8a6826123 100644 --- a/Content.Server/NPC/HTN/Preconditions/TargetInLOSPrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/TargetInLOSPrecondition.cs @@ -4,6 +4,7 @@ namespace Content.Server.NPC.HTN.Preconditions; public sealed class TargetInLOSPrecondition : HTNPrecondition { + [Dependency] private readonly IEntityManager _entManager = default!; private InteractionSystem _interaction = default!; [DataField("targetKey")] @@ -22,10 +23,10 @@ public sealed class TargetInLOSPrecondition : HTNPrecondition { var owner = blackboard.GetValue(NPCBlackboard.Owner); - if (!blackboard.TryGetValue(TargetKey, out var target)) + if (!blackboard.TryGetValue(TargetKey, out var target, _entManager)) return false; - var range = blackboard.GetValueOrDefault(RangeKey); + var range = blackboard.GetValueOrDefault(RangeKey, _entManager); return _interaction.InRangeUnobstructed(owner, target, range); } diff --git a/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs b/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs index 15e5af80a7..85eaf2f7b4 100644 --- a/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs @@ -16,13 +16,13 @@ public sealed class TargetInRangePrecondition : HTNPrecondition public override bool IsMet(NPCBlackboard blackboard) { - if (!blackboard.TryGetValue(NPCBlackboard.OwnerCoordinates, out var coordinates)) + if (!blackboard.TryGetValue(NPCBlackboard.OwnerCoordinates, out var coordinates, _entManager)) return false; - if (!blackboard.TryGetValue(TargetKey, out var target) || + if (!blackboard.TryGetValue(TargetKey, out var target, _entManager) || !_entManager.TryGetComponent(target, out var targetXform)) return false; - return coordinates.InRange(_entManager, targetXform.Coordinates, blackboard.GetValueOrDefault(RangeKey)); + return coordinates.InRange(_entManager, targetXform.Coordinates, blackboard.GetValueOrDefault(RangeKey, _entManager)); } } diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Melee/MeleeOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Melee/MeleeOperator.cs index dc77758ec7..00ca4dc611 100644 --- a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Melee/MeleeOperator.cs +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Melee/MeleeOperator.cs @@ -38,7 +38,7 @@ public sealed class MeleeOperator : HTNOperator CancellationToken cancelToken) { // Don't attack if they're already as wounded as we want them. - if (!blackboard.TryGetValue(TargetKey, out var target)) + if (!blackboard.TryGetValue(TargetKey, out var target, _entManager)) { return (false, null); } diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/MoveToOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/MoveToOperator.cs index 654fd4dd0c..c560fcbc0f 100644 --- a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/MoveToOperator.cs +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/MoveToOperator.cs @@ -60,7 +60,7 @@ public sealed class MoveToOperator : HTNOperator public override async Task<(bool Valid, Dictionary? Effects)> Plan(NPCBlackboard blackboard, CancellationToken cancelToken) { - if (!blackboard.TryGetValue(TargetKey, out var targetCoordinates)) + if (!blackboard.TryGetValue(TargetKey, out var targetCoordinates, _entManager)) { return (false, null); } @@ -77,14 +77,14 @@ public sealed class MoveToOperator : HTNOperator return (false, null); } - var range = blackboard.GetValueOrDefault(RangeKey); + var range = blackboard.GetValueOrDefault(RangeKey, _entManager); if (xform.Coordinates.TryDistance(_entManager, targetCoordinates, out var distance) && distance <= range) { // In range return (true, new Dictionary() { - {NPCBlackboard.OwnerCoordinates, blackboard.GetValueOrDefault(NPCBlackboard.OwnerCoordinates)} + {NPCBlackboard.OwnerCoordinates, blackboard.GetValueOrDefault(NPCBlackboard.OwnerCoordinates, _entManager)} }); } @@ -130,14 +130,14 @@ public sealed class MoveToOperator : HTNOperator // Re-use the path we may have if applicable. var comp = _steering.Register(blackboard.GetValue(NPCBlackboard.Owner), targetCoordinates); - if (blackboard.TryGetValue(RangeKey, out var range)) + if (blackboard.TryGetValue(RangeKey, out var range, _entManager)) { comp.Range = range; } - if (blackboard.TryGetValue(PathfindKey, out var result)) + if (blackboard.TryGetValue(PathfindKey, out var result, _entManager)) { - if (blackboard.TryGetValue(NPCBlackboard.OwnerCoordinates, out var coordinates)) + if (blackboard.TryGetValue(NPCBlackboard.OwnerCoordinates, out var coordinates, _entManager)) { var mapCoords = coordinates.ToMap(_entManager); _steering.PrunePath(mapCoords, targetCoordinates.ToMapPos(_entManager) - mapCoords.Position, result.Path); @@ -152,7 +152,7 @@ public sealed class MoveToOperator : HTNOperator base.Shutdown(blackboard, status); // Cleanup the blackboard and remove steering. - if (blackboard.TryGetValue(MovementCancelToken, out var cancelToken)) + if (blackboard.TryGetValue(MovementCancelToken, out var cancelToken, _entManager)) { cancelToken.Cancel(); blackboard.Remove(MovementCancelToken); diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/NPCCombatOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/NPCCombatOperator.cs index f29367bf93..86cfd739ba 100644 --- a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/NPCCombatOperator.cs +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/NPCCombatOperator.cs @@ -69,7 +69,7 @@ public abstract class NPCCombatOperator : HTNOperator var radius = blackboard.GetValueOrDefault(NPCBlackboard.VisionRadius, EntManager); var targets = new List<(EntityUid Entity, float Rating, float Distance)>(); - blackboard.TryGetValue(Key, out var existingTarget); + blackboard.TryGetValue(Key, out var existingTarget, EntManager); var xformQuery = EntManager.GetEntityQuery(); var mobQuery = EntManager.GetEntityQuery(); var canMove = blackboard.GetValueOrDefault(NPCBlackboard.CanMove, EntManager); diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/PickAccessibleComponentOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/PickAccessibleComponentOperator.cs index d7316fd6e0..464dc8eef4 100644 --- a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/PickAccessibleComponentOperator.cs +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/PickAccessibleComponentOperator.cs @@ -48,10 +48,10 @@ public sealed class PickAccessibleComponentOperator : HTNOperator return (false, null); } - var range = blackboard.GetValueOrDefault(RangeKey); + var range = blackboard.GetValueOrDefault(RangeKey, _entManager); var owner = blackboard.GetValue(NPCBlackboard.Owner); - if (!blackboard.TryGetValue(NPCBlackboard.OwnerCoordinates, out var coordinates)) + if (!blackboard.TryGetValue(NPCBlackboard.OwnerCoordinates, out var coordinates, _entManager)) { return (false, null); } @@ -76,7 +76,7 @@ public sealed class PickAccessibleComponentOperator : HTNOperator return (false, null); } - blackboard.TryGetValue(RangeKey, out var maxRange); + blackboard.TryGetValue(RangeKey, out var maxRange, _entManager); if (maxRange == 0f) maxRange = 7f; diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/PickAccessibleOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/PickAccessibleOperator.cs index b96db18be7..d73e9d7649 100644 --- a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/PickAccessibleOperator.cs +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/PickAccessibleOperator.cs @@ -10,6 +10,7 @@ namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators; /// public sealed class PickAccessibleOperator : HTNOperator { + [Dependency] private readonly IEntityManager _entManager = default!; private PathfindingSystem _pathfinding = default!; [DataField("rangeKey", required: true)] @@ -37,7 +38,7 @@ public sealed class PickAccessibleOperator : HTNOperator // Very inefficient (should weight each region by its node count) but better than the old system var owner = blackboard.GetValue(NPCBlackboard.Owner); - blackboard.TryGetValue(RangeKey, out var maxRange); + blackboard.TryGetValue(RangeKey, out var maxRange, _entManager); if (maxRange == 0f) maxRange = 7f; diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/RandomOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/RandomOperator.cs index cda29518a9..1d8a23bd12 100644 --- a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/RandomOperator.cs +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/RandomOperator.cs @@ -6,6 +6,7 @@ namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators; public sealed class RandomOperator : HTNOperator { + [Dependency] private readonly IEntityManager _entManager = default!; [Dependency] private readonly IRobustRandom _random = default!; /// @@ -30,8 +31,8 @@ public sealed class RandomOperator : HTNOperator { { TargetKey, - _random.NextFloat(blackboard.GetValueOrDefault(MinKey), - blackboard.GetValueOrDefault(MaxKey)) + _random.NextFloat(blackboard.GetValueOrDefault(MinKey, _entManager), + blackboard.GetValueOrDefault(MaxKey, _entManager)) } }); } diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Ranged/RangedOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Ranged/RangedOperator.cs index ddd8551de4..fa6976abf2 100644 --- a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Ranged/RangedOperator.cs +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Ranged/RangedOperator.cs @@ -29,7 +29,7 @@ public sealed class RangedOperator : HTNOperator CancellationToken cancelToken) { // Don't attack if they're already as wounded as we want them. - if (!blackboard.TryGetValue(TargetKey, out var target)) + if (!blackboard.TryGetValue(TargetKey, out var target, _entManager)) { return (false, null); } @@ -50,12 +50,12 @@ public sealed class RangedOperator : HTNOperator var ranged = _entManager.EnsureComponent(blackboard.GetValue(NPCBlackboard.Owner)); ranged.Target = blackboard.GetValue(TargetKey); - if (blackboard.TryGetValue(NPCBlackboard.RotateSpeed, out var rotSpeed)) + if (blackboard.TryGetValue(NPCBlackboard.RotateSpeed, out var rotSpeed, _entManager)) { ranged.RotationSpeed = new Angle(rotSpeed); } - if (blackboard.TryGetValue("SoundTargetInLOS", out var losSound)) + if (blackboard.TryGetValue("SoundTargetInLOS", out var losSound, _entManager)) { ranged.SoundTargetInLOS = losSound; } diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Specific/MedibotInjectOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Specific/MedibotInjectOperator.cs index ec4f960c64..5693311d83 100644 --- a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Specific/MedibotInjectOperator.cs +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Specific/MedibotInjectOperator.cs @@ -44,7 +44,7 @@ public sealed class MedibotInjectOperator : HTNOperator // TODO: Wat var owner = blackboard.GetValue(NPCBlackboard.Owner); - if (!blackboard.TryGetValue(TargetKey, out var target) || _entManager.Deleted(target)) + if (!blackboard.TryGetValue(TargetKey, out var target, _entManager) || _entManager.Deleted(target)) return HTNOperatorStatus.Failed; if (!_entManager.TryGetComponent(owner, out var botComp)) diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Specific/PickNearbyInjectableOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Specific/PickNearbyInjectableOperator.cs index b3c96bf742..0da6c092fc 100644 --- a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Specific/PickNearbyInjectableOperator.cs +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Specific/PickNearbyInjectableOperator.cs @@ -41,7 +41,7 @@ public sealed class PickNearbyInjectableOperator : HTNOperator { var owner = blackboard.GetValue(NPCBlackboard.Owner); - if (!blackboard.TryGetValue(RangeKey, out var range)) + if (!blackboard.TryGetValue(RangeKey, out var range, _entManager)) return (false, null); var damageQuery = _entManager.GetEntityQuery(); diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/WaitOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/WaitOperator.cs index 1ed1ccf6cb..a992d5eccc 100644 --- a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/WaitOperator.cs +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/WaitOperator.cs @@ -5,6 +5,8 @@ namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators; /// public sealed class WaitOperator : HTNOperator { + [Dependency] private readonly IEntityManager _entManager = default!; + /// /// Blackboard key for the time we'll wait for. /// @@ -12,7 +14,7 @@ public sealed class WaitOperator : HTNOperator public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime) { - if (!blackboard.TryGetValue(Key, out var timer)) + if (!blackboard.TryGetValue(Key, out var timer, _entManager)) { return HTNOperatorStatus.Finished; } diff --git a/Content.Server/NPC/NPCBlackboard.cs b/Content.Server/NPC/NPCBlackboard.cs index 4f3c97dd2b..6d93b6c814 100644 --- a/Content.Server/NPC/NPCBlackboard.cs +++ b/Content.Server/NPC/NPCBlackboard.cs @@ -67,7 +67,7 @@ public sealed class NPCBlackboard : IEnumerable> /// /// Tries to get the blackboard data for a particular key. Returns default if not found /// - public T? GetValueOrDefault(string key, IEntityManager? entManager = null) + public T? GetValueOrDefault(string key, IEntityManager entManager) { if (_blackboard.TryGetValue(key, out var value)) { @@ -90,7 +90,7 @@ public sealed class NPCBlackboard : IEnumerable> /// /// Tries to get the blackboard data for a particular key. /// - public bool TryGetValue(string key, [NotNullWhen(true)] out T? value, IEntityManager? entManager = null) + public bool TryGetValue(string key, [NotNullWhen(true)] out T? value, IEntityManager entManager) { if (_blackboard.TryGetValue(key, out var data)) { @@ -130,17 +130,15 @@ public sealed class NPCBlackboard : IEnumerable> DebugTools.Assert(false, $"Tried to write to an NPC blackboard that is readonly!"); } - private bool TryGetEntityDefault(string key, [NotNullWhen(true)] out object? value, IEntityManager? entManager = null) + private bool TryGetEntityDefault(string key, [NotNullWhen(true)] out object? value, IEntityManager entManager) { - // TODO: Pass this in - IoCManager.Resolve(ref entManager); value = default; EntityUid owner; switch (key) { case Access: - if (!TryGetValue(Owner, out owner)) + if (!TryGetValue(Owner, out owner, entManager)) { return false; } @@ -149,7 +147,7 @@ public sealed class NPCBlackboard : IEnumerable> value = access.FindAccessTags(owner); return true; case CanMove: - if (!TryGetValue(Owner, out owner)) + if (!TryGetValue(Owner, out owner, entManager)) { return false; } @@ -158,7 +156,7 @@ public sealed class NPCBlackboard : IEnumerable> value = blocker.CanMove(owner); return true; case OwnerCoordinates: - if (!TryGetValue(Owner, out owner)) + if (!TryGetValue(Owner, out owner, entManager)) { return false; } diff --git a/Content.Server/NPC/Pathfinding/PathfindingSystem.cs b/Content.Server/NPC/Pathfinding/PathfindingSystem.cs index fccce2e65f..4f2e22bcb3 100644 --- a/Content.Server/NPC/Pathfinding/PathfindingSystem.cs +++ b/Content.Server/NPC/Pathfinding/PathfindingSystem.cs @@ -131,7 +131,6 @@ namespace Content.Server.NPC.Pathfinding switch (result) { case PathResult.Continuing: - DebugTools.Assert(path.Frontier.Count > 0); break; case PathResult.PartialPath: case PathResult.Path: @@ -409,17 +408,17 @@ namespace Content.Server.NPC.Pathfinding { var flags = PathFlags.None; - if (blackboard.TryGetValue(NPCBlackboard.NavPry, out var pry) && pry) + if (blackboard.TryGetValue(NPCBlackboard.NavPry, out var pry, EntityManager) && pry) { flags |= PathFlags.Prying; } - if (blackboard.TryGetValue(NPCBlackboard.NavSmash, out var smash) && smash) + if (blackboard.TryGetValue(NPCBlackboard.NavSmash, out var smash, EntityManager) && smash) { flags |= PathFlags.Smashing; } - if (blackboard.TryGetValue(NPCBlackboard.NavInteract, out var interact) && interact) + if (blackboard.TryGetValue(NPCBlackboard.NavInteract, out var interact, EntityManager) && interact) { flags |= PathFlags.Interact; }