From 5bb1521a3b4b58498eff92aadfcec2cfee23b218 Mon Sep 17 00:00:00 2001 From: granny Date: Tue, 30 Sep 2025 19:05:41 -0700 Subject: [PATCH] add copper golem options --- .../features/0001-Ridables.patch | 51 ++++++++++++++++++- ...-Configurable-entity-base-attributes.patch | 21 ++++++++ ...oggle-for-water-sensitive-mob-damage.patch | 18 +++++++ .../0020-Mobs-always-drop-experience.patch | 18 +++++++ .../purpurmc/purpur/PurpurWorldConfig.java | 23 +++++++++ 5 files changed, 129 insertions(+), 2 deletions(-) diff --git a/purpur-server/minecraft-patches/features/0001-Ridables.patch b/purpur-server/minecraft-patches/features/0001-Ridables.patch index b2f893772..0997421e8 100644 --- a/purpur-server/minecraft-patches/features/0001-Ridables.patch +++ b/purpur-server/minecraft-patches/features/0001-Ridables.patch @@ -2127,10 +2127,39 @@ index 9ad94aca22a100dddaded5833763f9acd2a0ce56..96c98f032b1b3aec32aba38244ee8b45 protected void addAdditionalSaveData(ValueOutput output) { super.addAdditionalSaveData(output); diff --git a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java -index f9c3a33a7c5efc30a97f1ce74b94f5e6213298fe..82c2ff4ba05921a102d21e8fe547adb82fe9a445 100644 +index f9c3a33a7c5efc30a97f1ce74b94f5e6213298fe..20d2f081fa2576ea946489d3e717b389092abaef 100644 --- a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java +++ b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java -@@ -199,6 +199,7 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab +@@ -109,6 +109,28 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab + } + // Purpur end - Summoner API + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.copperGolemRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.copperGolemRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.copperGolemControllable; ++ } ++ ++ @Override ++ protected void registerGoals() { ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); ++ } ++ // Purpur end - Ridables ++ + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F).add(Attributes.STEP_HEIGHT, 1.0).add(Attributes.MAX_HEALTH, 12.0); + } +@@ -199,6 +221,7 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab protected void customServerAiStep(ServerLevel level) { ProfilerFiller profilerFiller = Profiler.get(); profilerFiller.push("copperGolemBrain"); @@ -2138,6 +2167,24 @@ index f9c3a33a7c5efc30a97f1ce74b94f5e6213298fe..82c2ff4ba05921a102d21e8fe547adb8 this.getBrain().tick(level, this); profilerFiller.pop(); profilerFiller.push("copperGolemActivityUpdate"); +@@ -238,7 +261,7 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab + java.util.List drops = this.generateDefaultDrops(serverLevel, itemInHand); + org.bukkit.event.player.PlayerShearEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemInHand, hand, drops); + if (event != null) { +- if (event.isCancelled()) return InteractionResult.PASS; ++ if (event.isCancelled()) return tryRide(player, hand); // Purpur - Ridables + drops = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getDrops()); + } + this.shear(serverLevel, SoundSource.PLAYERS, itemInHand, drops); +@@ -274,6 +297,8 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab + } + } + ++ if (level().purpurConfig.villagerRidable && itemInHand.isEmpty()) return tryRide(player, hand); // Purpur - Ridables ++ + return super.mobInteract(player, hand); + } + } diff --git a/net/minecraft/world/entity/animal/frog/Frog.java b/net/minecraft/world/entity/animal/frog/Frog.java index 7d63881ec187f11544947a487fd0445561228247..e451e604b37f078cb94f3204ebb25dbc153d2551 100644 --- a/net/minecraft/world/entity/animal/frog/Frog.java diff --git a/purpur-server/minecraft-patches/features/0002-Configurable-entity-base-attributes.patch b/purpur-server/minecraft-patches/features/0002-Configurable-entity-base-attributes.patch index aba86cd6a..416e3bcb3 100644 --- a/purpur-server/minecraft-patches/features/0002-Configurable-entity-base-attributes.patch +++ b/purpur-server/minecraft-patches/features/0002-Configurable-entity-base-attributes.patch @@ -595,6 +595,27 @@ index 96c98f032b1b3aec32aba38244ee8b45aca9078c..3a794ff3d68c86b4e5ef93ff8f5cedfa @Override public SoundEvent getAmbientSound() { return SoundEvents.CAMEL_AMBIENT; +diff --git a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java +index 20d2f081fa2576ea946489d3e717b389092abaef..0597de19bcb1dc21cc7d07bb9b69dfb6967bba6f 100644 +--- a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java ++++ b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java +@@ -131,6 +131,16 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.copperGolemMaxHealth); ++ this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(this.level().purpurConfig.copperGolemStepHeight); ++ this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level().purpurConfig.copperGolemMovementSpeed); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.copperGolemScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F).add(Attributes.STEP_HEIGHT, 1.0).add(Attributes.MAX_HEALTH, 12.0); + } diff --git a/net/minecraft/world/entity/animal/horse/AbstractHorse.java b/net/minecraft/world/entity/animal/horse/AbstractHorse.java index b528bd7cc2001a3c0ec1cf615a4c306a9cd7e9f1..387f6bb134a766ce7b72cf2d4a56509f51687308 100644 --- a/net/minecraft/world/entity/animal/horse/AbstractHorse.java diff --git a/purpur-server/minecraft-patches/features/0017-Toggle-for-water-sensitive-mob-damage.patch b/purpur-server/minecraft-patches/features/0017-Toggle-for-water-sensitive-mob-damage.patch index 2e16ccb0d..85d965b7b 100644 --- a/purpur-server/minecraft-patches/features/0017-Toggle-for-water-sensitive-mob-damage.patch +++ b/purpur-server/minecraft-patches/features/0017-Toggle-for-water-sensitive-mob-damage.patch @@ -458,6 +458,24 @@ index a6145a24bffc1f56406cb9e57b15631ba82afe6a..4932668448a7346758983b647f4e5080 @Override public float getWalkTargetValue(BlockPos pos, LevelReader level) { return 0.0F; +diff --git a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java +index 0597de19bcb1dc21cc7d07bb9b69dfb6967bba6f..19d02efdd82f370d0edc62abdbb7be3a062f8706 100644 +--- a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java ++++ b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java +@@ -141,6 +141,13 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.copperGolemTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F).add(Attributes.STEP_HEIGHT, 1.0).add(Attributes.MAX_HEALTH, 12.0); + } diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java index 0ec325f198d877057a9b497e667d1f3be40e683e..4e93554170d9c91a7d704b161b91ca28b19be73b 100644 --- a/net/minecraft/world/entity/animal/goat/Goat.java diff --git a/purpur-server/minecraft-patches/features/0020-Mobs-always-drop-experience.patch b/purpur-server/minecraft-patches/features/0020-Mobs-always-drop-experience.patch index bb7b116cb..7b7efa43c 100644 --- a/purpur-server/minecraft-patches/features/0020-Mobs-always-drop-experience.patch +++ b/purpur-server/minecraft-patches/features/0020-Mobs-always-drop-experience.patch @@ -454,6 +454,24 @@ index 4932668448a7346758983b647f4e508061297ba2..08fb591e860b7b2b93b42bfc7a91d639 @Override public float getWalkTargetValue(BlockPos pos, LevelReader level) { return 0.0F; +diff --git a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java +index 19d02efdd82f370d0edc62abdbb7be3a062f8706..eb1074a39d7d1ec8ecf7f2345e5402ef092cf9b1 100644 +--- a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java ++++ b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java +@@ -148,6 +148,13 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.copperGolemAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F).add(Attributes.STEP_HEIGHT, 1.0).add(Attributes.MAX_HEALTH, 12.0); + } diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java index 4e93554170d9c91a7d704b161b91ca28b19be73b..99980c9a69b51f81a9cd4429d59fab9497d79656 100644 --- a/net/minecraft/world/entity/animal/goat/Goat.java 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 a03e166b4..2e068f730 100644 --- a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1459,6 +1459,29 @@ public class PurpurWorldConfig { codAlwaysDropExp = getBoolean("mobs.cod.always-drop-exp", codAlwaysDropExp); } + public boolean copperGolemRidable = false; + public boolean copperGolemRidableInWater = true; + public boolean copperGolemControllable = true; + public boolean copperGolemCanSwim = false; + public double copperGolemMaxHealth = 12.0D; + public double copperGolemStepHeight = 1.0D; + public double copperGolemMovementSpeed = 0.2D; + public double copperGolemScale = 1.0D; + public boolean copperGolemTakeDamageFromWater = false; + public boolean copperGolemAlwaysDropExp = false; + private void copperGolemSettings() { + copperGolemRidable = getBoolean("mobs.copper_golem.ridable", copperGolemRidable); + copperGolemRidableInWater = getBoolean("mobs.copper_golem.ridable-in-water", copperGolemRidableInWater); + copperGolemControllable = getBoolean("mobs.copper_golem.controllable", copperGolemControllable); + copperGolemCanSwim = getBoolean("mobs.copper_golem.can-swim", copperGolemCanSwim); + copperGolemMaxHealth = getDouble("mobs.copper_golem.attributes.max_health", copperGolemMaxHealth); + copperGolemStepHeight = getDouble("mobs.copper_golem.attributes.step_height", copperGolemStepHeight); + copperGolemMovementSpeed = getDouble("mobs.copper_golem.attributes.movement_speed", copperGolemMovementSpeed); + 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); + } + public boolean cowRidable = false; public boolean cowRidableInWater = true; public boolean cowControllable = true;