From 1a04e96ab7095f9c0ea45d39b7448401c5ae5ee2 Mon Sep 17 00:00:00 2001 From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com> Date: Sat, 8 Feb 2025 20:59:13 +0100 Subject: [PATCH] Fix EntityBreedEvent cancellation (#12046) --- .../ai/behavior/VillagerMakeLove.java.patch | 2 +- .../world/entity/animal/Animal.java.patch | 26 ++++++++-------- .../world/entity/animal/Fox.java.patch | 31 +++++++++---------- .../craftbukkit/event/CraftEventFactory.java | 4 +-- 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/paper-server/patches/sources/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java.patch index 303c80235caf..592af079e2e2 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java.patch @@ -17,7 +17,7 @@ + parent.setAge(6000); + partner.setAge(6000); + level.addFreshEntityWithPassengers(breedOffspring, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); -+ // CraftBukkit end ++ // CraftBukkit end - call EntityBreedEvent level.broadcastEntityEvent(breedOffspring, (byte)12); return Optional.of(breedOffspring); } diff --git a/paper-server/patches/sources/net/minecraft/world/entity/animal/Animal.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/animal/Animal.java.patch index 47de924357f1..f837f2d731a0 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/animal/Animal.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/animal/Animal.java.patch @@ -63,7 +63,7 @@ this.level().broadcastEntityEvent(this, (byte)18); } -@@ -220,23 +_,45 @@ +@@ -220,23 +_,44 @@ if (breedOffspring != null) { breedOffspring.setBaby(true); breedOffspring.moveTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F); @@ -74,43 +74,43 @@ + int experience = this.getRandom().nextInt(7) + 1; + org.bukkit.event.entity.EntityBreedEvent entityBreedEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(breedOffspring, this, mate, breeder, this.breedItem, experience); + if (entityBreedEvent.isCancelled()) { ++ this.resetLove(); ++ mate.resetLove(); + return; + } + experience = entityBreedEvent.getExperience(); + this.finalizeSpawnChildFromBreeding(level, mate, breedOffspring, experience); + level.addFreshEntityWithPassengers(breedOffspring, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); -+ // CraftBukkit end ++ // CraftBukkit end - call EntityBreedEvent } } public void finalizeSpawnChildFromBreeding(ServerLevel level, Animal animal, @Nullable AgeableMob baby) { - Optional.ofNullable(this.getLoveCause()).or(() -> Optional.ofNullable(animal.getLoveCause())).ifPresent(player -> { -+ // CraftBukkit start ++ // CraftBukkit start - call EntityBreedEvent + this.finalizeSpawnChildFromBreeding(level, animal, baby, this.getRandom().nextInt(7) + 1); + } ++ + public void finalizeSpawnChildFromBreeding(ServerLevel level, Animal animal, @Nullable AgeableMob baby, int experience) { -+ // CraftBukkit end -+ // Paper start ++ // CraftBukkit end - call EntityBreedEvent ++ // Paper start - call EntityBreedEvent + ServerPlayer player = this.getLoveCause(); + if (player == null) player = animal.getLoveCause(); + if (player != null) { -+ // Paper end ++ // Paper end - call EntityBreedEvent player.awardStat(Stats.ANIMALS_BRED); CriteriaTriggers.BRED_ANIMALS.trigger(player, this, animal, baby); - }); -+ } // Paper ++ } // Paper - call EntityBreedEvent this.setAge(6000); animal.setAge(6000); this.resetLove(); animal.resetLove(); level.broadcastEntityEvent(this, (byte)18); - if (level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { +- if (level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { - level.addFreshEntity(new ExperienceOrb(level, this.getX(), this.getY(), this.getZ(), this.getRandom().nextInt(7) + 1)); -+ // CraftBukkit start - use event experience -+ if (experience > 0) { -+ level.addFreshEntity(new ExperienceOrb(level, this.getX(), this.getY(), this.getZ(), experience, org.bukkit.entity.ExperienceOrb.SpawnReason.BREED, player, baby)); // Paper -+ } -+ // CraftBukkit end ++ if (experience > 0 && level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { // Paper - call EntityBreedEvent ++ level.addFreshEntity(new ExperienceOrb(level, this.getX(), this.getY(), this.getZ(), experience, org.bukkit.entity.ExperienceOrb.SpawnReason.BREED, player, baby)); // Paper - call EntityBreedEvent, add spawn context } } diff --git a/paper-server/patches/sources/net/minecraft/world/entity/animal/Fox.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/animal/Fox.java.patch index aa6fdd965444..e2b7f5326c9f 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/animal/Fox.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/animal/Fox.java.patch @@ -93,7 +93,7 @@ } public static boolean isPathClear(Fox fox, LivingEntity livingEntity) { -@@ -853,6 +_,14 @@ +@@ -853,6 +_,18 @@ if (loveCause1 != null && loveCause != loveCause1) { fox.addTrustedUUID(loveCause1.getUUID()); } @@ -102,13 +102,17 @@ + fox.moveTo(this.animal.getX(), this.animal.getY(), this.animal.getZ(), 0.0F, 0.0F); + int experience = this.animal.getRandom().nextInt(7) + 1; + org.bukkit.event.entity.EntityBreedEvent entityBreedEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(fox, this.animal, this.partner, loveCause, this.animal.breedItem, experience); -+ if (entityBreedEvent.isCancelled()) return; ++ if (entityBreedEvent.isCancelled()) { ++ this.animal.resetLove(); ++ this.partner.resetLove(); ++ return; ++ } + experience = entityBreedEvent.getExperience(); -+ // CraftBukkit end ++ // CraftBukkit end - call EntityBreedEvent if (serverPlayer != null) { serverPlayer.awardStat(Stats.ANIMALS_BRED); -@@ -863,15 +_,17 @@ +@@ -863,14 +_,12 @@ this.partner.setAge(6000); this.animal.resetLove(); this.partner.resetLove(); @@ -117,22 +121,15 @@ - serverLevel.addFreshEntityWithPassengers(fox); + serverLevel.addFreshEntityWithPassengers(fox, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason this.level.broadcastEntityEvent(this.animal, (byte)18); - if (serverLevel.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { -- this.level -- .addFreshEntity( +- if (serverLevel.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { ++ if (experience > 0 && serverLevel.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { // Paper - call EntityBreedEvent + this.level + .addFreshEntity( - new ExperienceOrb(this.level, this.animal.getX(), this.animal.getY(), this.animal.getZ(), this.animal.getRandom().nextInt(7) + 1) -- ); -+ // CraftBukkit start - use event experience -+ if (experience > 0) { -+ this.level -+ .addFreshEntity( -+ new ExperienceOrb(this.level, this.animal.getX(), this.animal.getY(), this.animal.getZ(), experience, org.bukkit.entity.ExperienceOrb.SpawnReason.BREED, loveCause, fox) // Paper -+ ); -+ } -+ // CraftBukkit end ++ new ExperienceOrb(this.level, this.animal.getX(), this.animal.getY(), this.animal.getZ(), experience, org.bukkit.entity.ExperienceOrb.SpawnReason.BREED, loveCause, fox) // Paper - call EntityBreedEvent, add spawn context + ); } } - } @@ -934,6 +_,7 @@ private void pickSweetBerries(BlockState state) { int ageValue = state.getValue(SweetBerryBushBlock.AGE); diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index 85adadf7d039..fd4c1d67c134 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -1896,11 +1896,11 @@ public static VehicleCreateEvent callVehicleCreateEvent(Entity entity) { } public static EntityBreedEvent callEntityBreedEvent(net.minecraft.world.entity.LivingEntity child, net.minecraft.world.entity.LivingEntity mother, net.minecraft.world.entity.LivingEntity father, net.minecraft.world.entity.LivingEntity breeder, ItemStack bredWith, int experience) { - org.bukkit.entity.LivingEntity breederEntity = (LivingEntity) (breeder == null ? null : breeder.getBukkitEntity()); + LivingEntity breederEntity = breeder == null ? null : (LivingEntity) breeder.getBukkitEntity(); CraftItemStack bredWithStack = bredWith == null ? null : CraftItemStack.asCraftMirror(bredWith).clone(); EntityBreedEvent event = new EntityBreedEvent((LivingEntity) child.getBukkitEntity(), (LivingEntity) mother.getBukkitEntity(), (LivingEntity) father.getBukkitEntity(), breederEntity, bredWithStack, experience); - child.level().getCraftServer().getPluginManager().callEvent(event); + event.callEvent(); return event; }