From 10ffbb7f29abbe393262ffc9fb0388616f84b52a Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sat, 18 Mar 2023 14:05:20 +0100 Subject: [PATCH] breaking: fix reverting action (1.19) --- .../interaction/breaking/executor/SequencedExecutorTest.kt | 5 ++++- .../input/interaction/breaking/executor/BreakingExecutor.kt | 1 + .../minosoft/protocol/packets/s2c/play/block/BlockS2CP.kt | 5 +++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/input/interaction/breaking/executor/SequencedExecutorTest.kt b/src/integration-test/kotlin/de/bixilon/minosoft/input/interaction/breaking/executor/SequencedExecutorTest.kt index 81d6dc882..dd064f3b3 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/input/interaction/breaking/executor/SequencedExecutorTest.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/input/interaction/breaking/executor/SequencedExecutorTest.kt @@ -43,7 +43,9 @@ class SequencedExecutorTest { executor.start(Vec3i(1, 1, 1), state) - connection.world[Vec3i(1, 1, 1)] = state // <- set the same block -> revert + + executor.abort(Vec3i(1, 1, 1), state) // TODO: simulate packet + // connection.world[Vec3i(1, 1, 1)] = state // <- set the same block -> revert/cancel executor.finish() assertEquals(connection.world[Vec3i(1, 1, 1)], state) @@ -57,6 +59,7 @@ class SequencedExecutorTest { executor.start(Vec3i(1, 1, 1), state) executor.finish() + Thread.sleep(10) // async, wait for thread to complete assertNull(connection.world[Vec3i(1, 1, 1)]) } } diff --git a/src/main/java/de/bixilon/minosoft/input/interaction/breaking/executor/BreakingExecutor.kt b/src/main/java/de/bixilon/minosoft/input/interaction/breaking/executor/BreakingExecutor.kt index 8af47af7c..3acdc8768 100644 --- a/src/main/java/de/bixilon/minosoft/input/interaction/breaking/executor/BreakingExecutor.kt +++ b/src/main/java/de/bixilon/minosoft/input/interaction/breaking/executor/BreakingExecutor.kt @@ -43,6 +43,7 @@ abstract class BreakingExecutor(protected val breaking: BreakHandler) { open fun finish(): Int { val state = this.state ?: Broken() val position = this.position ?: Broken() + val abort = this.abort reset() if (!abort) { execute(position, state) diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockS2CP.kt index 3dbac7279..f2c49f176 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockS2CP.kt @@ -13,7 +13,9 @@ package de.bixilon.minosoft.protocol.packets.s2c.play.block import de.bixilon.kotlinglm.vec3.Vec3i +import de.bixilon.kutil.cast.CastUtil.nullCast import de.bixilon.minosoft.data.registries.blocks.state.BlockState +import de.bixilon.minosoft.input.interaction.breaking.executor.SequencedExecutor import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.packets.factory.LoadPacket import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket @@ -40,6 +42,9 @@ class BlockS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { override fun handle(connection: PlayConnection) { connection.world[position] = state + if (state != null) { + connection.camera.interactions.breaking.executor.nullCast()?.abort(position, state) + } } override fun log(reducedLog: Boolean) {