From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Helvetica Volubi Date: Tue, 18 Nov 2025 23:11:26 +0800 Subject: [PATCH] Leaves: Old Block remove behaviour Co-authored by: violetc <58360096+s-yh-china@users.noreply.github.com> 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/Containers.java b/net/minecraft/world/Containers.java index 1311d4936f84652c5ffc51544f99cb98fc293906..3a62831838a60776159dcb1ca783d3f00e6cd35e 100644 --- a/net/minecraft/world/Containers.java +++ b/net/minecraft/world/Containers.java @@ -51,4 +51,16 @@ public class Containers { public static void updateNeighboursAfterDestroy(final BlockState state, final Level level, final BlockPos pos) { level.updateNeighbourForOutputSignal(pos, state.getBlock()); } + + + // Leaves start - behaviour 1.21.1- + public static void dropContentsOnDestroy(BlockState state, BlockState newState, Level level, BlockPos pos) { + if (!state.is(newState.getBlock())) { + if (level.getBlockEntity(pos) instanceof Container container) { + dropContents(level, pos, container); + level.updateNeighbourForOutputSignal(pos, state.getBlock()); + } + } + } + // Leaves end - behaviour 1.21.1- } diff --git a/net/minecraft/world/level/block/AbstractFurnaceBlock.java b/net/minecraft/world/level/block/AbstractFurnaceBlock.java index 98561dcc465ca9d5394e58b05ad3e8dc59773ebc..72e3d6c1ce3389972df21d5ff6e4d74bcf2ad300 100644 --- a/net/minecraft/world/level/block/AbstractFurnaceBlock.java +++ b/net/minecraft/world/level/block/AbstractFurnaceBlock.java @@ -53,6 +53,27 @@ public abstract class AbstractFurnaceBlock extends BaseEntityBlock { return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!state.is(newState.getBlock())) { + BlockEntity blockEntity = level.getBlockEntity(pos); + if (blockEntity instanceof AbstractFurnaceBlockEntity) { + if (level instanceof ServerLevel) { + Containers.dropContents(level, pos, (AbstractFurnaceBlockEntity)blockEntity); + ((AbstractFurnaceBlockEntity)blockEntity).getRecipesToAwardAndPopExperience((ServerLevel)level, net.minecraft.world.phys.Vec3.atCenterOf(pos)); + } + + super.onRemove(state, level, pos, newState, isMoving); + level.updateNeighbourForOutputSignal(pos, this); + } else { + super.onRemove(state, level, pos, newState, isMoving); + } + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/BarrelBlock.java b/net/minecraft/world/level/block/BarrelBlock.java index 5332fd32fa7a0d3fc3be1b0a7c2ca5dee8e402c6..37667a8e512bdba385c563e950d8c5d5cdd18832 100644 --- a/net/minecraft/world/level/block/BarrelBlock.java +++ b/net/minecraft/world/level/block/BarrelBlock.java @@ -51,6 +51,15 @@ public class BarrelBlock extends BaseEntityBlock { return InteractionResult.SUCCESS; } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + Containers.dropContentsOnDestroy(state, newState, level, pos); + super.onRemove(state, level, pos, newState, isMoving); + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/BasePressurePlateBlock.java b/net/minecraft/world/level/block/BasePressurePlateBlock.java index c2fbf44e93e44c36423465d406b5e4d3db029a80..a28a453f139295834c77aa908027c74c8dfd7aba 100644 --- a/net/minecraft/world/level/block/BasePressurePlateBlock.java +++ b/net/minecraft/world/level/block/BasePressurePlateBlock.java @@ -133,6 +133,20 @@ public abstract class BasePressurePlateBlock extends Block { } } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!isMoving && !state.is(newState.getBlock())) { + if (this.getSignalForState(state) > 0) { + this.updateNeighbours(level, pos); + } + + super.onRemove(state, level, pos, newState, isMoving); + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston && this.getSignalForState(state) > 0) { diff --git a/net/minecraft/world/level/block/BaseRailBlock.java b/net/minecraft/world/level/block/BaseRailBlock.java index bc79a7c2cb18237dad15432ae7e1238125108696..5ef16955c69f0e0fecc772067a0fb006e6413011 100644 --- a/net/minecraft/world/level/block/BaseRailBlock.java +++ b/net/minecraft/world/level/block/BaseRailBlock.java @@ -123,6 +123,24 @@ public abstract class BaseRailBlock extends Block implements SimpleWaterloggedBl } } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!isMoving) { + super.onRemove(state, level, pos, newState, isMoving); + if (state.getValue(this.getShapeProperty()).isSlope()) { + level.updateNeighborsAt(pos.above(), this); + } + + if (this.isStraight) { + level.updateNeighborsAt(pos, this); + level.updateNeighborsAt(pos.below(), this); + } + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston) { diff --git a/net/minecraft/world/level/block/BrewingStandBlock.java b/net/minecraft/world/level/block/BrewingStandBlock.java index aea12aad3270b966eed7779eaf77d26052f8a21f..6c39edf98f33df437880a77450557082ea9b0f6c 100644 --- a/net/minecraft/world/level/block/BrewingStandBlock.java +++ b/net/minecraft/world/level/block/BrewingStandBlock.java @@ -80,6 +80,15 @@ public class BrewingStandBlock extends BaseEntityBlock { level.addParticle(ParticleTypes.SMOKE, x, y, z, 0.0, 0.0, 0.0); } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + Containers.dropContentsOnDestroy(state, newState, level, pos); + super.onRemove(state, level, pos, newState, isMoving); + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/ButtonBlock.java b/net/minecraft/world/level/block/ButtonBlock.java index 86f4dcd959bb83247c6d2c5e947c79230aed3189..1b0223f1d533d1a8db5497ab9104052bc799f691 100644 --- a/net/minecraft/world/level/block/ButtonBlock.java +++ b/net/minecraft/world/level/block/ButtonBlock.java @@ -131,6 +131,20 @@ public class ButtonBlock extends FaceAttachedHorizontalDirectionalBlock { return pressed ? this.type.buttonClickOn() : this.type.buttonClickOff(); } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!isMoving && !state.is(newState.getBlock())) { + if (state.getValue(POWERED)) { + this.updateNeighbours(state, level, pos); + } + + super.onRemove(state, level, pos, newState, isMoving); + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston && state.getValue(POWERED)) { diff --git a/net/minecraft/world/level/block/CampfireBlock.java b/net/minecraft/world/level/block/CampfireBlock.java index 8b706b34914326c039b761387f25e488f30fe6c8..b816594fcd83d26037734ec051f2c5d7f7dbde9f 100644 --- a/net/minecraft/world/level/block/CampfireBlock.java +++ b/net/minecraft/world/level/block/CampfireBlock.java @@ -111,6 +111,21 @@ public class CampfireBlock extends BaseEntityBlock implements SimpleWaterloggedB return InteractionResult.TRY_WITH_EMPTY_HAND; } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!state.is(newState.getBlock())) { + BlockEntity blockEntity = level.getBlockEntity(pos); + if (blockEntity instanceof CampfireBlockEntity) { + net.minecraft.world.Containers.dropContents(level, pos, ((CampfireBlockEntity)blockEntity).getItems()); + } + + super.onRemove(state, level, pos, newState, isMoving); + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void entityInside( final BlockState state, diff --git a/net/minecraft/world/level/block/ChestBlock.java b/net/minecraft/world/level/block/ChestBlock.java index d3f0680d59ec87990b54dc3dbce27706bfadf5f1..b5595d87339e4d313c5691a06c2b1b3d1b40b6de 100644 --- a/net/minecraft/world/level/block/ChestBlock.java +++ b/net/minecraft/world/level/block/ChestBlock.java @@ -257,6 +257,15 @@ public class ChestBlock extends AbstractChestBlock implements return this.chestCanConnectTo(state) && state.getValue(TYPE) == ChestType.SINGLE ? state.getValue(FACING) : null; } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + Containers.dropContentsOnDestroy(state, newState, level, pos); + super.onRemove(state, level, pos, newState, isMoving); + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/ChiseledBookShelfBlock.java b/net/minecraft/world/level/block/ChiseledBookShelfBlock.java index 0682acaae12650549eea3c291d8cde7bb17766bd..ac12ef0c99c82d771e5275ec7ced7f76c76f5938 100644 --- a/net/minecraft/world/level/block/ChiseledBookShelfBlock.java +++ b/net/minecraft/world/level/block/ChiseledBookShelfBlock.java @@ -168,6 +168,28 @@ public class ChiseledBookShelfBlock extends BaseEntityBlock implements Selectabl SLOT_OCCUPIED_PROPERTIES.forEach(property -> builder.add(property)); } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + if (!state.is(newState.getBlock())) { + if (level.getBlockEntity(pos) instanceof ChiseledBookShelfBlockEntity chiseledBookShelfBlockEntity && !chiseledBookShelfBlockEntity.isEmpty()) { + for (int i = 0; i < 6; i++) { + ItemStack item = chiseledBookShelfBlockEntity.getItem(i); + if (!item.isEmpty()) { + Containers.dropItemStack(level, pos.getX(), pos.getY(), pos.getZ(), item); + } + } + + chiseledBookShelfBlockEntity.clearContent(); + level.updateNeighbourForOutputSignal(pos, this); + } + + super.onRemove(state, level, pos, newState, movedByPiston); + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/CrafterBlock.java b/net/minecraft/world/level/block/CrafterBlock.java index 2b97fd6af1c4956eb173b8c66c2a3efc8772a798..90326fe95673edbf5ed8c1a5d9020735fdd4d53e 100644 --- a/net/minecraft/world/level/block/CrafterBlock.java +++ b/net/minecraft/world/level/block/CrafterBlock.java @@ -130,6 +130,15 @@ public class CrafterBlock extends BaseEntityBlock { } } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + Containers.dropContentsOnDestroy(state, newState, level, pos); + super.onRemove(state, level, pos, newState, movedByPiston); + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/CreakingHeartBlock.java b/net/minecraft/world/level/block/CreakingHeartBlock.java index 3dd5f8c20ad68e0bd6222c8ba1687df0b2ad3b0d..b2e1e78cd70e20dd1c17ef0199059fc2b4e513b5 100644 --- a/net/minecraft/world/level/block/CreakingHeartBlock.java +++ b/net/minecraft/world/level/block/CreakingHeartBlock.java @@ -152,6 +152,17 @@ public class CreakingHeartBlock extends BaseEntityBlock { builder.add(AXIS, STATE, NATURAL); } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + if (level.getBlockEntity(pos) instanceof CreakingHeartBlockEntity creakingHeartBlockEntity) { + creakingHeartBlockEntity.removeProtector(null); + } + super.onRemove(state, level, pos, newState, movedByPiston); + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/DecoratedPotBlock.java b/net/minecraft/world/level/block/DecoratedPotBlock.java index 3ce41ce3f9d2bf7a79e4b9811e043a69e0dedb13..2856b4081cddb38bac5c1d7199649a7531ef077f 100644 --- a/net/minecraft/world/level/block/DecoratedPotBlock.java +++ b/net/minecraft/world/level/block/DecoratedPotBlock.java @@ -172,6 +172,15 @@ public class DecoratedPotBlock extends BaseEntityBlock implements SimpleWaterlog return new DecoratedPotBlockEntity(worldPosition, blockState); } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + Containers.dropContentsOnDestroy(state, newState, level, pos); + super.onRemove(state, level, pos, newState, movedByPiston); + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/DiodeBlock.java b/net/minecraft/world/level/block/DiodeBlock.java index 3457a1fa8f5efc4bf173bf155165ab5e5ae9f303..1342607e3bf28ca085f51ade22efaf34f19da170 100644 --- a/net/minecraft/world/level/block/DiodeBlock.java +++ b/net/minecraft/world/level/block/DiodeBlock.java @@ -180,6 +180,17 @@ public abstract class DiodeBlock extends HorizontalDirectionalBlock { if (me.earthme.luminol.config.modules.optimizations.LeavesSleepingBlockEntityConfig.enabled && this instanceof ComparatorBlock && !oldState.is(Blocks.COMPARATOR)) org.leavesmc.leaves.lithium.common.block.entity.inventory_comparator_tracking.ComparatorTracking.notifyNearbyBlockEntitiesAboutNewComparator(level, pos); // Leaves - Lithium Sleeping Block Entity } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!isMoving && !state.is(newState.getBlock())) { + super.onRemove(state, level, pos, newState, isMoving); + this.updateNeighborsInFront(level, pos, state); + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston) { diff --git a/net/minecraft/world/level/block/DispenserBlock.java b/net/minecraft/world/level/block/DispenserBlock.java index dca954bd076fa917512af91e0b93d449eb5cac6d..7f880ba7cdd08be392dd4fe5a06fffbf6962318b 100644 --- a/net/minecraft/world/level/block/DispenserBlock.java +++ b/net/minecraft/world/level/block/DispenserBlock.java @@ -159,6 +159,15 @@ public class DispenserBlock extends BaseEntityBlock { return this.defaultBlockState().setValue(FACING, context.getNearestLookingDirection().getOpposite()); } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + Containers.dropContentsOnDestroy(state, newState, level, pos); + super.onRemove(state, level, pos, newState, isMoving); + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/HopperBlock.java b/net/minecraft/world/level/block/HopperBlock.java index 88606b84ea3a33ffbb0cfa6e073eb8f59d7188d0..c3ccebd7f27fd4d313cbcd616d58180a70f5f574 100644 --- a/net/minecraft/world/level/block/HopperBlock.java +++ b/net/minecraft/world/level/block/HopperBlock.java @@ -139,6 +139,15 @@ public class HopperBlock extends BaseEntityBlock implements org.leavesmc.leaves. } } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + Containers.dropContentsOnDestroy(state, newState, level, pos); + super.onRemove(state, level, pos, newState, isMoving); + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/JukeboxBlock.java b/net/minecraft/world/level/block/JukeboxBlock.java index a9e46a66ffc868c3b4ef2bb6257f23a20f12b1a6..cee96a825f0e0e740ede8df0bf6dc5256b9fb8d3 100644 --- a/net/minecraft/world/level/block/JukeboxBlock.java +++ b/net/minecraft/world/level/block/JukeboxBlock.java @@ -82,6 +82,20 @@ public class JukeboxBlock extends BaseEntityBlock { } } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!state.is(newState.getBlock())) { + if (level.getBlockEntity(pos) instanceof JukeboxBlockEntity jukeboxBlockEntity) { + jukeboxBlockEntity.popOutTheItem(); + } + + super.onRemove(state, level, pos, newState, isMoving); + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/LecternBlock.java b/net/minecraft/world/level/block/LecternBlock.java index 75660fb19c25444e35dbbe58cd20f9b3d3f7ad32..196051c80baa489f43065a11a61f22a8c61251e7 100644 --- a/net/minecraft/world/level/block/LecternBlock.java +++ b/net/minecraft/world/level/block/LecternBlock.java @@ -200,6 +200,37 @@ public class LecternBlock extends BaseEntityBlock { changePowered(level, pos, state, false); } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!state.is(newState.getBlock())) { + if (state.getValue(HAS_BOOK)) { + this.popBook(state, level, pos); + } + + if (state.getValue(POWERED)) { + updateBelow(level, pos, state); + } + super.onRemove(state, level, pos, newState, isMoving); + } + } + + private void popBook(BlockState state, Level level, BlockPos pos) { + if (level.getBlockEntity(pos) instanceof LecternBlockEntity lecternBlockEntity) { // CraftBukkit - don't validate, type may be changed already // Leaves - the method with validate arg already removed by paper... + Direction direction = state.getValue(FACING); + ItemStack itemStack = lecternBlockEntity.getBook().copy(); + if (itemStack.isEmpty()) return; // CraftBukkit - SPIGOT-5500 + float f = 0.25F * direction.getStepX(); + float f1 = 0.25F * direction.getStepZ(); + net.minecraft.world.entity.item.ItemEntity itemEntity = new net.minecraft.world.entity.item.ItemEntity(level, pos.getX() + 0.5 + f, pos.getY() + 1, pos.getZ() + 0.5 + f1, itemStack); + itemEntity.setDefaultPickUpDelay(); + level.addFreshEntity(itemEntity); + lecternBlockEntity.clearContent(); + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (state.getValue(POWERED)) { diff --git a/net/minecraft/world/level/block/LeverBlock.java b/net/minecraft/world/level/block/LeverBlock.java index 341960ef67a689f660d0dcf61aaf5bf52bdc9074..6fc372e782f2a34a34a9ef1faed41ace6db5ec1b 100644 --- a/net/minecraft/world/level/block/LeverBlock.java +++ b/net/minecraft/world/level/block/LeverBlock.java @@ -127,6 +127,20 @@ public class LeverBlock extends FaceAttachedHorizontalDirectionalBlock { } } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!isMoving && !state.is(newState.getBlock())) { + if (state.getValue(POWERED)) { + this.updateNeighbours(state, level, pos); + } + + super.onRemove(state, level, pos, newState, isMoving); + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston && state.getValue(POWERED)) { diff --git a/net/minecraft/world/level/block/LightningRodBlock.java b/net/minecraft/world/level/block/LightningRodBlock.java index 47ca45518df306cc4368983eefb89294e56b015a..31be8864aa28eff804b507efdab614b35e3fea6f 100644 --- a/net/minecraft/world/level/block/LightningRodBlock.java +++ b/net/minecraft/world/level/block/LightningRodBlock.java @@ -123,6 +123,19 @@ public class LightningRodBlock extends RodBlock implements SimpleWaterloggedBloc } } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + if (!state.is(newState.getBlock())) { + if (state.getValue(POWERED)) { + this.updateNeighbours(state, level, pos); + } + super.onRemove(state, level, pos, newState, movedByPiston); + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (state.getValue(POWERED)) { diff --git a/net/minecraft/world/level/block/ObserverBlock.java b/net/minecraft/world/level/block/ObserverBlock.java index 6a3413ca875ce78f48cd8d3ce2cfe7798be1a19e..be572eff561ffdd961a9602eaa6136761c4d48a4 100644 --- a/net/minecraft/world/level/block/ObserverBlock.java +++ b/net/minecraft/world/level/block/ObserverBlock.java @@ -128,6 +128,18 @@ public class ObserverBlock extends DirectionalBlock { } } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!state.is(newState.getBlock())) { + if (state.getValue(POWERED) && level.getBlockTicks().hasScheduledTick(pos, this)) { + this.updateNeighborsInFront(level, pos, state.setValue(POWERED, Boolean.FALSE)); + } + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (state.getValue(POWERED) && level.getBlockTicks().hasScheduledTick(pos, this)) { diff --git a/net/minecraft/world/level/block/RedStoneWireBlock.java b/net/minecraft/world/level/block/RedStoneWireBlock.java index 30a7208a698a8bd3ba8a08ace6f23b206d90f6a3..7f5b77cd9cb78e693bbe1efd3d5fd7256d7700c5 100644 --- a/net/minecraft/world/level/block/RedStoneWireBlock.java +++ b/net/minecraft/world/level/block/RedStoneWireBlock.java @@ -382,6 +382,28 @@ public class RedStoneWireBlock extends Block { } } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!isMoving && !state.is(newState.getBlock())) { + super.onRemove(state, level, pos, newState, isMoving); + for (Direction direction : Direction.values()) { + level.updateNeighborsAt(pos.relative(direction), this); + } + + // Paper start - optimize redstone - replace call to updatePowerStrength + if (level.paperConfig().misc.redstoneImplementation == io.papermc.paper.configuration.WorldConfiguration.Misc.RedstoneImplementation.ALTERNATE_CURRENT) { + level.getWireHandler().onWireRemoved(pos, state); // Alternate Current + } else { + this.updateSurroundingRedstone(level, pos, state, null, false); // Vanilla/Eigencraft + } + // Paper end - optimize redstone + this.updateNeighborsOfNeighboringWires(level, pos); + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston) { diff --git a/net/minecraft/world/level/block/RedstoneTorchBlock.java b/net/minecraft/world/level/block/RedstoneTorchBlock.java index 0d0b5443c5c56825e88fd64c02c993eca6044d45..e2e5552008547fa1782b0a5ed3129162e94647c9 100644 --- a/net/minecraft/world/level/block/RedstoneTorchBlock.java +++ b/net/minecraft/world/level/block/RedstoneTorchBlock.java @@ -54,6 +54,16 @@ public class RedstoneTorchBlock extends BaseTorchBlock { } } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!isMoving) { + this.notifyNeighbors(level, pos, state); + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston) { diff --git a/net/minecraft/world/level/block/SculkSensorBlock.java b/net/minecraft/world/level/block/SculkSensorBlock.java index 2bbce50d9dd0ca65f9e3bc90c8de098473039bc5..9a9fcb593c4b5f2bb0c57f9268dfdc9eb21d38ea 100644 --- a/net/minecraft/world/level/block/SculkSensorBlock.java +++ b/net/minecraft/world/level/block/SculkSensorBlock.java @@ -129,6 +129,19 @@ public class SculkSensorBlock extends BaseEntityBlock implements SimpleWaterlogg } } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + if (!state.is(newState.getBlock())) { + if (getPhase(state) == SculkSensorPhase.ACTIVE) { + updateNeighbours(level, pos, state); + } + super.onRemove(state, level, pos, newState, movedByPiston); + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (getPhase(state) == SculkSensorPhase.ACTIVE) { diff --git a/net/minecraft/world/level/block/SculkShriekerBlock.java b/net/minecraft/world/level/block/SculkShriekerBlock.java index d7e5ec23c64b60c47ab6b54cbf282e88c3a4a045..037aa3592a963bbb142465d31040f60e95cb146e 100644 --- a/net/minecraft/world/level/block/SculkShriekerBlock.java +++ b/net/minecraft/world/level/block/SculkShriekerBlock.java @@ -68,6 +68,17 @@ public class SculkShriekerBlock extends BaseEntityBlock implements SimpleWaterlo super.stepOn(level, pos, onState, entity); } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + if (level instanceof ServerLevel serverLevel && state.getValue(SHRIEKING) && !state.is(newState.getBlock())) { + serverLevel.getBlockEntity(pos, BlockEntityType.SCULK_SHRIEKER).ifPresent(sculkShrieker -> sculkShrieker.tryRespond(serverLevel)); + } + super.onRemove(state, level, pos, newState, movedByPiston); + } + // Leaves end - behaviour 1.21.1- + + @Override protected void tick(final BlockState state, final ServerLevel level, final BlockPos pos, final RandomSource random) { if (state.getValue(SHRIEKING)) { diff --git a/net/minecraft/world/level/block/ShulkerBoxBlock.java b/net/minecraft/world/level/block/ShulkerBoxBlock.java index 722ce78461b2303f99493c309345697cfc98fb99..45dc3e8484842265b26d387d518831ff23da4b5e 100644 --- a/net/minecraft/world/level/block/ShulkerBoxBlock.java +++ b/net/minecraft/world/level/block/ShulkerBoxBlock.java @@ -150,6 +150,20 @@ public class ShulkerBoxBlock extends BaseEntityBlock { // Paper end - re-set loot table if it was cleared } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!state.is(newState.getBlock())) { + BlockEntity blockEntity = level.getBlockEntity(pos); + if (blockEntity instanceof ShulkerBoxBlockEntity) { + level.updateNeighbourForOutputSignal(pos, state.getBlock()); + } + super.onRemove(state, level, pos, newState, isMoving); + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/TripWireBlock.java b/net/minecraft/world/level/block/TripWireBlock.java index 04e5995409a3532947dfab1c8ef05bd546a6f66d..6bf811477a27bbbeeeba6c9d768d33fc677ea5e7 100644 --- a/net/minecraft/world/level/block/TripWireBlock.java +++ b/net/minecraft/world/level/block/TripWireBlock.java @@ -107,6 +107,17 @@ public class TripWireBlock extends Block { } } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent adjacent tripwires from updating + if (!isMoving && !state.is(newState.getBlock())) { + this.updateSource(level, pos, state.setValue(POWERED, Boolean.TRUE)); + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent adjacent tripwires from updating diff --git a/net/minecraft/world/level/block/TripWireHookBlock.java b/net/minecraft/world/level/block/TripWireHookBlock.java index fd808353181e05f2fc527a391ce7bb990f61b4c7..836eae0c3e0891a3e3309b684f15d65f891215cf 100644 --- a/net/minecraft/world/level/block/TripWireHookBlock.java +++ b/net/minecraft/world/level/block/TripWireHookBlock.java @@ -248,6 +248,26 @@ public class TripWireHookBlock extends Block { level.updateNeighborsAt(pos.relative(front), block, orientation); } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!isMoving && !state.is(newState.getBlock())) { + boolean attachedValue = state.getValue(ATTACHED); + boolean poweredValue = state.getValue(POWERED); + if (attachedValue || poweredValue) { + calculateState(level, pos, state, true, false, -1, null); + } + + if (poweredValue) { + notifyNeighbors(this, level, pos, state.getValue(FACING)); + } + + super.onRemove(state, level, pos, newState, isMoving); + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston) { diff --git a/net/minecraft/world/level/block/entity/BlockEntityType.java b/net/minecraft/world/level/block/entity/BlockEntityType.java index ac58bbed01edaf5dfe4839c89649ca865c339c8a..caead1012ff3b5b5f78c24a3baf20b7d00b84cf6 100644 --- a/net/minecraft/world/level/block/entity/BlockEntityType.java +++ b/net/minecraft/world/level/block/entity/BlockEntityType.java @@ -301,7 +301,7 @@ public class BlockEntityType { } public boolean isValid(final BlockState state) { - return this.validBlocks.contains(state.getBlock()); + return fun.bm.lophine.config.modules.experiment.RedStoneConfig.oldBlockRemoveBehaviour || this.validBlocks.contains(state.getBlock()); // Leaves - behaviour 1.21.1- } @Deprecated diff --git a/net/minecraft/world/level/block/piston/MovingPistonBlock.java b/net/minecraft/world/level/block/piston/MovingPistonBlock.java index 2b6ad989e1e1424d0283bae39e5dae33eba44923..0f47fb528422d591bd03434a089ea69c7f27bf8c 100644 --- a/net/minecraft/world/level/block/piston/MovingPistonBlock.java +++ b/net/minecraft/world/level/block/piston/MovingPistonBlock.java @@ -70,6 +70,19 @@ public class MovingPistonBlock extends BaseEntityBlock { return createTickerHelper(type, BlockEntityType.PISTON, PistonMovingBlockEntity::tick); } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!state.is(newState.getBlock())) { + BlockEntity blockEntity = level.getBlockEntity(pos); + if (blockEntity instanceof PistonMovingBlockEntity) { + ((PistonMovingBlockEntity)blockEntity).finalTick(); + } + } + } + // Leaves end - behaviour 1.21.1- + + @Override public void destroy(final LevelAccessor level, final BlockPos pos, final BlockState state) { BlockPos relative = pos.relative(state.getValue(FACING).getOpposite()); diff --git a/net/minecraft/world/level/block/piston/PistonHeadBlock.java b/net/minecraft/world/level/block/piston/PistonHeadBlock.java index f8caa0b3c21766dbad73c524c1680346e4257188..b658d602953ade618d89c02745eb46be5d0175dd 100644 --- a/net/minecraft/world/level/block/piston/PistonHeadBlock.java +++ b/net/minecraft/world/level/block/piston/PistonHeadBlock.java @@ -78,6 +78,20 @@ public class PistonHeadBlock extends DirectionalBlock { return super.playerWillDestroy(level, pos, state, player); } + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { + if (!state.is(newState.getBlock())) { + super.onRemove(state, level, pos, newState, isMoving); + BlockPos blockPos = pos.relative(state.getValue(FACING).getOpposite()); + if (this.isFittingBase(state, level.getBlockState(blockPos))) { + level.destroyBlock(blockPos, true); + } + } + } + // Leaves end - behaviour 1.21.1- + + @Override protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { BlockPos basePos = pos.relative(state.getValue(FACING).getOpposite()); diff --git a/net/minecraft/world/level/block/state/BlockBehaviour.java b/net/minecraft/world/level/block/state/BlockBehaviour.java index 0fbdf810c785c8a596d461e7651361fdedbb6217..ff1471f40b73582df68efbf2996a854c6aa37d65 100644 --- a/net/minecraft/world/level/block/state/BlockBehaviour.java +++ b/net/minecraft/world/level/block/state/BlockBehaviour.java @@ -174,6 +174,16 @@ public abstract class BlockBehaviour implements FeatureElement, org.leavesmc.lea org.spigotmc.AsyncCatcher.catchOp("block onPlace"); // Spigot } + // Leaves start - behaviour 1.21.1- + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + org.spigotmc.AsyncCatcher.catchOp("block remove"); // Spigot + if (state.hasBlockEntity() && !state.is(newState.getBlock())) { + level.removeBlockEntity(pos); + } + } + // Leaves end - behaviour 1.21.1- + + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { } @@ -889,6 +899,13 @@ public abstract class BlockBehaviour implements FeatureElement, org.leavesmc.lea // CraftBukkit end } + // Leaves start - behaviour 1.21.1- + public void onRemove(Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + this.getBlock().onRemove(this.asState(), level, pos, newState, movedByPiston); + } + // Leaves end - behaviour 1.21.1- + + public void affectNeighborsAfterRemoval(final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { this.getBlock().affectNeighborsAfterRemoval(this.asState(), level, pos, movedByPiston); } diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java index 316b8d45b0902b1bf01a77307e24fc9a47d1283b..9b3775b0cbca782964e03935331d1bfdd1af140d 100644 --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java @@ -424,22 +424,28 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot boolean blockChanged = !oldState.is(newBlock); boolean movedByPiston = (flags & Block.UPDATE_MOVE_BY_PISTON) != 0; boolean sideEffects = (flags & Block.UPDATE_SKIP_BLOCK_ENTITY_SIDEEFFECTS) == 0; - if (blockChanged && oldState.hasBlockEntity() && !state.shouldChangedStateKeepBlockEntity(oldState)) { - if (!this.level.isClientSide() && sideEffects) { - BlockEntity blockEntity = this.level.getBlockEntity(pos); - if (blockEntity != null) { - blockEntity.preRemoveSideEffects(pos, oldState); + // Leaves start - behaviour 1.21.1- + if (!fun.bm.lophine.config.modules.experiment.RedStoneConfig.oldBlockRemoveBehaviour) { + if (blockChanged && oldState.hasBlockEntity() && !state.shouldChangedStateKeepBlockEntity(oldState)) { + if (!this.level.isClientSide() && sideEffects) { + BlockEntity blockEntity = this.level.getBlockEntity(pos); + if (blockEntity != null) { + blockEntity.preRemoveSideEffects(pos, oldState); + } } - } - this.removeBlockEntity(pos); - } + this.removeBlockEntity(pos); + } - if ((blockChanged || newBlock instanceof BaseRailBlock) - && this.level instanceof ServerLevel serverLevel - && ((flags & Block.UPDATE_NEIGHBORS) != 0 || movedByPiston)) { - oldState.affectNeighborsAfterRemoval(serverLevel, pos, movedByPiston); + if ((blockChanged || newBlock instanceof BaseRailBlock) + && this.level instanceof ServerLevel serverLevel + && ((flags & Block.UPDATE_NEIGHBORS) != 0 || movedByPiston)) { + oldState.affectNeighborsAfterRemoval(serverLevel, pos, movedByPiston); + } + } else { + oldState.onRemove(this.level, pos, state, movedByPiston); } + // Leaves end - behaviour 1.21.1- if (!section.getBlockState(localX, localY, localZ).is(newBlock)) { return null;