Don't enqueue construction events without validation (#39869)
This commit is contained in:
committed by
GitHub
parent
deb08579a4
commit
24f4b40881
@@ -0,0 +1,49 @@
|
|||||||
|
using Content.IntegrationTests.Tests.Interaction;
|
||||||
|
using Content.Server.Construction.Components;
|
||||||
|
using Content.Shared.Temperature;
|
||||||
|
|
||||||
|
namespace Content.IntegrationTests.Tests.Construction.Interaction;
|
||||||
|
|
||||||
|
public sealed class EdgeClobbering : InteractionTest
|
||||||
|
{
|
||||||
|
[TestPrototypes]
|
||||||
|
private const string Prototypes = @"
|
||||||
|
- type: constructionGraph
|
||||||
|
id: ExampleGraph
|
||||||
|
start: A
|
||||||
|
graph:
|
||||||
|
- node: A
|
||||||
|
edges:
|
||||||
|
- to: B
|
||||||
|
steps:
|
||||||
|
- tool: Anchoring
|
||||||
|
doAfter: 1
|
||||||
|
- to: C
|
||||||
|
steps:
|
||||||
|
- tool: Screwing
|
||||||
|
doAfter: 1
|
||||||
|
- node: B
|
||||||
|
- node: C
|
||||||
|
|
||||||
|
- type: entity
|
||||||
|
id: ExampleEntity
|
||||||
|
components:
|
||||||
|
- type: Construction
|
||||||
|
graph: ExampleGraph
|
||||||
|
node: A
|
||||||
|
|
||||||
|
";
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task EnsureNoEdgeClobbering()
|
||||||
|
{
|
||||||
|
await SpawnTarget("ExampleEntity");
|
||||||
|
var sTarget = SEntMan.GetEntity(Target!.Value);
|
||||||
|
|
||||||
|
await InteractUsing(Screw, false);
|
||||||
|
SEntMan.EventBus.RaiseLocalEvent(sTarget, new OnTemperatureChangeEvent(0f, 0f, 0f));
|
||||||
|
await AwaitDoAfters();
|
||||||
|
|
||||||
|
Assert.That(SEntMan.GetComponent<ConstructionComponent>(sTarget).Node, Is.EqualTo("C"));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -570,6 +570,10 @@ namespace Content.Server.Construction
|
|||||||
handled.Handled = true;
|
handled.Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make sure the event passes validation before enqueuing it
|
||||||
|
if (HandleEvent(uid, args, true, construction) != HandleResult.Validated)
|
||||||
|
return;
|
||||||
|
|
||||||
// Enqueue this event so it'll be handled in the next tick.
|
// Enqueue this event so it'll be handled in the next tick.
|
||||||
// This prevents some issues that could occur from entity deletion, component deletion, etc in a handler.
|
// This prevents some issues that could occur from entity deletion, component deletion, etc in a handler.
|
||||||
construction.InteractionQueue.Enqueue(args);
|
construction.InteractionQueue.Enqueue(args);
|
||||||
|
|||||||
Reference in New Issue
Block a user