Skip to content

Commit 64a5bf3

Browse files
committed
add option to let copper golems open shulkers
1 parent 95a466c commit 64a5bf3

File tree

4 files changed

+30
-11
lines changed

4 files changed

+30
-11
lines changed

build-data/purpur.at

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ public net.minecraft.world.entity.Entity updateInWaterStateAndDoWaterCurrentPush
55
public net.minecraft.world.entity.LivingEntity canGlide()Z
66
public net.minecraft.world.entity.monster.Shulker MAX_SCALE
77
public net.minecraft.world.entity.player.Player canGlide()Z
8+
public net.minecraft.world.level.block.ShulkerBoxBlock canOpen(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/entity/ShulkerBoxBlockEntity;)Z
89
public net.minecraft.world.level.block.entity.FuelValues values
910
public-f net.minecraft.world.entity.EntityType dimensions
1011
public-f net.minecraft.world.level.block.state.BlockBehaviour explosionResistance

purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/behavior/TransportItemsBetweenContainers.java.patch

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,29 @@
55
if (chunkNow != null) {
66
for (BlockEntity blockEntity : chunkNow.getBlockEntities().values()) {
77
- if (blockEntity instanceof ChestBlockEntity chestBlockEntity) {
8-
+ if (blockEntity instanceof net.minecraft.world.level.block.entity.BaseContainerBlockEntity chestBlockEntity) { // Purpur - copper golem can place items in barrels option
8+
+ if (blockEntity instanceof net.minecraft.world.level.block.entity.BaseContainerBlockEntity chestBlockEntity) { // Purpur - copper golem can place items in barrels or shulkers option
99
double d1 = chestBlockEntity.getBlockPos().distToCenterSqr(mob.position());
1010
if (d1 < d) {
1111
TransportItemsBetweenContainers.TransportItemTarget transportItemTarget1 = this.isTargetValidToPick(
12-
@@ -338,7 +_,7 @@
12+
@@ -372,7 +_,11 @@
13+
}
14+
15+
private boolean isTargetBlocked(Level level, TransportItemsBetweenContainers.TransportItemTarget target) {
16+
- return ChestBlock.isChestBlockedAt(level, target.pos);
17+
+ // Purpur start - copper golem can place items in barrels or shulkers option
18+
+ boolean isBarrelBlocked = level.purpurConfig.copperGolemCanOpenBarrel && target.state.is(net.minecraft.world.level.block.Blocks.BARREL);
19+
+ boolean isShulkerBlocked = level.purpurConfig.copperGolemCanOpenShulker && target.blockEntity instanceof net.minecraft.world.level.block.entity.ShulkerBoxBlockEntity shulkerBoxBlockEntity && !net.minecraft.world.level.block.ShulkerBoxBlock.canOpen(target.state, level, target.pos, shulkerBoxBlockEntity);
20+
+ return isBarrelBlocked || isShulkerBlocked || net.minecraft.world.level.block.ChestBlock.isChestBlockedAt(level, target.pos);
21+
+ // Purpur end - copper golem can place items in barrels or shulkers option
22+
}
1323

14-
private boolean hasValidTarget(Level level, PathfinderMob mob) {
15-
boolean flag = this.target != null && this.isWantedBlock(mob, this.target.state) && this.targetHasNotChanged(level, this.target);
16-
- if (flag && !this.isTargetBlocked(level, this.target)) {
17-
+ if (flag && (mob.level().purpurConfig.copperGolemCanOpenBarrel && this.target.state.is(net.minecraft.world.level.block.Blocks.BARREL) || !this.isTargetBlocked(level, this.target))) { // Purpur - copper golem can place items in barrels option
18-
if (!this.state.equals(TransportItemsBetweenContainers.TransportItemState.TRAVELLING)) {
19-
return true;
20-
}
24+
private boolean targetHasNotChanged(Level level, TransportItemsBetweenContainers.TransportItemTarget target) {
2125
@@ -449,7 +_,7 @@
2226
}
2327

2428
private boolean isWantedBlock(PathfinderMob mob, BlockState state) {
2529
- return isPickingUpItems(mob) ? this.sourceBlockType.test(state) : this.destinationBlockType.test(state);
26-
+ 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
30+
+ return isPickingUpItems(mob) ? this.sourceBlockType.test(state) : (mob.level().purpurConfig.copperGolemCanOpenBarrel && state.is(net.minecraft.world.level.block.Blocks.BARREL)) || (mob.level().purpurConfig.copperGolemCanOpenShulker && state.is(net.minecraft.tags.BlockTags.SHULKER_BOXES)) || this.destinationBlockType.test(state); // Purpur - copper golem can place items in barrels or shulkers option
2731
}
2832

2933
private static double getInteractionRange(PathfinderMob mob) {

purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/coppergolem/CopperGolemAi.java.patch

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,19 @@
55
private static final int TICK_TO_PLAY_ON_REACHED_SOUND = 9;
66
private static final Predicate<BlockState> TRANSPORT_ITEM_SOURCE_BLOCK = state -> state.is(BlockTags.COPPER_CHESTS);
77
- private static final Predicate<BlockState> TRANSPORT_ITEM_DESTINATION_BLOCK = state -> state.is(Blocks.CHEST) || state.is(Blocks.TRAPPED_CHEST);
8-
+ private static final Predicate<BlockState> TRANSPORT_ITEM_DESTINATION_BLOCK = state -> state.is(Blocks.CHEST) || state.is(Blocks.TRAPPED_CHEST); // Purpur - copper golem can place items in barrels option - diff on change
8+
+ private static final Predicate<BlockState> TRANSPORT_ITEM_DESTINATION_BLOCK = state -> state.is(Blocks.CHEST) || state.is(Blocks.TRAPPED_CHEST); // Purpur - copper golem can place items in barrels or shulkers option - diff on change
99
private static final ImmutableList<SensorType<? extends Sensor<? super CopperGolem>>> SENSOR_TYPES = ImmutableList.of(
1010
SensorType.NEAREST_LIVING_ENTITIES, SensorType.HURT_BY
1111
);
12+
@@ -158,6 +_,11 @@
13+
}
14+
15+
if (integer == 60) {
16+
+ // Purpur start - copper golem can place items in barrels or shulkers option
17+
+ if (container instanceof net.minecraft.world.level.block.entity.ShulkerBoxBlockEntity shulkerBoxBlockEntity && shulkerBoxBlockEntity.openCount > 0) {
18+
+ container.stopOpen(copperGolem);
19+
+ }
20+
+ // Purpur end - copper golem can place items in barrels or shulkers option
21+
if (container.getEntitiesWithContainerOpen().contains(pathfinderMob)) {
22+
container.stopOpen(copperGolem);
23+
}

purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1560,6 +1560,7 @@ private void codSettings() {
15601560
public boolean copperGolemTakeDamageFromWater = false;
15611561
public boolean copperGolemAlwaysDropExp = false;
15621562
public boolean copperGolemCanOpenBarrel = false;
1563+
public boolean copperGolemCanOpenShulker = false;
15631564
private void copperGolemSettings() {
15641565
copperGolemRidable = getBoolean("mobs.copper_golem.ridable", copperGolemRidable);
15651566
copperGolemRidableInWater = getBoolean("mobs.copper_golem.ridable-in-water", copperGolemRidableInWater);
@@ -1572,6 +1573,7 @@ private void copperGolemSettings() {
15721573
copperGolemTakeDamageFromWater = getBoolean("mobs.copper_golem.takes-damage-from-water", copperGolemTakeDamageFromWater);
15731574
copperGolemAlwaysDropExp = getBoolean("mobs.copper_golem.always-drop-exp", copperGolemAlwaysDropExp);
15741575
copperGolemCanOpenBarrel = getBoolean("mobs.copper_golem.can-open-barrel", copperGolemCanOpenBarrel);
1576+
copperGolemCanOpenShulker = getBoolean("mobs.copper_golem.can-open-shulker", copperGolemCanOpenShulker);
15751577
}
15761578

15771579
public boolean cowRidable = false;

0 commit comments

Comments
 (0)