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;
|
||||
}
|
||||
|
||||
// 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.
|
||||
// This prevents some issues that could occur from entity deletion, component deletion, etc in a handler.
|
||||
construction.InteractionQueue.Enqueue(args);
|
||||
|
||||
Reference in New Issue
Block a user