From 3f3218197af260f587b96ac017b4470e2cf7b332 Mon Sep 17 00:00:00 2001 From: granny Date: Thu, 2 Oct 2025 19:17:54 -0700 Subject: [PATCH] add option to let copper golems open barrels --- ...TransportItemsBetweenContainers.java.patch | 20 +++++++++++++++++++ .../coppergolem/CopperGolemAi.java.patch | 11 ++++++++++ .../purpurmc/purpur/PurpurWorldConfig.java | 2 ++ 3 files changed, 33 insertions(+) create mode 100644 purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/behavior/TransportItemsBetweenContainers.java.patch create mode 100644 purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/coppergolem/CopperGolemAi.java.patch diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/behavior/TransportItemsBetweenContainers.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/behavior/TransportItemsBetweenContainers.java.patch new file mode 100644 index 000000000..04dfda15f --- /dev/null +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/behavior/TransportItemsBetweenContainers.java.patch @@ -0,0 +1,20 @@ +--- a/net/minecraft/world/entity/ai/behavior/TransportItemsBetweenContainers.java ++++ b/net/minecraft/world/entity/ai/behavior/TransportItemsBetweenContainers.java +@@ -287,7 +_,7 @@ + LevelChunk chunkNow = level.getChunkSource().getChunkNow(chunkPos.x, chunkPos.z); + if (chunkNow != null) { + for (BlockEntity blockEntity : chunkNow.getBlockEntities().values()) { +- if (blockEntity instanceof ChestBlockEntity chestBlockEntity) { ++ if (blockEntity instanceof net.minecraft.world.level.block.entity.BaseContainerBlockEntity chestBlockEntity) { // Purpur - copper golem can place items in barrels option + double d1 = chestBlockEntity.getBlockPos().distToCenterSqr(mob.position()); + if (d1 < d) { + TransportItemsBetweenContainers.TransportItemTarget transportItemTarget1 = this.isTargetValidToPick( +@@ -446,7 +_,7 @@ + } + + private boolean isWantedBlock(PathfinderMob mob, BlockState state) { +- return isPickingUpItems(mob) ? this.sourceBlockType.test(state) : this.destinationBlockType.test(state); ++ return isPickingUpItems(mob) ? this.sourceBlockType.test(state) : (mob.level().purpurConfig.copperGolemCanOpenBarrel && state.is(net.minecraft.world.level.block.Blocks.BARREL)) || this.destinationBlockType.test(state); // Purpur - copper golem can place items in barrels option + } + + private static double getInteractionRange(PathfinderMob mob) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/coppergolem/CopperGolemAi.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/coppergolem/CopperGolemAi.java.patch new file mode 100644 index 000000000..d5f2652c4 --- /dev/null +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/coppergolem/CopperGolemAi.java.patch @@ -0,0 +1,11 @@ +--- a/net/minecraft/world/entity/animal/coppergolem/CopperGolemAi.java ++++ b/net/minecraft/world/entity/animal/coppergolem/CopperGolemAi.java +@@ -43,7 +_,7 @@ + private static final int TICK_TO_START_ON_REACHED_INTERACTION = 1; + private static final int TICK_TO_PLAY_ON_REACHED_SOUND = 9; + private static final Predicate TRANSPORT_ITEM_SOURCE_BLOCK = blockState -> blockState.is(BlockTags.COPPER_CHESTS); +- private static final Predicate TRANSPORT_ITEM_DESTINATION_BLOCK = blockState -> blockState.is(Blocks.CHEST) ++ private static final Predicate TRANSPORT_ITEM_DESTINATION_BLOCK = blockState -> blockState.is(Blocks.CHEST) // Purpur - copper golem can place items in barrels option - diff on change + || blockState.is(Blocks.TRAPPED_CHEST); + private static final ImmutableList>> SENSOR_TYPES = ImmutableList.of( + SensorType.NEAREST_LIVING_ENTITIES, SensorType.HURT_BY diff --git a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java index d8054933e..6a9717b8f 100644 --- a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1514,6 +1514,7 @@ public class PurpurWorldConfig { public double copperGolemScale = 1.0D; public boolean copperGolemTakeDamageFromWater = false; public boolean copperGolemAlwaysDropExp = false; + public boolean copperGolemCanOpenBarrel = false; private void copperGolemSettings() { copperGolemRidable = getBoolean("mobs.copper_golem.ridable", copperGolemRidable); copperGolemRidableInWater = getBoolean("mobs.copper_golem.ridable-in-water", copperGolemRidableInWater); @@ -1525,6 +1526,7 @@ public class PurpurWorldConfig { copperGolemScale = Mth.clamp(getDouble("mobs.copper_golem.attributes.scale", copperGolemScale), 0.0625D, 16.0D); copperGolemTakeDamageFromWater = getBoolean("mobs.copper_golem.takes-damage-from-water", copperGolemTakeDamageFromWater); copperGolemAlwaysDropExp = getBoolean("mobs.copper_golem.always-drop-exp", copperGolemAlwaysDropExp); + copperGolemCanOpenBarrel = getBoolean("mobs.copper_golem.can-open-barrel", copperGolemCanOpenBarrel); } public boolean cowRidable = false;