From 4e20fc68d1dbf5c2148c15da5d482407efde4196 Mon Sep 17 00:00:00 2001
From: Tamion <70228790+notTamion@users.noreply.github.com>
Date: Sat, 31 Aug 2024 20:50:24 +0200
Subject: [PATCH] Fix InventoryOpenEvent cancellation (#11304)

* fix

* other blocks

* add missing diff in ContainerEntity

---------

Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com>
---
 .../Fix-InventoryOpenEvent-cancellation.patch | 368 ++++++++++++++++++
 1 file changed, 368 insertions(+)
 create mode 100644 patches/server/Fix-InventoryOpenEvent-cancellation.patch

diff --git a/patches/server/Fix-InventoryOpenEvent-cancellation.patch b/patches/server/Fix-InventoryOpenEvent-cancellation.patch
new file mode 100644
index 0000000000..6a24eaca39
--- /dev/null
+++ b/patches/server/Fix-InventoryOpenEvent-cancellation.patch
@@ -0,0 +1,368 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Tamion <70228790+notTamion@users.noreply.github.com>
+Date: Mon, 19 Aug 2024 18:05:26 +0200
+Subject: [PATCH] Fix InventoryOpenEvent cancellation
+
+
+diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+@@ -0,0 +0,0 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple
+                     } else if (factory instanceof ChestBlock.DoubleInventory) {
+                         // SPIGOT-5355 - double chests too :(
+                         ((ChestBlock.DoubleInventory) factory).inventorylargechest.stopOpen(this);
++                        // Paper start - Fix InventoryOpenEvent cancellation
++                    } else if (!this.enderChestInventory.isActiveChest(null)) {
++                        this.enderChestInventory.stopOpen(this);
++                        // Paper end - Fix InventoryOpenEvent cancellation
+                     }
+                     return OptionalInt.empty();
+                 }
+diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
+@@ -0,0 +0,0 @@ public class ServerPlayerGameMode {
+         } else if (this.gameModeForPlayer == GameType.SPECTATOR) {
+             MenuProvider itileinventory = iblockdata.getMenuProvider(world, blockposition);
+ 
+-            if (itileinventory != null) {
+-                player.openMenu(itileinventory);
++            if (itileinventory != null && player.openMenu(itileinventory).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+                 return InteractionResult.SUCCESS;
+             } else {
+                 return InteractionResult.PASS;
+diff --git a/src/main/java/net/minecraft/world/entity/vehicle/ChestBoat.java b/src/main/java/net/minecraft/world/entity/vehicle/ChestBoat.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/entity/vehicle/ChestBoat.java
++++ b/src/main/java/net/minecraft/world/entity/vehicle/ChestBoat.java
+@@ -0,0 +0,0 @@ public class ChestBoat extends Boat implements HasCustomInventoryScreen, Contain
+ 
+     @Override
+     public void openCustomInventoryScreen(Player player) {
+-        player.openMenu(this);
+-        if (!player.level().isClientSide) {
++        if (!player.level().isClientSide && player.openMenu(this).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+             this.gameEvent(GameEvent.CONTAINER_OPEN, player);
+             PiglinAi.angerNearbyPiglins(player, true);
+         }
+diff --git a/src/main/java/net/minecraft/world/entity/vehicle/ContainerEntity.java b/src/main/java/net/minecraft/world/entity/vehicle/ContainerEntity.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/entity/vehicle/ContainerEntity.java
++++ b/src/main/java/net/minecraft/world/entity/vehicle/ContainerEntity.java
+@@ -0,0 +0,0 @@ public interface ContainerEntity extends Container, MenuProvider {
+     }
+ 
+     default InteractionResult interactWithContainerVehicle(Player player) {
+-        player.openMenu(this);
++        // Paper start - Fix InventoryOpenEvent cancellation
++        if (player.openMenu(this).isEmpty()) {
++            return InteractionResult.PASS;
++        }
++        // Paper end - Fix InventoryOpenEvent cancellation
+         return !player.level().isClientSide ? InteractionResult.CONSUME : InteractionResult.SUCCESS;
+     }
+ 
+diff --git a/src/main/java/net/minecraft/world/level/block/AnvilBlock.java b/src/main/java/net/minecraft/world/level/block/AnvilBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/AnvilBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/AnvilBlock.java
+@@ -0,0 +0,0 @@ public class AnvilBlock extends FallingBlock {
+     protected InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hit) {
+         if (world.isClientSide) {
+             return InteractionResult.SUCCESS;
+-        } else {
+-            player.openMenu(state.getMenuProvider(world, pos));
++        } else if (player.openMenu(state.getMenuProvider(world, pos)).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+             player.awardStat(Stats.INTERACT_WITH_ANVIL);
+-            return InteractionResult.CONSUME;
+         }
++        return InteractionResult.CONSUME; // Paper - Fix InventoryOpenEvent cancellation
+     }
+ 
+     @Nullable
+diff --git a/src/main/java/net/minecraft/world/level/block/BarrelBlock.java b/src/main/java/net/minecraft/world/level/block/BarrelBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/BarrelBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/BarrelBlock.java
+@@ -0,0 +0,0 @@ public class BarrelBlock extends BaseEntityBlock {
+             return InteractionResult.SUCCESS;
+         } else {
+             BlockEntity blockEntity = world.getBlockEntity(pos);
+-            if (blockEntity instanceof BarrelBlockEntity) {
+-                player.openMenu((BarrelBlockEntity)blockEntity);
++            if (blockEntity instanceof BarrelBlockEntity && player.openMenu((BarrelBlockEntity)blockEntity).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+                 player.awardStat(Stats.OPEN_BARREL);
+                 PiglinAi.angerNearbyPiglins(player, true);
+             }
+diff --git a/src/main/java/net/minecraft/world/level/block/BeaconBlock.java b/src/main/java/net/minecraft/world/level/block/BeaconBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/BeaconBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/BeaconBlock.java
+@@ -0,0 +0,0 @@ public class BeaconBlock extends BaseEntityBlock implements BeaconBeamBlock {
+         if (world.isClientSide) {
+             return InteractionResult.SUCCESS;
+         } else {
+-            if (world.getBlockEntity(pos) instanceof BeaconBlockEntity beaconBlockEntity) {
+-                player.openMenu(beaconBlockEntity);
++            if (world.getBlockEntity(pos) instanceof BeaconBlockEntity beaconBlockEntity && player.openMenu(beaconBlockEntity).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+                 player.awardStat(Stats.INTERACT_WITH_BEACON);
+             }
+ 
+diff --git a/src/main/java/net/minecraft/world/level/block/BlastFurnaceBlock.java b/src/main/java/net/minecraft/world/level/block/BlastFurnaceBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/BlastFurnaceBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/BlastFurnaceBlock.java
+@@ -0,0 +0,0 @@ public class BlastFurnaceBlock extends AbstractFurnaceBlock {
+     @Override
+     protected void openContainer(Level world, BlockPos pos, Player player) {
+         BlockEntity blockEntity = world.getBlockEntity(pos);
+-        if (blockEntity instanceof BlastFurnaceBlockEntity) {
+-            player.openMenu((MenuProvider)blockEntity);
++        if (blockEntity instanceof BlastFurnaceBlockEntity && player.openMenu((MenuProvider)blockEntity).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+             player.awardStat(Stats.INTERACT_WITH_BLAST_FURNACE);
+         }
+     }
+diff --git a/src/main/java/net/minecraft/world/level/block/BrewingStandBlock.java b/src/main/java/net/minecraft/world/level/block/BrewingStandBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/BrewingStandBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/BrewingStandBlock.java
+@@ -0,0 +0,0 @@ public class BrewingStandBlock extends BaseEntityBlock {
+             return InteractionResult.SUCCESS;
+         } else {
+             BlockEntity blockEntity = world.getBlockEntity(pos);
+-            if (blockEntity instanceof BrewingStandBlockEntity) {
+-                player.openMenu((BrewingStandBlockEntity)blockEntity);
++            if (blockEntity instanceof BrewingStandBlockEntity && player.openMenu((BrewingStandBlockEntity)blockEntity).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+                 player.awardStat(Stats.INTERACT_WITH_BREWINGSTAND);
+             }
+ 
+diff --git a/src/main/java/net/minecraft/world/level/block/CartographyTableBlock.java b/src/main/java/net/minecraft/world/level/block/CartographyTableBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/CartographyTableBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/CartographyTableBlock.java
+@@ -0,0 +0,0 @@ public class CartographyTableBlock extends Block {
+     protected InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hit) {
+         if (world.isClientSide) {
+             return InteractionResult.SUCCESS;
+-        } else {
+-            player.openMenu(state.getMenuProvider(world, pos));
++        } else if (player.openMenu(state.getMenuProvider(world, pos)).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+             player.awardStat(Stats.INTERACT_WITH_CARTOGRAPHY_TABLE);
+-            return InteractionResult.CONSUME;
+         }
++        return InteractionResult.CONSUME; // Paper - Fix InventoryOpenEvent cancellation
+     }
+ 
+     @Nullable
+diff --git a/src/main/java/net/minecraft/world/level/block/ChestBlock.java b/src/main/java/net/minecraft/world/level/block/ChestBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/ChestBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/ChestBlock.java
+@@ -0,0 +0,0 @@ public class ChestBlock extends AbstractChestBlock<ChestBlockEntity> implements
+         } else {
+             MenuProvider itileinventory = this.getMenuProvider(state, world, pos);
+ 
+-            if (itileinventory != null) {
+-                player.openMenu(itileinventory);
++            if (itileinventory != null && player.openMenu(itileinventory).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+                 player.awardStat(this.getOpenChestStat());
+                 PiglinAi.angerNearbyPiglins(player, true);
+             }
+diff --git a/src/main/java/net/minecraft/world/level/block/CraftingTableBlock.java b/src/main/java/net/minecraft/world/level/block/CraftingTableBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/CraftingTableBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/CraftingTableBlock.java
+@@ -0,0 +0,0 @@ public class CraftingTableBlock extends Block {
+     protected InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hit) {
+         if (world.isClientSide) {
+             return InteractionResult.SUCCESS;
+-        } else {
+-            player.openMenu(state.getMenuProvider(world, pos));
++        } else if (player.openMenu(state.getMenuProvider(world, pos)).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+             player.awardStat(Stats.INTERACT_WITH_CRAFTING_TABLE);
+-            return InteractionResult.CONSUME;
+         }
++        return InteractionResult.CONSUME; // Paper - Fix InventoryOpenEvent cancellation
+     }
+ 
+     @Override
+diff --git a/src/main/java/net/minecraft/world/level/block/DispenserBlock.java b/src/main/java/net/minecraft/world/level/block/DispenserBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/DispenserBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/DispenserBlock.java
+@@ -0,0 +0,0 @@ public class DispenserBlock extends BaseEntityBlock {
+         } else {
+             BlockEntity tileentity = world.getBlockEntity(pos);
+ 
+-            if (tileentity instanceof DispenserBlockEntity) {
+-                player.openMenu((DispenserBlockEntity) tileentity);
++            if (tileentity instanceof DispenserBlockEntity && player.openMenu((DispenserBlockEntity) tileentity).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+                 if (tileentity instanceof DropperBlockEntity) {
+                     player.awardStat(Stats.INSPECT_DROPPER);
+                 } else {
+diff --git a/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java b/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java
+@@ -0,0 +0,0 @@ public class EnderChestBlock extends AbstractChestBlock<EnderChestBlockEntity> i
+             } else {
+                 EnderChestBlockEntity enderChestBlockEntity = (EnderChestBlockEntity)blockEntity;
+                 playerEnderChestContainer.setActiveChest(enderChestBlockEntity);
+-                player.openMenu(
++                // Paper start - Fix InventoryOpenEvent cancellation
++                if (player.openMenu(
+                     new SimpleMenuProvider((i, inventory, playerx) -> ChestMenu.threeRows(i, inventory, playerEnderChestContainer), CONTAINER_TITLE)
+-                );
+-                player.awardStat(Stats.OPEN_ENDERCHEST);
+-                PiglinAi.angerNearbyPiglins(player, true);
++                ).isPresent()) {
++                    player.awardStat(Stats.OPEN_ENDERCHEST);
++                    PiglinAi.angerNearbyPiglins(player, true);
++                }
++                // Paper end - Fix InventoryOpenEvent cancellation
+                 return InteractionResult.CONSUME;
+             }
+         } else {
+diff --git a/src/main/java/net/minecraft/world/level/block/FurnaceBlock.java b/src/main/java/net/minecraft/world/level/block/FurnaceBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/FurnaceBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/FurnaceBlock.java
+@@ -0,0 +0,0 @@ public class FurnaceBlock extends AbstractFurnaceBlock {
+     @Override
+     protected void openContainer(Level world, BlockPos pos, Player player) {
+         BlockEntity blockEntity = world.getBlockEntity(pos);
+-        if (blockEntity instanceof FurnaceBlockEntity) {
+-            player.openMenu((MenuProvider)blockEntity);
++        if (blockEntity instanceof FurnaceBlockEntity && player.openMenu((MenuProvider)blockEntity).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+             player.awardStat(Stats.INTERACT_WITH_FURNACE);
+         }
+     }
+diff --git a/src/main/java/net/minecraft/world/level/block/GrindstoneBlock.java b/src/main/java/net/minecraft/world/level/block/GrindstoneBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/GrindstoneBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/GrindstoneBlock.java
+@@ -0,0 +0,0 @@ public class GrindstoneBlock extends FaceAttachedHorizontalDirectionalBlock {
+     protected InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hit) {
+         if (world.isClientSide) {
+             return InteractionResult.SUCCESS;
+-        } else {
+-            player.openMenu(state.getMenuProvider(world, pos));
++        } else if (player.openMenu(state.getMenuProvider(world, pos)).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+             player.awardStat(Stats.INTERACT_WITH_GRINDSTONE);
+-            return InteractionResult.CONSUME;
+         }
++        return InteractionResult.CONSUME; // Paper - Fix InventoryOpenEvent cancellation
+     }
+ 
+     @Override
+diff --git a/src/main/java/net/minecraft/world/level/block/HopperBlock.java b/src/main/java/net/minecraft/world/level/block/HopperBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/HopperBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/HopperBlock.java
+@@ -0,0 +0,0 @@ public class HopperBlock extends BaseEntityBlock {
+             return InteractionResult.SUCCESS;
+         } else {
+             BlockEntity blockEntity = world.getBlockEntity(pos);
+-            if (blockEntity instanceof HopperBlockEntity) {
+-                player.openMenu((HopperBlockEntity)blockEntity);
++            if (blockEntity instanceof HopperBlockEntity && player.openMenu((HopperBlockEntity)blockEntity).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+                 player.awardStat(Stats.INSPECT_HOPPER);
+             }
+ 
+diff --git a/src/main/java/net/minecraft/world/level/block/LecternBlock.java b/src/main/java/net/minecraft/world/level/block/LecternBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/LecternBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/LecternBlock.java
+@@ -0,0 +0,0 @@ public class LecternBlock extends BaseEntityBlock {
+     private void openScreen(Level world, BlockPos pos, Player player) {
+         BlockEntity tileentity = world.getBlockEntity(pos);
+ 
+-        if (tileentity instanceof LecternBlockEntity) {
+-            player.openMenu((LecternBlockEntity) tileentity);
++        if (tileentity instanceof LecternBlockEntity && player.openMenu((LecternBlockEntity) tileentity).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+             player.awardStat(Stats.INTERACT_WITH_LECTERN);
+         }
+ 
+diff --git a/src/main/java/net/minecraft/world/level/block/LoomBlock.java b/src/main/java/net/minecraft/world/level/block/LoomBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/LoomBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/LoomBlock.java
+@@ -0,0 +0,0 @@ public class LoomBlock extends HorizontalDirectionalBlock {
+     protected InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hit) {
+         if (world.isClientSide) {
+             return InteractionResult.SUCCESS;
+-        } else {
+-            player.openMenu(state.getMenuProvider(world, pos));
++        } else if (player.openMenu(state.getMenuProvider(world, pos)).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+             player.awardStat(Stats.INTERACT_WITH_LOOM);
+-            return InteractionResult.CONSUME;
+         }
++        return InteractionResult.CONSUME; // Paper - Fix InventoryOpenEvent cancellation
+     }
+ 
+     @Override
+diff --git a/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java b/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/ShulkerBoxBlock.java
+@@ -0,0 +0,0 @@ public class ShulkerBoxBlock extends BaseEntityBlock {
+         } else if (player.isSpectator()) {
+             return InteractionResult.CONSUME;
+         } else if (world.getBlockEntity(pos) instanceof ShulkerBoxBlockEntity shulkerBoxBlockEntity) {
+-            if (canOpen(state, world, pos, shulkerBoxBlockEntity)) {
+-                player.openMenu(shulkerBoxBlockEntity);
++            if (canOpen(state, world, pos, shulkerBoxBlockEntity) && player.openMenu(shulkerBoxBlockEntity).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+                 player.awardStat(Stats.OPEN_SHULKER_BOX);
+                 PiglinAi.angerNearbyPiglins(player, true);
+             }
+diff --git a/src/main/java/net/minecraft/world/level/block/SmithingTableBlock.java b/src/main/java/net/minecraft/world/level/block/SmithingTableBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/SmithingTableBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/SmithingTableBlock.java
+@@ -0,0 +0,0 @@ public class SmithingTableBlock extends CraftingTableBlock {
+     protected InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hit) {
+         if (world.isClientSide) {
+             return InteractionResult.SUCCESS;
+-        } else {
+-            player.openMenu(state.getMenuProvider(world, pos));
++        } else if (player.openMenu(state.getMenuProvider(world, pos)).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+             player.awardStat(Stats.INTERACT_WITH_SMITHING_TABLE);
+-            return InteractionResult.CONSUME;
+         }
++        return InteractionResult.CONSUME; // Paper - Fix InventoryOpenEvent cancellation
+     }
+ }
+diff --git a/src/main/java/net/minecraft/world/level/block/SmokerBlock.java b/src/main/java/net/minecraft/world/level/block/SmokerBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/SmokerBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/SmokerBlock.java
+@@ -0,0 +0,0 @@ public class SmokerBlock extends AbstractFurnaceBlock {
+     @Override
+     protected void openContainer(Level world, BlockPos pos, Player player) {
+         BlockEntity blockEntity = world.getBlockEntity(pos);
+-        if (blockEntity instanceof SmokerBlockEntity) {
+-            player.openMenu((MenuProvider)blockEntity);
++        if (blockEntity instanceof SmokerBlockEntity && player.openMenu((MenuProvider)blockEntity).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+             player.awardStat(Stats.INTERACT_WITH_SMOKER);
+         }
+     }
+diff --git a/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java b/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java
+@@ -0,0 +0,0 @@ public class StonecutterBlock extends Block {
+     protected InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hit) {
+         if (world.isClientSide) {
+             return InteractionResult.SUCCESS;
+-        } else {
+-            player.openMenu(state.getMenuProvider(world, pos));
++        } else if (player.openMenu(state.getMenuProvider(world, pos)).isPresent()) { // Paper - Fix InventoryOpenEvent cancellation
+             player.awardStat(Stats.INTERACT_WITH_STONECUTTER);
+-            return InteractionResult.CONSUME;
+         }
++        return InteractionResult.CONSUME; // Paper - Fix InventoryOpenEvent cancellation
+     }
+ 
+     @Nullable