--- /dev/null
+using Content.Shared.Hands.Components;
+using Content.Shared.Nutrition.Components;
+using Robust.Shared.Prototypes;
+
+namespace Content.Server.NPC.HTN.Preconditions;
+
+/// <summary>
+/// Returns true if the active hand entity has the specified components.
+/// </summary>
+public sealed partial class HungryPrecondition : HTNPrecondition
+{
+ [Dependency] private readonly IEntityManager _entManager = default!;
+
+ [DataField(required: true)]
+ public HungerThreshold MinHungerState = HungerThreshold.Starving;
+
+ public override bool IsMet(NPCBlackboard blackboard)
+ {
+ if (!blackboard.TryGetValue<EntityUid>(NPCBlackboard.Owner, out var owner, _entManager))
+ {
+ return false;
+ }
+
+ return _entManager.TryGetComponent<HungerComponent>(owner, out var hunger) ? hunger.CurrentThreshold <= MinHungerState : false;
+ }
+}
--- /dev/null
+using Content.Shared.Hands.Components;
+using Content.Shared.Nutrition.Components;
+using Robust.Shared.Prototypes;
+
+namespace Content.Server.NPC.HTN.Preconditions;
+
+/// <summary>
+/// Returns true if the active hand entity has the specified components.
+/// </summary>
+public sealed partial class ThirstyPrecondition : HTNPrecondition
+{
+ [Dependency] private readonly IEntityManager _entManager = default!;
+
+ [DataField(required: true)]
+ public ThirstThreshold MinThirstState = ThirstThreshold.Parched;
+
+ public override bool IsMet(NPCBlackboard blackboard)
+ {
+ if (!blackboard.TryGetValue<EntityUid>(NPCBlackboard.Owner, out var owner, _entManager))
+ {
+ return false;
+ }
+
+ return _entManager.TryGetComponent<ThirstComponent>(owner, out var thirst) ? thirst.CurrentThirstThreshold <= MinThirstState : false;
+ }
+}
Dead:
Base: splat-0
- type: Food
+ - type: Thirst
+ startingThirst: 25 # spawn with Okay thirst state
+ thresholds:
+ OverHydrated: 35
+ Okay: 25
+ Thirsty: 15
+ Parched: 10
+ Dead: 0
+ baseDecayRate: 0.04
- type: Hunger
+ currentHunger: 25 # spawn with Okay hunger state
thresholds:
Overfed: 35
Okay: 25
# Picks a nearby food, moves into range, then eats it and waits the idle time.
- tasks:
- !type:HTNPrimitiveTask
+ preconditions:
+ - !type:HungryPrecondition
+ minHungerState: Starving # See HungerThreshold enum
operator: !type:UtilityOperator
proto: NearbyFood
# Picks nearby drink then consumes it and waits idle time
- tasks:
- !type:HTNPrimitiveTask
+ preconditions:
+ - !type:ThirstyPrecondition
+ minThirstState: Parched # See ThirstThreshold enum
operator: !type:UtilityOperator
proto: NearbyDrink