using Content.Shared.NPC.Systems;
using Robust.Shared.Containers;
using Robust.Server.Containers;
using Robust.Shared.GameObjects;
namespace Content.Server.NPC.HTN.Preconditions;
///
/// Checks if the owner is in a friendly container.
/// Recursively checks if container's container is friendly.
///
public sealed partial class InFriendlyContainerPrecondition : HTNPrecondition
{
private ContainerSystem _container = default!;
private NpcFactionSystem _npcFaction = default!;
[DataField] public bool IsInFriendlyContainer = true;
public override void Initialize(IEntitySystemManager sysManager)
{
base.Initialize(sysManager);
_container = sysManager.GetEntitySystem();
_npcFaction = sysManager.GetEntitySystem();
}
public override bool IsMet(NPCBlackboard blackboard)
{
var owner = blackboard.GetValue(NPCBlackboard.Owner);
if (!_container.TryGetContainingContainer(owner, out var container))
return !IsInFriendlyContainer;
return IsInFriendlyContainer == IsContainerOrParentFriendly(owner, container.Owner);
}
///
/// Recursively check if a container or any parent container is friendly.
///
/// True if any container is friendly.
private bool IsContainerOrParentFriendly(EntityUid owner, EntityUid containerOwner)
{
if (_npcFaction.IsEntityFriendly(owner, containerOwner))
return true;
if (!_container.TryGetContainingContainer(containerOwner, out var nextContainer))
return false;
return IsContainerOrParentFriendly(owner, nextContainer.Owner);
}
}