diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BlockItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BlockItemBehavior.java index 0fda1036a..faa5afefc 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BlockItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BlockItemBehavior.java @@ -47,6 +47,8 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.Optional; @@ -125,15 +127,19 @@ public class BlockItemBehavior extends BlockBoundItemBehavior { // it's just world + pos BlockState previousState = bukkitBlock.getState(); + List revertStates = new ArrayList<>(2); + revertStates.add(previousState); // place custom block - placeBlock(placeLocation, blockStateToPlace); + placeBlock(placeLocation, blockStateToPlace, revertStates); if (player != null) { // call bukkit event BlockPlaceEvent bukkitPlaceEvent = new BlockPlaceEvent(bukkitBlock, previousState, againstBlock, (ItemStack) context.getItem().getItem(), bukkitPlayer, true, context.getHand() == InteractionHand.MAIN_HAND ? EquipmentSlot.HAND : EquipmentSlot.OFF_HAND); if (EventUtils.fireAndCheckCancel(bukkitPlaceEvent)) { // revert changes - previousState.update(true, false); + for (BlockState state : revertStates) { + state.update(true, false); + } return InteractionResult.FAIL; } @@ -141,7 +147,9 @@ public class BlockItemBehavior extends BlockBoundItemBehavior { CustomBlockPlaceEvent customPlaceEvent = new CustomBlockPlaceEvent(bukkitPlayer, placeLocation.clone(), blockStateToPlace, world.getBlockAt(placeLocation), context.getHand()); if (EventUtils.fireAndCheckCancel(customPlaceEvent)) { // revert changes - previousState.update(true, false); + for (BlockState state : revertStates) { + state.update(true, false); + } return InteractionResult.FAIL; } } @@ -215,7 +223,7 @@ public class BlockItemBehavior extends BlockBoundItemBehavior { } } - protected boolean placeBlock(Location location, ImmutableBlockState blockState) { + protected boolean placeBlock(Location location, ImmutableBlockState blockState, List revertStates) { return CraftEngineBlocks.place(location, blockState, UpdateOption.UPDATE_ALL_IMMEDIATE, false); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/DoubleHighBlockItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/DoubleHighBlockItemBehavior.java index c9c8949c7..0acf2bfb3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/DoubleHighBlockItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/DoubleHighBlockItemBehavior.java @@ -13,8 +13,10 @@ import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigExce import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import org.bukkit.Location; +import org.bukkit.block.BlockState; import java.nio.file.Path; +import java.util.List; import java.util.Map; public class DoubleHighBlockItemBehavior extends BlockItemBehavior { @@ -25,14 +27,15 @@ public class DoubleHighBlockItemBehavior extends BlockItemBehavior { } @Override - protected boolean placeBlock(Location location, ImmutableBlockState blockState) { + protected boolean placeBlock(Location location, ImmutableBlockState blockState, List revertState) { Object level = FastNMS.INSTANCE.field$CraftWorld$ServerLevel(location.getWorld()); Object blockPos = FastNMS.INSTANCE.constructor$BlockPos(location.getBlockX(), location.getBlockY() + 1, location.getBlockZ()); UpdateOption option = UpdateOption.builder().updateNeighbors().updateClients().updateImmediate().updateKnownShape().build(); Object fluidData = FastNMS.INSTANCE.method$BlockGetter$getFluidState(level, blockPos); Object stateToPlace = fluidData == MFluids.WATER$defaultState ? MBlocks.WATER$defaultState : MBlocks.AIR$defaultState; + revertState.add(location.getWorld().getBlockAt(location.getBlockX(), location.getBlockY() + 1, location.getBlockZ()).getState()); FastNMS.INSTANCE.method$LevelWriter$setBlock(level, blockPos, stateToPlace, option.flags()); - return super.placeBlock(location, blockState); + return super.placeBlock(location, blockState, revertState); } public static class Factory implements ItemBehaviorFactory {