diff --git a/gradle.properties b/gradle.properties index 48a347dbe..3513c66d2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ group=net.pl3x.purpur version=1.17-R0.1-SNAPSHOT packageVersion=1_17_R1 -paperCommit=ac95f25f3534d0c5e65ea7d106973639a58670a1 +paperCommit=3d43c5e50077ac7fa1e68cf7a7add0ac77768a61 org.gradle.parallel=true org.gradle.jvmargs=-Xmx3G diff --git a/patches/server-unmapped/0122-Add-adjustable-breeding-cooldown-to-config.patch b/patches/server-unmapped/0122-Add-adjustable-breeding-cooldown-to-config.patch deleted file mode 100644 index 9fdd10e7f..000000000 --- a/patches/server-unmapped/0122-Add-adjustable-breeding-cooldown-to-config.patch +++ /dev/null @@ -1,135 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: montlikadani -Date: Fri, 13 Nov 2020 17:52:40 +0100 -Subject: [PATCH] Add adjustable breeding cooldown to config - - -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityAnimal.java b/src/main/java/net/minecraft/world/entity/animal/EntityAnimal.java -index 4de0a733819d408e8b9a55b604f455281d7732c5..94b5874c1eb90c02a557179a2a1170b1da85deb4 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityAnimal.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityAnimal.java -@@ -145,7 +145,7 @@ public abstract class EntityAnimal extends EntityAgeable { - if (this.k(itemstack)) { - int i = this.getAge(); - -- if (!this.world.isClientSide && i == 0 && this.eP()) { -+ if (!this.world.isClientSide && i == 0 && this.eP() && (this.world.purpurConfig.animalBreedingCooldownSeconds <= 0 || !this.world.hasBreedingCooldown(entityhuman.getUniqueID(), this.getClass()))) { // Purpur - this.a(entityhuman, itemstack); - this.g(entityhuman); - return EnumInteractionResult.SUCCESS; -@@ -237,6 +237,14 @@ public abstract class EntityAnimal extends EntityAgeable { - if (entityplayer == null && entityanimal.getBreedCause() != null) { - entityplayer = entityanimal.getBreedCause(); - } -+ // Purpur start -+ if (entityplayer != null && worldserver.purpurConfig.animalBreedingCooldownSeconds > 0) { -+ if (worldserver.hasBreedingCooldown(entityplayer.getUniqueID(), this.getClass())) { -+ return; -+ } -+ worldserver.addBreedingCooldown(entityplayer.getUniqueID(), this.getClass()); -+ } -+ // Purpur end - // CraftBukkit start - call EntityBreedEvent - entityageable.setBaby(true); - entityageable.setPositionRotation(this.locX(), this.locY(), this.locZ(), 0.0F, 0.0F); -diff --git a/src/main/java/net/minecraft/world/level/World.java b/src/main/java/net/minecraft/world/level/World.java -index ea40c3d862acdea4d02b234ae5039204a415df20..dd0dabc36de2ae01d631e46795071f8ec3477f5a 100644 ---- a/src/main/java/net/minecraft/world/level/World.java -+++ b/src/main/java/net/minecraft/world/level/World.java -@@ -41,6 +41,7 @@ import net.minecraft.world.DifficultyDamageScaler; - import net.minecraft.world.damagesource.DamageSource; - import net.minecraft.world.entity.Entity; - import net.minecraft.world.entity.EntityTypes; -+import net.minecraft.world.entity.animal.EntityAnimal; - import net.minecraft.world.entity.decoration.EntityArmorStand; - import net.minecraft.world.entity.player.EntityHuman; - import net.minecraft.world.item.ItemStack; -@@ -167,6 +168,48 @@ public abstract class World implements GeneratorAccess, AutoCloseable { - private int tileTickPosition; - public final Map explosionDensityCache = new HashMap<>(); // Paper - Optimize explosions - public java.util.ArrayDeque redstoneUpdateInfos; // Paper - Move from Map in BlockRedstoneTorch to here -+ // Purpur start -+ private com.google.common.cache.Cache playerBreedingCooldowns; -+ -+ private com.google.common.cache.Cache getNewBreedingCooldownCache() { -+ return com.google.common.cache.CacheBuilder.newBuilder().expireAfterWrite(this.purpurConfig.animalBreedingCooldownSeconds, java.util.concurrent.TimeUnit.SECONDS).build(); -+ } -+ -+ public void resetBreedingCooldowns() { -+ this.playerBreedingCooldowns = this.getNewBreedingCooldownCache(); -+ } -+ -+ public boolean hasBreedingCooldown(java.util.UUID player, Class animalType) { // Purpur -+ return this.playerBreedingCooldowns.getIfPresent(new BreedingCooldownPair(player, animalType)) != null; -+ } -+ -+ public void addBreedingCooldown(java.util.UUID player, Class animalType) { -+ this.playerBreedingCooldowns.put(new BreedingCooldownPair(player, animalType), new Object()); -+ } -+ -+ private static final class BreedingCooldownPair { -+ private final java.util.UUID playerUUID; -+ private final Class animalType; -+ -+ public BreedingCooldownPair(java.util.UUID playerUUID, Class animalType) { -+ this.playerUUID = playerUUID; -+ this.animalType = animalType; -+ } -+ -+ @Override -+ public boolean equals(Object o) { -+ if (this == o) return true; -+ if (o == null || getClass() != o.getClass()) return false; -+ BreedingCooldownPair that = (BreedingCooldownPair) o; -+ return playerUUID.equals(that.playerUUID) && animalType.equals(that.animalType); -+ } -+ -+ @Override -+ public int hashCode() { -+ return java.util.Objects.hash(playerUUID, animalType); -+ } -+ } -+ // Purpur end - - public CraftWorld getWorld() { - return this.world; -@@ -201,6 +244,7 @@ public abstract class World implements GeneratorAccess, AutoCloseable { - this.paperConfig = new com.destroystokyo.paper.PaperWorldConfig(((net.minecraft.world.level.storage.WorldDataServer) worlddatamutable).getName(), this.spigotConfig); // Paper - this.chunkPacketBlockController = this.paperConfig.antiXray ? new ChunkPacketBlockControllerAntiXray(this, executor) : ChunkPacketBlockController.NO_OPERATION_INSTANCE; // Paper - Anti-Xray - this.purpurConfig = new net.pl3x.purpur.PurpurWorldConfig((((net.minecraft.world.level.storage.WorldDataServer)worlddatamutable).getName()), env); // Purpur -+ this.playerBreedingCooldowns = this.getNewBreedingCooldownCache(); // Purpur - this.generator = gen; - this.world = new CraftWorld((WorldServer) this, gen, env); - this.ticksPerAnimalSpawns = this.getServer().getTicksPerAnimalSpawns(); // CraftBukkit -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 44c27c6dd4993add42410373191a46f4cc92f42f..b92715b115332e8197d5a02a2f308a1ab0f447b6 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -265,6 +265,7 @@ public class PurpurWorldConfig { - public double voidDamageHeight = -64.0D; - public double voidDamageDealt = 4.0D; - public int raidCooldownSeconds = 0; -+ public int animalBreedingCooldownSeconds = 0; - private void miscGameplayMechanicsSettings() { - useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending); - boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand); -@@ -277,6 +278,7 @@ public class PurpurWorldConfig { - voidDamageHeight = getDouble("gameplay-mechanics.void-damage-height", voidDamageHeight); - voidDamageDealt = getDouble("gameplay-mechanics.void-damage-dealt", voidDamageDealt); - raidCooldownSeconds = getInt("gameplay-mechanics.raid-cooldown-seconds", raidCooldownSeconds); -+ animalBreedingCooldownSeconds = getInt("gameplay-mechanics.animal-breeding-cooldown-seconds", animalBreedingCooldownSeconds); - } - - public boolean catSpawning; -diff --git a/src/main/java/net/pl3x/purpur/command/PurpurCommand.java b/src/main/java/net/pl3x/purpur/command/PurpurCommand.java -index 536955124afaec5c8a070249c7432cb99bf43d67..0c35b1dd5147cf86c7ee743b98528e8f4bc0b5e9 100644 ---- a/src/main/java/net/pl3x/purpur/command/PurpurCommand.java -+++ b/src/main/java/net/pl3x/purpur/command/PurpurCommand.java -@@ -49,6 +49,7 @@ public class PurpurCommand extends Command { - PurpurConfig.init((File) console.options.valueOf("purpur-settings")); - for (WorldServer world : console.getWorlds()) { - world.purpurConfig.init(); -+ world.resetBreedingCooldowns(); - } - console.server.reloadCount++; - diff --git a/patches/server-unmapped/0123-Make-entity-breeding-times-configurable.patch b/patches/server-unmapped/0123-Make-entity-breeding-times-configurable.patch deleted file mode 100644 index 04daf4ab7..000000000 --- a/patches/server-unmapped/0123-Make-entity-breeding-times-configurable.patch +++ /dev/null @@ -1,685 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> -Date: Sun, 15 Nov 2020 02:18:15 -0800 -Subject: [PATCH] Make entity breeding times configurable - - -diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/BehaviorMakeLove.java b/src/main/java/net/minecraft/world/entity/ai/behavior/BehaviorMakeLove.java -index 79989c143fc8393172475e33d356510b3547afb9..d1315f4b6e026f70e04a0b54289fd13b4be17cde 100644 ---- a/src/main/java/net/minecraft/world/entity/ai/behavior/BehaviorMakeLove.java -+++ b/src/main/java/net/minecraft/world/entity/ai/behavior/BehaviorMakeLove.java -@@ -117,8 +117,10 @@ public class BehaviorMakeLove extends Behavior { - return Optional.empty(); - } - // CraftBukkit end -- entityvillager.setAgeRaw(6000); -- entityvillager1.setAgeRaw(6000); -+ // Purpur start -+ entityvillager.setAgeRaw(worldserver.purpurConfig.villagerBreedingTicks); -+ entityvillager1.setAgeRaw(worldserver.purpurConfig.villagerBreedingTicks); -+ // Purpur end - worldserver.addAllEntities(entityvillager2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason - worldserver.broadcastEntityEffect(entityvillager2, (byte) 12); - return Optional.of(entityvillager2); -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityAnimal.java b/src/main/java/net/minecraft/world/entity/animal/EntityAnimal.java -index 94b5874c1eb90c02a557179a2a1170b1da85deb4..181bb648dd32f71c7f9d3fbb4974e2a1afba61ac 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityAnimal.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityAnimal.java -@@ -38,6 +38,7 @@ public abstract class EntityAnimal extends EntityAgeable { - public int loveTicks; - public UUID breedCause; - public ItemStack breedItem; // CraftBukkit - Add breedItem variable -+ public abstract int getPurpurBreedTime(); // Purpur - - protected EntityAnimal(EntityTypes entitytypes, World world) { - super(entitytypes, world); -@@ -261,8 +262,10 @@ public abstract class EntityAnimal extends EntityAgeable { - CriterionTriggers.o.a(entityplayer, this, entityanimal, entityageable); - } - -- this.setAgeRaw(6000); -- entityanimal.setAgeRaw(6000); -+ // Purpur start -+ this.setAgeRaw(this.getPurpurBreedTime()); -+ entityanimal.setAgeRaw(entityanimal.getPurpurBreedTime()); -+ // Purpur end - this.resetLove(); - entityanimal.resetLove(); - worldserver.addAllEntities(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityBee.java b/src/main/java/net/minecraft/world/entity/animal/EntityBee.java -index bcd510e0bf647a240edfaac1348119c5e1d7dc42..6086dda5b06f0c0e02734edf7141b13715420d3c 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityBee.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityBee.java -@@ -175,6 +175,11 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB - setMot(mot.a(0.9D)); - } - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.beeBreedingTicks; -+ } - // Purpur end - - @Override -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityCat.java b/src/main/java/net/minecraft/world/entity/animal/EntityCat.java -index 0ec711f8f1d103d24899854f8cbcd261a66f26fc..25b0d4ebb45ffa5579921e6966c63eff1e043b85 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityCat.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityCat.java -@@ -122,6 +122,11 @@ public class EntityCat extends EntityTameableAnimal { - setSleepingWithOwner(false); - setHeadDown(false); - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.catBreedingTicks; -+ } - // Purpur end - - public MinecraftKey eU() { -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 5c744f1eac19e144c39a2c146d312f0547d6e589..ab54e809f735cea7d84366d2bc205351f8992bef 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityChicken.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityChicken.java -@@ -71,6 +71,11 @@ public class EntityChicken extends EntityAnimal { - this.getAttributeInstance(GenericAttributes.ATTACK_DAMAGE).setValue(2.0D); - } - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.chickenBreedingTicks; -+ } - // Purpur end - - @Override -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityCow.java b/src/main/java/net/minecraft/world/entity/animal/EntityCow.java -index b2d3fc3151a952ac783101443772736a206a6a3b..7ed55ebe1bb768351a5cb4cdc7d4d3b0816d53b1 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityCow.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityCow.java -@@ -54,6 +54,11 @@ public class EntityCow extends EntityAnimal { - public boolean isRidableInWater() { - return world.purpurConfig.cowRidableInWater; - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.cowBreedingTicks; -+ } - // Purpur end - - @Override -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 7b1a6d846f25d8bc659a541fce59df79347ba9bc..70369d03985250fa5eaf398fa98d35a2c2a06ff1 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityFox.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityFox.java -@@ -157,6 +157,11 @@ public class EntityFox extends EntityAnimal { - super.onDismount(entityhuman); - setCanPickupLoot(true); - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.foxBreedingTicks; -+ } - // Purpur end - - @Override -@@ -1373,8 +1378,10 @@ public class EntityFox extends EntityAnimal { - CriterionTriggers.o.a(entityplayer2, this.animal, this.partner, (EntityAgeable) entityfox); - } - -- this.animal.setAgeRaw(6000); -- this.partner.setAgeRaw(6000); -+ // Purpur start -+ this.animal.setAgeRaw(this.animal.getPurpurBreedTime()); -+ this.partner.setAgeRaw(this.partner.getPurpurBreedTime()); -+ // Purpur end - this.animal.resetLove(); - this.partner.resetLove(); - worldserver.addAllEntities(entityfox, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityMushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/EntityMushroomCow.java -index 815e907e8db721f2a6f0f831b69c44a9573b5c9b..ab4a8ee6e1912f230cbf3353eb42c3bc8a9db58e 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityMushroomCow.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityMushroomCow.java -@@ -67,6 +67,11 @@ public class EntityMushroomCow extends EntityCow implements IShearable { - public boolean isRidableInWater() { - return world.purpurConfig.mooshroomRidableInWater; - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.mooshroomBreedingTicks; -+ } - // Purpur end - - @Override -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityOcelot.java b/src/main/java/net/minecraft/world/entity/animal/EntityOcelot.java -index d7938ff0dca305f1d47fdfdbc57648892debe367..cff2ff5a8beef739f0515832e072e7e390ac388f 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityOcelot.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityOcelot.java -@@ -74,6 +74,11 @@ public class EntityOcelot extends EntityAnimal { - public boolean isRidableInWater() { - return world.purpurConfig.ocelotRidableInWater; - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.ocelotBreedingTicks; -+ } - // Purpur end - - private boolean isTrusting() { -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityPanda.java b/src/main/java/net/minecraft/world/entity/animal/EntityPanda.java -index 0d912399e1975d9c0d5525f5b89049f40e7efcc0..e6952c0a8d90eb4b133c517d97299f2c3db7e329 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityPanda.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityPanda.java -@@ -121,6 +121,11 @@ public class EntityPanda extends EntityAnimal { - this.setEating(false); - this.setLayingOnBack(false); - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.pandaBreedingTicks; -+ } - // Purpur end - - @Override -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java b/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java -index 9f705b75a14ba456808485ce4ddef9550aac3fe9..7346921a24bdd57aa3814386bc372b082b23b4bc 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java -@@ -171,6 +171,11 @@ public class EntityParrot extends EntityPerchable implements EntityBird { - setMot(mot.a(0.9D)); - } - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return 6000; -+ } - // Purpur end - - @Nullable -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityPig.java b/src/main/java/net/minecraft/world/entity/animal/EntityPig.java -index cef69f99d7bc9b6605b9654c50f43a1ebc1a8509..5aa8806063186bec36b38adc51e2ea82bf6ff21a 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityPig.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityPig.java -@@ -77,6 +77,11 @@ public class EntityPig extends EntityAnimal implements ISteerable, ISaddleable { - public boolean isRidableInWater() { - return world.purpurConfig.pigRidableInWater; - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.pigBreedingTicks; -+ } - // Purpur end - - @Override -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 b46315700b8857318b03b83097fcf829047f8ca4..c9c7c9de638079393bbea86f8069023dcbcbca83 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityPolarBear.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityPolarBear.java -@@ -116,6 +116,11 @@ public class EntityPolarBear extends EntityAnimal implements IEntityAngerable { - return this.isInLove() && polarbear.isInLove(); - } - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.polarBearBreedingTicks; -+ } - // Purpur end - - @Override -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java b/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java -index 4660f37bc89418e0c3767305d390a53f5c0d3c55..465701232567e4058f9dfc776560ccde33fee66c 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java -@@ -85,6 +85,11 @@ public class EntityRabbit extends EntityAnimal { - public boolean isRidableInWater() { - return world.purpurConfig.rabbitRidableInWater; - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.rabbitBreedingTicks; -+ } - // Purpur end - - // CraftBukkit start - code from constructor -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntitySheep.java b/src/main/java/net/minecraft/world/entity/animal/EntitySheep.java -index 8f3296031f220dd7bb3ae9fe2443e479954ebad3..ff6fc821085e4430a3b1008140b0b7fcacc59d2e 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntitySheep.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntitySheep.java -@@ -121,6 +121,11 @@ public class EntitySheep extends EntityAnimal implements IShearable { - public boolean isRidableInWater() { - return world.purpurConfig.sheepRidableInWater; - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.sheepBreedingTicks; -+ } - // Purpur end - - @Override -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityTurtle.java b/src/main/java/net/minecraft/world/entity/animal/EntityTurtle.java -index 28d6e673f55fc8fae40dff4a96ac2c2b5eeab9d6..a16f586934f24e599d00bf793f06d3f9134ed29d 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityTurtle.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityTurtle.java -@@ -101,6 +101,11 @@ public class EntityTurtle extends EntityAnimal { - public boolean isRidableInWater() { - return world.purpurConfig.turtleRidableInWater; - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.turtleBreedingTicks; -+ } - // Purpur end - - public void setHomePos(BlockPosition blockposition) { -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityWolf.java b/src/main/java/net/minecraft/world/entity/animal/EntityWolf.java -index 3fbd8f9122d7a5ac23af4d872f877030644ef86a..dd3c7ad7701ad18ccaf86d73fde7051090ed3d57 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityWolf.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityWolf.java -@@ -107,6 +107,11 @@ public class EntityWolf extends EntityTameableAnimal implements IEntityAngerable - super.onMount(entityhuman); - setSitting(false); - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.wolfBreedingTicks; -+ } - // Purpur end - - @Override -diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorse.java -index 650f13b1133e4c61f71b36f3f91a9d2913996435..c830bf6e5e38f5ebacc07673c3d67e4157c8c2b5 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorse.java -+++ b/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorse.java -@@ -46,6 +46,11 @@ public class EntityHorse extends EntityHorseAbstract { - public boolean isRidableInWater() { - return world.purpurConfig.horseRidableInWater; - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.horseBreedingTicks; -+ } - // Purpur end - - @Override -diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseDonkey.java b/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseDonkey.java -index 50700bf85a296b87fe3155651f869e2bbdb0875d..3b44394dcba8e9905aca46e6e585ee6d7a87de44 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseDonkey.java -+++ b/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseDonkey.java -@@ -21,6 +21,11 @@ public class EntityHorseDonkey extends EntityHorseChestedAbstract { - public boolean isRidableInWater() { - return world.purpurConfig.donkeyRidableInWater; - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.donkeyBreedingTicks; -+ } - // Purpur end - - @Override -diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseMule.java b/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseMule.java -index b6385a23050296611dbc8864b92d2cdd8321a1d0..0536112357e0321dbb902331467b847894a4c11b 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseMule.java -+++ b/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseMule.java -@@ -20,6 +20,11 @@ public class EntityHorseMule extends EntityHorseChestedAbstract { - public boolean isRidableInWater() { - return world.purpurConfig.muleRidableInWater; - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.muleBreedingTicks; -+ } - // Purpur end - @Override - protected SoundEffect getSoundAmbient() { -diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseSkeleton.java b/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseSkeleton.java -index d21399fbb6ddc4f26a7509ce547f8c4ad6458089..28c6e3745c61d0670bf7f3a324169472250e25f4 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseSkeleton.java -+++ b/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseSkeleton.java -@@ -43,6 +43,11 @@ public class EntityHorseSkeleton extends EntityHorseAbstract { - public boolean isTamed() { - return true; - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return 6000; -+ } - // Purpur end - - public static AttributeProvider.Builder eL() { -diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseZombie.java b/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseZombie.java -index d57e7c02268e5d8a00b0b5897fa03dcee10cd2e0..c776f18722d1aa73f53da66ef6b37564eeaddd2a 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseZombie.java -+++ b/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseZombie.java -@@ -35,6 +35,11 @@ public class EntityHorseZombie extends EntityHorseAbstract { - public boolean isTamed() { - return true; - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return 6000; -+ } - // Purpur end - - public static AttributeProvider.Builder eL() { -diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java b/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java -index d25177f9500a084e0f18a20b1eb1c4ac170048ec..2710c246a147f117d2d90014c37988888010dc36 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java -+++ b/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java -@@ -108,6 +108,11 @@ public class EntityLlama extends EntityHorseChestedAbstract implements IRangedEn - public boolean hasSaddle() { - return super.hasSaddle() || (isTamed() && getColor() != null); - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.llamaBreedingTicks; -+ } - // Purpur end - - public void setStrength(int i) { -diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityStrider.java b/src/main/java/net/minecraft/world/entity/monster/EntityStrider.java -index 14dda6743ed9e6f4880bc560f7ba8892d8e84afe..cba66a08feceeeaf7c123da595fc7b12c5749783 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/EntityStrider.java -+++ b/src/main/java/net/minecraft/world/entity/monster/EntityStrider.java -@@ -105,6 +105,11 @@ public class EntityStrider extends EntityAnimal implements ISteerable, ISaddleab - public boolean isRidableInWater() { - return world.purpurConfig.striderRidableInWater; - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.striderBreedingTicks; -+ } - // Purpur end - - public static boolean c(EntityTypes entitytypes, GeneratorAccess generatoraccess, EnumMobSpawn enummobspawn, BlockPosition blockposition, Random random) { -diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/EntityHoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/EntityHoglin.java -index 9bac45983b55abf9b72f2c45f632cdedd48f81f9..9f2af4b37ffb22034b537cc27b42d520a41d4fe7 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/hoglin/EntityHoglin.java -+++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/EntityHoglin.java -@@ -71,6 +71,11 @@ public class EntityHoglin extends EntityAnimal implements IMonster, IOglin { - public boolean isRidableInWater() { - return world.purpurConfig.hoglinRidableInWater; - } -+ -+ @Override -+ public int getPurpurBreedTime() { -+ return this.world.purpurConfig.hoglinBreedingTicks; -+ } - // Purpur end - - @Override -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index b92715b115332e8197d5a02a2f308a1ab0f447b6..bd37234624a720c1077aabf0123de61a0d4e05cb 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -492,10 +492,12 @@ public class PurpurWorldConfig { - public boolean beeRidable = false; - public boolean beeRidableInWater = false; - public double beeMaxY = 256D; -+ public int beeBreedingTicks = 6000; - private void beeSettings() { - beeRidable = getBoolean("mobs.bee.ridable", beeRidable); - beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); - beeMaxY = getDouble("mobs.bee.ridable-max-y", beeMaxY); -+ beeBreedingTicks = getInt("mobs.bee.breeding-delay-ticks", beeBreedingTicks); - } - - public boolean blazeRidable = false; -@@ -512,12 +514,14 @@ public class PurpurWorldConfig { - public int catSpawnDelay = 1200; - public int catSpawnSwampHutScanRange = 16; - public int catSpawnVillageScanRange = 48; -+ public int catBreedingTicks = 6000; - private void catSettings() { - catRidable = getBoolean("mobs.cat.ridable", catRidable); - catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); - catSpawnDelay = getInt("mobs.cat.spawn-delay", catSpawnDelay); - catSpawnSwampHutScanRange = getInt("mobs.cat.scan-range-for-other-cats.swamp-hut", catSpawnSwampHutScanRange); - catSpawnVillageScanRange = getInt("mobs.cat.scan-range-for-other-cats.village", catSpawnVillageScanRange); -+ catBreedingTicks = getInt("mobs.cat.breeding-delay-ticks", catBreedingTicks); - } - - public boolean caveSpiderRidable = false; -@@ -530,10 +534,12 @@ public class PurpurWorldConfig { - public boolean chickenRidable = false; - public boolean chickenRidableInWater = false; - public boolean chickenRetaliate = false; -+ public int chickenBreedingTicks = 6000; - private void chickenSettings() { - chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); - chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); - chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); -+ chickenBreedingTicks = getInt("mobs.chicken.breeding-delay-ticks", chickenBreedingTicks); - } - - public boolean codRidable = false; -@@ -544,10 +550,12 @@ public class PurpurWorldConfig { - public boolean cowRidable = false; - public boolean cowRidableInWater = false; - public int cowFeedMushrooms = 0; -+ public int cowBreedingTicks = 6000; - private void cowSettings() { - cowRidable = getBoolean("mobs.cow.ridable", cowRidable); - cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); - cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms); -+ cowBreedingTicks = getInt("mobs.cow.breeding-delay-ticks", cowBreedingTicks); - } - - public boolean creeperRidable = false; -@@ -575,8 +583,10 @@ public class PurpurWorldConfig { - } - - public boolean donkeyRidableInWater = false; -+ public int donkeyBreedingTicks = 6000; - private void donkeySettings() { - donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); -+ donkeyBreedingTicks = getInt("mobs.donkey.breeding-delay-ticks", donkeyBreedingTicks); - } - - public boolean drownedRidable = false; -@@ -634,10 +644,12 @@ public class PurpurWorldConfig { - public boolean foxRidable = false; - public boolean foxRidableInWater = false; - public boolean foxTypeChangesWithTulips = false; -+ public int foxBreedingTicks = 6000; - private void foxSettings() { - foxRidable = getBoolean("mobs.fox.ridable", foxRidable); - foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); - foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); -+ foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); - } - - public boolean ghastRidable = false; -@@ -682,14 +694,18 @@ public class PurpurWorldConfig { - - public boolean hoglinRidable = false; - public boolean hoglinRidableInWater = false; -+ public int hoglinBreedingTicks = 6000; - private void hoglinSettings() { - hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); - hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); -+ hoglinBreedingTicks = getInt("mobs.hoglin.breeding-delay-ticks", hoglinBreedingTicks); - } - - public boolean horseRidableInWater = false; -+ public int horseBreedingTicks = 6000; - private void horseSettings() { - horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); -+ horseBreedingTicks = getInt("mobs.horse.breeding-delay-ticks", horseBreedingTicks); - } - - public boolean huskRidable = false; -@@ -734,9 +750,11 @@ public class PurpurWorldConfig { - - public boolean llamaRidable = false; - public boolean llamaRidableInWater = false; -+ public int llamaBreedingTicks = 6000; - private void llamaSettings() { - llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); - llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); -+ llamaBreedingTicks = getInt("mobs.llama.breeding-delay-ticks", llamaBreedingTicks); - } - - public boolean llamaTraderRidable = false; -@@ -755,28 +773,36 @@ public class PurpurWorldConfig { - - public boolean mooshroomRidable = false; - public boolean mooshroomRidableInWater = false; -+ public int mooshroomBreedingTicks = 6000; - private void mooshroomSettings() { - mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); - mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); -+ mooshroomBreedingTicks = getInt("mobs.mooshroom.breeding-delay-ticks", mooshroomBreedingTicks); - } - - public boolean muleRidableInWater = false; -+ public int muleBreedingTicks = 6000; - private void muleSettings() { - muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); -+ muleBreedingTicks = getInt("mobs.mule.breeding-delay-ticks", muleBreedingTicks); - } - - public boolean ocelotRidable = false; - public boolean ocelotRidableInWater = false; -+ public int ocelotBreedingTicks = 6000; - private void ocelotSettings() { - ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); - ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); -+ ocelotBreedingTicks = getInt("mobs.ocelot.breeding-delay-ticks", ocelotBreedingTicks); - } - - public boolean pandaRidable = false; - public boolean pandaRidableInWater = false; -+ public int pandaBreedingTicks = 6000; - private void pandaSettings() { - pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); - pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); -+ pandaBreedingTicks = getInt("mobs.panda.breeding-delay-ticks", pandaBreedingTicks); - } - - public boolean parrotRidable = false; -@@ -842,10 +868,12 @@ public class PurpurWorldConfig { - public boolean pigRidable = false; - public boolean pigRidableInWater = false; - public boolean pigGiveSaddleBack = false; -+ public int pigBreedingTicks = 6000; - private void pigSettings() { - pigRidable = getBoolean("mobs.pig.ridable", pigRidable); - pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); - pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); -+ pigBreedingTicks = getInt("mobs.pig.breeding-delay-ticks", pigBreedingTicks); - } - - public boolean piglinRidable = false; -@@ -873,12 +901,14 @@ public class PurpurWorldConfig { - public boolean polarBearRidableInWater = false; - public String polarBearBreedableItemString = ""; - public Item polarBearBreedableItem = null; -+ public int polarBearBreedingTicks = 6000; - private void polarBearSettings() { - polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); - polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); - polarBearBreedableItemString = getString("mobs.polar_bear.breedable-item", polarBearBreedableItemString); - Item item = IRegistry.ITEM.get(new MinecraftKey(polarBearBreedableItemString)); - if (item != Items.AIR) polarBearBreedableItem = item; -+ polarBearBreedingTicks = getInt("mobs.polar_bear.breeding-delay-ticks", polarBearBreedingTicks); - } - - public boolean pufferfishRidable = false; -@@ -890,11 +920,13 @@ public class PurpurWorldConfig { - public boolean rabbitRidableInWater = false; - public double rabbitNaturalToast = 0.0D; - public double rabbitNaturalKiller = 0.0D; -+ public int rabbitBreedingTicks = 6000; - private void rabbitSettings() { - rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); - rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); - rabbitNaturalToast = getDouble("mobs.rabbit.spawn-toast-chance", rabbitNaturalToast); - rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); -+ rabbitBreedingTicks = getInt("mobs.rabbit.breeding-delay-ticks", rabbitBreedingTicks); - } - - public boolean ravagerRidable = false; -@@ -911,9 +943,11 @@ public class PurpurWorldConfig { - - public boolean sheepRidable = false; - public boolean sheepRidableInWater = false; -+ public int sheepBreedingTicks = 6000; - private void sheepSettings() { - sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); - sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); -+ sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); - } - - public boolean shulkerRidable = false; -@@ -991,9 +1025,11 @@ public class PurpurWorldConfig { - - public boolean striderRidable = false; - public boolean striderRidableInWater = false; -+ public int striderBreedingTicks = 6000; - private void striderSettings() { - striderRidable = getBoolean("mobs.strider.ridable", striderRidable); - striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); -+ striderBreedingTicks = getInt("mobs.strider.breeding-delay-ticks", striderBreedingTicks); - } - - public boolean tropicalFishRidable = false; -@@ -1003,9 +1039,11 @@ public class PurpurWorldConfig { - - public boolean turtleRidable = false; - public boolean turtleRidableInWater = false; -+ public int turtleBreedingTicks = 6000; - private void turtleSettings() { - turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); - turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); -+ turtleBreedingTicks = getInt("mobs.turtle.breeding-delay-ticks", turtleBreedingTicks); - } - - public boolean vexRidable = false; -@@ -1027,6 +1065,7 @@ public class PurpurWorldConfig { - public int villagerSpawnIronGolemRadius = 0; - public int villagerSpawnIronGolemLimit = 0; - public boolean villagerCanBreed = true; -+ public int villagerBreedingTicks = 6000; - private void villagerSettings() { - villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); - villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1038,6 +1077,7 @@ public class PurpurWorldConfig { - villagerSpawnIronGolemRadius = getInt("mobs.villager.spawn-iron-golem.radius", villagerSpawnIronGolemRadius); - villagerSpawnIronGolemLimit = getInt("mobs.villager.spawn-iron-golem.limit", villagerSpawnIronGolemLimit); - villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed); -+ villagerBreedingTicks = getInt("mobs.villager.breeding-delay-ticks", villagerBreedingTicks); - } - - public boolean villagerTraderRidable = false; -@@ -1098,9 +1138,11 @@ public class PurpurWorldConfig { - - public boolean wolfRidable = false; - public boolean wolfRidableInWater = false; -+ public int wolfBreedingTicks = 6000; - private void wolfSettings() { - wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); - wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); -+ wolfBreedingTicks = getInt("mobs.wolf.breeding-delay-ticks", wolfBreedingTicks); - } - - public boolean zoglinRidable = false; diff --git a/patches/server/0119-Add-adjustable-breeding-cooldown-to-config.patch b/patches/server/0119-Add-adjustable-breeding-cooldown-to-config.patch new file mode 100644 index 000000000..3985f7c5a --- /dev/null +++ b/patches/server/0119-Add-adjustable-breeding-cooldown-to-config.patch @@ -0,0 +1,128 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: BillyGalbreath +Date: Sat, 19 Jun 2021 12:54:11 -0500 +Subject: [PATCH] Add adjustable breeding cooldown to config + + +diff --git a/src/main/java/net/minecraft/world/entity/animal/Animal.java b/src/main/java/net/minecraft/world/entity/animal/Animal.java +index 5a503a255b4e7e684a8f42d8190430397ca81683..7a90c6a628571730eee382e1efcfe1b90a5ecfc5 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Animal.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Animal.java +@@ -145,7 +145,7 @@ public abstract class Animal extends AgeableMob { + if (this.isFood(itemstack)) { + int i = this.getAge(); + +- if (!this.level.isClientSide && i == 0 && this.canFallInLove()) { ++ if (!this.level.isClientSide && i == 0 && this.canFallInLove() && (this.level.purpurConfig.animalBreedingCooldownSeconds <= 0 || !this.level.hasBreedingCooldown(player.getUUID(), this.getClass()))) { // Purpur + this.usePlayerItem(player, hand, itemstack); + this.setInLove(player); + this.gameEvent(GameEvent.MOB_INTERACT, this.eyeBlockPosition()); +@@ -239,6 +239,14 @@ public abstract class Animal extends AgeableMob { + if (entityplayer == null && other.getLoveCause() != null) { + entityplayer = other.getLoveCause(); + } ++ // Purpur start ++ if (entityplayer != null && world.purpurConfig.animalBreedingCooldownSeconds > 0) { ++ if (world.hasBreedingCooldown(entityplayer.getUUID(), this.getClass())) { ++ return; ++ } ++ world.addBreedingCooldown(entityplayer.getUUID(), this.getClass()); ++ } ++ // Purpur end + // CraftBukkit start - call EntityBreedEvent + entityageable.setBaby(true); + entityageable.moveTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F); +diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java +index 917a671894e16e024db941cea1845e39eaf93ef8..b17f250eec710c91a1d5995136d7dec26ddd8f1c 100644 +--- a/src/main/java/net/minecraft/world/level/Level.java ++++ b/src/main/java/net/minecraft/world/level/Level.java +@@ -185,6 +185,49 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + } + // Paper end - fix and optimise world upgrading + ++ // Purpur start ++ private com.google.common.cache.Cache playerBreedingCooldowns; ++ ++ private com.google.common.cache.Cache getNewBreedingCooldownCache() { ++ return com.google.common.cache.CacheBuilder.newBuilder().expireAfterWrite(this.purpurConfig.animalBreedingCooldownSeconds, java.util.concurrent.TimeUnit.SECONDS).build(); ++ } ++ ++ public void resetBreedingCooldowns() { ++ this.playerBreedingCooldowns = this.getNewBreedingCooldownCache(); ++ } ++ ++ public boolean hasBreedingCooldown(java.util.UUID player, Class animalType) { // Purpur ++ return this.playerBreedingCooldowns.getIfPresent(new BreedingCooldownPair(player, animalType)) != null; ++ } ++ ++ public void addBreedingCooldown(java.util.UUID player, Class animalType) { ++ this.playerBreedingCooldowns.put(new BreedingCooldownPair(player, animalType), new Object()); ++ } ++ ++ private static final class BreedingCooldownPair { ++ private final java.util.UUID playerUUID; ++ private final Class animalType; ++ ++ public BreedingCooldownPair(java.util.UUID playerUUID, Class animalType) { ++ this.playerUUID = playerUUID; ++ this.animalType = animalType; ++ } ++ ++ @Override ++ public boolean equals(Object o) { ++ if (this == o) return true; ++ if (o == null || getClass() != o.getClass()) return false; ++ BreedingCooldownPair that = (BreedingCooldownPair) o; ++ return playerUUID.equals(that.playerUUID) && animalType.equals(that.animalType); ++ } ++ ++ @Override ++ public int hashCode() { ++ return java.util.Objects.hash(playerUUID, animalType); ++ } ++ } ++ // Purpur end ++ + public CraftWorld getWorld() { + return this.world; + } +@@ -201,6 +244,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot + this.paperConfig = new com.destroystokyo.paper.PaperWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName(), this.spigotConfig); // Paper + this.purpurConfig = new net.pl3x.purpur.PurpurWorldConfig((((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()), env); // Purpur ++ this.playerBreedingCooldowns = this.getNewBreedingCooldownCache(); // Purpur + this.generator = gen; + this.world = new CraftWorld((ServerLevel) this, gen, env); + this.ticksPerAnimalSpawns = this.getCraftServer().getTicksPerAnimalSpawns(); // CraftBukkit +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index 0fad44563547eb3643019a42d1d38a371df0613d..788884481c4df2e25843245b484682371e5267fe 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -129,6 +129,7 @@ public class PurpurWorldConfig { + public double voidDamageHeight = -64.0D; + public double voidDamageDealt = 4.0D; + public int raidCooldownSeconds = 0; ++ public int animalBreedingCooldownSeconds = 0; + private void miscGameplayMechanicsSettings() { + useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending); + boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand); +@@ -141,6 +142,7 @@ public class PurpurWorldConfig { + voidDamageHeight = getDouble("gameplay-mechanics.void-damage-height", voidDamageHeight); + voidDamageDealt = getDouble("gameplay-mechanics.void-damage-dealt", voidDamageDealt); + raidCooldownSeconds = getInt("gameplay-mechanics.raid-cooldown-seconds", raidCooldownSeconds); ++ animalBreedingCooldownSeconds = getInt("gameplay-mechanics.animal-breeding-cooldown-seconds", animalBreedingCooldownSeconds); + } + + public boolean catSpawning; +diff --git a/src/main/java/net/pl3x/purpur/command/PurpurCommand.java b/src/main/java/net/pl3x/purpur/command/PurpurCommand.java +index 6e7f56fe2b78d7a09d5d130f2c88338fb8ae628e..cd63e9e556fa4931ab33c63931cf916757c51a62 100644 +--- a/src/main/java/net/pl3x/purpur/command/PurpurCommand.java ++++ b/src/main/java/net/pl3x/purpur/command/PurpurCommand.java +@@ -49,6 +49,7 @@ public class PurpurCommand extends Command { + PurpurConfig.init((File) console.options.valueOf("purpur-settings")); + for (ServerLevel level : console.getAllLevels()) { + level.purpurConfig.init(); ++ level.resetBreedingCooldowns(); + } + console.server.reloadCount++; + diff --git a/patches/server/0120-Make-entity-breeding-times-configurable.patch b/patches/server/0120-Make-entity-breeding-times-configurable.patch new file mode 100644 index 000000000..a947dd701 --- /dev/null +++ b/patches/server/0120-Make-entity-breeding-times-configurable.patch @@ -0,0 +1,852 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: BillyGalbreath +Date: Sat, 19 Jun 2021 13:20:26 -0500 +Subject: [PATCH] Make entity breeding times configurable + + +diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java b/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java +index 8419ce671cff4b59e44376f9d874a6bdb53b3b13..dfbceb36813c9fd55bc481779bea0ce9084b544b 100644 +--- a/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java ++++ b/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java +@@ -121,6 +121,10 @@ public class VillagerMakeLove extends Behavior { + // CraftBukkit end + parent.setAge(6000); + partner.setAge(6000); ++ // Purpur start ++ parent.setAge(world.purpurConfig.villagerBreedingTicks); ++ partner.setAge(world.purpurConfig.villagerBreedingTicks); ++ // Purpur end + world.addAllEntities(entityvillager2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason + world.broadcastEntityEvent(entityvillager2, (byte) 12); + return Optional.of(entityvillager2); +diff --git a/src/main/java/net/minecraft/world/entity/animal/Animal.java b/src/main/java/net/minecraft/world/entity/animal/Animal.java +index 7a90c6a628571730eee382e1efcfe1b90a5ecfc5..2caf41f458f38729902e040d65f56c786c954950 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Animal.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Animal.java +@@ -38,6 +38,7 @@ public abstract class Animal extends AgeableMob { + public int inLove; + public UUID loveCause; + public ItemStack breedItem; // CraftBukkit - Add breedItem variable ++ public abstract int getPurpurBreedTime(); // Purpur + + protected Animal(EntityType type, Level world) { + super(type, world); +@@ -263,8 +264,10 @@ public abstract class Animal extends AgeableMob { + CriteriaTriggers.BRED_ANIMALS.trigger(entityplayer, this, other, entityageable); + } + +- this.setAge(6000); +- other.setAge(6000); ++ // Purpur start ++ this.setAge(this.getPurpurBreedTime()); ++ other.setAge(other.getPurpurBreedTime()); ++ // Purpur end + this.resetLove(); + other.resetLove(); + world.addAllEntities(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason +diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java +index 56f55c4520bec4b4baaa606e47ecf6c0288a104f..f9262c1fca1a1318fb5f6f607e8e71c1019c5c95 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Bee.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java +@@ -214,6 +214,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.beeMaxHealth); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.beeBreedingTicks; ++ } + // Purpur end + + @Override +diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java +index 1cbbc29ef19c8f1b8f96882213b662cfcb193033..052d1e51a891ee17bed0043f6f3fd162c15b16b2 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Cat.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java +@@ -144,6 +144,11 @@ public class Cat extends TamableAnimal { + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.catMaxHealth); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.catBreedingTicks; ++ } + // Purpur end + + public ResourceLocation getResourceLocation() { +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 eaec6eba96db3b8ce046208a4a1e5fc4b26b7dcc..a907520c2cd9eacf2fe80d87004afc5f30b6a630 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java +@@ -70,6 +70,11 @@ public class Chicken extends Animal { + this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(2.0D); + } + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.chickenBreedingTicks; ++ } + // Purpur end + + @Override +diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java +index 9da76357da891a70e20ad80f50873b3b487dc84c..c718697a9511ccf761467644967397b777446db9 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Cow.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java +@@ -57,6 +57,11 @@ public class Cow extends Animal { + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.cowMaxHealth); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.cowBreedingTicks; ++ } + // Purpur end + + @Override +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 d31b906c87e22f505bee22f21dd8ec1e047f6ffe..504ea27df8ce010728d73349a8daf66310968f38 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Fox.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java +@@ -176,6 +176,11 @@ public class Fox extends Animal { + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.foxMaxHealth); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.foxBreedingTicks; ++ } + // Purpur end + + @Override +@@ -955,8 +960,10 @@ public class Fox extends Animal { + CriteriaTriggers.BRED_ANIMALS.trigger(entityplayer2, this.animal, this.partner, (AgeableMob) entityfox); + } + +- this.animal.setAge(6000); +- this.partner.setAge(6000); ++ // Purpur start ++ this.animal.setAge(this.animal.getPurpurBreedTime()); ++ this.partner.setAge(this.partner.getPurpurBreedTime()); ++ // Purpur end + this.animal.resetLove(); + this.partner.resetLove(); + worldserver.addAllEntities(entityfox, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason +diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +index e7818390e6b8130312fc5a607fae1d1fc094a36a..3d3f333a4c77d0d6e82a54aac190772dd6b9bab4 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java ++++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +@@ -74,6 +74,11 @@ public class MushroomCow extends Cow implements Shearable { + public void initAttributes() { + this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.mooshroomMaxHealth); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.mooshroomBreedingTicks; ++ } + // Purpur end + + @Override +diff --git a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java +index 4e979a8012b8b001c6a35c477c01d7da67583220..4e6e63ec2c5a9b86528f1a620ff7f0be90a7b3dc 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java +@@ -83,6 +83,11 @@ public class Ocelot extends Animal { + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.ocelotMaxHealth); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.ocelotBreedingTicks; ++ } + // Purpur end + + boolean isTrusting() { +diff --git a/src/main/java/net/minecraft/world/entity/animal/Panda.java b/src/main/java/net/minecraft/world/entity/animal/Panda.java +index 13ef0071b98ad2b7654914b62711a661f14b2c42..e9859935a5f18d2c51020ce5772ecf7264787773 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Panda.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Panda.java +@@ -133,6 +133,11 @@ public class Panda extends Animal { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.pandaMaxHealth); + setAttributes(); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.pandaBreedingTicks; ++ } + // Purpur end + + @Override +diff --git a/src/main/java/net/minecraft/world/entity/animal/Parrot.java b/src/main/java/net/minecraft/world/entity/animal/Parrot.java +index 1e38578a9a1531433866e2de7aa0ce5237da3b6b..2cc91c255e0f77b214b8ec54429c11bb1d6fe8e0 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java +@@ -181,6 +181,11 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.parrotMaxHealth); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return 6000; ++ } + // Purpur end + + @Nullable +diff --git a/src/main/java/net/minecraft/world/entity/animal/Pig.java b/src/main/java/net/minecraft/world/entity/animal/Pig.java +index 518d28dc0b5b8c04263c93a4347e4c971a1318d8..98cf2268304f3a092dba45bb4297d14fe81cc057 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Pig.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Pig.java +@@ -80,6 +80,11 @@ public class Pig extends Animal implements ItemSteerable, Saddleable { + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.pigMaxHealth); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.pigBreedingTicks; ++ } + // Purpur end + + @Override +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 d39c88af3882a09ff1a06f9052d7b9b8afdddda4..45934499067bb323413e73c99fe01bb223df7990 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/PolarBear.java ++++ b/src/main/java/net/minecraft/world/entity/animal/PolarBear.java +@@ -114,6 +114,11 @@ public class PolarBear extends Animal implements NeutralMob { + return this.isInLove() && bear.isInLove(); + } + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.polarBearBreedingTicks; ++ } + // Purpur end + + @Override +diff --git a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +index e0ba1ef404c9f8ba1eae563b733d10d94b1442e4..8d15e7ec0ae4bcdfd5628f41c0fc236eaa85d548 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +@@ -133,6 +133,11 @@ public class Rabbit extends Animal { + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.rabbitMaxHealth); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.rabbitBreedingTicks; ++ } + // Purpur end + + // CraftBukkit start - code from constructor +diff --git a/src/main/java/net/minecraft/world/entity/animal/Sheep.java b/src/main/java/net/minecraft/world/entity/animal/Sheep.java +index 497be3182c72b5a0f3bc42088c4168702119b527..607823661ba942ec03b1f61dac5a786b6f72ff7b 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java +@@ -131,6 +131,11 @@ public class Sheep extends Animal implements Shearable { + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.sheepMaxHealth); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.sheepBreedingTicks; ++ } + // Purpur end + + @Override +diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java +index 31568adcf4a89b11e61f455a15326c7f72bf487e..c1202540383ef991d7b8c3767132c4fc54d4c570 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java +@@ -105,6 +105,11 @@ public class Turtle extends Animal { + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.turtleMaxHealth); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.turtleBreedingTicks; ++ } + // Purpur end + + public void setHomePos(BlockPos pos) { +diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java +index ae416b70109c959980b3115da6e97df1610996ca..ef4abaf68de01b0879f7d0b330d2d57cc6bd10f9 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java +@@ -113,6 +113,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.wolfMaxHealth); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.wolfBreedingTicks; ++ } + // Purpur end + + @Override +diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +index 15a0aeb1131618ea27620c5893a7448af624b6dd..a75d7da8278b5a0671d85708898731d9bd3344e2 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java ++++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +@@ -110,6 +110,11 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.axolotlMaxHealth); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.axolotlBreedingTicks; ++ } + // Purpur end + + @Override +diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +index 9092eac3e7e15845d14175cad8030f4ea60d43ad..93439e518b071cc19eeabe4c8db7676e5a31cfff 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java ++++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +@@ -85,6 +85,11 @@ public class Goat extends Animal { + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.goatMaxHealth); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.goatBreedingTicks; ++ } + // Purpur end + + @Override +diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java +index b4944ab2191241dc604ad21670360e5204bc111b..63378addd3de1a3e882f72bc6e1da74405bd79ed 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java ++++ b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java +@@ -35,6 +35,11 @@ public class Donkey extends AbstractChestedHorse { + public double generateRandomSpeed() { + return generateRandomSpeed(this.level.purpurConfig.donkeyMovementSpeedMin, this.level.purpurConfig.donkeyMovementSpeedMax); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.donkeyBreedingTicks; ++ } + // Purpur end + + @Override +diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java +index 6c6d2ac7551ae24dec88bd9e6bce7aeafd900e8c..b077b3d389e3439cf1115009a0edb4ed9f66bf02 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java ++++ b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java +@@ -59,6 +59,11 @@ public class Horse extends AbstractHorse { + public double generateRandomSpeed() { + return generateRandomSpeed(this.level.purpurConfig.horseMovementSpeedMin, this.level.purpurConfig.horseMovementSpeedMax); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.horseBreedingTicks; ++ } + // Purpur end + + @Override +diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +index 92069543fd8f19ee037af59edd84c61f5216463f..873e1d64b917e961c9d9b5217fe664a91d0ab5bc 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java ++++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +@@ -123,6 +123,11 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { + public double generateRandomSpeed() { + return generateRandomSpeed(this.level.purpurConfig.llamaMovementSpeedMin, this.level.purpurConfig.llamaMovementSpeedMax); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.llamaBreedingTicks; ++ } + // Purpur end + + public boolean isTraderLlama() { +diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Mule.java b/src/main/java/net/minecraft/world/entity/animal/horse/Mule.java +index da3d0b431c14f1a0794b9445236af1f548139013..6bdf1727ae241538dc391431a55e5b089431bd7b 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/horse/Mule.java ++++ b/src/main/java/net/minecraft/world/entity/animal/horse/Mule.java +@@ -34,6 +34,11 @@ public class Mule extends AbstractChestedHorse { + public double generateRandomSpeed() { + return generateRandomSpeed(this.level.purpurConfig.muleMovementSpeedMin, this.level.purpurConfig.muleMovementSpeedMax); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.muleBreedingTicks; ++ } + // Purpur end + + @Override +diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonHorse.java +index ffc36728e0fc90c4e37051adc643a2b8af8077ff..6d595941aa2dd36fda8bf7efea06b6d52c17647d 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonHorse.java ++++ b/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonHorse.java +@@ -49,6 +49,11 @@ public class SkeletonHorse extends AbstractHorse { + public double generateRandomSpeed() { + return generateRandomSpeed(this.level.purpurConfig.skeletonHorseMovementSpeedMin, this.level.purpurConfig.skeletonHorseMovementSpeedMax); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return 6000; ++ } + // Purpur end + + public static AttributeSupplier.Builder createAttributes() { +diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java b/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java +index c4eb99466c00c6cf1d60c7fa387f8b65efdac912..dbeed04103ee42bd16e7b785d7024214b6335679 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java ++++ b/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java +@@ -57,6 +57,11 @@ public class TraderLlama extends Llama { + public double generateRandomSpeed() { + return generateRandomSpeed(this.level.purpurConfig.traderLlamaMovementSpeedMin, this.level.purpurConfig.traderLlamaMovementSpeedMax); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.traderLlamaBreedingTicks; ++ } + // Purpur end + + @Override +diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/ZombieHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/ZombieHorse.java +index 6ca7b168a1ea26102922d9377e52662f16c1e725..74321ed51b25617bac25e3497ba908cd1751db09 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/horse/ZombieHorse.java ++++ b/src/main/java/net/minecraft/world/entity/animal/horse/ZombieHorse.java +@@ -47,6 +47,11 @@ public class ZombieHorse extends AbstractHorse { + public double generateRandomSpeed() { + return generateRandomSpeed(this.level.purpurConfig.zombieHorseMovementSpeedMin, this.level.purpurConfig.zombieHorseMovementSpeedMax); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return 6000; ++ } + // Purpur end + + public static AttributeSupplier.Builder createAttributes() { +diff --git a/src/main/java/net/minecraft/world/entity/monster/Strider.java b/src/main/java/net/minecraft/world/entity/monster/Strider.java +index 6b9316536e09c52be2cd1e9cdc71529f4ddb69c6..294f276fa8d2d754abde11ebc3d39e5e68996b05 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/Strider.java ++++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java +@@ -112,6 +112,11 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.striderMaxHealth); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.striderBreedingTicks; ++ } + // Purpur end + + public static boolean checkStriderSpawnRules(EntityType type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { +diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +index 5d289be8f0ef003abbce992e7662f6ddce4f4a99..5e3d7321a73144c3e4c43c18c5b748b2d0139db8 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java ++++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +@@ -82,6 +82,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.hoglinMaxHealth); + } ++ ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level.purpurConfig.hoglinBreedingTicks; ++ } + // Purpur end + + @Override +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index 788884481c4df2e25843245b484682371e5267fe..ff2be552313fe5543228838245dcfa24cdcad342 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -464,9 +464,11 @@ public class PurpurWorldConfig { + + public boolean axolotlRidable = false; + public double axolotlMaxHealth = 14.0D; ++ public int axolotlBreedingTicks = 6000; + private void axolotlSettings() { + axolotlRidable = getBoolean("mobs.axolotl.ridable", axolotlRidable); + axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); ++ axolotlBreedingTicks = getInt("mobs.axolotl.breeding-delay-ticks", axolotlBreedingTicks); + } + + public boolean batRidable = false; +@@ -496,6 +498,7 @@ public class PurpurWorldConfig { + public boolean beeRidableInWater = false; + public double beeMaxY = 256D; + public double beeMaxHealth = 10.0D; ++ public int beeBreedingTicks = 6000; + private void beeSettings() { + beeRidable = getBoolean("mobs.bee.ridable", beeRidable); + beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); +@@ -506,6 +509,7 @@ public class PurpurWorldConfig { + set("mobs.bee.attributes.max_health", oldValue); + } + beeMaxHealth = getDouble("mobs.bee.attributes.max_health", beeMaxHealth); ++ beeBreedingTicks = getInt("mobs.bee.breeding-delay-ticks", beeBreedingTicks); + } + + public boolean blazeRidable = false; +@@ -530,6 +534,7 @@ public class PurpurWorldConfig { + public int catSpawnDelay = 1200; + public int catSpawnSwampHutScanRange = 16; + public int catSpawnVillageScanRange = 48; ++ public int catBreedingTicks = 6000; + private void catSettings() { + catRidable = getBoolean("mobs.cat.ridable", catRidable); + catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); +@@ -542,6 +547,7 @@ public class PurpurWorldConfig { + catSpawnDelay = getInt("mobs.cat.spawn-delay", catSpawnDelay); + catSpawnSwampHutScanRange = getInt("mobs.cat.scan-range-for-other-cats.swamp-hut", catSpawnSwampHutScanRange); + catSpawnVillageScanRange = getInt("mobs.cat.scan-range-for-other-cats.village", catSpawnVillageScanRange); ++ catBreedingTicks = getInt("mobs.cat.breeding-delay-ticks", catBreedingTicks); + } + + public boolean caveSpiderRidable = false; +@@ -562,6 +568,7 @@ public class PurpurWorldConfig { + public boolean chickenRidableInWater = false; + public double chickenMaxHealth = 4.0D; + public boolean chickenRetaliate = false; ++ public int chickenBreedingTicks = 6000; + private void chickenSettings() { + chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); + chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); +@@ -572,6 +579,7 @@ public class PurpurWorldConfig { + } + chickenMaxHealth = getDouble("mobs.chicken.attributes.max_health", chickenMaxHealth); + chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); ++ chickenBreedingTicks = getInt("mobs.chicken.breeding-delay-ticks", chickenBreedingTicks); + } + + public boolean codRidable = false; +@@ -590,6 +598,7 @@ public class PurpurWorldConfig { + public boolean cowRidableInWater = false; + public double cowMaxHealth = 10.0D; + public int cowFeedMushrooms = 0; ++ public int cowBreedingTicks = 6000; + private void cowSettings() { + cowRidable = getBoolean("mobs.cow.ridable", cowRidable); + cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); +@@ -600,6 +609,7 @@ public class PurpurWorldConfig { + } + cowMaxHealth = getDouble("mobs.cow.attributes.max_health", cowMaxHealth); + cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms); ++ cowBreedingTicks = getInt("mobs.cow.breeding-delay-ticks", cowBreedingTicks); + } + + public boolean creeperRidable = false; +@@ -647,6 +657,7 @@ public class PurpurWorldConfig { + public double donkeyJumpStrengthMax = 0.5D; + public double donkeyMovementSpeedMin = 0.175D; + public double donkeyMovementSpeedMax = 0.175D; ++ public int donkeyBreedingTicks = 6000; + private void donkeySettings() { + donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); + if (PurpurConfig.version < 10) { +@@ -662,6 +673,7 @@ public class PurpurWorldConfig { + donkeyJumpStrengthMax = getDouble("mobs.donkey.attributes.jump_strength.max", donkeyJumpStrengthMax); + donkeyMovementSpeedMin = getDouble("mobs.donkey.attributes.movement_speed.min", donkeyMovementSpeedMin); + donkeyMovementSpeedMax = getDouble("mobs.donkey.attributes.movement_speed.max", donkeyMovementSpeedMax); ++ donkeyBreedingTicks = getInt("mobs.donkey.breeding-delay-ticks", donkeyBreedingTicks); + } + + public boolean drownedRidable = false; +@@ -768,6 +780,7 @@ public class PurpurWorldConfig { + public boolean foxRidableInWater = false; + public double foxMaxHealth = 10.0D; + public boolean foxTypeChangesWithTulips = false; ++ public int foxBreedingTicks = 6000; + private void foxSettings() { + foxRidable = getBoolean("mobs.fox.ridable", foxRidable); + foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); +@@ -778,6 +791,7 @@ public class PurpurWorldConfig { + } + foxMaxHealth = getDouble("mobs.fox.attributes.max_health", foxMaxHealth); + foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); ++ foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); + } + + public boolean ghastRidable = false; +@@ -836,10 +850,12 @@ public class PurpurWorldConfig { + public boolean goatRidable = false; + public boolean goatRidableInWater = false; + public double goatMaxHealth = 10.0D; ++ public int goatBreedingTicks = 6000; + private void goatSettings() { + goatRidable = getBoolean("mobs.goat.ridable", goatRidable); + goatRidableInWater = getBoolean("mobs.goat.ridable-in-water", goatRidableInWater); + goatMaxHealth = getDouble("mobs.goat.attributes.max_health", goatMaxHealth); ++ goatBreedingTicks = getInt("mobs.goat.breeding-delay-ticks", goatBreedingTicks); + } + + public boolean guardianRidable = false; +@@ -857,6 +873,7 @@ public class PurpurWorldConfig { + public boolean hoglinRidable = false; + public boolean hoglinRidableInWater = false; + public double hoglinMaxHealth = 40.0D; ++ public int hoglinBreedingTicks = 6000; + private void hoglinSettings() { + hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); + hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); +@@ -866,6 +883,7 @@ public class PurpurWorldConfig { + set("mobs.hoglin.attributes.max_health", oldValue); + } + hoglinMaxHealth = getDouble("mobs.hoglin.attributes.max_health", hoglinMaxHealth); ++ hoglinBreedingTicks = getInt("mobs.hoglin.breeding-delay-ticks", hoglinBreedingTicks); + } + + public boolean horseRidableInWater = false; +@@ -875,6 +893,7 @@ public class PurpurWorldConfig { + public double horseJumpStrengthMax = 1.0D; + public double horseMovementSpeedMin = 0.1125D; + public double horseMovementSpeedMax = 0.3375D; ++ public int horseBreedingTicks = 6000; + private void horseSettings() { + horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); + if (PurpurConfig.version < 10) { +@@ -890,6 +909,7 @@ public class PurpurWorldConfig { + horseJumpStrengthMax = getDouble("mobs.horse.attributes.jump_strength.max", horseJumpStrengthMax); + horseMovementSpeedMin = getDouble("mobs.horse.attributes.movement_speed.min", horseMovementSpeedMin); + horseMovementSpeedMax = getDouble("mobs.horse.attributes.movement_speed.max", horseMovementSpeedMax); ++ horseBreedingTicks = getInt("mobs.horse.breeding-delay-ticks", horseBreedingTicks); + } + + public boolean huskRidable = false; +@@ -960,6 +980,7 @@ public class PurpurWorldConfig { + public double llamaJumpStrengthMax = 0.5D; + public double llamaMovementSpeedMin = 0.175D; + public double llamaMovementSpeedMax = 0.175D; ++ public int llamaBreedingTicks = 6000; + private void llamaSettings() { + llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); + llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); +@@ -976,6 +997,7 @@ public class PurpurWorldConfig { + llamaJumpStrengthMax = getDouble("mobs.llama.attributes.jump_strength.max", llamaJumpStrengthMax); + llamaMovementSpeedMin = getDouble("mobs.llama.attributes.movement_speed.min", llamaMovementSpeedMin); + llamaMovementSpeedMax = getDouble("mobs.llama.attributes.movement_speed.max", llamaMovementSpeedMax); ++ llamaBreedingTicks = getInt("mobs.llama.breeding-delay-ticks", llamaBreedingTicks); + } + + public boolean magmaCubeRidable = false; +@@ -995,6 +1017,7 @@ public class PurpurWorldConfig { + public boolean mooshroomRidable = false; + public boolean mooshroomRidableInWater = false; + public double mooshroomMaxHealth = 10.0D; ++ public int mooshroomBreedingTicks = 6000; + private void mooshroomSettings() { + mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); + mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); +@@ -1004,6 +1027,7 @@ public class PurpurWorldConfig { + set("mobs.mooshroom.attributes.max_health", oldValue); + } + mooshroomMaxHealth = getDouble("mobs.mooshroom.attributes.max_health", mooshroomMaxHealth); ++ mooshroomBreedingTicks = getInt("mobs.mooshroom.breeding-delay-ticks", mooshroomBreedingTicks); + } + + public boolean muleRidableInWater = false; +@@ -1013,6 +1037,7 @@ public class PurpurWorldConfig { + public double muleJumpStrengthMax = 0.5D; + public double muleMovementSpeedMin = 0.175D; + public double muleMovementSpeedMax = 0.175D; ++ public int muleBreedingTicks = 6000; + private void muleSettings() { + muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); + if (PurpurConfig.version < 10) { +@@ -1028,11 +1053,13 @@ public class PurpurWorldConfig { + muleJumpStrengthMax = getDouble("mobs.mule.attributes.jump_strength.max", muleJumpStrengthMax); + muleMovementSpeedMin = getDouble("mobs.mule.attributes.movement_speed.min", muleMovementSpeedMin); + muleMovementSpeedMax = getDouble("mobs.mule.attributes.movement_speed.max", muleMovementSpeedMax); ++ muleBreedingTicks = getInt("mobs.mule.breeding-delay-ticks", muleBreedingTicks); + } + + public boolean ocelotRidable = false; + public boolean ocelotRidableInWater = false; + public double ocelotMaxHealth = 10.0D; ++ public int ocelotBreedingTicks = 6000; + private void ocelotSettings() { + ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); + ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); +@@ -1042,11 +1069,13 @@ public class PurpurWorldConfig { + set("mobs.ocelot.attributes.max_health", oldValue); + } + ocelotMaxHealth = getDouble("mobs.ocelot.attributes.max_health", ocelotMaxHealth); ++ ocelotBreedingTicks = getInt("mobs.ocelot.breeding-delay-ticks", ocelotBreedingTicks); + } + + public boolean pandaRidable = false; + public boolean pandaRidableInWater = false; + public double pandaMaxHealth = 20.0D; ++ public int pandaBreedingTicks = 6000; + private void pandaSettings() { + pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); + pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); +@@ -1056,6 +1085,7 @@ public class PurpurWorldConfig { + set("mobs.panda.attributes.max_health", oldValue); + } + pandaMaxHealth = getDouble("mobs.panda.attributes.max_health", pandaMaxHealth); ++ pandaBreedingTicks = getInt("mobs.panda.breeding-delay-ticks", pandaBreedingTicks); + } + + public boolean parrotRidable = false; +@@ -1136,6 +1166,7 @@ public class PurpurWorldConfig { + public boolean pigRidableInWater = false; + public double pigMaxHealth = 10.0D; + public boolean pigGiveSaddleBack = false; ++ public int pigBreedingTicks = 6000; + private void pigSettings() { + pigRidable = getBoolean("mobs.pig.ridable", pigRidable); + pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); +@@ -1146,6 +1177,7 @@ public class PurpurWorldConfig { + } + pigMaxHealth = getDouble("mobs.pig.attributes.max_health", pigMaxHealth); + pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); ++ pigBreedingTicks = getInt("mobs.pig.breeding-delay-ticks", pigBreedingTicks); + } + + public boolean piglinRidable = false; +@@ -1195,6 +1227,7 @@ public class PurpurWorldConfig { + public double polarBearMaxHealth = 30.0D; + public String polarBearBreedableItemString = ""; + public Item polarBearBreedableItem = null; ++ public int polarBearBreedingTicks = 6000; + private void polarBearSettings() { + polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); + polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); +@@ -1207,6 +1240,7 @@ public class PurpurWorldConfig { + polarBearBreedableItemString = getString("mobs.polar_bear.breedable-item", polarBearBreedableItemString); + Item item = Registry.ITEM.get(new ResourceLocation(polarBearBreedableItemString)); + if (item != Items.AIR) polarBearBreedableItem = item; ++ polarBearBreedingTicks = getInt("mobs.polar_bear.breeding-delay-ticks", polarBearBreedingTicks); + } + + public boolean pufferfishRidable = false; +@@ -1226,6 +1260,7 @@ public class PurpurWorldConfig { + public double rabbitMaxHealth = 3.0D; + public double rabbitNaturalToast = 0.0D; + public double rabbitNaturalKiller = 0.0D; ++ public int rabbitBreedingTicks = 6000; + private void rabbitSettings() { + rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); + rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); +@@ -1237,6 +1272,7 @@ public class PurpurWorldConfig { + rabbitMaxHealth = getDouble("mobs.rabbit.attributes.max_health", rabbitMaxHealth); + rabbitNaturalToast = getDouble("mobs.rabbit.spawn-toast-chance", rabbitNaturalToast); + rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); ++ rabbitBreedingTicks = getInt("mobs.rabbit.breeding-delay-ticks", rabbitBreedingTicks); + } + + public boolean ravagerRidable = false; +@@ -1268,6 +1304,7 @@ public class PurpurWorldConfig { + public boolean sheepRidable = false; + public boolean sheepRidableInWater = false; + public double sheepMaxHealth = 8.0D; ++ public int sheepBreedingTicks = 6000; + private void sheepSettings() { + sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); + sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); +@@ -1277,6 +1314,7 @@ public class PurpurWorldConfig { + set("mobs.sheep.attributes.max_health", oldValue); + } + sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); ++ sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); + } + + public boolean shulkerRidable = false; +@@ -1431,6 +1469,7 @@ public class PurpurWorldConfig { + public boolean striderRidable = false; + public boolean striderRidableInWater = false; + public double striderMaxHealth = 20.0D; ++ public int striderBreedingTicks = 6000; + private void striderSettings() { + striderRidable = getBoolean("mobs.strider.ridable", striderRidable); + striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); +@@ -1440,6 +1479,7 @@ public class PurpurWorldConfig { + set("mobs.strider.attributes.max_health", oldValue); + } + striderMaxHealth = getDouble("mobs.strider.attributes.max_health", striderMaxHealth); ++ striderBreedingTicks = getInt("mobs.strider.breeding-delay-ticks", striderBreedingTicks); + } + + public boolean traderLlamaRidable = false; +@@ -1450,6 +1490,7 @@ public class PurpurWorldConfig { + public double traderLlamaJumpStrengthMax = 0.5D; + public double traderLlamaMovementSpeedMin = 0.175D; + public double traderLlamaMovementSpeedMax = 0.175D; ++ public int traderLlamaBreedingTicks = 6000; + private void traderLlamaSettings() { + traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); + traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); +@@ -1466,6 +1507,7 @@ public class PurpurWorldConfig { + traderLlamaJumpStrengthMax = getDouble("mobs.trader_llama.attributes.jump_strength.max", traderLlamaJumpStrengthMax); + traderLlamaMovementSpeedMin = getDouble("mobs.trader_llama.attributes.movement_speed.min", traderLlamaMovementSpeedMin); + traderLlamaMovementSpeedMax = getDouble("mobs.trader_llama.attributes.movement_speed.max", traderLlamaMovementSpeedMax); ++ traderLlamaBreedingTicks = getInt("mobs.trader_llama.breeding-delay-ticks", traderLlamaBreedingTicks); + } + + public boolean tropicalFishRidable = false; +@@ -1496,6 +1538,7 @@ public class PurpurWorldConfig { + public boolean turtleEggsBreakFromExpOrbs = true; + public boolean turtleEggsBreakFromItems = true; + public boolean turtleEggsBreakFromMinecarts = true; ++ public int turtleBreedingTicks = 6000; + private void turtleEggSettings() { + turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); + turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); +@@ -1508,6 +1551,7 @@ public class PurpurWorldConfig { + turtleEggsBreakFromExpOrbs = getBoolean("blocks.turtle_egg.break-from-exp-orbs", turtleEggsBreakFromExpOrbs); + turtleEggsBreakFromItems = getBoolean("blocks.turtle_egg.break-from-items", turtleEggsBreakFromItems); + turtleEggsBreakFromMinecarts = getBoolean("blocks.turtle_egg.break-from-minecarts", turtleEggsBreakFromMinecarts); ++ turtleBreedingTicks = getInt("mobs.turtle.breeding-delay-ticks", turtleBreedingTicks); + } + + public boolean vexRidable = false; +@@ -1537,6 +1581,7 @@ public class PurpurWorldConfig { + public int villagerSpawnIronGolemRadius = 0; + public int villagerSpawnIronGolemLimit = 0; + public boolean villagerCanBreed = true; ++ public int villagerBreedingTicks = 6000; + private void villagerSettings() { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); +@@ -1554,6 +1599,7 @@ public class PurpurWorldConfig { + villagerSpawnIronGolemRadius = getInt("mobs.villager.spawn-iron-golem.radius", villagerSpawnIronGolemRadius); + villagerSpawnIronGolemLimit = getInt("mobs.villager.spawn-iron-golem.limit", villagerSpawnIronGolemLimit); + villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed); ++ villagerBreedingTicks = getInt("mobs.villager.breeding-delay-ticks", villagerBreedingTicks); + } + + public boolean vindicatorRidable = false; +@@ -1647,6 +1693,7 @@ public class PurpurWorldConfig { + public boolean wolfRidable = false; + public boolean wolfRidableInWater = false; + public double wolfMaxHealth = 8.0D; ++ public int wolfBreedingTicks = 6000; + private void wolfSettings() { + wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); + wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); +@@ -1656,6 +1703,7 @@ public class PurpurWorldConfig { + set("mobs.wolf.attributes.max_health", oldValue); + } + wolfMaxHealth = getDouble("mobs.wolf.attributes.max_health", wolfMaxHealth); ++ wolfBreedingTicks = getInt("mobs.wolf.breeding-delay-ticks", wolfBreedingTicks); + } + + public boolean zoglinRidable = false;