Indicate when a teleport event was triggered by ender pearls or unknown internal teleports

This commit is contained in:
Nathan Adams 2011-12-04 11:04:14 +00:00
parent 645079be08
commit 55a532c251
4 changed files with 40 additions and 14 deletions

View File

@ -3,6 +3,8 @@ package net.minecraft.server;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.player.PlayerPortalEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
public class EntityEnderPearl extends EntityProjectile { public class EntityEnderPearl extends EntityProjectile {
public EntityEnderPearl(World world) { public EntityEnderPearl(World world) {
@ -28,23 +30,36 @@ public class EntityEnderPearl extends EntityProjectile {
if (!this.world.isStatic) { if (!this.world.isStatic) {
// CraftBukkit start - dupe fix + damage event // CraftBukkit start - dupe fix + damage event
boolean damage = false; boolean teleport = false;
PlayerTeleportEvent teleEvent = null;
if (this.shooter != null) { if (this.shooter != null) {
if (this.shooter instanceof EntityPlayer) { 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 { } else {
damage = true; teleport = true;
} }
} }
if (damage) { if (teleport) {
this.shooter.a_(this.locX, this.locY, this.locZ); 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; this.shooter.fallDistance = 0.0F;
EntityDamageEvent event = new EntityDamageEvent(getBukkitEntity(), EntityDamageEvent.DamageCause.FALL, 5); EntityDamageEvent damageEvent = new EntityDamageEvent(getBukkitEntity(), EntityDamageEvent.DamageCause.FALL, 5);
Bukkit.getPluginManager().callEvent(event); Bukkit.getPluginManager().callEvent(damageEvent);
if (!event.isCancelled()) { if (!damageEvent.isCancelled()) {
this.shooter.damageEntity(DamageSource.FALL, event.getDamage()); this.shooter.damageEntity(DamageSource.FALL, damageEvent.getDamage());
} }
} }
// CraftBukkit end // CraftBukkit end

View File

@ -190,7 +190,7 @@ public class NetServerHandler extends NetHandler implements ICommandListener {
there to avoid any 'Moved wrongly' or 'Moved too quickly' errors. there to avoid any 'Moved wrongly' or 'Moved too quickly' errors.
We only do this if the Event was not cancelled. */ We only do this if the Event was not cancelled. */
if (!to.equals(event.getTo()) && !event.isCancelled()) { if (!to.equals(event.getTo()) && !event.isCancelled()) {
this.player.getBukkitEntity().teleport(event.getTo()); this.player.getBukkitEntity().teleport(event.getTo(), PlayerTeleportEvent.TeleportCause.UNKNOWN);
return; 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)) { 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."); System.err.println(player.getName() + " was caught trying to crash the server with an invalid position.");
player.kickPlayer("Nope!"); player.kickPlayer("Nope!");
return; return;
@ -386,7 +386,7 @@ public class NetServerHandler extends NetHandler implements ICommandListener {
Player player = this.getPlayer(); Player player = this.getPlayer();
Location from = player.getLocation(); Location from = player.getLocation();
Location to = new Location(this.getPlayer().getWorld(), d0, d1, d2, f, f1); 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); this.server.getPluginManager().callEvent(event);
from = event.getFrom(); from = event.getFrom();

View File

@ -15,6 +15,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
public abstract class CraftEntity implements org.bukkit.entity.Entity { public abstract class CraftEntity implements org.bukkit.entity.Entity {
private static final Map<String, CraftPlayer> players = new MapMaker().softValues().makeMap(); private static final Map<String, CraftPlayer> players = new MapMaker().softValues().makeMap();
@ -152,6 +153,10 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
} }
public boolean teleport(Location location) { public boolean teleport(Location location) {
return teleport(this, TeleportCause.PLUGIN);
}
public boolean teleport(Location location, TeleportCause cause) {
entity.world = ((CraftWorld) location.getWorld()).getHandle(); entity.world = ((CraftWorld) location.getWorld()).getHandle();
entity.setLocation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); entity.setLocation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
// entity.setLocation() throws no event, and so cannot be cancelled // entity.setLocation() throws no event, and so cannot be cancelled
@ -162,6 +167,10 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
return teleport(destination.getLocation()); return teleport(destination.getLocation());
} }
public boolean teleport(org.bukkit.entity.Entity destination, TeleportCause cause) {
return teleport(destination.getLocation(), cause);
}
public List<org.bukkit.entity.Entity> getNearbyEntities(double x, double y, double z) { public List<org.bukkit.entity.Entity> getNearbyEntities(double x, double y, double z) {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
List<Entity> notchEntityList = entity.world.b(entity, entity.boundingBox.b(x, y, z)); List<Entity> notchEntityList = entity.world.b(entity, entity.boundingBox.b(x, y, z));

View File

@ -86,10 +86,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
} }
} }
@Override
public double getEyeHeight() { public double getEyeHeight() {
return getEyeHeight(false); return getEyeHeight(false);
} }
@Override
public double getEyeHeight(boolean ignoreSneaking) { public double getEyeHeight(boolean ignoreSneaking) {
if (ignoreSneaking) { if (ignoreSneaking) {
return 1.62D; return 1.62D;
@ -274,7 +276,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
} }
@Override @Override
public boolean teleport(Location location) { public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) {
if (getHandle().netServerHandler == null) return false; if (getHandle().netServerHandler == null) return false;
// From = Players current Location // From = Players current Location
@ -282,7 +284,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
// To = Players new Location if Teleport is Successful // To = Players new Location if Teleport is Successful
Location to = location; Location to = location;
// Create & Call the Teleport Event. // Create & Call the Teleport Event.
PlayerTeleportEvent event = new PlayerTeleportEvent((Player) this, from, to); PlayerTeleportEvent event = new PlayerTeleportEvent((Player) this, from, to, cause);
server.getPluginManager().callEvent(event); server.getPluginManager().callEvent(event);
// Return False to inform the Plugin that the Teleport was unsuccessful/cancelled. // Return False to inform the Plugin that the Teleport was unsuccessful/cancelled.
if (event.isCancelled() == true) { if (event.isCancelled() == true) {