SPIGOT-7375: Fix crash breeding certain entities
By: md_5 <git@md-5.net>
This commit is contained in:
		
					parent
					
						
							
								640e9271af
							
						
					
				
			
			
				commit
				
					
						99be5d2a3c
					
				
			
		
					 1 changed files with 25 additions and 20 deletions
				
			
		| 
						 | 
					@ -57,34 +57,39 @@
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
         this.level().broadcastEntityEvent(this, (byte) 18);
 | 
					         this.level().broadcastEntityEvent(this, (byte) 18);
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
@@ -221,14 +239,23 @@
 | 
					@@ -220,12 +238,29 @@
 | 
				
			||||||
 | 
					         if (entityageable != null) {
 | 
				
			||||||
             entityageable.setBaby(true);
 | 
					             entityageable.setBaby(true);
 | 
				
			||||||
             entityageable.moveTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F);
 | 
					             entityageable.moveTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F);
 | 
				
			||||||
             this.finalizeSpawnChildFromBreeding(worldserver, entityanimal, entityageable);
 | 
					-            this.finalizeSpawnChildFromBreeding(worldserver, entityanimal, entityageable);
 | 
				
			||||||
-            worldserver.addFreshEntityWithPassengers(entityageable);
 | 
					-            worldserver.addFreshEntityWithPassengers(entityageable);
 | 
				
			||||||
+            worldserver.addFreshEntityWithPassengers(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason
 | 
					+            // CraftBukkit start - call EntityBreedEvent
 | 
				
			||||||
 | 
					+            EntityPlayer breeder = Optional.ofNullable(this.getLoveCause()).or(() -> {
 | 
				
			||||||
 | 
					+                return Optional.ofNullable(entityanimal.getLoveCause());
 | 
				
			||||||
 | 
					+            }).orElse(null);
 | 
				
			||||||
 | 
					+            int experience = this.getRandom().nextInt(7) + 1;
 | 
				
			||||||
 | 
					+            org.bukkit.event.entity.EntityBreedEvent entityBreedEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(entityageable, this, entityanimal, breeder, this.breedItem, experience);
 | 
				
			||||||
 | 
					+            if (entityBreedEvent.isCancelled()) {
 | 
				
			||||||
 | 
					+                return;
 | 
				
			||||||
 | 
					+            }
 | 
				
			||||||
 | 
					+            experience = entityBreedEvent.getExperience();
 | 
				
			||||||
 | 
					+            this.finalizeSpawnChildFromBreeding(worldserver, entityanimal, entityageable, experience);
 | 
				
			||||||
 | 
					+            worldserver.addFreshEntityWithPassengers(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING);
 | 
				
			||||||
 | 
					+            // CraftBukkit end
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     public void finalizeSpawnChildFromBreeding(WorldServer worldserver, EntityAnimal entityanimal, @Nullable EntityAgeable entityageable) {
 | 
					     public void finalizeSpawnChildFromBreeding(WorldServer worldserver, EntityAnimal entityanimal, @Nullable EntityAgeable entityageable) {
 | 
				
			||||||
-        Optional.ofNullable(this.getLoveCause()).or(() -> {
 | 
					+        // CraftBukkit start
 | 
				
			||||||
+        // CraftBukkit start - call EntityBreedEvent
 | 
					+        this.finalizeSpawnChildFromBreeding(worldserver, entityanimal, entityageable, this.getRandom().nextInt(7) + 1);
 | 
				
			||||||
+        Optional<EntityPlayer> cause = Optional.ofNullable(this.getLoveCause()).or(() -> {
 | 
					+    }
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+    public void finalizeSpawnChildFromBreeding(WorldServer worldserver, EntityAnimal entityanimal, @Nullable EntityAgeable entityageable, int experience) {
 | 
				
			||||||
 | 
					+        // CraftBukkit end
 | 
				
			||||||
 | 
					         Optional.ofNullable(this.getLoveCause()).or(() -> {
 | 
				
			||||||
             return Optional.ofNullable(entityanimal.getLoveCause());
 | 
					             return Optional.ofNullable(entityanimal.getLoveCause());
 | 
				
			||||||
-        }).ifPresent((entityplayer) -> {
 | 
					         }).ifPresent((entityplayer) -> {
 | 
				
			||||||
+        });
 | 
					@@ -238,7 +273,11 @@
 | 
				
			||||||
+        int experience = this.getRandom().nextInt(7) + 1;
 | 
					 | 
				
			||||||
+        org.bukkit.event.entity.EntityBreedEvent entityBreedEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(entityageable, this, entityanimal, cause.orElse(null), this.breedItem, experience);
 | 
					 | 
				
			||||||
+        if (entityBreedEvent.isCancelled()) {
 | 
					 | 
				
			||||||
+            return;
 | 
					 | 
				
			||||||
+        }
 | 
					 | 
				
			||||||
+        experience = entityBreedEvent.getExperience();
 | 
					 | 
				
			||||||
+        cause.ifPresent((entityplayer) -> {
 | 
					 | 
				
			||||||
+            // CraftBukkit end
 | 
					 | 
				
			||||||
             entityplayer.awardStat(StatisticList.ANIMALS_BRED);
 | 
					 | 
				
			||||||
             CriterionTriggers.BRED_ANIMALS.trigger(entityplayer, this, entityanimal, entityageable);
 | 
					 | 
				
			||||||
         });
 | 
					 | 
				
			||||||
@@ -238,7 +265,11 @@
 | 
					 | 
				
			||||||
         entityanimal.resetLove();
 | 
					         entityanimal.resetLove();
 | 
				
			||||||
         worldserver.broadcastEntityEvent(this, (byte) 18);
 | 
					         worldserver.broadcastEntityEvent(this, (byte) 18);
 | 
				
			||||||
         if (worldserver.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) {
 | 
					         if (worldserver.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue