--- a/net/minecraft/world/entity/projectile/EntityEnderPearl.java +++ b/net/minecraft/world/entity/projectile/EntityEnderPearl.java @@ -17,6 +17,13 @@ import net.minecraft.world.phys.MovingObjectPosition; import net.minecraft.world.phys.MovingObjectPositionEntity; +// CraftBukkit start +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +// CraftBukkit end + public class EntityEnderPearl extends EntityProjectileThrowable { public EntityEnderPearl(EntityTypes entitytypes, World world) { @@ -53,21 +60,34 @@ EntityPlayer entityplayer = (EntityPlayer) entity; if (entityplayer.connection.a().isConnected() && entityplayer.level == this.level && !entityplayer.isSleeping()) { - if (this.random.nextFloat() < 0.05F && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { - EntityEndermite entityendermite = (EntityEndermite) EntityTypes.ENDERMITE.a(this.level); - - entityendermite.setPositionRotation(entity.locX(), entity.locY(), entity.locZ(), entity.getYRot(), entity.getXRot()); - this.level.addEntity(entityendermite); + // CraftBukkit start - Fire PlayerTeleportEvent + org.bukkit.craftbukkit.entity.CraftPlayer player = entityplayer.getBukkitEntity(); + org.bukkit.Location location = getBukkitEntity().getLocation(); + location.setPitch(player.getLocation().getPitch()); + location.setYaw(player.getLocation().getYaw()); + + PlayerTeleportEvent teleEvent = new PlayerTeleportEvent(player, player.getLocation(), location, PlayerTeleportEvent.TeleportCause.ENDER_PEARL); + Bukkit.getPluginManager().callEvent(teleEvent); + + if (!teleEvent.isCancelled() && !entityplayer.connection.isDisconnected()) { + if (this.random.nextFloat() < 0.05F && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { + EntityEndermite entityendermite = (EntityEndermite) EntityTypes.ENDERMITE.a(this.level); + + entityendermite.setPositionRotation(entity.locX(), entity.locY(), entity.locZ(), entity.getYRot(), entity.getXRot()); + this.level.addEntity(entityendermite, CreatureSpawnEvent.SpawnReason.ENDER_PEARL); + } + + if (entity.isPassenger()) { + entity.stopRiding(); + } + + entityplayer.connection.teleport(teleEvent.getTo()); + entity.fallDistance = 0.0F; + CraftEventFactory.entityDamage = this; + entity.damageEntity(DamageSource.FALL, 5.0F); + CraftEventFactory.entityDamage = null; } - - if (entity.isPassenger()) { - entityplayer.a(this.locX(), this.locY(), this.locZ()); - } else { - entity.enderTeleportTo(this.locX(), this.locY(), this.locZ()); - } - - entity.fallDistance = 0.0F; - entity.damageEntity(DamageSource.FALL, 5.0F); + // CraftBukkit end } } else if (entity != null) { entity.enderTeleportTo(this.locX(), this.locY(), this.locZ()); @@ -96,7 +116,7 @@ public Entity b(WorldServer worldserver) { Entity entity = this.getShooter(); - if (entity != null && entity.level.getDimensionKey() != worldserver.getDimensionKey()) { + if (entity != null && worldserver != null && entity.level.getDimensionKey() != worldserver.getDimensionKey()) { // CraftBukkit - SPIGOT-6113 this.setShooter((Entity) null); }