From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Helvetica Volubi Date: Tue, 18 Nov 2025 23:26:27 +0800 Subject: [PATCH] Leaves: Do not reset placed block on exception & Do not prevent block entity and entity crash at LevelChunk Co-authored by: MC_XiaoHei As a part of : Leaves (https://github.com/LeavesMC/Leaves) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/net/minecraft/world/item/BlockItem.java b/net/minecraft/world/item/BlockItem.java index 3b5aa0c45647c694e908aaae2a027db02b4f8385..aebcab247f49ada6af76b3c0e60944134d8f6f88 100644 --- a/net/minecraft/world/item/BlockItem.java +++ b/net/minecraft/world/item/BlockItem.java @@ -77,21 +77,8 @@ public class BlockItem extends Item { java.util.function.UnaryOperator context = c -> c.placedBlockAt(pos.immutable()); // Paper - track placed block position from block item if (placedState.is(placementState.getBlock())) { placedState = this.updateBlockStateFromTag(pos, level, itemStack, placedState); - // Paper start - Reset placed block on exception - try { - boolean updatedBlockEntity = this.updateCustomBlockEntityTag(pos, level, player, itemStack, placedState); - context = context.andThen(c -> c.updatedBlockEntity(updatedBlockEntity))::apply; // track whether the block entity got updated or not - updateBlockEntityComponents(level, pos, itemStack); - } catch (Exception ex) { - ((org.bukkit.craftbukkit.block.CraftBlockState) previousState).revertPlace(false); - if (player instanceof ServerPlayer serverPlayer) { - net.minecraft.server.MinecraftServer.LOGGER.warn("Player {} tried placing invalid block", player.getScoreboardName(), ex); - serverPlayer.connection.disconnect(net.minecraft.network.chat.Component.literal("Packet processing error"), org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION); - return InteractionResult.FAIL; - } - throw ex; // Rethrow exception if not placed by a player - } - // Paper end - Reset placed block on exception + this.updateCustomBlockEntityTag(pos, level, player, itemStack, placedState); + updateBlockEntityComponents(level, pos, itemStack); placedState.getBlock().setPlacedBy(level, pos, placedState, player, itemStack); // CraftBukkit start - special case for handling block placement with water lilies, frog spawn and snow buckets if (player != null && (this instanceof PlaceOnWaterBlockItem || this instanceof SolidBucketItem)) { diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java index 668e2b12d706ba2b0727ac7e2ba0698d997e415b..f103b1633f7483bd57da760e59fea132c63faec5 100644 --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java @@ -1018,12 +1018,6 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot profiler.pop(); } catch (Throwable t) { - // Paper start - Prevent block entity and entity crashes - final String msg = String.format("BlockEntity threw exception at %s:%s,%s,%s", io.papermc.paper.util.MCUtil.getLevelName(LevelChunk.this.getLevel()), this.getPos().getX(), this.getPos().getY(), this.getPos().getZ()); - LevelChunk.LOGGER.error(msg, t); - LevelChunk.this.level.getCraftServer().getPluginManager().callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerInternalException(msg, t))); // Paper - ServerExceptionEvent - LevelChunk.this.removeBlockEntity(this.getPos()); - // Paper end - Prevent block entity and entity crashes } } }