From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com> Date: Fri, 24 Jun 2022 12:39:34 +0200 Subject: [PATCH] Add EntityFertilizeEggEvent 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 76ab82553488e129882fc9beb603636bb723ec42..d3c15d029d5f003cba3c89f7ea1f3ed4f943f2bd 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java @@ -441,6 +441,10 @@ public class Turtle extends Animal { if (entityplayer == null && this.partner.getLoveCause() != null) { entityplayer = this.partner.getLoveCause(); } + // Paper start - Add EntityFertilizeEggEvent event + io.papermc.paper.event.entity.EntityFertilizeEggEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityFertilizeEggEvent(this.animal, this.partner); + if (event.isCancelled()) return; + // Paper end - Add EntityFertilizeEggEvent event if (entityplayer != null) { entityplayer.awardStat(Stats.ANIMALS_BRED); @@ -455,7 +459,7 @@ public class Turtle extends Animal { RandomSource randomsource = this.animal.getRandom(); if (this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { - this.level.addFreshEntity(new ExperienceOrb(this.level, this.animal.getX(), this.animal.getY(), this.animal.getZ(), randomsource.nextInt(7) + 1, org.bukkit.entity.ExperienceOrb.SpawnReason.BREED, entityplayer)); // Paper; + if(event.getExperience() > 0) this.level.addFreshEntity(new ExperienceOrb(this.level, this.animal.getX(), this.animal.getY(), this.animal.getZ(), event.getExperience(), org.bukkit.entity.ExperienceOrb.SpawnReason.BREED, entityplayer)); // Paper - Add EntityFertilizeEggEvent event } } diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java index 22eb0a8fc35baa04b34265b62aa29a71f3cc7343..203691417e208b9e023e5f8c3b76993db2747ba8 100644 --- a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java +++ b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java @@ -242,7 +242,12 @@ public class Frog extends Animal implements VariantHolder { @Override public void spawnChildFromBreeding(ServerLevel world, Animal other) { - this.finalizeSpawnChildFromBreeding(world, other, (AgeableMob)null); + // Paper start - Add EntityFertilizeEggEvent event + final io.papermc.paper.event.entity.EntityFertilizeEggEvent result = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityFertilizeEggEvent(this, other); + if (result.isCancelled()) return; + + this.finalizeSpawnChildFromBreeding(world, other, (AgeableMob)null, result.getExperience()); // Paper - use craftbukkit call that takes experience amount + // Paper end - Add EntityFertilizeEggEvent event this.getBrain().setMemory(MemoryModuleType.IS_PREGNANT, Unit.INSTANCE); } diff --git a/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java b/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java index 3de0424a18e0a3b0cd2f755adfa859e474d5c643..94965855233509cbe48cebd690a83ef29cd0c27a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java +++ b/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java @@ -350,11 +350,16 @@ public class Sniffer extends Animal { @Override public void spawnChildFromBreeding(ServerLevel world, Animal other) { + // Paper start - Add EntityFertilizeEggEvent event + final io.papermc.paper.event.entity.EntityFertilizeEggEvent result = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityFertilizeEggEvent(this, other); + if (result.isCancelled()) return; + // Paper end - Add EntityFertilizeEggEvent event + ItemStack itemstack = new ItemStack(Items.SNIFFER_EGG); ItemEntity entityitem = new ItemEntity(world, this.position().x(), this.position().y(), this.position().z(), itemstack); entityitem.setDefaultPickUpDelay(); - this.finalizeSpawnChildFromBreeding(world, other, (AgeableMob) null); + this.finalizeSpawnChildFromBreeding(world, other, (AgeableMob) null, result.getExperience()); // Paper - Add EntityFertilizeEggEvent event if (this.spawnAtLocation(entityitem) != null) { // Paper - call EntityDropItemEvent this.playSound(SoundEvents.SNIFFER_EGG_PLOP, 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 0.5F); } // Paper diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index a4653a660e74f5d65489ddbb7b0e46134f2472c0..eb310003414000d76a150a7acbedc08e9b1d7180 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -2047,4 +2047,29 @@ public class CraftEventFactory { return event.callEvent(); } // Paper end + + // Paper start - add EntityFertilizeEggEvent + /** + * Calls the io.papermc.paper.event.entity.EntityFertilizeEggEvent. + * If the event is cancelled, this method also resets the love on both the {@code breeding} and {@code other} entity. + * + * @param breeding the entity on which #spawnChildFromBreeding was called. + * @param other the partner of the entity. + * @return the event after it was called. The instance may be used to retrieve the experience of the event. + */ + public static io.papermc.paper.event.entity.EntityFertilizeEggEvent callEntityFertilizeEggEvent(net.minecraft.world.entity.animal.Animal breeding, + net.minecraft.world.entity.animal.Animal other) { + net.minecraft.server.level.ServerPlayer serverPlayer = breeding.getLoveCause(); + if (serverPlayer == null) serverPlayer = other.getLoveCause(); + final int experience = breeding.getRandom().nextInt(7) + 1; // From Animal#spawnChildFromBreeding(ServerLevel, Animal) + + final io.papermc.paper.event.entity.EntityFertilizeEggEvent event = new io.papermc.paper.event.entity.EntityFertilizeEggEvent((org.bukkit.entity.LivingEntity) breeding.getBukkitEntity(), (org.bukkit.entity.LivingEntity) other.getBukkitEntity(), serverPlayer == null ? null : serverPlayer.getBukkitEntity(), breeding.breedItem == null ? null : org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(breeding.breedItem).clone(), experience); + if (!event.callEvent()) { + breeding.resetLove(); + other.resetLove(); // stop the pathfinding to avoid infinite loop + } + + return event; + } + // Paper end - add EntityFertilizeEggEvent }