diff --git a/Content.Server/Construction/ConstructionSystem.Interactions.cs b/Content.Server/Construction/ConstructionSystem.Interactions.cs index e443fe827b..969d30ee5c 100644 --- a/Content.Server/Construction/ConstructionSystem.Interactions.cs +++ b/Content.Server/Construction/ConstructionSystem.Interactions.cs @@ -54,7 +54,13 @@ namespace Content.Server.Construction // If we're currently in an edge, we'll let the edge handle or validate the interaction. if (GetCurrentEdge(uid, construction) is {} edge) { - return HandleEdge(uid, ev, edge, validation, construction); + var result = HandleEdge(uid, ev, edge, validation, construction); + + // Reset edge index to none if this failed... + if (!validation && result is HandleResult.False && construction.StepIndex == 0) + construction.EdgeIndex = null; + + return result; } // If we're not on an edge, let the node handle or validate the interaction. @@ -85,10 +91,17 @@ namespace Content.Server.Construction if (HandleEdge(uid, ev, edge, validation, construction) is var result and not HandleResult.False) { // Only a True result may modify the state. - // In the case of DoAfter, we don't want it modifying the state yet, other than the waiting flag. + // In the case of DoAfter, it's only allowed to modify the waiting flag and the current edge index. // In the case of validated, it should NEVER modify the state at all. if (result is not HandleResult.True) + { + if (result is HandleResult.DoAfter) + { + construction.EdgeIndex = i; + } + return result; + } // If we're not on the same edge as we were before, that means handling that edge changed the node. if (construction.Node != node.Name) diff --git a/Resources/Changelog/Parts/doafter.yml b/Resources/Changelog/Parts/doafter.yml new file mode 100644 index 0000000000..012ed1d72e --- /dev/null +++ b/Resources/Changelog/Parts/doafter.yml @@ -0,0 +1,4 @@ +author: Zumorica +changes: + - type: Fix # One of the following: Add, Remove, Tweak, Fix + message: Fix rare construction bug where some interactions would be incorrect. diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/machine.yml b/Resources/Prototypes/Recipes/Construction/Graphs/machine.yml index b013f3b8b2..d18c4ac6dd 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/machine.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/machine.yml @@ -6,7 +6,7 @@ actions: - !type:SpawnPrototype prototype: SheetSteel1 - - !type:DeleteEntity {} + - !type:DeleteEntity edges: - to: missingWires completed: @@ -22,11 +22,11 @@ actions: - !type:SpriteStateChange state: "box_0" - - !type:EmptyAllContainers {} + - !type:EmptyAllContainers edges: - to: machineFrame conditions: - - !type:EntityAnchored {} + - !type:EntityAnchored steps: - material: Cable - to: start @@ -37,7 +37,7 @@ - !type:SpawnPrototype prototype: SheetSteel1 amount: 5 - - !type:DeleteEntity {} + - !type:DeleteEntity steps: - tool: Screwing doAfter: 2 @@ -60,7 +60,7 @@ - to: missingWires conditions: - - !type:EntityAnchored {} + - !type:EntityAnchored completed: - !type:SpawnPrototype prototype: CableApcStack1 @@ -68,8 +68,8 @@ - tool: Prying doAfter: 2 completed: - - !type:EmptyAllContainers {} - - !type:MachineFrameRegenerateProgress {} + - !type:EmptyAllContainers + - !type:MachineFrameRegenerateProgress - tool: Cutting doAfter: 0.25 @@ -82,8 +82,8 @@ edges: - to: machineFrame conditions: - - !type:EntityAnchored {} - - !type:WirePanel {} + - !type:EntityAnchored + - !type:WirePanel steps: - tool: Prying doAfter: 0.25