Skip to content

Commit

Permalink
Implement Health Consideration for NPCs (space-wizards#29922)
Browse files Browse the repository at this point in the history
Implement TargetHealthCon
  • Loading branch information
osjarw authored and themias committed Aug 9, 2024
1 parent 2711c98 commit 4963d0b
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 1 deletion.
10 changes: 10 additions & 0 deletions Content.Server/NPC/Queries/Considerations/TargetHealthCon.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
using Content.Shared.Mobs;

namespace Content.Server.NPC.Queries.Considerations;

/// <summary>
/// Goes linearly from 1f to 0f, with 0 damage returning 1f and <see cref=TargetState> damage returning 0f
/// </summary>
public sealed partial class TargetHealthCon : UtilityConsideration
{

/// <summary>
/// Which MobState the consideration returns 0f at, defaults to choosing earliest incapacitating MobState
/// </summary>
[DataField("targetState")]
public MobState TargetState = MobState.Invalid;
}
12 changes: 11 additions & 1 deletion Content.Server/NPC/Systems/NPCUtilitySystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,13 @@
using Content.Server.Nutrition.Components;
using Content.Server.Nutrition.EntitySystems;
using Content.Server.Storage.Components;
using Content.Shared.Damage;
using Content.Shared.Examine;
using Content.Shared.Fluids.Components;
using Content.Shared.Hands.Components;
using Content.Shared.Inventory;
using Content.Shared.Mobs;
using Content.Shared.Mobs.Components;
using Content.Shared.Mobs.Systems;
using Content.Shared.NPC.Systems;
using Content.Shared.Nutrition.Components;
Expand Down Expand Up @@ -48,6 +51,7 @@ public sealed class NPCUtilitySystem : EntitySystem
[Dependency] private readonly WeldableSystem _weldable = default!;
[Dependency] private readonly ExamineSystemShared _examine = default!;
[Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!;
[Dependency] private readonly MobThresholdSystem _thresholdSystem = default!;

private EntityQuery<PuddleComponent> _puddleQuery;
private EntityQuery<TransformComponent> _xformQuery;
Expand Down Expand Up @@ -293,8 +297,14 @@ private float GetScore(NPCBlackboard blackboard, EntityUid targetUid, UtilityCon

return (float) ev.Count / ev.Capacity;
}
case TargetHealthCon:
case TargetHealthCon con:
{
if (!TryComp(targetUid, out DamageableComponent? damage))
return 0f;
if (con.TargetState != MobState.Invalid && _thresholdSystem.TryGetPercentageForState(targetUid, con.TargetState, damage.TotalDamage, out var percentage))
return Math.Clamp((float)(1 - percentage), 0f, 1f);
if (_thresholdSystem.TryGetIncapPercentage(targetUid, damage.TotalDamage, out var incapPercentage))
return Math.Clamp((float)(1 - incapPercentage), 0f, 1f);
return 0f;
}
case TargetInLOSCon:
Expand Down

0 comments on commit 4963d0b

Please sign in to comment.