diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/CopperGolem.java.patch b/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/CopperGolem.java.patch new file mode 100644 index 000000000..b14fbcdfd --- /dev/null +++ b/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/CopperGolem.java.patch @@ -0,0 +1,22 @@ +--- a/src/main/java/org/bukkit/entity/CopperGolem.java ++++ b/src/main/java/org/bukkit/entity/CopperGolem.java +@@ -3,4 +_,19 @@ + import io.papermc.paper.entity.Shearable; + + public interface CopperGolem extends Golem, Shearable { ++ // Purpur start ++ /** ++ * Get the player that summoned this iron golem ++ * ++ * @return UUID of summoner ++ */ ++ @org.jetbrains.annotations.Nullable java.util.UUID getSummoner(); ++ ++ /** ++ * Set the player that summoned this iron golem ++ * ++ * @param summoner UUID of summoner ++ */ ++ void setSummoner(@org.jetbrains.annotations.Nullable java.util.UUID summoner); ++ // Purpur end + } diff --git a/purpur-server/minecraft-patches/features/0001-Ridables.patch b/purpur-server/minecraft-patches/features/0001-Ridables.patch index 739d03b29..b2f893772 100644 --- a/purpur-server/minecraft-patches/features/0001-Ridables.patch +++ b/purpur-server/minecraft-patches/features/0001-Ridables.patch @@ -2127,10 +2127,10 @@ 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 facc49cb9a6aa7dddfbbf9733391fc9cf656f0ce..292c9a82028503566c8d3b50b87d09f79619aa7d 100644 +index f9c3a33a7c5efc30a97f1ce74b94f5e6213298fe..82c2ff4ba05921a102d21e8fe547adb82fe9a445 100644 --- a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java +++ b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java -@@ -185,6 +185,7 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab +@@ -199,6 +199,7 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab protected void customServerAiStep(ServerLevel level) { ProfilerFiller profilerFiller = Profiler.get(); profilerFiller.push("copperGolemBrain"); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java.patch new file mode 100644 index 000000000..aa9cfe0bc --- /dev/null +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java.patch @@ -0,0 +1,44 @@ +--- a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java ++++ b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java +@@ -84,6 +_,7 @@ + private final AnimationState interactionDropItemAnimationState = new AnimationState(); + private final AnimationState interactionDropNoItemAnimationState = new AnimationState(); + public static final EquipmentSlot EQUIPMENT_SLOT_ANTENNA = EquipmentSlot.SADDLE; ++ @Nullable private UUID summoner; // Purpur - Summoner API + + public CopperGolem(EntityType entityType, Level level) { + super(entityType, level); +@@ -97,6 +_,17 @@ + this.getBrain().setMemory(MemoryModuleType.TRANSPORT_ITEMS_COOLDOWN_TICKS, this.getRandom().nextInt(60, 100)); + } + ++ // Purpur start - Summoner API ++ @Nullable ++ public UUID getSummoner() { ++ return summoner; ++ } ++ ++ public void setSummoner(@Nullable UUID summoner) { ++ this.summoner = summoner; ++ } ++ // Purpur end - Summoner API ++ + 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); + } +@@ -172,6 +_,7 @@ + super.addAdditionalSaveData(output); + output.putLong("next_weather_age", this.nextWeatheringTick); + output.store("weather_state", WeatheringCopper.WeatherState.CODEC, this.getWeatherState()); ++ output.storeNullable("Purpur.Summoner", net.minecraft.core.UUIDUtil.CODEC, getSummoner()); // Purpur - Summoner API + } + + @Override +@@ -179,6 +_,7 @@ + super.readAdditionalSaveData(input); + this.nextWeatheringTick = input.getLongOr("next_weather_age", -1L); + this.setWeatherState(input.read("weather_state", WeatheringCopper.WeatherState.CODEC).orElse(WeatheringCopper.WeatherState.UNAFFECTED)); ++ this.setSummoner(input.read("Purpur.Summoner", net.minecraft.core.UUIDUtil.CODEC).orElse(null)); // Purpur - Summoner API + } + + @Override diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CarvedPumpkinBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CarvedPumpkinBlock.java.patch index 37c2a4ea1..bc9bb48ad 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CarvedPumpkinBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CarvedPumpkinBlock.java.patch @@ -18,18 +18,31 @@ return; } } -@@ -112,6 +_,16 @@ +@@ -93,7 +_,7 @@ + if (blockPatternMatch2 != null) { + CopperGolem copperGolem = EntityType.COPPER_GOLEM.create(level, EntitySpawnReason.TRIGGERED); + if (copperGolem != null) { +- spawnGolemInWorld(level, blockPatternMatch2, copperGolem, blockPatternMatch2.getBlock(0, 0, 0).getPos()); ++ spawnGolemInWorld(level, blockPatternMatch2, copperGolem, blockPatternMatch2.getBlock(0, 0, 0).getPos(), this.placer); // Purpur - Summoner API + this.replaceCopperBlockWithChest(level, blockPatternMatch2); + copperGolem.spawn(this.getWeatherStateFromPattern(blockPatternMatch2)); + } +@@ -111,7 +_,20 @@ + .getAge(); } ++ @io.papermc.paper.annotation.DoNotUse private static void spawnGolemInWorld(Level level, BlockPattern.BlockPatternMatch patternMatch, Entity golem, BlockPos pos) { + // Purpur start - Summoner API + spawnGolemInWorld(level, patternMatch, golem, pos, null); + } + private static void spawnGolemInWorld(Level level, BlockPattern.BlockPatternMatch patternMatch, Entity golem, BlockPos pos, net.minecraft.world.entity.LivingEntity placer) { -+ if (golem instanceof SnowGolem snowGolem) { -+ snowGolem.setSummoner(placer == null ? null : placer.getUUID()); -+ } else if (golem instanceof IronGolem ironGolem) { -+ ironGolem.setSummoner(placer == null ? null : placer.getUUID()); ++ java.util.UUID summoner = placer == null ? null : placer.getUUID(); ++ switch (golem) { ++ case SnowGolem snowGolem -> snowGolem.setSummoner(summoner); ++ case IronGolem ironGolem -> ironGolem.setSummoner(summoner); ++ case CopperGolem copperGolem -> copperGolem.setSummoner(summoner); ++ default -> throw new IllegalStateException("Unexpected value: " + golem); + } + // Purpur end - Summoner API // clearPatternBlocks(level, patternMatch); // Paper - moved down diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftCopperGolem.java.patch b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftCopperGolem.java.patch new file mode 100644 index 000000000..22580e7d3 --- /dev/null +++ b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftCopperGolem.java.patch @@ -0,0 +1,20 @@ +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftCopperGolem.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftCopperGolem.java +@@ -13,4 +_,17 @@ + public net.minecraft.world.entity.animal.coppergolem.CopperGolem getHandle() { + return (net.minecraft.world.entity.animal.coppergolem.CopperGolem) this.entity; + } ++ ++ // Purpur start - Summoner API ++ @Override ++ @org.jetbrains.annotations.Nullable ++ public java.util.UUID getSummoner() { ++ return getHandle().getSummoner(); ++ } ++ ++ @Override ++ public void setSummoner(@org.jetbrains.annotations.Nullable java.util.UUID summoner) { ++ getHandle().setSummoner(summoner); ++ } ++ // Purpur end - Summoner API + }