diff options
Diffstat (limited to 'src/main/java/net/minecraft')
-rw-r--r-- | src/main/java/net/minecraft/server/EntityEnderPearl.java | 33 | ||||
-rw-r--r-- | src/main/java/net/minecraft/server/NetServerHandler.java | 6 |
2 files changed, 27 insertions, 12 deletions
diff --git a/src/main/java/net/minecraft/server/EntityEnderPearl.java b/src/main/java/net/minecraft/server/EntityEnderPearl.java index 5469b6e2..04f7db9d 100644 --- a/src/main/java/net/minecraft/server/EntityEnderPearl.java +++ b/src/main/java/net/minecraft/server/EntityEnderPearl.java @@ -3,6 +3,8 @@ package net.minecraft.server; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.player.PlayerPortalEvent; +import org.bukkit.event.player.PlayerTeleportEvent; public class EntityEnderPearl extends EntityProjectile { public EntityEnderPearl(World world) { @@ -28,23 +30,36 @@ public class EntityEnderPearl extends EntityProjectile { if (!this.world.isStatic) { // CraftBukkit start - dupe fix + damage event - boolean damage = false; + boolean teleport = false; + PlayerTeleportEvent teleEvent = null; + if (this.shooter != null) { if (this.shooter instanceof EntityPlayer) { - damage = ((CraftPlayer)this.shooter.bukkitEntity).isOnline(); + CraftPlayer player = (CraftPlayer)this.shooter.bukkitEntity; + teleport = player.isOnline(); + + if (teleport) { + teleEvent = new PlayerTeleportEvent(player, player.getLocation(), getBukkitEntity().getLocation(), PlayerTeleportEvent.TeleportCause.ENDER_PEARL); + Bukkit.getPluginManager().callEvent(teleEvent); + teleport = !teleEvent.isCancelled(); + } } else { - damage = true; + teleport = true; } } - if (damage) { - this.shooter.a_(this.locX, this.locY, this.locZ); + if (teleport) { + if (this.shooter instanceof EntityPlayer) { + ((EntityPlayer)this.shooter).netServerHandler.teleport(teleEvent.getTo()); + } else { + this.shooter.a_(this.locX, this.locY, this.locZ); + } this.shooter.fallDistance = 0.0F; - EntityDamageEvent event = new EntityDamageEvent(getBukkitEntity(), EntityDamageEvent.DamageCause.FALL, 5); - Bukkit.getPluginManager().callEvent(event); + EntityDamageEvent damageEvent = new EntityDamageEvent(getBukkitEntity(), EntityDamageEvent.DamageCause.FALL, 5); + Bukkit.getPluginManager().callEvent(damageEvent); - if (!event.isCancelled()) { - this.shooter.damageEntity(DamageSource.FALL, event.getDamage()); + if (!damageEvent.isCancelled()) { + this.shooter.damageEntity(DamageSource.FALL, damageEvent.getDamage()); } } // CraftBukkit end diff --git a/src/main/java/net/minecraft/server/NetServerHandler.java b/src/main/java/net/minecraft/server/NetServerHandler.java index 9727f641..3c4f9e81 100644 --- a/src/main/java/net/minecraft/server/NetServerHandler.java +++ b/src/main/java/net/minecraft/server/NetServerHandler.java @@ -190,7 +190,7 @@ public class NetServerHandler extends NetHandler implements ICommandListener { there to avoid any 'Moved wrongly' or 'Moved too quickly' errors. We only do this if the Event was not cancelled. */ if (!to.equals(event.getTo()) && !event.isCancelled()) { - this.player.getBukkitEntity().teleport(event.getTo()); + this.player.getBukkitEntity().teleport(event.getTo(), PlayerTeleportEvent.TeleportCause.UNKNOWN); return; } @@ -204,7 +204,7 @@ public class NetServerHandler extends NetHandler implements ICommandListener { } if (Double.isNaN(packet10flying.x) || Double.isNaN(packet10flying.y) || Double.isNaN(packet10flying.z) || Double.isNaN(packet10flying.stance)) { - player.teleport(player.getWorld().getSpawnLocation()); + player.teleport(player.getWorld().getSpawnLocation(), PlayerTeleportEvent.TeleportCause.UNKNOWN); System.err.println(player.getName() + " was caught trying to crash the server with an invalid position."); player.kickPlayer("Nope!"); return; @@ -386,7 +386,7 @@ public class NetServerHandler extends NetHandler implements ICommandListener { Player player = this.getPlayer(); Location from = player.getLocation(); Location to = new Location(this.getPlayer().getWorld(), d0, d1, d2, f, f1); - PlayerTeleportEvent event = new PlayerTeleportEvent(player, from, to); + PlayerTeleportEvent event = new PlayerTeleportEvent(player, from, to, PlayerTeleportEvent.TeleportCause.UNKNOWN); this.server.getPluginManager().callEvent(event); from = event.getFrom(); |