diff --git a/patches/server-unmapped/0031-Make-Iron-Golems-Swim.patch b/patches/server-unmapped/0031-Make-Iron-Golems-Swim.patch deleted file mode 100644 index 13b90cada..000000000 --- a/patches/server-unmapped/0031-Make-Iron-Golems-Swim.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Sat, 15 Jun 2019 03:12:15 -0500 -Subject: [PATCH] Make Iron Golems Swim - - -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityIronGolem.java b/src/main/java/net/minecraft/world/entity/animal/EntityIronGolem.java -index 5e2b49d120b724cb5a7ae00940ded4f4875ea8a1..62cff5faafa076d05ebc59ad5c4fb020bea0509e 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityIronGolem.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityIronGolem.java -@@ -30,6 +30,7 @@ import net.minecraft.world.entity.EntityTypes; - import net.minecraft.world.entity.IEntityAngerable; - import net.minecraft.world.entity.ai.attributes.AttributeProvider; - import net.minecraft.world.entity.ai.attributes.GenericAttributes; -+import net.minecraft.world.entity.ai.goal.PathfinderGoalFloat; - import net.minecraft.world.entity.ai.goal.PathfinderGoalLookAtPlayer; - import net.minecraft.world.entity.ai.goal.PathfinderGoalMeleeAttack; - import net.minecraft.world.entity.ai.goal.PathfinderGoalMoveTowardsTarget; -@@ -70,6 +71,7 @@ public class EntityIronGolem extends EntityGolem implements IEntityAngerable { - - @Override - protected void initPathfinder() { -+ if (world.purpurConfig.ironGolemCanSwim) this.goalSelector.a(0, new PathfinderGoalFloat(this)); // Purpur - this.goalSelector.a(1, new PathfinderGoalMeleeAttack(this, 1.0D, true)); - this.goalSelector.a(2, new PathfinderGoalMoveTowardsTarget(this, 0.9D, 32.0F)); - this.goalSelector.a(2, new PathfinderGoalStrollVillage(this, 0.6D, false)); -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 6dcfbebd850d71587da5a78a3acf09d8ae413072..decd0e755deede2b092866a8f7f6b46520435bbe 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -154,6 +154,11 @@ public class PurpurWorldConfig { - illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max-health", illusionerMaxHealth); - } - -+ public boolean ironGolemCanSwim = false; -+ private void ironGolemSettings() { -+ ironGolemCanSwim = getBoolean("mobs.iron_golem.can-swim", ironGolemCanSwim); -+ } -+ - public double rabbitNaturalToast = 0.0D; - public double rabbitNaturalKiller = 0.0D; - private void rabbitSettings() { diff --git a/patches/server-unmapped/0032-Dont-send-useless-entity-packets.patch b/patches/server-unmapped/0032-Dont-send-useless-entity-packets.patch deleted file mode 100644 index 3b07e683a..000000000 --- a/patches/server-unmapped/0032-Dont-send-useless-entity-packets.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Sat, 6 Jul 2019 17:00:04 -0500 -Subject: [PATCH] Dont send useless entity packets - - -diff --git a/src/main/java/net/minecraft/network/protocol/game/PacketPlayOutEntity.java b/src/main/java/net/minecraft/network/protocol/game/PacketPlayOutEntity.java -index 0eed10a6c4e0c7245f219d19ed1e2e5c94364db9..2b54a5f3347f788b751892105f888663bb349629 100644 ---- a/src/main/java/net/minecraft/network/protocol/game/PacketPlayOutEntity.java -+++ b/src/main/java/net/minecraft/network/protocol/game/PacketPlayOutEntity.java -@@ -9,11 +9,11 @@ import net.minecraft.world.phys.Vec3D; - public class PacketPlayOutEntity implements Packet { - - protected int a; -- protected short b; -- protected short c; -- protected short d; -- protected byte e; -- protected byte f; -+ protected short b; public short getX() { return b; } // Purpur - OBFHELPER -+ protected short c; public short getY() { return c; } // Purpur - OBFHELPER -+ protected short d; public short getZ() { return d; } // Purpur - OBFHELPER -+ protected byte e; public byte getYaw() { return e; } // Purpur - OBFHELPER -+ protected byte f; public byte getPitch() { return f; } // Purpur - OBFHELPER - protected boolean g; - protected boolean h; - protected boolean i; -diff --git a/src/main/java/net/minecraft/server/level/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/level/EntityTrackerEntry.java -index 1df8fb8cb3fcf8201e1c5fa8ca13f7a9c632c379..eaa68fb865dd23af20a05b567aad231dd8fa469c 100644 ---- a/src/main/java/net/minecraft/server/level/EntityTrackerEntry.java -+++ b/src/main/java/net/minecraft/server/level/EntityTrackerEntry.java -@@ -199,6 +199,7 @@ public class EntityTrackerEntry { - this.o = 0; - packet1 = new PacketPlayOutEntityTeleport(this.tracker); - } -+ if (net.pl3x.purpur.PurpurConfig.dontSendUselessEntityPackets && isUselessPacket(packet1)) packet1 = null; // Purpur - } - - if ((this.e || this.tracker.impulse || this.tracker instanceof EntityLiving && ((EntityLiving) this.tracker).isGliding()) && this.tickCounter > 0) { -@@ -285,6 +286,22 @@ public class EntityTrackerEntry { - - } - -+ // Purpur start -+ private boolean isUselessPacket(Packet possibleUselessPacket) { -+ if (possibleUselessPacket instanceof PacketPlayOutEntity) { -+ PacketPlayOutEntity packet = (PacketPlayOutEntity) possibleUselessPacket; -+ if (possibleUselessPacket instanceof PacketPlayOutEntity.PacketPlayOutRelEntityMove) { -+ return packet.getX() == 0 && packet.getY() == 0 && packet.getZ() == 0; -+ } else if (possibleUselessPacket instanceof PacketPlayOutEntity.PacketPlayOutRelEntityMoveLook) { -+ return packet.getX() == 0 && packet.getY() == 0 && packet.getZ() == 0 && packet.getYaw() == 0 && packet.getPitch() == 0; -+ } else if (possibleUselessPacket instanceof PacketPlayOutEntity.PacketPlayOutEntityLook) { -+ return packet.getYaw() == 0 && packet.getPitch() == 0; -+ } -+ } -+ return false; -+ } -+ // Purpur end -+ - public void a(EntityPlayer entityplayer) { - this.tracker.c(entityplayer); - entityplayer.c(this.tracker); -diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index c7755cea5e8337af7acc96c6a34afa547b391035..6d5c2f469e4a7a13a69ac3f7a1dadeac6aabb531 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -179,6 +179,11 @@ public class PurpurConfig { - enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); - } - -+ public static boolean dontSendUselessEntityPackets = false; -+ private static void dontSendUselessEntityPackets() { -+ dontSendUselessEntityPackets = getBoolean("settings.dont-send-useless-entity-packets", dontSendUselessEntityPackets); -+ } -+ - public static boolean loggerSuppressInitLegacyMaterialError = false; - public static boolean loggerSuppressIgnoredAdvancementWarnings = false; - private static void loggerSettings() { diff --git a/patches/server-unmapped/0033-Tulips-change-fox-type.patch b/patches/server-unmapped/0033-Tulips-change-fox-type.patch deleted file mode 100644 index 0a18c286f..000000000 --- a/patches/server-unmapped/0033-Tulips-change-fox-type.patch +++ /dev/null @@ -1,111 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Sat, 13 Jul 2019 15:56:22 -0500 -Subject: [PATCH] Tulips change fox type - - -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityFox.java b/src/main/java/net/minecraft/world/entity/animal/EntityFox.java -index b7fa24318ef43918b6b10ff4ea8acb960527296e..19a9affdaba52d8e7dc1c4c20d5c0d52829f4989 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityFox.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityFox.java -@@ -30,6 +30,8 @@ import net.minecraft.tags.Tag; - import net.minecraft.tags.TagsFluid; - import net.minecraft.util.MathHelper; - import net.minecraft.world.DifficultyDamageScaler; -+import net.minecraft.world.EnumHand; -+import net.minecraft.world.EnumInteractionResult; - import net.minecraft.world.damagesource.DamageSource; - import net.minecraft.world.entity.Entity; - import net.minecraft.world.entity.EntityAgeable; -@@ -107,9 +109,9 @@ public class EntityFox extends EntityAnimal { - private static final Predicate bv = (entity) -> { - return !entity.bx() && IEntitySelector.e.test(entity); - }; -- private PathfinderGoal bw; -- private PathfinderGoal bx; -- private PathfinderGoal by; -+ private PathfinderGoal bw; private PathfinderGoal attackAnimalGoal() { return bw; } // Purpur - OBFHELPER -+ private PathfinderGoal bx; private PathfinderGoal attackTurtleGoal() { return bx; } // Purpur - OBFHELPER -+ private PathfinderGoal by; private PathfinderGoal attackFishGoal() { return by; } // Purpur - OBFHELPER - private float bz; - private float bA; - private float bB; -@@ -297,6 +299,11 @@ public class EntityFox extends EntityAnimal { - } - - private void initializePathFinderGoals() { -+ // Purpur start - do not add duplicate goals -+ this.targetSelector.a(attackAnimalGoal()); -+ this.targetSelector.a(attackTurtleGoal()); -+ this.targetSelector.a(attackFishGoal()); -+ // Purpur end - if (this.getFoxType() == EntityFox.Type.RED) { - this.targetSelector.a(4, this.bw); - this.targetSelector.a(4, this.bx); -@@ -329,6 +336,7 @@ public class EntityFox extends EntityAnimal { - - public void setFoxType(EntityFox.Type entityfox_type) { - this.datawatcher.set(EntityFox.bo, entityfox_type.b()); -+ initializePathFinderGoals(); // Purpur - fix API bug not updating pathfinders on type change - } - - private List fa() { -@@ -646,6 +654,27 @@ public class EntityFox extends EntityAnimal { - return this.fa().contains(uuid); - } - -+ @Override -+ public EnumInteractionResult b(EntityHuman entityhuman, EnumHand enumhand) { -+ if (world.purpurConfig.foxTypeChangesWithTulips) { -+ ItemStack itemstack = entityhuman.b(enumhand); -+ if (getFoxType() == Type.RED && itemstack.getItem() == Items.whiteTulip()) { -+ setFoxType(Type.SNOW); -+ if (!entityhuman.abilities.canInstantlyBuild) { -+ itemstack.subtract(1); -+ } -+ return EnumInteractionResult.SUCCESS; -+ } else if (getFoxType() == Type.SNOW && itemstack.getItem() == Items.orangeTulip()) { -+ setFoxType(Type.RED); -+ if (!entityhuman.abilities.canInstantlyBuild) { -+ itemstack.subtract(1); -+ } -+ return EnumInteractionResult.SUCCESS; -+ } -+ } -+ return super.b(entityhuman, enumhand); -+ } -+ - @Override - protected org.bukkit.event.entity.EntityDeathEvent d(DamageSource damagesource) { // Paper - ItemStack itemstack = this.getEquipment(EnumItemSlot.MAINHAND).cloneItemStack(); // Paper -diff --git a/src/main/java/net/minecraft/world/item/Items.java b/src/main/java/net/minecraft/world/item/Items.java -index 8e9a25495d76251a86268d3059e2960a86dc46b3..993a88a5937417016821ef9d7cd58e4ee097491c 100644 ---- a/src/main/java/net/minecraft/world/item/Items.java -+++ b/src/main/java/net/minecraft/world/item/Items.java -@@ -133,8 +133,8 @@ public class Items { - public static final Item bk = a(Blocks.ALLIUM, CreativeModeTab.c); - public static final Item bl = a(Blocks.AZURE_BLUET, CreativeModeTab.c); - public static final Item bm = a(Blocks.RED_TULIP, CreativeModeTab.c); -- public static final Item bn = a(Blocks.ORANGE_TULIP, CreativeModeTab.c); -- public static final Item bo = a(Blocks.WHITE_TULIP, CreativeModeTab.c); -+ public static final Item bn = a(Blocks.ORANGE_TULIP, CreativeModeTab.c); public static Item orangeTulip() { return bn; } // Purpur - OBFHELPER -+ public static final Item bo = a(Blocks.WHITE_TULIP, CreativeModeTab.c); public static Item whiteTulip() { return bo; } // Purpur - OBFHELPER - public static final Item bp = a(Blocks.PINK_TULIP, CreativeModeTab.c); - public static final Item bq = a(Blocks.OXEYE_DAISY, CreativeModeTab.c); - public static final Item br = a(Blocks.CORNFLOWER, CreativeModeTab.c); -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index decd0e755deede2b092866a8f7f6b46520435bbe..081675005077c5070f7745e24fd2ee7400fe2320 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -118,6 +118,11 @@ public class PurpurWorldConfig { - creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); - } - -+ public boolean foxTypeChangesWithTulips = false; -+ private void foxSettings() { -+ foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); -+ } -+ - public float giantStepHeight = 2.0F; - public float giantJumpHeight = 1.0F; - public double giantMovementSpeed = 0.5D; diff --git a/patches/server-unmapped/0034-Breedable-Polar-Bears.patch b/patches/server-unmapped/0034-Breedable-Polar-Bears.patch deleted file mode 100644 index 4a2ecee2c..000000000 --- a/patches/server-unmapped/0034-Breedable-Polar-Bears.patch +++ /dev/null @@ -1,117 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Thu, 26 Mar 2020 19:46:44 -0500 -Subject: [PATCH] Breedable Polar Bears - - -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityPolarBear.java b/src/main/java/net/minecraft/world/entity/animal/EntityPolarBear.java -index 49f26d487229a732902d5bf48d305b0864e90d63..f25f5ced218555af0d62844a78842cfc7599d608 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityPolarBear.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityPolarBear.java -@@ -34,6 +34,7 @@ import net.minecraft.world.entity.GroupDataEntity; - import net.minecraft.world.entity.IEntityAngerable; - import net.minecraft.world.entity.ai.attributes.AttributeProvider; - import net.minecraft.world.entity.ai.attributes.GenericAttributes; -+import net.minecraft.world.entity.ai.goal.PathfinderGoalBreed; - import net.minecraft.world.entity.ai.goal.PathfinderGoalFloat; - import net.minecraft.world.entity.ai.goal.PathfinderGoalFollowParent; - import net.minecraft.world.entity.ai.goal.PathfinderGoalLookAtPlayer; -@@ -41,11 +42,13 @@ import net.minecraft.world.entity.ai.goal.PathfinderGoalMeleeAttack; - import net.minecraft.world.entity.ai.goal.PathfinderGoalPanic; - import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomLookaround; - import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomStroll; -+import net.minecraft.world.entity.ai.goal.PathfinderGoalTempt; - import net.minecraft.world.entity.ai.goal.target.PathfinderGoalHurtByTarget; - import net.minecraft.world.entity.ai.goal.target.PathfinderGoalNearestAttackableTarget; - import net.minecraft.world.entity.ai.goal.target.PathfinderGoalUniversalAngerReset; - import net.minecraft.world.entity.player.EntityHuman; - import net.minecraft.world.item.ItemStack; -+import net.minecraft.world.item.crafting.RecipeItemStack; - import net.minecraft.world.level.GeneratorAccess; - import net.minecraft.world.level.World; - import net.minecraft.world.level.WorldAccess; -@@ -68,6 +71,30 @@ public class EntityPolarBear extends EntityAnimal implements IEntityAngerable { - super(entitytypes, world); - } - -+ // Purpur start -+ @Override -+ public boolean mate(EntityAnimal entityanimal) { -+ if (entityanimal == this) { -+ return false; -+ } else if (this.isStanding()) { -+ return false; -+ } else if (this.getGoalTarget() != null) { -+ return false; -+ } else if (!(entityanimal instanceof EntityPolarBear)) { -+ return false; -+ } else { -+ EntityPolarBear polarbear = (EntityPolarBear) entityanimal; -+ if (polarbear.isStanding()) { -+ return false; -+ } -+ if (polarbear.getGoalTarget() != null) { -+ return false; -+ } -+ return this.isInLove() && polarbear.isInLove(); -+ } -+ } -+ // Purpur end -+ - @Override - public EntityAgeable createChild(WorldServer worldserver, EntityAgeable entityageable) { - return (EntityAgeable) EntityTypes.POLAR_BEAR.a((World) worldserver); -@@ -75,7 +102,7 @@ public class EntityPolarBear extends EntityAnimal implements IEntityAngerable { - - @Override - public boolean k(ItemStack itemstack) { -- return false; -+ return world.purpurConfig.polarBearBreedableItem != null && itemstack.getItem() == world.purpurConfig.polarBearBreedableItem; // Purpur; - } - - @Override -@@ -84,6 +111,12 @@ public class EntityPolarBear extends EntityAnimal implements IEntityAngerable { - this.goalSelector.a(0, new PathfinderGoalFloat(this)); - this.goalSelector.a(1, new EntityPolarBear.c()); - this.goalSelector.a(1, new EntityPolarBear.d()); -+ // Purpur start -+ if (world.purpurConfig.polarBearBreedableItem != null) { -+ this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D)); -+ this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.0D, RecipeItemStack.a(world.purpurConfig.polarBearBreedableItem), false)); -+ } -+ // Purpur end - this.goalSelector.a(4, new PathfinderGoalFollowParent(this, 1.25D)); - this.goalSelector.a(5, new PathfinderGoalRandomStroll(this, 1.0D)); - this.goalSelector.a(6, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); -@@ -225,10 +258,12 @@ public class EntityPolarBear extends EntityAnimal implements IEntityAngerable { - return flag; - } - -+ public boolean isStanding() { return eM(); } // Purpur - OBFHELPER - public boolean eM() { - return (Boolean) this.datawatcher.get(EntityPolarBear.bo); - } - -+ public void setStanding(boolean standing) { t(standing); } // Purpur - OBFHELPER - public void t(boolean flag) { - this.datawatcher.set(EntityPolarBear.bo, flag); - } -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 081675005077c5070f7745e24fd2ee7400fe2320..fa43c015976aabaae8843983976c9c939a49016f 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -164,6 +164,14 @@ public class PurpurWorldConfig { - ironGolemCanSwim = getBoolean("mobs.iron_golem.can-swim", ironGolemCanSwim); - } - -+ public String polarBearBreedableItemString = ""; -+ public Item polarBearBreedableItem = null; -+ private void polarBearSettings() { -+ polarBearBreedableItemString = getString("mobs.polar_bear.breedable-item", polarBearBreedableItemString); -+ Item item = IRegistry.ITEM.get(new MinecraftKey(polarBearBreedableItemString)); -+ if (item != Items.AIR) polarBearBreedableItem = item; -+ } -+ - public double rabbitNaturalToast = 0.0D; - public double rabbitNaturalKiller = 0.0D; - private void rabbitSettings() { diff --git a/patches/server-unmapped/0035-Chickens-can-retaliate.patch b/patches/server-unmapped/0035-Chickens-can-retaliate.patch deleted file mode 100644 index 3fa2e23da..000000000 --- a/patches/server-unmapped/0035-Chickens-can-retaliate.patch +++ /dev/null @@ -1,83 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Sun, 12 Apr 2020 13:19:34 -0500 -Subject: [PATCH] Chickens can retaliate - - -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityChicken.java b/src/main/java/net/minecraft/world/entity/animal/EntityChicken.java -index cd6fb8efb20a2d32de59d479b1dbf5ee69d5df37..600d6ebdf554dbaa8ca46a22a12d8b4e3255d987 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityChicken.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityChicken.java -@@ -20,10 +20,12 @@ import net.minecraft.world.entity.ai.goal.PathfinderGoalBreed; - import net.minecraft.world.entity.ai.goal.PathfinderGoalFloat; - import net.minecraft.world.entity.ai.goal.PathfinderGoalFollowParent; - import net.minecraft.world.entity.ai.goal.PathfinderGoalLookAtPlayer; -+import net.minecraft.world.entity.ai.goal.PathfinderGoalMeleeAttack; - import net.minecraft.world.entity.ai.goal.PathfinderGoalPanic; - import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomLookaround; - import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomStrollLand; - import net.minecraft.world.entity.ai.goal.PathfinderGoalTempt; -+import net.minecraft.world.entity.ai.goal.target.PathfinderGoalHurtByTarget; - import net.minecraft.world.entity.player.EntityHuman; - import net.minecraft.world.item.ItemStack; - import net.minecraft.world.item.Items; -@@ -51,16 +53,33 @@ public class EntityChicken extends EntityAnimal { - this.a(PathType.WATER, 0.0F); - } - -+ // Purpur start -+ @Override -+ protected void initAttributes() { -+ if (world.purpurConfig.chickenRetaliate) { -+ this.getAttributeInstance(GenericAttributes.ATTACK_DAMAGE).setValue(2.0D); -+ } -+ } -+ // Purpur end -+ - @Override - protected void initPathfinder() { - this.goalSelector.a(0, new PathfinderGoalFloat(this)); -- this.goalSelector.a(1, new PathfinderGoalPanic(this, 1.4D)); -+ //this.goalSelector.a(1, new PathfinderGoalPanic(this, 1.4D)); // Purpur - moved down - this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D)); - this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.0D, false, EntityChicken.bv)); - this.goalSelector.a(4, new PathfinderGoalFollowParent(this, 1.1D)); - this.goalSelector.a(5, new PathfinderGoalRandomStrollLand(this, 1.0D)); - this.goalSelector.a(6, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); - this.goalSelector.a(7, new PathfinderGoalRandomLookaround(this)); -+ // Purpur start -+ if (world.purpurConfig.chickenRetaliate) { -+ this.goalSelector.a(1, new PathfinderGoalMeleeAttack(this, 1.0D, false)); -+ this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this)); -+ } else { -+ this.goalSelector.a(1, new PathfinderGoalPanic(this, 1.4D)); -+ } -+ // Purpur end - } - - @Override -@@ -69,7 +88,7 @@ public class EntityChicken extends EntityAnimal { - } - - public static AttributeProvider.Builder eK() { -- return EntityInsentient.p().a(GenericAttributes.MAX_HEALTH, 4.0D).a(GenericAttributes.MOVEMENT_SPEED, 0.25D); -+ return EntityInsentient.p().a(GenericAttributes.MAX_HEALTH, 4.0D).a(GenericAttributes.MOVEMENT_SPEED, 0.25D).a(GenericAttributes.ATTACK_DAMAGE, 0.0D); // Purpur - } - - @Override -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index fa43c015976aabaae8843983976c9c939a49016f..78218f2d59203b8f2b286fd09b3f6bdebb47565c 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -113,6 +113,11 @@ public class PurpurWorldConfig { - turtleEggsBreakFromMinecarts = getBoolean("blocks.turtle_egg.break-from-minecarts", turtleEggsBreakFromMinecarts); - } - -+ public boolean chickenRetaliate = false; -+ private void chickenSettings() { -+ chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); -+ } -+ - public double creeperChargedChance = 0.0D; - private void creeperSettings() { - creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); diff --git a/patches/server/0030-Make-Iron-Golems-Swim.patch b/patches/server/0030-Make-Iron-Golems-Swim.patch new file mode 100644 index 000000000..e4c1add72 --- /dev/null +++ b/patches/server/0030-Make-Iron-Golems-Swim.patch @@ -0,0 +1,42 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Sat, 15 Jun 2019 03:12:15 -0500 +Subject: [PATCH] Make Iron Golems Swim + + +diff --git a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +index ec00c2dd8f969eb99ec6a014e3bcd09c7484b237..9604bda9ed7e0a87bd627521440e8b70f076584a 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java ++++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +@@ -30,6 +30,7 @@ import net.minecraft.world.entity.Mob; + import net.minecraft.world.entity.NeutralMob; + import net.minecraft.world.entity.ai.attributes.AttributeSupplier; + import net.minecraft.world.entity.ai.attributes.Attributes; ++import net.minecraft.world.entity.ai.goal.FloatGoal; + import net.minecraft.world.entity.ai.goal.GolemRandomStrollInVillageGoal; + import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; + import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; +@@ -72,6 +73,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { + + @Override + protected void registerGoals() { ++ if (level.purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new FloatGoal(this)); // Purpur + this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0D, true)); + this.goalSelector.addGoal(2, new MoveTowardsTargetGoal(this, 0.9D, 32.0F)); + this.goalSelector.addGoal(2, new MoveBackToVillageGoal(this, 0.6D, false)); +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index f9908c4edd1b47b447556feeb5de05a0fd3db468..d7a0d258fb150a595fc8fcbf47cc9dbdb899421a 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -154,6 +154,11 @@ public class PurpurWorldConfig { + illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max-health", illusionerMaxHealth); + } + ++ public boolean ironGolemCanSwim = false; ++ private void ironGolemSettings() { ++ ironGolemCanSwim = getBoolean("mobs.iron_golem.can-swim", ironGolemCanSwim); ++ } ++ + public double rabbitNaturalToast = 0.0D; + public double rabbitNaturalKiller = 0.0D; + private void rabbitSettings() { diff --git a/patches/server/0031-Dont-send-useless-entity-packets.patch b/patches/server/0031-Dont-send-useless-entity-packets.patch new file mode 100644 index 000000000..a79ee7041 --- /dev/null +++ b/patches/server/0031-Dont-send-useless-entity-packets.patch @@ -0,0 +1,57 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Sat, 6 Jul 2019 17:00:04 -0500 +Subject: [PATCH] Dont send useless entity packets + + +diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java +index 8ea4209400489116823eced292d8cd9654a1c809..d19a025337c4b0a2965184b4c872f23d15a4a60b 100644 +--- a/src/main/java/net/minecraft/server/level/ServerEntity.java ++++ b/src/main/java/net/minecraft/server/level/ServerEntity.java +@@ -189,6 +189,7 @@ public class ServerEntity { + this.teleportDelay = 0; + packet1 = new ClientboundTeleportEntityPacket(this.entity); + } ++ if (net.pl3x.purpur.PurpurConfig.dontSendUselessEntityPackets && isUselessPacket(packet1)) packet1 = null; // Purpur + } + + if ((this.trackDelta || this.entity.hasImpulse || this.entity instanceof LivingEntity && ((LivingEntity) this.entity).isFallFlying()) && this.tickCount > 0) { +@@ -257,6 +258,22 @@ public class ServerEntity { + + } + ++ // Purpur start ++ private boolean isUselessPacket(Packet possibleUselessPacket) { ++ if (possibleUselessPacket instanceof ClientboundMoveEntityPacket) { ++ ClientboundMoveEntityPacket packet = (ClientboundMoveEntityPacket) possibleUselessPacket; ++ if (possibleUselessPacket instanceof ClientboundMoveEntityPacket.Pos) { ++ return packet.getXa() == 0 && packet.getYa() == 0 && packet.getZa() == 0; ++ } else if (possibleUselessPacket instanceof ClientboundMoveEntityPacket.PosRot) { ++ return packet.getXa() == 0 && packet.getYa() == 0 && packet.getZa() == 0 && packet.getyRot() == 0 && packet.getxRot() == 0; ++ } else if (possibleUselessPacket instanceof ClientboundMoveEntityPacket.Rot) { ++ return packet.getyRot() == 0 && packet.getxRot() == 0; ++ } ++ } ++ return false; ++ } ++ // Purpur end ++ + public void removePairing(ServerPlayer player) { + this.entity.stopSeenByPlayer(player); + player.connection.send(new ClientboundRemoveEntityPacket(this.entity.getId())); +diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java +index 4e8f346cfe09b5806f53ae85729b3597b2e7c9eb..561c27bc5c23e3761018b8475ad1512d880418fc 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java +@@ -177,6 +177,11 @@ public class PurpurConfig { + enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); + } + ++ public static boolean dontSendUselessEntityPackets = false; ++ private static void dontSendUselessEntityPackets() { ++ dontSendUselessEntityPackets = getBoolean("settings.dont-send-useless-entity-packets", dontSendUselessEntityPackets); ++ } ++ + public static boolean loggerSuppressInitLegacyMaterialError = false; + public static boolean loggerSuppressIgnoredAdvancementWarnings = false; + private static void loggerSettings() { diff --git a/patches/server/0032-Tulips-change-fox-type.patch b/patches/server/0032-Tulips-change-fox-type.patch new file mode 100644 index 000000000..f0efad7e9 --- /dev/null +++ b/patches/server/0032-Tulips-change-fox-type.patch @@ -0,0 +1,92 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Sat, 13 Jul 2019 15:56:22 -0500 +Subject: [PATCH] Tulips change fox type + + +diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java +index 31f4e4a93ea5fd3ffe7e60dff2e2a9642b51daa2..26470e4e07387fcf0c02c1f8845950eca4140a56 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Fox.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java +@@ -34,6 +34,7 @@ import net.minecraft.tags.Tag; + import net.minecraft.util.Mth; + import net.minecraft.world.DifficultyInstance; + import net.minecraft.world.InteractionHand; ++import net.minecraft.world.InteractionResult; + import net.minecraft.world.damagesource.DamageSource; + import net.minecraft.world.entity.AgeableMob; + import net.minecraft.world.entity.Entity; +@@ -85,6 +86,7 @@ import net.minecraft.world.level.block.Blocks; + import net.minecraft.world.level.block.CaveVines; + import net.minecraft.world.level.block.SweetBerryBushBlock; + import net.minecraft.world.level.block.state.BlockState; ++import net.minecraft.world.level.gameevent.GameEvent; + import net.minecraft.world.level.pathfinder.BlockPathTypes; + import net.minecraft.world.phys.Vec3; + +@@ -328,6 +330,11 @@ public class Fox extends Animal { + } + + private void setTargetGoals() { ++ // Purpur start - do not add duplicate goals ++ this.targetSelector.removeGoal(this.landTargetGoal); ++ this.targetSelector.removeGoal(this.turtleEggTargetGoal); ++ this.targetSelector.removeGoal(this.fishTargetGoal); ++ // Purpur end + if (this.getFoxType() == Fox.Type.RED) { + this.targetSelector.addGoal(4, this.landTargetGoal); + this.targetSelector.addGoal(4, this.turtleEggTargetGoal); +@@ -360,6 +367,7 @@ public class Fox extends Animal { + + public void setFoxType(Fox.Type type) { + this.entityData.set(Fox.DATA_TYPE_ID, type.getId()); ++ this.setTargetGoals(); // Purpur - fix API bug not updating pathfinders on type change + } + + List getTrustedUUIDs() { +@@ -690,6 +698,29 @@ public class Fox extends Animal { + return this.getTrustedUUIDs().contains(uuid); + } + ++ // Purpur start ++ @Override ++ public InteractionResult mobInteract(Player player, InteractionHand hand) { ++ if (level.purpurConfig.foxTypeChangesWithTulips) { ++ ItemStack itemstack = player.getItemInHand(hand); ++ if (getFoxType() == Type.RED && itemstack.getItem() == Items.WHITE_TULIP) { ++ setFoxType(Type.SNOW); ++ if (!player.getAbilities().instabuild) { ++ itemstack.shrink(1); ++ } ++ return InteractionResult.SUCCESS; ++ } else if (getFoxType() == Type.SNOW && itemstack.getItem() == Items.ORANGE_TULIP) { ++ setFoxType(Type.RED); ++ if (!player.getAbilities().instabuild) { ++ itemstack.shrink(1); ++ } ++ return InteractionResult.SUCCESS; ++ } ++ } ++ return super.mobInteract(player, hand); ++ } ++ // Purpur end ++ + @Override + // Paper start - Cancellable death event + protected org.bukkit.event.entity.EntityDeathEvent dropAllDeathLoot(DamageSource source) { +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index d7a0d258fb150a595fc8fcbf47cc9dbdb899421a..142135c8058eb3f199f5f7d4572daaac45d997a0 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -118,6 +118,11 @@ public class PurpurWorldConfig { + creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); + } + ++ public boolean foxTypeChangesWithTulips = false; ++ private void foxSettings() { ++ foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); ++ } ++ + public float giantStepHeight = 2.0F; + public float giantJumpHeight = 1.0F; + public double giantMovementSpeed = 0.5D; diff --git a/patches/server/0033-Breedable-Polar-Bears.patch b/patches/server/0033-Breedable-Polar-Bears.patch new file mode 100644 index 000000000..6a6337c71 --- /dev/null +++ b/patches/server/0033-Breedable-Polar-Bears.patch @@ -0,0 +1,104 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Thu, 26 Mar 2020 19:46:44 -0500 +Subject: [PATCH] Breedable Polar Bears + + +diff --git a/src/main/java/net/minecraft/world/entity/animal/PolarBear.java b/src/main/java/net/minecraft/world/entity/animal/PolarBear.java +index 0694cd0b994ee595adca43c988485e6dc13c7244..583bb80059b9351d27d15859b1687dd817ba165e 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/PolarBear.java ++++ b/src/main/java/net/minecraft/world/entity/animal/PolarBear.java +@@ -32,6 +32,7 @@ import net.minecraft.world.entity.Pose; + import net.minecraft.world.entity.SpawnGroupData; + import net.minecraft.world.entity.ai.attributes.AttributeSupplier; + import net.minecraft.world.entity.ai.attributes.Attributes; ++import net.minecraft.world.entity.ai.goal.BreedGoal; + import net.minecraft.world.entity.ai.goal.FloatGoal; + import net.minecraft.world.entity.ai.goal.FollowParentGoal; + import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +@@ -39,11 +40,13 @@ import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; + import net.minecraft.world.entity.ai.goal.PanicGoal; + import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; + import net.minecraft.world.entity.ai.goal.RandomStrollGoal; ++import net.minecraft.world.entity.ai.goal.TemptGoal; + import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; + import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; + import net.minecraft.world.entity.ai.goal.target.ResetUniversalAngerTargetGoal; + import net.minecraft.world.entity.player.Player; + import net.minecraft.world.item.ItemStack; ++import net.minecraft.world.item.crafting.Ingredient; + import net.minecraft.world.level.Level; + import net.minecraft.world.level.LevelAccessor; + import net.minecraft.world.level.ServerLevelAccessor; +@@ -66,6 +69,30 @@ public class PolarBear extends Animal implements NeutralMob { + super(type, world); + } + ++ // Purpur start ++ @Override ++ public boolean canMate(Animal other) { ++ if (other == this) { ++ return false; ++ } else if (this.isStanding()) { ++ return false; ++ } else if (this.getTarget() != null) { ++ return false; ++ } else if (!(other instanceof PolarBear)) { ++ return false; ++ } else { ++ PolarBear bear = (PolarBear) other; ++ if (bear.isStanding()) { ++ return false; ++ } ++ if (bear.getTarget() != null) { ++ return false; ++ } ++ return this.isInLove() && bear.isInLove(); ++ } ++ } ++ // Purpur end ++ + @Override + public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) { + return EntityType.POLAR_BEAR.create(world); +@@ -73,7 +100,7 @@ public class PolarBear extends Animal implements NeutralMob { + + @Override + public boolean isFood(ItemStack stack) { +- return false; ++ return level.purpurConfig.polarBearBreedableItem != null && stack.getItem() == level.purpurConfig.polarBearBreedableItem; // Purpur; + } + + @Override +@@ -82,6 +109,12 @@ public class PolarBear extends Animal implements NeutralMob { + this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(1, new PolarBear.PolarBearMeleeAttackGoal()); + this.goalSelector.addGoal(1, new PolarBear.PolarBearPanicGoal()); ++ // Purpur start ++ if (level.purpurConfig.polarBearBreedableItem != null) { ++ this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); ++ this.goalSelector.addGoal(3, new TemptGoal(this, 1.0D, Ingredient.of(level.purpurConfig.polarBearBreedableItem), false)); ++ } ++ // Purpur end + this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.25D)); + this.goalSelector.addGoal(5, new RandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index 142135c8058eb3f199f5f7d4572daaac45d997a0..8191eba054e4d47a1310c6d57688d759b909443e 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -164,6 +164,14 @@ public class PurpurWorldConfig { + ironGolemCanSwim = getBoolean("mobs.iron_golem.can-swim", ironGolemCanSwim); + } + ++ public String polarBearBreedableItemString = ""; ++ public Item polarBearBreedableItem = null; ++ private void polarBearSettings() { ++ polarBearBreedableItemString = getString("mobs.polar_bear.breedable-item", polarBearBreedableItemString); ++ Item item = Registry.ITEM.get(new ResourceLocation(polarBearBreedableItemString)); ++ if (item != Items.AIR) polarBearBreedableItem = item; ++ } ++ + public double rabbitNaturalToast = 0.0D; + public double rabbitNaturalKiller = 0.0D; + private void rabbitSettings() { diff --git a/patches/server/0034-Chickens-can-retaliate.patch b/patches/server/0034-Chickens-can-retaliate.patch new file mode 100644 index 000000000..c33b96374 --- /dev/null +++ b/patches/server/0034-Chickens-can-retaliate.patch @@ -0,0 +1,83 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Sun, 12 Apr 2020 13:19:34 -0500 +Subject: [PATCH] Chickens can retaliate + + +diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java +index 8460bed561c09a647f6e0209f7c5448e5a42b281..56aee819372d4baacf73c345603ce889b3a60b52 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java +@@ -20,10 +20,12 @@ import net.minecraft.world.entity.ai.goal.BreedGoal; + import net.minecraft.world.entity.ai.goal.FloatGoal; + import net.minecraft.world.entity.ai.goal.FollowParentGoal; + import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; ++import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; + import net.minecraft.world.entity.ai.goal.PanicGoal; + import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal; + import net.minecraft.world.entity.ai.goal.TemptGoal; + import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal; ++import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; + import net.minecraft.world.entity.player.Player; + import net.minecraft.world.item.ItemStack; + import net.minecraft.world.item.Items; +@@ -52,16 +54,33 @@ public class Chicken extends Animal { + this.setPathfindingMalus(BlockPathTypes.WATER, 0.0F); + } + ++ // Purpur start ++ @Override ++ protected void initAttributes() { ++ if (level.purpurConfig.chickenRetaliate) { ++ this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(2.0D); ++ } ++ } ++ // Purpur end ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); +- this.goalSelector.addGoal(1, new PanicGoal(this, 1.4D)); ++ // this.goalSelector.addGoal(1, new PanicGoal(this, 1.4D)); // Purpur - moved down + this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); + this.goalSelector.addGoal(3, new TemptGoal(this, 1.0D, Chicken.FOOD_ITEMS, false)); + this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.1D)); + this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0D)); + this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); ++ // Purpur start ++ if (level.purpurConfig.chickenRetaliate) { ++ this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0D, false)); ++ this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); ++ } else { ++ this.goalSelector.addGoal(1, new PanicGoal(this, 1.4D)); ++ } ++ // Purpur end + } + + @Override +@@ -70,7 +89,7 @@ public class Chicken extends Animal { + } + + public static AttributeSupplier.Builder createAttributes() { +- return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D).add(Attributes.MOVEMENT_SPEED, 0.25D); ++ return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 4.0D).add(Attributes.MOVEMENT_SPEED, 0.25D).add(Attributes.ATTACK_DAMAGE, 0.0D); // Purpur + } + + @Override +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index 8191eba054e4d47a1310c6d57688d759b909443e..615f7a3ccb925a8db52c5f2e4e0510f740784194 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -113,6 +113,11 @@ public class PurpurWorldConfig { + turtleEggsBreakFromMinecarts = getBoolean("blocks.turtle_egg.break-from-minecarts", turtleEggsBreakFromMinecarts); + } + ++ public boolean chickenRetaliate = false; ++ private void chickenSettings() { ++ chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); ++ } ++ + public double creeperChargedChance = 0.0D; + private void creeperSettings() { + creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); diff --git a/patches/server-unmapped/0036-Add-option-to-set-armorstand-step-height.patch b/patches/server/0035-Add-option-to-set-armorstand-step-height.patch similarity index 67% rename from patches/server-unmapped/0036-Add-option-to-set-armorstand-step-height.patch rename to patches/server/0035-Add-option-to-set-armorstand-step-height.patch index 0a3d19160..918b0f152 100644 --- a/patches/server-unmapped/0036-Add-option-to-set-armorstand-step-height.patch +++ b/patches/server/0035-Add-option-to-set-armorstand-step-height.patch @@ -4,20 +4,20 @@ Date: Sun, 6 Oct 2019 12:46:35 -0500 Subject: [PATCH] Add option to set armorstand step height -diff --git a/src/main/java/net/minecraft/world/entity/decoration/EntityArmorStand.java b/src/main/java/net/minecraft/world/entity/decoration/EntityArmorStand.java -index c0e0750adef0ae6aff7635c84f6585f06c5fc38d..89d3734489b65245e815376edf4e2d9baea1563a 100644 ---- a/src/main/java/net/minecraft/world/entity/decoration/EntityArmorStand.java -+++ b/src/main/java/net/minecraft/world/entity/decoration/EntityArmorStand.java -@@ -660,6 +660,7 @@ public class EntityArmorStand extends EntityLiving { +diff --git a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java +index 5fc66d7096afcfe63eba774e1dc330ac3263e4b0..7a3a364f5e3b025cc0a5694401cb9298c80cb733 100644 +--- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java ++++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java +@@ -669,6 +669,7 @@ public class ArmorStand extends LivingEntity { @Override public void tick() { -+ setStepHeight(world.purpurConfig.armorstandStepHeight); // Purpur ++ maxUpStep = level.purpurConfig.armorstandStepHeight; // Paper start if (!this.canTick) { if (this.noTickPoseDirty) { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 78218f2d59203b8f2b286fd09b3f6bdebb47565c..90f367f2f04f9bf66b7f54ffe784db16c7ca868b 100644 +index 615f7a3ccb925a8db52c5f2e4e0510f740784194..5d80cd3049e33d1bed7d347f4092a0ca476f711b 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -63,6 +63,11 @@ public class PurpurWorldConfig {