Skip to content

Commit

Permalink
Fix EntityBreedEvent cancellation (#12046)
Browse files Browse the repository at this point in the history
  • Loading branch information
Lulu13022002 authored Feb 8, 2025
1 parent 61312fd commit 1a04e96
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
Expand All @@ -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();
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down

0 comments on commit 1a04e96

Please sign in to comment.