mirror of
https://github.com/PaperMC/Paper.git
synced 2025-03-21 22:48:57 +01:00
Fix EntityBreedEvent cancellation (#12046)
This commit is contained in:
parent
61312fdb59
commit
1a04e96ab7
4 changed files with 30 additions and 33 deletions
paper-server
patches/sources/net/minecraft/world/entity
src/main/java/org/bukkit/craftbukkit/event
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -1896,11 +1896,11 @@ public class CraftEventFactory {
|
|||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue