--- a/net/minecraft/server/EntityEnderPearl.java +++ b/net/minecraft/server/EntityEnderPearl.java @@ -1,6 +1,12 @@ package net.minecraft.server; import javax.annotation.Nullable; +// 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 { @@ -65,21 +71,35 @@ EntityPlayer entityplayer = (EntityPlayer) entityliving; if (entityplayer.playerConnection.a().isConnected() && entityplayer.world == this.world && !entityplayer.isSleeping()) { - if (this.random.nextFloat() < 0.05F && this.world.getGameRules().getBoolean("doMobSpawning")) { - EntityEndermite entityendermite = (EntityEndermite) EntityTypes.ENDERMITE.a(this.world); - - entityendermite.setPlayerSpawned(true); - entityendermite.setPositionRotation(entityliving.locX, entityliving.locY, entityliving.locZ, entityliving.yaw, entityliving.pitch); - this.world.addEntity(entityendermite); - } - - if (entityliving.isPassenger()) { - entityliving.stopRiding(); + // 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.playerConnection.isDisconnected()) { + if (this.random.nextFloat() < 0.05F && this.world.getGameRules().getBoolean("doMobSpawning")) { + EntityEndermite entityendermite = (EntityEndermite) EntityTypes.ENDERMITE.a(this.world); + + entityendermite.setPlayerSpawned(true); + entityendermite.setPositionRotation(entityliving.locX, entityliving.locY, entityliving.locZ, entityliving.yaw, entityliving.pitch); + this.world.addEntity(entityendermite, CreatureSpawnEvent.SpawnReason.ENDER_PEARL); + } + + if (entityliving.isPassenger()) { + entityliving.stopRiding(); + } + + entityplayer.playerConnection.teleport(teleEvent.getTo()); + entityliving.fallDistance = 0.0F; + CraftEventFactory.entityDamage = this; + entityliving.damageEntity(DamageSource.FALL, 5.0F); + CraftEventFactory.entityDamage = null; } - - entityliving.enderTeleportTo(this.locX, this.locY, this.locZ); - entityliving.fallDistance = 0.0F; - entityliving.damageEntity(DamageSource.FALL, 5.0F); + // CraftBukkit end } } else if (entityliving != null) { entityliving.enderTeleportTo(this.locX, this.locY, this.locZ);