aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0915-Add-EntityFertilizeEggEvent.patch
diff options
context:
space:
mode:
authorJake Potrebic <[email protected]>2023-11-04 14:11:55 -0700
committerGitHub <[email protected]>2023-11-04 14:11:55 -0700
commit0cdce89d595a2c1c097c9e2a5ff96687977b3b25 (patch)
treede63d6aa8112811f93b5d6afebbb069b9980870f /patches/server/0915-Add-EntityFertilizeEggEvent.patch
parent15a0de2eefb70ea8162cbb31056920adf80265fa (diff)
downloadPaper-0cdce89d595a2c1c097c9e2a5ff96687977b3b25.tar.gz
Paper-0cdce89d595a2c1c097c9e2a5ff96687977b3b25.zip
Fix a bunch of stuff with player spawn locations (#9887)
If a playerdata doesn't contain a valid, loaded world, reset to the main world spawn point
Diffstat (limited to 'patches/server/0915-Add-EntityFertilizeEggEvent.patch')
-rw-r--r--patches/server/0915-Add-EntityFertilizeEggEvent.patch104
1 files changed, 104 insertions, 0 deletions
diff --git a/patches/server/0915-Add-EntityFertilizeEggEvent.patch b/patches/server/0915-Add-EntityFertilizeEggEvent.patch
new file mode 100644
index 0000000000..ea181cda54
--- /dev/null
+++ b/patches/server/0915-Add-EntityFertilizeEggEvent.patch
@@ -0,0 +1,104 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Lulu13022002 <[email protected]>
+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 5f57f13d50e051c621e401b63c0b55b3a2a73fa3..490472bb618e9ac07da5883a71dff8920525b1e2 100644
+--- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java
++++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java
+@@ -450,6 +450,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);
+@@ -464,7 +468,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 7d1e6427ab5f2dabe9072d092d733b0ff34e0b44..5000ebc5f19dee72a86360062b822aecd60beb47 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
+@@ -244,7 +244,12 @@ public class Frog extends Animal implements VariantHolder<FrogVariant> {
+
+ @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 36b3945832733b5ad66d25aa3a31335234d2acff..47a5125e44cea1ece84657cdb874807f13ee824f 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
+@@ -347,11 +347,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 73f12036dbbcecbd5848c8eda391fc34d04e9995..4ad092c25a17cfb3eae26316260ddeeb66a59cfd 100644
+--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
++++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+@@ -2089,4 +2089,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
+ }