From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Helvetica Volubi Date: Sun, 18 May 2025 03:48:53 +0800 Subject: [PATCH] Add config to modify tripwire behavior diff --git a/net/minecraft/world/level/block/TripWireHookBlock.java b/net/minecraft/world/level/block/TripWireHookBlock.java index 9aace993c6c18f1a50610e4766225485984b8167..419c1c7e14691a472b70ed548ecb928cb289b939 100644 --- a/net/minecraft/world/level/block/TripWireHookBlock.java +++ b/net/minecraft/world/level/block/TripWireHookBlock.java @@ -214,10 +214,18 @@ public class TripWireHookBlock extends Block { BlockPos blockPos1 = pos.relative(direction, i2); BlockState blockState2 = blockStates[i2]; if (blockState2 != null) { - BlockState blockState3 = level.getBlockState(blockPos1); - if (blockState3.is(Blocks.TRIPWIRE) || blockState3.is(Blocks.TRIPWIRE_HOOK)) { - if (!io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates || !blockState3.is(Blocks.TRIPWIRE)) level.setBlock(blockPos1, blockState2.trySetValue(ATTACHED, Boolean.valueOf(flag2)), 3); // Paper - prevent tripwire from updating + // Luminol start - tripwire and tripwireHook dupe + if (me.earthme.luminol.config.modules.misc.AllowTripwireDupe.enabled) { + level.setBlock(blockPos1, blockState2.trySetValue(ATTACHED, flag2), 3); + level.getBlockState(blockPos1); + } else { + BlockState blockState3 = level.getBlockState(blockPos1); + if (blockState3.is(Blocks.TRIPWIRE) || blockState3.is(Blocks.TRIPWIRE_HOOK)) { + if (!io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates || !blockState3.is(Blocks.TRIPWIRE)) + level.setBlock(blockPos1, blockState2.trySetValue(ATTACHED, Boolean.valueOf(flag2)), 3); // Paper - prevent tripwire from updating + } } + // Luminol end - tripwire and tripwireHook dupe } } } diff --git a/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java b/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java index f96fc1391167dea48cac1caa464b9026657df89a..5485d02c1eff4d0dcc69cf74f4ce5e485e3a95bf 100644 --- a/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java +++ b/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java @@ -27,15 +27,43 @@ public class EndPlatformFeature extends Feature { // CraftBukkit end BlockPos.MutableBlockPos mutableBlockPos = pos.mutable(); + // Luminol start - tripwire behavior modifier + java.util.List blockList1 = new java.util.ArrayList<>(); + java.util.List blockList2 = new java.util.ArrayList<>(); + boolean flag21 = !java.util.Objects.equals(me.earthme.luminol.config.modules.misc.AllowTripwireDupe.behaviorMode, "VANILLA20") + && !java.util.Objects.equals(me.earthme.luminol.config.modules.misc.AllowTripwireDupe.behaviorMode, "MIXED"); for (int i = -2; i <= 2; i++) { for (int i1 = -2; i1 <= 2; i1++) { for (int i2 = -1; i2 < 3; i2++) { BlockPos blockPos = mutableBlockPos.set(pos).move(i1, i2, i); Block block = i2 == -1 ? Blocks.OBSIDIAN : Blocks.AIR; - // CraftBukkit start if (!blockList.getBlockState(blockPos).is(block)) { if (dropBlocks) { - blockList.destroyBlock(blockPos, true, null); + boolean flag = false; + if (me.earthme.luminol.config.modules.misc.AllowTripwireDupe.enabled) { + switch (me.earthme.luminol.config.modules.misc.AllowTripwireDupe.behaviorMode) { + case "VANILLA20": { + flag = true; + } + case "MIXED": { + net.minecraft.world.level.block.state.BlockState state = level.getBlockState(blockPos); + if (state.is(Blocks.TRIPWIRE)) { + if (state.getValue(net.minecraft.world.level.block.TripWireBlock.DISARMED)) { + flag = true; + blockList2.add(blockPos.immutable()); + } + if (!flag) { + flag = checkString(blockList2, blockPos); + } + } + } + default: { + + } // Luminol - 1.21 Logic - default empty + } + } + if (flag) blockList1.add(blockPos.immutable()); + else blockList.destroyBlock(blockPos, true, null); } blockList.setBlock(blockPos, block.defaultBlockState(), 3); @@ -54,11 +82,39 @@ public class EndPlatformFeature extends Feature { if (portalEvent.isCancelled()) return; } - // SPIGOT-7856: End platform not dropping items after replacing blocks - if (dropBlocks) { - blockList.getList().forEach((state) -> level.destroyBlock(state.getPosition(), true, null)); + if (flag21) { + // Luminol start - When updated replace it with newer code + if (dropBlocks) { + java.util.function.Consumer beforeRun = state -> level.destroyBlock(state.getPosition(), !blockList1.contains(state.getPosition()), null); + java.util.function.Predicate filter = $ -> true; + for (org.bukkit.craftbukkit.block.CraftBlockState state : blockList.getList()) { + if (filter.test(state)) { + beforeRun.accept(state); + if (state.isPlaced()) { + state.getWorldHandle().setBlock(state.getPosition(), state.getHandle(), state.getFlag()); + } + } + } + } else { + blockList.updateList(); + } + // Luminol end - When updated replace it with newer code + } else { + // SPIGOT-7856: End platform not dropping items after replacing blocks + if (dropBlocks) { + blockList.getList().forEach((state) -> level.destroyBlock(state.getPosition(), !blockList1.contains(state.getPosition()), null)); // Luminol - prevent tripwire dupe in end platform generate + } + blockList.updateList(); } - blockList.updateList(); // CraftBukkit end } + + private static boolean checkString(java.util.List blockList, BlockPos blockPos) { + for (BlockPos pos : blockList) { + if (pos.getY() != blockPos.getY()) continue; + if (pos.getX() == blockPos.getX() || pos.getZ() == blockPos.getZ()) return true; + } + return false; + } + // Luminol end - tripwire behavior modifier }