Implement Health Consideration for NPCs (#29922)
Implement TargetHealthCon
This commit is contained in:
@@ -1,6 +1,16 @@
|
|||||||
|
using Content.Shared.Mobs;
|
||||||
|
|
||||||
namespace Content.Server.NPC.Queries.Considerations;
|
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
|
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,10 +7,13 @@ using Content.Server.NPC.Queries.Queries;
|
|||||||
using Content.Server.Nutrition.Components;
|
using Content.Server.Nutrition.Components;
|
||||||
using Content.Server.Nutrition.EntitySystems;
|
using Content.Server.Nutrition.EntitySystems;
|
||||||
using Content.Server.Storage.Components;
|
using Content.Server.Storage.Components;
|
||||||
|
using Content.Shared.Damage;
|
||||||
using Content.Shared.Examine;
|
using Content.Shared.Examine;
|
||||||
using Content.Shared.Fluids.Components;
|
using Content.Shared.Fluids.Components;
|
||||||
using Content.Shared.Hands.Components;
|
using Content.Shared.Hands.Components;
|
||||||
using Content.Shared.Inventory;
|
using Content.Shared.Inventory;
|
||||||
|
using Content.Shared.Mobs;
|
||||||
|
using Content.Shared.Mobs.Components;
|
||||||
using Content.Shared.Mobs.Systems;
|
using Content.Shared.Mobs.Systems;
|
||||||
using Content.Shared.NPC.Systems;
|
using Content.Shared.NPC.Systems;
|
||||||
using Content.Shared.Nutrition.Components;
|
using Content.Shared.Nutrition.Components;
|
||||||
@@ -48,6 +51,7 @@ public sealed class NPCUtilitySystem : EntitySystem
|
|||||||
[Dependency] private readonly WeldableSystem _weldable = default!;
|
[Dependency] private readonly WeldableSystem _weldable = default!;
|
||||||
[Dependency] private readonly ExamineSystemShared _examine = default!;
|
[Dependency] private readonly ExamineSystemShared _examine = default!;
|
||||||
[Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!;
|
[Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!;
|
||||||
|
[Dependency] private readonly MobThresholdSystem _thresholdSystem = default!;
|
||||||
|
|
||||||
private EntityQuery<PuddleComponent> _puddleQuery;
|
private EntityQuery<PuddleComponent> _puddleQuery;
|
||||||
private EntityQuery<TransformComponent> _xformQuery;
|
private EntityQuery<TransformComponent> _xformQuery;
|
||||||
@@ -293,8 +297,14 @@ public sealed class NPCUtilitySystem : EntitySystem
|
|||||||
|
|
||||||
return (float) ev.Count / ev.Capacity;
|
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;
|
return 0f;
|
||||||
}
|
}
|
||||||
case TargetInLOSCon:
|
case TargetInLOSCon:
|
||||||
|
|||||||
Reference in New Issue
Block a user