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/Animal.java b/src/main/java/net/minecraft/world/entity/animal/Animal.java index 80598d4e679999138f6aca9f6f847e9509fa68da..e3a0a2914db92c95c894174e3815e3eca8d70826 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Animal.java +++ b/src/main/java/net/minecraft/world/entity/animal/Animal.java @@ -151,7 +151,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); return InteractionResult.SUCCESS; @@ -233,12 +233,20 @@ public abstract class Animal extends AgeableMob { AgeableMob entityageable = this.getBreedOffspring(world, other); if (entityageable != null) { - entityageable.setBaby(true); - entityageable.moveTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F); - // CraftBukkit start - call EntityBreedEvent + // Purpur start ServerPlayer breeder = Optional.ofNullable(this.getLoveCause()).or(() -> { return Optional.ofNullable(other.getLoveCause()); }).orElse(null); + if (breeder != null && world.purpurConfig.animalBreedingCooldownSeconds > 0) { + if (world.hasBreedingCooldown(breeder.getUUID(), this.getClass())) { + return; + } + world.addBreedingCooldown(breeder.getUUID(), this.getClass()); + } + entityageable.setBaby(true); + entityageable.moveTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F); + // CraftBukkit start - call EntityBreedEvent + // Purpur end int experience = this.getRandom().nextInt(7) + 1; org.bukkit.event.entity.EntityBreedEvent entityBreedEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(entityageable, this, other, breeder, this.breedItem, experience); if (entityBreedEvent.isCancelled()) { diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java index 8673d325bd866704ae90ac31eb54f78097eac952..10cff85dd4a59558dd487a3c5c7871a026835ceb 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -193,6 +193,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; } @@ -277,6 +320,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 = paperWorldConfigCreator.apply(this.spigotConfig); // Paper this.purpurConfig = new org.purpurmc.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, biomeProvider, env); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java index 78e2afcbe361e32a023a9a3b0708b9c1705138a4..39c8e6f7bf012e94c653c12383d2a7cf856e1123 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -117,6 +117,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); @@ -127,6 +128,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 int daytimeTicks = 12000; diff --git a/src/main/java/org/purpurmc/purpur/command/PurpurCommand.java b/src/main/java/org/purpurmc/purpur/command/PurpurCommand.java index 173b6bba1c8eb4c6c6ab55cad478db7c4c91fd75..e1e2a010bb741110aff43690e3aa6be84a5e1bb8 100644 --- a/src/main/java/org/purpurmc/purpur/command/PurpurCommand.java +++ b/src/main/java/org/purpurmc/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++;