Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Content.Server/NPC/HTN/HTNComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,10 @@ public sealed partial class HTNComponent : NPCComponent
/// </summary>
[DataField]
public float? SleepPlayerCheckRangeOverride = null;

/// <summary>
/// Monolith - If not null, do not sleep if the grid we're on is moving at least this fast.
/// </summary>
[DataField]
public float? SleepMaxGridSpeed = null;
}
46 changes: 28 additions & 18 deletions Content.Server/NPC/Systems/NPCSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using Robust.Server.GameObjects;
using Robust.Server.Player;
using Robust.Shared.Configuration;
using Robust.Shared.Physics.Components; // Mono
using Robust.Shared.Player;

namespace Content.Server.NPC.Systems
Expand Down Expand Up @@ -186,30 +187,39 @@ private void CheckPlayerDistancesAndPauseNPCs()
if (_mobState.IsIncapacitated(npcUid))
continue;

var minDistance = htn.SleepPlayerCheckRangeOverride ?? _playerPauseDistance; // Mono

var npcCoords = npcTransform.Coordinates;
var hasNearbyPlayer = false;

var minDistance = htn.SleepPlayerCheckRangeOverride ?? _playerPauseDistance; // Mono
// Mono
if (htn.SleepMaxGridSpeed is { } ms
&& TryComp<PhysicsComponent>(npcTransform.GridUid, out var gridBody)
&& gridBody.LinearVelocity.Length() > ms
)
hasNearbyPlayer = true;

// Check distance to all players.
var allPlayerData = _playerManager.GetAllPlayerData();
foreach (var playerData in allPlayerData)
if (!hasNearbyPlayer)
{
var exists = _playerManager.TryGetSessionById(playerData.UserId, out var session);

if (!exists || session == null
|| session.AttachedEntity is not { Valid: true } playerEnt
|| HasComp<GhostComponent>(playerEnt)
|| TryComp<MobStateComponent>(playerEnt, out var state) && state.CurrentState != MobState.Alive)
continue;

var playerCoords = Transform(playerEnt).Coordinates;

if (npcCoords.TryDistance(EntityManager, playerCoords, out var distance) &&
distance <= minDistance)
var allPlayerData = _playerManager.GetAllPlayerData();
foreach (var playerData in allPlayerData)
{
hasNearbyPlayer = true;
break;
var exists = _playerManager.TryGetSessionById(playerData.UserId, out var session);

if (!exists || session == null
|| session.AttachedEntity is not { Valid: true } playerEnt
|| HasComp<GhostComponent>(playerEnt)
|| TryComp<MobStateComponent>(playerEnt, out var state) && state.CurrentState != MobState.Alive)
continue;

var playerCoords = Transform(playerEnt).Coordinates;

if (npcCoords.TryDistance(EntityManager, playerCoords, out var distance) &&
distance <= minDistance)
{
hasNearbyPlayer = true;
break;
}
}
}

Expand Down
14 changes: 12 additions & 2 deletions Content.Server/_Mono/NPC/HTN/Operators/ShipFireGunsOperator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ public sealed partial class ShipFireGunsOperator : HTNOperator, IHtnConditionalS
[DataField]
public bool RequirePowered = true;

private EntityCoordinates? wasTarget = null;

private const string TargetingCancelToken = "ShipTargetingCancelToken";

public override void Initialize(IEntitySystemManager sysManager)
Expand Down Expand Up @@ -111,18 +113,26 @@ public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTi
)
return HTNOperatorStatus.Failed;

// hack to update ShipMoveTo or such when we swap targets
if (wasTarget != null && wasTarget != target)
{
wasTarget = null;
return HTNOperatorStatus.Finished;
}

// ensure we're still targeting if we e.g. move grids
var comp = _targeting.Target(owner, target);

wasTarget = target;

if (comp == null)
return HTNOperatorStatus.Finished;

if (target.EntityId == EntityUid.Invalid)
return HTNOperatorStatus.Finished;

if (ShutdownState == HTNPlanState.PlanFinished)
{
return HTNOperatorStatus.Finished;
}

return HTNOperatorStatus.Continuing;
}
Expand Down
4 changes: 2 additions & 2 deletions Resources/Prototypes/_Mono/Entities/Mobs/NPCs/ai.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@
path: /Audio/Ambience/Objects/periodic_beep.ogg
- type: Anchorable
- type: HTN
sleepPlayerCheckRangeOverride: 2000
sleepPlayerCheckRangeOverride: 4000
sleepMaxGridSpeed: 10 # don't sleep so we can still dodge grids or such if drifting far from players
rootTask:
task: RammerShuttleCompound
- type: StaticPrice
Expand Down Expand Up @@ -215,7 +216,6 @@
suffix: AI, Drone-Assembly
components:
- type: HTN
sleepPlayerCheckRangeOverride: 4000
rootTask:
task: DroneCompoundAssembly

Expand Down
Loading