From f80ccb5b1ee303642056ce7a8152da24764ace63 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 12 Jan 2025 11:30:20 -0800 Subject: [PATCH] Summoner API --- patches/api/0027-Summoner-API.patch | 81 ------ patches/server/0181-Summoner-API.patch | 258 ------------------ .../org/bukkit/entity/IronGolem.java.patch | 23 ++ .../java/org/bukkit/entity/Snowman.java.patch | 23 ++ .../java/org/bukkit/entity/Wither.java.patch | 23 ++ .../features/0001-Ridables.patch | 41 +-- ...-Configurable-entity-base-attributes.patch | 21 +- .../0009-Implement-elytra-settings.patch | 4 +- ...iefing-bypass-to-everything-affected.patch | 8 +- ...oggle-for-water-sensitive-mob-damage.patch | 12 +- .../world/entity/animal/IronGolem.java.patch | 37 ++- .../world/entity/animal/SnowGolem.java.patch | 37 ++- .../entity/boss/wither/WitherBoss.java.patch | 42 +++ .../level/block/CarvedPumpkinBlock.java.patch | 36 +++ .../level/block/WitherSkullBlock.java.patch | 10 + .../entity/CraftIronGolem.java.patch | 20 ++ .../entity/CraftSnowman.java.patch | 20 ++ .../craftbukkit/entity/CraftWither.java.patch | 20 ++ 18 files changed, 335 insertions(+), 381 deletions(-) delete mode 100644 patches/api/0027-Summoner-API.patch delete mode 100644 patches/server/0181-Summoner-API.patch create mode 100644 purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/IronGolem.java.patch create mode 100644 purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Snowman.java.patch create mode 100644 purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Wither.java.patch create mode 100644 purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CarvedPumpkinBlock.java.patch create mode 100644 purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/WitherSkullBlock.java.patch create mode 100644 purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java.patch create mode 100644 purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java.patch create mode 100644 purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java.patch diff --git a/patches/api/0027-Summoner-API.patch b/patches/api/0027-Summoner-API.patch deleted file mode 100644 index bc94bd07e..000000000 --- a/patches/api/0027-Summoner-API.patch +++ /dev/null @@ -1,81 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Sat, 3 Jul 2021 18:45:01 -0500 -Subject: [PATCH] Summoner API - - -diff --git a/src/main/java/org/bukkit/entity/IronGolem.java b/src/main/java/org/bukkit/entity/IronGolem.java -index 655e37cb3a09610a3f3df805d6dcad17d722da62..09fd716c8fc9ea34a1cbf87bcbe22df035422a51 100644 ---- a/src/main/java/org/bukkit/entity/IronGolem.java -+++ b/src/main/java/org/bukkit/entity/IronGolem.java -@@ -19,4 +19,20 @@ public interface IronGolem extends Golem { - * player created, false if you want it to be a natural village golem. - */ - public void setPlayerCreated(boolean playerCreated); -+ -+ // 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/src/main/java/org/bukkit/entity/Snowman.java b/src/main/java/org/bukkit/entity/Snowman.java -index 7fbfdb07585c7b28acea1f0c1f58ada0cc744441..21fcca092e2e31baa5ece0de9e44e3fade8c7123 100644 ---- a/src/main/java/org/bukkit/entity/Snowman.java -+++ b/src/main/java/org/bukkit/entity/Snowman.java -@@ -23,4 +23,20 @@ public interface Snowman extends Golem, RangedEntity, io.papermc.paper.entity.Sh - * @param derpMode True to remove the pumpkin, false to add a pumpkin - */ - void setDerp(boolean derpMode); -+ -+ // Purpur start -+ /** -+ * Get the player that summoned this snowman -+ * -+ * @return UUID of summoner -+ */ -+ @org.jetbrains.annotations.Nullable java.util.UUID getSummoner(); -+ -+ /** -+ * Set the player that summoned this snowman -+ * -+ * @param summoner UUID of summoner -+ */ -+ void setSummoner(@org.jetbrains.annotations.Nullable java.util.UUID summoner); -+ // Purpur end - } -diff --git a/src/main/java/org/bukkit/entity/Wither.java b/src/main/java/org/bukkit/entity/Wither.java -index 14543c2238b45c526dd9aebea2aa5c22f5df54dc..5312daf33405704c74e2c9e109754285ea6cf734 100644 ---- a/src/main/java/org/bukkit/entity/Wither.java -+++ b/src/main/java/org/bukkit/entity/Wither.java -@@ -107,4 +107,20 @@ public interface Wither extends Monster, Boss, com.destroystokyo.paper.entity.Ra - */ - void enterInvulnerabilityPhase(); - // Paper end -+ -+ // Purpur start -+ /** -+ * Get the player that summoned this wither -+ * -+ * @return UUID of summoner -+ */ -+ @org.jetbrains.annotations.Nullable java.util.UUID getSummoner(); -+ -+ /** -+ * Set the player that summoned this wither -+ * -+ * @param summoner UUID of summoner -+ */ -+ void setSummoner(@org.jetbrains.annotations.Nullable java.util.UUID summoner); -+ // Purpur end - } diff --git a/patches/server/0181-Summoner-API.patch b/patches/server/0181-Summoner-API.patch deleted file mode 100644 index 2c5e9f54b..000000000 --- a/patches/server/0181-Summoner-API.patch +++ /dev/null @@ -1,258 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Sat, 3 Jul 2021 18:40:58 -0500 -Subject: [PATCH] Summoner API - - -diff --git a/net/minecraft/world/entity/animal/IronGolem.java b/net/minecraft/world/entity/animal/IronGolem.java -index da51e119c290a850072679a7b4f4bde3025c95cf..2cde18232b4101a5b20ca7897c0b8638eab68169 100644 ---- a/net/minecraft/world/entity/animal/IronGolem.java -+++ b/net/minecraft/world/entity/animal/IronGolem.java -@@ -57,6 +57,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - private int remainingPersistentAngerTime; - @Nullable - private UUID persistentAngerTarget; -+ @Nullable private UUID summoner; // Purpur - - public IronGolem(EntityType type, Level world) { - super(type, world); -@@ -92,6 +93,16 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - return this.level().purpurConfig.ironGolemTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Summoner API -+ @Nullable -+ public UUID getSummoner() { -+ return summoner; -+ } -+ -+ public void setSummoner(@Nullable UUID summoner) { -+ this.summoner = summoner; -+ } -+ // Purpur end - Summoner API - @Override - protected void registerGoals() { - if (level().purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur - Ridables -@@ -169,6 +180,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - public void addAdditionalSaveData(CompoundTag nbt) { - super.addAdditionalSaveData(nbt); - nbt.putBoolean("PlayerCreated", this.isPlayerCreated()); -+ if (getSummoner() != null) nbt.putUUID("Purpur.Summoner", getSummoner()); // Purpur - Summoner API - this.addPersistentAngerSaveData(nbt); - } - -@@ -176,6 +188,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - public void readAdditionalSaveData(CompoundTag nbt) { - super.readAdditionalSaveData(nbt); - this.setPlayerCreated(nbt.getBoolean("PlayerCreated")); -+ if (nbt.contains("Purpur.Summoner")) setSummoner(nbt.getUUID("Purpur.Summoner")); // Purpur - Summoner API - this.readPersistentAngerSaveData(this.level(), nbt); - } - -diff --git a/net/minecraft/world/entity/animal/SnowGolem.java b/net/minecraft/world/entity/animal/SnowGolem.java -index f27f68750221852e55b92395530e00e9c6918551..b9d2d942194784de64665e9d9d851f4027aa4db2 100644 ---- a/net/minecraft/world/entity/animal/SnowGolem.java -+++ b/net/minecraft/world/entity/animal/SnowGolem.java -@@ -50,6 +50,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM - - private static final EntityDataAccessor DATA_PUMPKIN_ID = SynchedEntityData.defineId(SnowGolem.class, EntityDataSerializers.BYTE); - private static final byte PUMPKIN_FLAG = 16; -+ @Nullable private java.util.UUID summoner; // Purpur - Summoner API - - public SnowGolem(EntityType type, Level world) { - super(type, world); -@@ -79,6 +80,16 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM - this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.snowGolemScale); - } - // Purpur end - Configurable entity base attributes -+ // Purpur start - Summoner API -+ @Nullable -+ public java.util.UUID getSummoner() { -+ return summoner; -+ } -+ -+ public void setSummoner(@Nullable java.util.UUID summoner) { -+ this.summoner = summoner; -+ } -+ // Purpur end - Summoner API - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -@@ -106,6 +117,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM - public void addAdditionalSaveData(CompoundTag nbt) { - super.addAdditionalSaveData(nbt); - nbt.putBoolean("Pumpkin", this.hasPumpkin()); -+ if (getSummoner() != null) nbt.putUUID("Purpur.Summoner", getSummoner()); // Purpur - Summoner API - } - - @Override -@@ -114,6 +126,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM - if (nbt.contains("Pumpkin")) { - this.setPumpkin(nbt.getBoolean("Pumpkin")); - } -+ if (nbt.contains("Purpur.Summoner")) setSummoner(nbt.getUUID("Purpur.Summoner")); // Purpur - Summoner API - - } - -diff --git a/net/minecraft/world/entity/boss/wither/WitherBoss.java b/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 7bdc2b79fbf58f248caf63008ce898b9a43bfcd3..5f40d6d5b002f1f098245c3aa1174c85759191ce 100644 ---- a/net/minecraft/world/entity/boss/wither/WitherBoss.java -+++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -87,6 +87,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { - }; - private static final TargetingConditions TARGETING_CONDITIONS = TargetingConditions.forCombat().range(20.0D).selector(WitherBoss.LIVING_ENTITY_SELECTOR); - private int shootCooldown = 0; // Purpur - Ridables -+ @Nullable private java.util.UUID summoner; // Purpur - Summoner API - // Paper start - private boolean canPortal = false; - -@@ -126,6 +127,16 @@ public class WitherBoss extends Monster implements RangedAttackMob { - return this.level().purpurConfig.witherTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Summoner API -+ @Nullable -+ public java.util.UUID getSummoner() { -+ return summoner; -+ } -+ -+ public void setSummoner(@Nullable java.util.UUID summoner) { -+ this.summoner = summoner; -+ } -+ // Purpur end - Summoner API - @Override - protected PathNavigation createNavigation(Level world) { - FlyingPathNavigation navigationflying = new FlyingPathNavigation(this, world); -@@ -260,6 +271,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { - public void addAdditionalSaveData(CompoundTag nbt) { - super.addAdditionalSaveData(nbt); - nbt.putInt("Invul", this.getInvulnerableTicks()); -+ if (getSummoner() != null) nbt.putUUID("Purpur.Summoner", getSummoner()); // Purpur - Summoner API - } - - @Override -@@ -269,6 +281,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { - if (this.hasCustomName()) { - this.bossEvent.setName(this.getDisplayName()); - } -+ if (nbt.contains("Purpur.Summoner")) setSummoner(nbt.getUUID("Purpur.Summoner")); // Purpur - Summoner API - - } - -diff --git a/net/minecraft/world/level/block/CarvedPumpkinBlock.java b/net/minecraft/world/level/block/CarvedPumpkinBlock.java -index 22242d11e009acab4c9738a1c6ada8b9ba678a0c..49b7565c26ce8bf217ae60d233d5963331ce6696 100644 ---- a/net/minecraft/world/level/block/CarvedPumpkinBlock.java -+++ b/net/minecraft/world/level/block/CarvedPumpkinBlock.java -@@ -72,7 +72,7 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock { - SnowGolem entitysnowman = (SnowGolem) EntityType.SNOW_GOLEM.create(world, EntitySpawnReason.TRIGGERED); - - if (entitysnowman != null) { -- CarvedPumpkinBlock.spawnGolemInWorld(world, shapedetector_shapedetectorcollection, entitysnowman, shapedetector_shapedetectorcollection.getBlock(0, 2, 0).getPos()); -+ CarvedPumpkinBlock.spawnGolemInWorld(world, shapedetector_shapedetectorcollection, entitysnowman, shapedetector_shapedetectorcollection.getBlock(0, 2, 0).getPos(), this.placer); // Purpur - Summoner API - } - } else { - BlockPattern.BlockPatternMatch shapedetector_shapedetectorcollection1 = this.getOrCreateIronGolemFull().find(world, pos); -@@ -82,7 +82,7 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock { - - if (entityirongolem != null) { - entityirongolem.setPlayerCreated(true); -- CarvedPumpkinBlock.spawnGolemInWorld(world, shapedetector_shapedetectorcollection1, entityirongolem, shapedetector_shapedetectorcollection1.getBlock(1, 2, 0).getPos()); -+ CarvedPumpkinBlock.spawnGolemInWorld(world, shapedetector_shapedetectorcollection1, entityirongolem, shapedetector_shapedetectorcollection1.getBlock(1, 2, 0).getPos(), this.placer); // Purpur - Summoner API - } - } - } -@@ -90,6 +90,16 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock { - } - - private static void spawnGolemInWorld(Level world, BlockPattern.BlockPatternMatch patternResult, Entity entity, BlockPos pos) { -+ // Purpur start - Summoner API -+ spawnGolemInWorld(world, patternResult, entity, pos, null); -+ } -+ private static void spawnGolemInWorld(Level world, BlockPattern.BlockPatternMatch patternResult, Entity entity, BlockPos pos, net.minecraft.world.entity.LivingEntity placer) { -+ if (entity instanceof SnowGolem snowGolem) { -+ snowGolem.setSummoner(placer == null ? null : placer.getUUID()); -+ } else if (entity instanceof IronGolem ironGolem) { -+ ironGolem.setSummoner(placer == null ? null : placer.getUUID()); -+ } -+ // Purpur end - Summoner API - // clearPatternBlocks(world, shapedetector_shapedetectorcollection); // CraftBukkit - moved down - entity.moveTo((double) pos.getX() + 0.5D, (double) pos.getY() + 0.05D, (double) pos.getZ() + 0.5D, 0.0F, 0.0F); - // CraftBukkit start -diff --git a/net/minecraft/world/level/block/WitherSkullBlock.java b/net/minecraft/world/level/block/WitherSkullBlock.java -index 0fbe66cc02bd3d95c0a5dcd55380a1b4a2f17ca6..11d6427682d8778d1cf668ee4c1d5760af2c185e 100644 ---- a/net/minecraft/world/level/block/WitherSkullBlock.java -+++ b/net/minecraft/world/level/block/WitherSkullBlock.java -@@ -80,6 +80,7 @@ public class WitherSkullBlock extends SkullBlock { - entitywither.moveTo((double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + 0.55D, (double) blockposition1.getZ() + 0.5D, shapedetector_shapedetectorcollection.getForwards().getAxis() == Direction.Axis.X ? 0.0F : 90.0F, 0.0F); - entitywither.yBodyRot = shapedetector_shapedetectorcollection.getForwards().getAxis() == Direction.Axis.X ? 0.0F : 90.0F; - entitywither.makeInvulnerable(); -+ entitywither.setSummoner(iblockdata.getBlock().placer == null ? null : iblockdata.getBlock().placer.getUUID()); // Purpur - Summoner API - // CraftBukkit start - if (!world.addFreshEntity(entitywither, SpawnReason.BUILD_WITHER)) { - return; -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java -index 63cae1a2e95d8da17c45c4404a8dd0ca6a413c39..464a3713845548473a357ea66c6147b10ff2cb16 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java -@@ -27,4 +27,17 @@ public class CraftIronGolem extends CraftGolem implements IronGolem { - public void setPlayerCreated(boolean playerCreated) { - this.getHandle().setPlayerCreated(playerCreated); - } -+ -+ // 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 - } -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java -index 4ce2373ff71c3c1b8951646e057587a3ab09e145..997b8e5059569de4ee8e70127c5d6019ce53afe3 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java -@@ -28,4 +28,17 @@ public class CraftSnowman extends CraftGolem implements Snowman, com.destroystok - public String toString() { - return "CraftSnowman"; - } -+ -+ // 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 - } -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java -index 7881c6253c1d652c0c0d54a9a8accdf0a1ff0f3e..fe8be71121324f64346174922c7bc7f5d3a9de69 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java -@@ -99,4 +99,17 @@ public class CraftWither extends CraftMonster implements Wither, com.destroystok - this.getHandle().makeInvulnerable(); - } - // Paper end -+ -+ // 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 - } diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/IronGolem.java.patch b/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/IronGolem.java.patch new file mode 100644 index 000000000..8a25a65b2 --- /dev/null +++ b/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/IronGolem.java.patch @@ -0,0 +1,23 @@ +--- a/src/main/java/org/bukkit/entity/IronGolem.java ++++ b/src/main/java/org/bukkit/entity/IronGolem.java +@@ -19,4 +_,20 @@ + * player created, false if you want it to be a natural village golem. + */ + public void setPlayerCreated(boolean playerCreated); ++ ++ // 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-api/paper-patches/files/src/main/java/org/bukkit/entity/Snowman.java.patch b/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Snowman.java.patch new file mode 100644 index 000000000..a24330d2d --- /dev/null +++ b/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Snowman.java.patch @@ -0,0 +1,23 @@ +--- a/src/main/java/org/bukkit/entity/Snowman.java ++++ b/src/main/java/org/bukkit/entity/Snowman.java +@@ -23,4 +_,20 @@ + * @param derpMode True to remove the pumpkin, false to add a pumpkin + */ + void setDerp(boolean derpMode); ++ ++ // Purpur start ++ /** ++ * Get the player that summoned this snowman ++ * ++ * @return UUID of summoner ++ */ ++ @org.jetbrains.annotations.Nullable java.util.UUID getSummoner(); ++ ++ /** ++ * Set the player that summoned this snowman ++ * ++ * @param summoner UUID of summoner ++ */ ++ void setSummoner(@org.jetbrains.annotations.Nullable java.util.UUID summoner); ++ // Purpur end + } diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Wither.java.patch b/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Wither.java.patch new file mode 100644 index 000000000..1080c3d6d --- /dev/null +++ b/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Wither.java.patch @@ -0,0 +1,23 @@ +--- a/src/main/java/org/bukkit/entity/Wither.java ++++ b/src/main/java/org/bukkit/entity/Wither.java +@@ -107,4 +_,20 @@ + */ + void enterInvulnerabilityPhase(); + // Paper end ++ ++ // Purpur start ++ /** ++ * Get the player that summoned this wither ++ * ++ * @return UUID of summoner ++ */ ++ @org.jetbrains.annotations.Nullable java.util.UUID getSummoner(); ++ ++ /** ++ * Set the player that summoned this wither ++ * ++ * @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 29fe0291d..9740d5ab3 100644 --- a/purpur-server/minecraft-patches/features/0001-Ridables.patch +++ b/purpur-server/minecraft-patches/features/0001-Ridables.patch @@ -1069,12 +1069,12 @@ index ddc252c76cedec0a0e9e268d8a874015a5ad52fe..8b0a813f9dd001c6dd108ba7aac04d13 } } diff --git a/net/minecraft/world/entity/animal/IronGolem.java b/net/minecraft/world/entity/animal/IronGolem.java -index ab3a3a2488628e18f71e30eab1639e9a08f63986..37b84f98e269bd28a67636929b200ee709804734 100644 +index 46921562c9c5caf7e04ee180325a638273d6bad2..223c4796f659a24062a719045e484a22d31ab2f0 100644 --- a/net/minecraft/world/entity/animal/IronGolem.java +++ b/net/minecraft/world/entity/animal/IronGolem.java -@@ -61,9 +61,28 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - super(entityType, level); +@@ -73,9 +73,28 @@ public class IronGolem extends AbstractGolem implements NeutralMob { } + // Purpur end - Summoner API + // Purpur start - Ridables + @Override @@ -1101,7 +1101,7 @@ index ab3a3a2488628e18f71e30eab1639e9a08f63986..37b84f98e269bd28a67636929b200ee7 this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0, true)); this.goalSelector.addGoal(2, new MoveTowardsTargetGoal(this, 0.9, 32.0F)); this.goalSelector.addGoal(2, new MoveBackToVillageGoal(this, 0.6, false)); -@@ -71,6 +90,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -83,6 +102,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { this.goalSelector.addGoal(5, new OfferFlowerGoal(this)); this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 6.0F)); this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); @@ -1109,7 +1109,7 @@ index ab3a3a2488628e18f71e30eab1639e9a08f63986..37b84f98e269bd28a67636929b200ee7 this.targetSelector.addGoal(1, new DefendVillageTargetGoal(this)); this.targetSelector.addGoal(2, new HurtByTargetGoal(this)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); -@@ -257,12 +277,12 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -271,12 +291,12 @@ public class IronGolem extends AbstractGolem implements NeutralMob { protected InteractionResult mobInteract(Player player, InteractionHand hand) { ItemStack itemInHand = player.getItemInHand(hand); if (!itemInHand.is(Items.IRON_INGOT)) { @@ -1701,12 +1701,12 @@ index e686c500e4b5f3e7b0e808af8b2e43ddbd163bef..c27bb9e8a4a5e8fdc8ae28dae8203859 this.goalSelector.addGoal(2, new BreedGoal(this, 1.0)); this.goalSelector.addGoal(3, new TemptGoal(this, 1.1, stack -> stack.is(ItemTags.SHEEP_FOOD), false)); diff --git a/net/minecraft/world/entity/animal/SnowGolem.java b/net/minecraft/world/entity/animal/SnowGolem.java -index 9130b51db39abc7781fecac8c881877e048e1c5f..17b41cfd9080cbb4def219cd91276e5a6d2a02a6 100644 +index 29427515b648b84248f486c156c5cd7a0995ba14..52de92b118b613217b8f92ff672c01ddf798a1fc 100644 --- a/net/minecraft/world/entity/animal/SnowGolem.java +++ b/net/minecraft/world/entity/animal/SnowGolem.java -@@ -49,12 +49,31 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM - super(entityType, level); +@@ -61,12 +61,31 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM } + // Purpur end - Summoner API + // Purpur start - Ridables + @Override @@ -1736,7 +1736,7 @@ index 9130b51db39abc7781fecac8c881877e048e1c5f..17b41cfd9080cbb4def219cd91276e5a this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Mob.class, 10, true, false, (entity, level) -> entity instanceof Enemy)); } -@@ -99,6 +118,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -113,6 +132,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM return; } @@ -1744,7 +1744,7 @@ index 9130b51db39abc7781fecac8c881877e048e1c5f..17b41cfd9080cbb4def219cd91276e5a BlockState blockState = Blocks.SNOW.defaultBlockState(); for (int i = 0; i < 4; i++) { -@@ -141,7 +161,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -155,7 +175,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM org.bukkit.event.player.PlayerShearEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemInHand, hand, drops); if (event != null) { if (event.isCancelled()) { @@ -1753,7 +1753,7 @@ index 9130b51db39abc7781fecac8c881877e048e1c5f..17b41cfd9080cbb4def219cd91276e5a } drops = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getDrops()); // Paper end - custom shear drops -@@ -162,7 +182,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -176,7 +196,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM return InteractionResult.SUCCESS; // Purpur end - Snowman drop and put back pumpkin } else { @@ -2797,7 +2797,7 @@ index f7e6866404af629ae0b20425202f592d76df4f3d..bc9564ee22ff9d7f6d819da9601c2d81 this.dragonFight.updateDragon(this); } diff --git a/net/minecraft/world/entity/boss/wither/WitherBoss.java b/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 0ccbcd8b576b082260b17b85291a81e905e6f46f..591dbbbd1da84b0190f010b22d5163bb41cdd3c7 100644 +index 79b1f6ed312b2c4c1ec708271c38bc59f0ae0e0e..c78132da8cb476e81beac68f7c0ac4ccd27a5db0 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java @@ -69,6 +69,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { @@ -2808,10 +2808,10 @@ index 0ccbcd8b576b082260b17b85291a81e905e6f46f..591dbbbd1da84b0190f010b22d5163bb private boolean canPortal = false; // Paper public final ServerBossEvent bossEvent = (ServerBossEvent)new ServerBossEvent( this.getDisplayName(), BossEvent.BossBarColor.PURPLE, BossEvent.BossBarOverlay.PROGRESS -@@ -77,9 +78,23 @@ public class WitherBoss extends Monster implements RangedAttackMob { - private static final TargetingConditions.Selector LIVING_ENTITY_SELECTOR = (entity, level) -> !entity.getType().is(EntityTypeTags.WITHER_FRIENDS) +@@ -78,9 +79,23 @@ public class WitherBoss extends Monster implements RangedAttackMob { && entity.attackable(); private static final TargetingConditions TARGETING_CONDITIONS = TargetingConditions.forCombat().range(20.0).selector(LIVING_ENTITY_SELECTOR); + @Nullable private java.util.UUID summoner; // Purpur - Summoner API + private org.purpurmc.purpur.controller.FlyingWithSpacebarMoveControllerWASD purpurController; // Purpur - Ridables public WitherBoss(EntityType entityType, Level level) { @@ -2832,9 +2832,9 @@ index 0ccbcd8b576b082260b17b85291a81e905e6f46f..591dbbbd1da84b0190f010b22d5163bb this.moveControl = new FlyingMoveControl(this, 10, false); this.setHealth(this.getMaxHealth()); this.xpReward = 50; -@@ -93,13 +108,114 @@ public class WitherBoss extends Monster implements RangedAttackMob { - return flyingPathNavigation; +@@ -97,6 +112,105 @@ public class WitherBoss extends Monster implements RangedAttackMob { } + // Purpur end - Summoner API + // Purpur start - Ridables + @Override @@ -2935,6 +2935,11 @@ index 0ccbcd8b576b082260b17b85291a81e905e6f46f..591dbbbd1da84b0190f010b22d5163bb + } + // Purpur end - Ridables + + @Override + protected PathNavigation createNavigation(Level level) { + FlyingPathNavigation flyingPathNavigation = new FlyingPathNavigation(this, level); +@@ -107,11 +221,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { + @Override protected void registerGoals() { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables @@ -2947,7 +2952,7 @@ index 0ccbcd8b576b082260b17b85291a81e905e6f46f..591dbbbd1da84b0190f010b22d5163bb this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 0, false, false, LIVING_ENTITY_SELECTOR)); } -@@ -257,6 +373,15 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -271,6 +387,15 @@ public class WitherBoss extends Monster implements RangedAttackMob { @Override protected void customServerAiStep(ServerLevel level) { @@ -2963,7 +2968,7 @@ index 0ccbcd8b576b082260b17b85291a81e905e6f46f..591dbbbd1da84b0190f010b22d5163bb if (this.getInvulnerableTicks() > 0) { int i = this.getInvulnerableTicks() - 1; this.bossEvent.setProgress(1.0F - i / 220.0F); -@@ -563,11 +688,11 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -577,11 +702,11 @@ public class WitherBoss extends Monster implements RangedAttackMob { } public int getAlternativeTarget(int head) { 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 0569ed0d9..d54b9bdf7 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 @@ -202,10 +202,10 @@ index 8b0a813f9dd001c6dd108ba7aac04d134a20fbc1..8bf893837586ae2a9b4ef7564d242e16 protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); diff --git a/net/minecraft/world/entity/animal/IronGolem.java b/net/minecraft/world/entity/animal/IronGolem.java -index 37b84f98e269bd28a67636929b200ee709804734..42780e8245b1746783084558cc2deab361b09d3b 100644 +index 223c4796f659a24062a719045e484a22d31ab2f0..37a353cbb0e9b16e0fc92bd1bc8194cb4cd3c13a 100644 --- a/net/minecraft/world/entity/animal/IronGolem.java +++ b/net/minecraft/world/entity/animal/IronGolem.java -@@ -78,6 +78,14 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -90,6 +90,14 @@ public class IronGolem extends AbstractGolem implements NeutralMob { } // Purpur end - Ridables @@ -422,10 +422,10 @@ index c27bb9e8a4a5e8fdc8ae28dae820385966b8b44c..b66440f5cfbd714c6d2f5b7f66b4e755 protected void registerGoals() { this.eatBlockGoal = new EatBlockGoal(this); diff --git a/net/minecraft/world/entity/animal/SnowGolem.java b/net/minecraft/world/entity/animal/SnowGolem.java -index 17b41cfd9080cbb4def219cd91276e5a6d2a02a6..4f0d2ede28adbe412d208609a96eacc1309b8115 100644 +index 52de92b118b613217b8f92ff672c01ddf798a1fc..d97a297db3bec0c86c6a82ef1c353015df2115f7 100644 --- a/net/minecraft/world/entity/animal/SnowGolem.java +++ b/net/minecraft/world/entity/animal/SnowGolem.java -@@ -66,6 +66,14 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -78,6 +78,14 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM } // Purpur end - Ridables @@ -903,13 +903,13 @@ index bc9564ee22ff9d7f6d819da9601c2d8162d304e1..ca900bb646e16c7b4342f23c3ffae786 // CraftBukkit start - SPIGOT-2420: Special case, the ender dragon drops 12000 xp for the first kill and 500 xp for every other kill and this over time. diff --git a/net/minecraft/world/entity/boss/wither/WitherBoss.java b/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 591dbbbd1da84b0190f010b22d5163bb41cdd3c7..f6221829d213f103ffed9acbf9c6bc954ab6d539 100644 +index c78132da8cb476e81beac68f7c0ac4ccd27a5db0..409b54fd8b0b9f34f2524d63d49abce6845ec80a 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -99,6 +99,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { - this.setHealth(this.getMaxHealth()); - this.xpReward = 50; +@@ -211,6 +211,14 @@ public class WitherBoss extends Monster implements RangedAttackMob { } + // Purpur end - Ridables + + // Purpur start - Configurable entity base attributes + @Override + public void initAttributes() { @@ -917,10 +917,11 @@ index 591dbbbd1da84b0190f010b22d5163bb41cdd3c7..f6221829d213f103ffed9acbf9c6bc95 + this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.witherScale); + } + // Purpur end - Configurable entity base attributes - ++ @Override protected PathNavigation createNavigation(Level level) { -@@ -419,7 +426,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { + FlyingPathNavigation flyingPathNavigation = new FlyingPathNavigation(this, level); +@@ -433,7 +441,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { this.setInvulnerableTicks(i); if (this.tickCount % 10 == 0) { diff --git a/purpur-server/minecraft-patches/features/0009-Implement-elytra-settings.patch b/purpur-server/minecraft-patches/features/0009-Implement-elytra-settings.patch index 0aedbd296..97f22e187 100644 --- a/purpur-server/minecraft-patches/features/0009-Implement-elytra-settings.patch +++ b/purpur-server/minecraft-patches/features/0009-Implement-elytra-settings.patch @@ -53,10 +53,10 @@ index 75a9bd205f32b77c5d242cb9fac0f571ce36045a..b03f182c62c699cc222e67c1ae6eadf9 itemInHand.shrink(1); // Moved up from below } else { diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java -index 34b7ead0f14a3f8ba8a9d94996c759896004299f..75f71b90bac3a6da888366325139485e44e472e6 100644 +index ef66c7b03696c2601d1fd0379fa038336ee0bb87..735ede5c5aa4b74639660fb4966101dcf63a2d75 100644 --- a/net/minecraft/world/item/ItemStack.java +++ b/net/minecraft/world/item/ItemStack.java -@@ -731,6 +731,14 @@ public final class ItemStack implements DataComponentHolder { +@@ -733,6 +733,14 @@ public final class ItemStack implements DataComponentHolder { org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent(serverPlayer, this); // Paper - Add EntityDamageItemEvent } // CraftBukkit end diff --git a/purpur-server/minecraft-patches/features/0016-Add-mobGriefing-bypass-to-everything-affected.patch b/purpur-server/minecraft-patches/features/0016-Add-mobGriefing-bypass-to-everything-affected.patch index 7bdd94667..9809c9a38 100644 --- a/purpur-server/minecraft-patches/features/0016-Add-mobGriefing-bypass-to-everything-affected.patch +++ b/purpur-server/minecraft-patches/features/0016-Add-mobGriefing-bypass-to-everything-affected.patch @@ -118,10 +118,10 @@ index bbdd06002b07699fffebdf6ed8148abdb69c24cc..7379def14f3f700fb8a746dc89d89e24 } diff --git a/net/minecraft/world/entity/animal/SnowGolem.java b/net/minecraft/world/entity/animal/SnowGolem.java -index 4f0d2ede28adbe412d208609a96eacc1309b8115..fdcc1534e59cf13ad354d56b1295cd60d1af0bc8 100644 +index d97a297db3bec0c86c6a82ef1c353015df2115f7..6ee73b798ab306f7c828c9f06ca5b1a96bd96139 100644 --- a/net/minecraft/world/entity/animal/SnowGolem.java +++ b/net/minecraft/world/entity/animal/SnowGolem.java -@@ -122,7 +122,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -136,7 +136,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM this.hurtServer(serverLevel, this.damageSources().melting(), 1.0F); // CraftBukkit - DamageSources.ON_FIRE -> CraftEventFactory.MELTING } @@ -144,10 +144,10 @@ index ca900bb646e16c7b4342f23c3ffae786eab28145..724d259d4b793f2043e63dda9022bdfd //flag1 = level.removeBlock(blockPos, false) || flag1; flag1 = true; diff --git a/net/minecraft/world/entity/boss/wither/WitherBoss.java b/net/minecraft/world/entity/boss/wither/WitherBoss.java -index f6221829d213f103ffed9acbf9c6bc954ab6d539..a9303429be73841480f81a8a6687787e5c169ddc 100644 +index 409b54fd8b0b9f34f2524d63d49abce6845ec80a..837a4bdeed3fc3878667293444340d19f7aa0df4 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -478,7 +478,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -493,7 +493,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { if (this.destroyBlocksTick > 0) { this.destroyBlocksTick--; diff --git a/purpur-server/minecraft-patches/features/0018-Toggle-for-water-sensitive-mob-damage.patch b/purpur-server/minecraft-patches/features/0018-Toggle-for-water-sensitive-mob-damage.patch index a6008030a..d9e05ca20 100644 --- a/purpur-server/minecraft-patches/features/0018-Toggle-for-water-sensitive-mob-damage.patch +++ b/purpur-server/minecraft-patches/features/0018-Toggle-for-water-sensitive-mob-damage.patch @@ -174,10 +174,10 @@ index 3d94d5c9ecab0fe7332daf4cdac879385159eaa1..22a70c6af965114e272bb56cb217f975 protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); diff --git a/net/minecraft/world/entity/animal/IronGolem.java b/net/minecraft/world/entity/animal/IronGolem.java -index 42780e8245b1746783084558cc2deab361b09d3b..469ebee33cc8bf8f4dcad2595c80ffad19edac18 100644 +index 37a353cbb0e9b16e0fc92bd1bc8194cb4cd3c13a..23108729ce65ef8b7b215b82f29347513cfd4ebf 100644 --- a/net/minecraft/world/entity/animal/IronGolem.java +++ b/net/minecraft/world/entity/animal/IronGolem.java -@@ -86,6 +86,13 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -98,6 +98,13 @@ public class IronGolem extends AbstractGolem implements NeutralMob { } // Purpur end - Configurable entity base attributes @@ -372,10 +372,10 @@ index 882c799cb66a2acada33ff24f3adb7eb611f89c1..05d955ed33f1c3e0960657c584f4aa1b protected void registerGoals() { this.eatBlockGoal = new EatBlockGoal(this); diff --git a/net/minecraft/world/entity/animal/SnowGolem.java b/net/minecraft/world/entity/animal/SnowGolem.java -index fdcc1534e59cf13ad354d56b1295cd60d1af0bc8..44729bc083a5f89fd2557a7ad42fc6f8e4cd6b92 100644 +index 6ee73b798ab306f7c828c9f06ca5b1a96bd96139..dbf3e4db27477afada86e02063a486f7cec573b5 100644 --- a/net/minecraft/world/entity/animal/SnowGolem.java +++ b/net/minecraft/world/entity/animal/SnowGolem.java -@@ -111,7 +111,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -125,7 +125,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM @Override public boolean isSensitiveToWater() { @@ -637,10 +637,10 @@ index 724d259d4b793f2043e63dda9022bdfddc4dca38..b2a0ba6faa117ad781aaa3e6932482d4 return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 200.0); } diff --git a/net/minecraft/world/entity/boss/wither/WitherBoss.java b/net/minecraft/world/entity/boss/wither/WitherBoss.java -index a9303429be73841480f81a8a6687787e5c169ddc..0bfb624fa2656ba416e02b645e92ec5814ea7156 100644 +index 837a4bdeed3fc3878667293444340d19f7aa0df4..ce6d4163c34dfdefacc917beccdee0542376d55b 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -107,6 +107,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -219,6 +219,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { } // Purpur end - Configurable entity base attributes diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/IronGolem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/IronGolem.java.patch index 422a0b87d..176e8f9bc 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/IronGolem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/IronGolem.java.patch @@ -1,13 +1,48 @@ --- a/net/minecraft/world/entity/animal/IronGolem.java +++ b/net/minecraft/world/entity/animal/IronGolem.java -@@ -63,6 +_,7 @@ +@@ -56,13 +_,26 @@ + private int remainingPersistentAngerTime; + @Nullable + private UUID persistentAngerTarget; ++ @Nullable private UUID summoner; // Purpur - Summoner API + public IronGolem(EntityType entityType, Level level) { + super(entityType, level); + } + ++ // Purpur start - Summoner API ++ @Nullable ++ public UUID getSummoner() { ++ return summoner; ++ } ++ ++ public void setSummoner(@Nullable UUID summoner) { ++ this.summoner = summoner; ++ } ++ // Purpur end - Summoner API ++ @Override protected void registerGoals() { + if (this.level().purpurConfig.ironGolemPoppyCalm) this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.ReceiveFlower(this)); // Purpur - Iron golem calm anger options this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0, true)); this.goalSelector.addGoal(2, new MoveTowardsTargetGoal(this, 0.9, 32.0F)); this.goalSelector.addGoal(2, new MoveBackToVillageGoal(this, 0.6, false)); +@@ -140,6 +_,7 @@ + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putBoolean("PlayerCreated", this.isPlayerCreated()); ++ if (getSummoner() != null) compound.putUUID("Purpur.Summoner", getSummoner()); // Purpur - Summoner API + this.addPersistentAngerSaveData(compound); + } + +@@ -147,6 +_,7 @@ + public void readAdditionalSaveData(CompoundTag compound) { + super.readAdditionalSaveData(compound); + this.setPlayerCreated(compound.getBoolean("PlayerCreated")); ++ if (compound.contains("Purpur.Summoner")) setSummoner(compound.getUUID("Purpur.Summoner")); // Purpur - Summoner API + this.readPersistentAngerSaveData(this.level(), compound); + } + @@ -266,6 +_,7 @@ float f = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F; this.playSound(SoundEvents.IRON_GOLEM_REPAIR, 1.0F, f); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/SnowGolem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/SnowGolem.java.patch index 77c3d813e..b6401d764 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/SnowGolem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/SnowGolem.java.patch @@ -1,7 +1,26 @@ --- a/net/minecraft/world/entity/animal/SnowGolem.java +++ b/net/minecraft/world/entity/animal/SnowGolem.java -@@ -51,8 +_,8 @@ +@@ -44,15 +_,27 @@ + public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackMob { + private static final EntityDataAccessor DATA_PUMPKIN_ID = SynchedEntityData.defineId(SnowGolem.class, EntityDataSerializers.BYTE); + private static final byte PUMPKIN_FLAG = 16; ++ @Nullable private java.util.UUID summoner; // Purpur - Summoner API + public SnowGolem(EntityType entityType, Level level) { + super(entityType, level); + } + ++ // Purpur start - Summoner API ++ @Nullable ++ public java.util.UUID getSummoner() { ++ return summoner; ++ } ++ ++ public void setSummoner(@Nullable java.util.UUID summoner) { ++ this.summoner = summoner; ++ } ++ // Purpur end - Summoner API ++ @Override protected void registerGoals() { - this.goalSelector.addGoal(1, new RangedAttackGoal(this, 1.25, 20, 10.0F)); @@ -11,6 +30,22 @@ this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 6.0F)); this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Mob.class, 10, true, false, (entity, level) -> entity instanceof Enemy)); +@@ -72,6 +_,7 @@ + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putBoolean("Pumpkin", this.hasPumpkin()); ++ if (getSummoner() != null) compound.putUUID("Purpur.Summoner", getSummoner()); // Purpur - Summoner API + } + + @Override +@@ -80,6 +_,7 @@ + if (compound.contains("Pumpkin")) { + this.setPumpkin(compound.getBoolean("Pumpkin")); + } ++ if (compound.contains("Purpur.Summoner")) setSummoner(compound.getUUID("Purpur.Summoner")); // Purpur - Summoner API + } + + @Override @@ -153,6 +_,14 @@ } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/wither/WitherBoss.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/wither/WitherBoss.java.patch index 48b404985..dfc885fd0 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/wither/WitherBoss.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/wither/WitherBoss.java.patch @@ -1,5 +1,47 @@ --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java +@@ -77,6 +_,7 @@ + private static final TargetingConditions.Selector LIVING_ENTITY_SELECTOR = (entity, level) -> !entity.getType().is(EntityTypeTags.WITHER_FRIENDS) + && entity.attackable(); + private static final TargetingConditions TARGETING_CONDITIONS = TargetingConditions.forCombat().range(20.0).selector(LIVING_ENTITY_SELECTOR); ++ @Nullable private java.util.UUID summoner; // Purpur - Summoner API + + public WitherBoss(EntityType entityType, Level level) { + super(entityType, level); +@@ -85,6 +_,17 @@ + this.xpReward = 50; + } + ++ // Purpur start - Summoner API ++ @Nullable ++ public java.util.UUID getSummoner() { ++ return summoner; ++ } ++ ++ public void setSummoner(@Nullable java.util.UUID summoner) { ++ this.summoner = summoner; ++ } ++ // Purpur end - Summoner API ++ + @Override + protected PathNavigation createNavigation(Level level) { + FlyingPathNavigation flyingPathNavigation = new FlyingPathNavigation(this, level); +@@ -117,6 +_,7 @@ + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); + compound.putInt("Invul", this.getInvulnerableTicks()); ++ if (getSummoner() != null) compound.putUUID("Purpur.Summoner", getSummoner()); // Purpur - Summoner API + } + + @Override +@@ -126,6 +_,7 @@ + if (this.hasCustomName()) { + this.bossEvent.setName(this.getDisplayName()); + } ++ if (compound.contains("Purpur.Summoner")) setSummoner(compound.getUUID("Purpur.Summoner")); // Purpur - Summoner API + } + + @Override @@ -376,8 +_,10 @@ } } 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 new file mode 100644 index 000000000..ba95ddd13 --- /dev/null +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CarvedPumpkinBlock.java.patch @@ -0,0 +1,36 @@ +--- a/net/minecraft/world/level/block/CarvedPumpkinBlock.java ++++ b/net/minecraft/world/level/block/CarvedPumpkinBlock.java +@@ -64,7 +_,7 @@ + if (blockPatternMatch != null) { + SnowGolem snowGolem = EntityType.SNOW_GOLEM.create(level, EntitySpawnReason.TRIGGERED); + if (snowGolem != null) { +- spawnGolemInWorld(level, blockPatternMatch, snowGolem, blockPatternMatch.getBlock(0, 2, 0).getPos()); ++ spawnGolemInWorld(level, blockPatternMatch, snowGolem, blockPatternMatch.getBlock(0, 2, 0).getPos(), this.placer); // Purpur - Summoner API + } + } else { + BlockPattern.BlockPatternMatch blockPatternMatch1 = this.getOrCreateIronGolemFull().find(level, pos); +@@ -72,13 +_,23 @@ + IronGolem ironGolem = EntityType.IRON_GOLEM.create(level, EntitySpawnReason.TRIGGERED); + if (ironGolem != null) { + ironGolem.setPlayerCreated(true); +- spawnGolemInWorld(level, blockPatternMatch1, ironGolem, blockPatternMatch1.getBlock(1, 2, 0).getPos()); ++ spawnGolemInWorld(level, blockPatternMatch1, ironGolem, blockPatternMatch1.getBlock(1, 2, 0).getPos(), this.placer); // Purpur - Summoner API + } + } + } + } + + 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()); ++ } ++ // Purpur end - Summoner API + // clearPatternBlocks(level, patternMatch); // CraftBukkit - moved down + golem.moveTo(pos.getX() + 0.5, pos.getY() + 0.05, pos.getZ() + 0.5, 0.0F, 0.0F); + if (!level.addFreshEntity(golem, (golem.getType() == EntityType.SNOW_GOLEM) ? org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BUILD_SNOWMAN : org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BUILD_IRONGOLEM)) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/WitherSkullBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/WitherSkullBlock.java.patch new file mode 100644 index 000000000..d92c3e43b --- /dev/null +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/WitherSkullBlock.java.patch @@ -0,0 +1,10 @@ +--- a/net/minecraft/world/level/block/WitherSkullBlock.java ++++ b/net/minecraft/world/level/block/WitherSkullBlock.java +@@ -71,6 +_,7 @@ + ); + witherBoss.yBodyRot = blockPatternMatch.getForwards().getAxis() == Direction.Axis.X ? 0.0F : 90.0F; + witherBoss.makeInvulnerable(); ++ witherBoss.setSummoner(blockState.getBlock().placer == null ? null : blockState.getBlock().placer.getUUID()); // Purpur - Summoner API + // CraftBukkit start + if (!level.addFreshEntity(witherBoss, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BUILD_WITHER)) { + return; diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java.patch b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java.patch new file mode 100644 index 000000000..d09a7cf6b --- /dev/null +++ b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java.patch @@ -0,0 +1,20 @@ +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java +@@ -27,4 +_,17 @@ + public void setPlayerCreated(boolean playerCreated) { + this.getHandle().setPlayerCreated(playerCreated); + } ++ ++ // 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 + } diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java.patch b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java.patch new file mode 100644 index 000000000..44a2a5b99 --- /dev/null +++ b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java.patch @@ -0,0 +1,20 @@ +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java +@@ -28,4 +_,17 @@ + public String toString() { + return "CraftSnowman"; + } ++ ++ // 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 + } diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java.patch b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java.patch new file mode 100644 index 000000000..d1bf807f1 --- /dev/null +++ b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java.patch @@ -0,0 +1,20 @@ +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java +@@ -99,4 +_,17 @@ + this.getHandle().makeInvulnerable(); + } + // Paper end ++ ++ // 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 + }