Allow specific entities to bypass DoAfter delays (#17349)
* Allow specific entities to bypass DoAfter delays This adds the InstantDoAfters tag to the admin ghost for mappers. * Add specific player prototype for InteractionTest
This commit is contained in:
@@ -38,7 +38,7 @@ namespace Content.IntegrationTests.Tests.Interaction;
|
|||||||
[FixtureLifeCycle(LifeCycle.InstancePerTestCase)]
|
[FixtureLifeCycle(LifeCycle.InstancePerTestCase)]
|
||||||
public abstract partial class InteractionTest
|
public abstract partial class InteractionTest
|
||||||
{
|
{
|
||||||
protected virtual string PlayerPrototype => "AdminObserver";
|
protected virtual string PlayerPrototype => "MobInteractionTestObserver";
|
||||||
|
|
||||||
protected PairTracker PairTracker = default!;
|
protected PairTracker PairTracker = default!;
|
||||||
protected TestMapData MapData = default!;
|
protected TestMapData MapData = default!;
|
||||||
@@ -118,7 +118,36 @@ public abstract partial class InteractionTest
|
|||||||
[SetUp]
|
[SetUp]
|
||||||
public virtual async Task Setup()
|
public virtual async Task Setup()
|
||||||
{
|
{
|
||||||
PairTracker = await PoolManager.GetServerClient(new PoolSettings());
|
const string TestPrototypes = @"
|
||||||
|
- type: entity
|
||||||
|
id: MobInteractionTestObserver
|
||||||
|
name: observer
|
||||||
|
noSpawn: true
|
||||||
|
save: false
|
||||||
|
description: Boo!
|
||||||
|
components:
|
||||||
|
- type: Access
|
||||||
|
groups:
|
||||||
|
- AllAccess
|
||||||
|
- type: Body
|
||||||
|
prototype: Aghost
|
||||||
|
- type: DoAfter
|
||||||
|
- type: Ghost
|
||||||
|
canInteract: true
|
||||||
|
- type: Hands
|
||||||
|
- type: Mind
|
||||||
|
- type: Stripping
|
||||||
|
- type: Tag
|
||||||
|
tags:
|
||||||
|
- CanPilot
|
||||||
|
- BypassInteractionRangeChecks
|
||||||
|
- type: Thieving
|
||||||
|
stripTimeReduction: 9999
|
||||||
|
stealthy: true
|
||||||
|
- type: UserInterface
|
||||||
|
";
|
||||||
|
|
||||||
|
PairTracker = await PoolManager.GetServerClient(new PoolSettings{ExtraPrototypes = TestPrototypes});
|
||||||
|
|
||||||
// server dependencies
|
// server dependencies
|
||||||
SEntMan = Server.ResolveDependency<IEntityManager>();
|
SEntMan = Server.ResolveDependency<IEntityManager>();
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using Content.Shared.ActionBlocker;
|
|||||||
using Content.Shared.Damage;
|
using Content.Shared.Damage;
|
||||||
using Content.Shared.Hands.Components;
|
using Content.Shared.Hands.Components;
|
||||||
using Content.Shared.Mobs;
|
using Content.Shared.Mobs;
|
||||||
|
using Content.Shared.Tag;
|
||||||
using Robust.Shared.GameStates;
|
using Robust.Shared.GameStates;
|
||||||
using Robust.Shared.Serialization;
|
using Robust.Shared.Serialization;
|
||||||
using Robust.Shared.Timing;
|
using Robust.Shared.Timing;
|
||||||
@@ -16,6 +17,7 @@ public abstract partial class SharedDoAfterSystem : EntitySystem
|
|||||||
[Dependency] protected readonly IGameTiming GameTiming = default!;
|
[Dependency] protected readonly IGameTiming GameTiming = default!;
|
||||||
[Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;
|
[Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;
|
||||||
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
||||||
|
[Dependency] private readonly TagSystem _tag = default!;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// We'll use an excess time so stuff like finishing effects can show.
|
/// We'll use an excess time so stuff like finishing effects can show.
|
||||||
@@ -221,7 +223,8 @@ public abstract partial class SharedDoAfterSystem : EntitySystem
|
|||||||
if (args.AttemptFrequency == AttemptFrequency.StartAndEnd && !TryAttemptEvent(doAfter))
|
if (args.AttemptFrequency == AttemptFrequency.StartAndEnd && !TryAttemptEvent(doAfter))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (args.Delay <= TimeSpan.Zero)
|
if (args.Delay <= TimeSpan.Zero ||
|
||||||
|
_tag.HasTag(args.User, "InstantDoAfters"))
|
||||||
{
|
{
|
||||||
RaiseDoAfterEvents(doAfter, comp);
|
RaiseDoAfterEvents(doAfter, comp);
|
||||||
// We don't store instant do-afters. This is just a lazy way of hiding them from client-side visuals.
|
// We don't store instant do-afters. This is just a lazy way of hiding them from client-side visuals.
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
maxZoom: 8.916104, 8.916104
|
maxZoom: 8.916104, 8.916104
|
||||||
- type: Tag
|
- type: Tag
|
||||||
tags:
|
tags:
|
||||||
|
- InstantDoAfters
|
||||||
- CanPilot
|
- CanPilot
|
||||||
- BypassInteractionRangeChecks
|
- BypassInteractionRangeChecks
|
||||||
- type: Input
|
- type: Input
|
||||||
|
|||||||
@@ -409,6 +409,9 @@
|
|||||||
- type: Tag
|
- type: Tag
|
||||||
id: Ingot
|
id: Ingot
|
||||||
|
|
||||||
|
- type: Tag
|
||||||
|
id: InstantDoAfters
|
||||||
|
|
||||||
- type: Tag
|
- type: Tag
|
||||||
id: IntercomElectronics
|
id: IntercomElectronics
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user