--- 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 { @@ -37,21 +43,35 @@ EntityPlayer entityplayer = (EntityPlayer) entity; if (entityplayer.playerConnection.a().isConnected() && entityplayer.world == this.world && !entityplayer.isSleeping()) { - if (this.random.nextFloat() < 0.05F && this.world.getGameRules().getBoolean(GameRules.DO_MOB_SPAWNING)) { - EntityEndermite entityendermite = (EntityEndermite) EntityTypes.ENDERMITE.a(this.world); + // 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(GameRules.DO_MOB_SPAWNING)) { + EntityEndermite entityendermite = (EntityEndermite) EntityTypes.ENDERMITE.a(this.world); - entityendermite.setPlayerSpawned(true); + entityendermite.setPlayerSpawned(true); entityendermite.setPositionRotation(entity.locX(), entity.locY(), entity.locZ(), entity.yaw, entity.pitch); - this.world.addEntity(entityendermite); - } + this.world.addEntity(entityendermite, CreatureSpawnEvent.SpawnReason.ENDER_PEARL); + } - if (entity.isPassenger()) { - entity.stopRiding(); + if (entity.isPassenger()) { + entity.stopRiding(); + } + + entityplayer.playerConnection.teleport(teleEvent.getTo()); + entity.fallDistance = 0.0F; + CraftEventFactory.entityDamage = this; + entity.damageEntity(DamageSource.FALL, 5.0F); + CraftEventFactory.entityDamage = null; } - - 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()); @@ -80,7 +100,7 @@ public Entity b(WorldServer worldserver) { Entity entity = this.getShooter(); - if (entity != null && entity.world.getDimensionKey() != worldserver.getDimensionKey()) { + if (entity != null && worldserver != null && entity.world.getDimensionKey() != worldserver.getDimensionKey()) { // CraftBukkit - SPIGOT-6113 this.setShooter((Entity) null); }