summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorByron Shelden <byron.shelden@gmail.com>2011-03-22 23:50:14 -0700
committerErik Broes <erikbroes@grum.nl>2011-03-23 18:34:53 +0100
commit376ac51cea7dfa5357d395b7a52f382c1249278a (patch)
tree63103976d75329477b4b8e7f44707a36d4577ff5 /src
parentd08ee17352868dc52d58403b8ae97cd05d5e0723 (diff)
downloadcraftbukkit-376ac51cea7dfa5357d395b7a52f382c1249278a.tar
craftbukkit-376ac51cea7dfa5357d395b7a52f382c1249278a.tar.gz
craftbukkit-376ac51cea7dfa5357d395b7a52f382c1249278a.tar.lz
craftbukkit-376ac51cea7dfa5357d395b7a52f382c1249278a.tar.xz
craftbukkit-376ac51cea7dfa5357d395b7a52f382c1249278a.zip
Fixed the PLAYER_TELEPORT event so event.getTo().getWorld() is correct. (#451)
Diffstat (limited to 'src')
-rw-r--r--src/main/java/net/minecraft/server/NetServerHandler.java25
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java14
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java36
3 files changed, 56 insertions, 19 deletions
diff --git a/src/main/java/net/minecraft/server/NetServerHandler.java b/src/main/java/net/minecraft/server/NetServerHandler.java
index 89979c72..a3bd30d9 100644
--- a/src/main/java/net/minecraft/server/NetServerHandler.java
+++ b/src/main/java/net/minecraft/server/NetServerHandler.java
@@ -258,30 +258,47 @@ public class NetServerHandler extends NetHandler implements ICommandListener {
}
}
- public void a(double d0, double d1, double d2, float f, float f1) {
- // CraftBukkit start
+ // CraftBukkit start -- Delegate for a(double, double, double, float, float)
+ public boolean teleport(Location dest) {
+ // Note: the world in location is used only for the event
+ // Inter-world teleportation is handled in CraftPlayer.teleport()
+
Player player = getPlayer();
Location from = player.getLocation();
- Location to = new Location(player.getWorld(), d0, d1, d2, f, f1);
+ Location to = dest.clone();
PlayerMoveEvent event = new PlayerMoveEvent(Type.PLAYER_TELEPORT, player, from, to);
server.getPluginManager().callEvent(event);
from = event.getFrom();
to = event.isCancelled() ? from : event.getTo();
+ double d0, d1, d2;
+ float f, f1;
+
d0 = to.getX();
d1 = to.getY();
d2 = to.getZ();
f = to.getYaw();
f1 = to.getPitch();
- // CraftBukkit end
+ // net.minecraft.server start
this.l = false;
this.i = d0;
this.j = d1;
this.k = d2;
this.e.b(d0, d1, d2, f, f1);
this.e.a.b((Packet) (new Packet13PlayerLookMove(d0, d1 + 1.6200000047683716D, d1, d2, f, f1, false)));
+ // net.minecraft.server end
+
+ // Returns TRUE if the teleport was successful
+ return !event.isCancelled();
+ }
+ // CraftBukkit end
+
+ public void a(double d0, double d1, double d2, float f, float f1) {
+ // CraftBukkit start -- Delegate to teleport(Location)
+ teleport(new Location(getPlayer().getWorld(), d0, d1, d2, f, f1));
+ // CraftBukkit end
}
public void a(Packet14BlockDig packet14blockdig) {
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
index 0d425ef0..f404fd47 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
@@ -107,13 +107,23 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
return ((WorldServer)entity.world).getWorld();
}
- public void teleportTo(Location location) {
+ public boolean teleport(Location location) {
entity.world = ((CraftWorld)location.getWorld()).getHandle();
entity.b(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
+ // entity.b() throws no event, and so cannot be cancelled
+ return true;
+ }
+
+ public boolean teleport(org.bukkit.entity.Entity destination) {
+ return teleport(destination.getLocation());
+ }
+
+ public void teleportTo(Location location) {
+ teleport(location);
}
public void teleportTo(org.bukkit.entity.Entity destination) {
- teleportTo(destination.getLocation());
+ teleport(destination);
}
public int getEntityId() {
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 1b3a6222..ef90643e 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -137,18 +137,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
}
@Override
- public void teleportTo(Location location) {
+ public boolean teleport(Location location) {
WorldServer oldWorld = ((CraftWorld)getWorld()).getHandle();
WorldServer newWorld = ((CraftWorld)location.getWorld()).getHandle();
ServerConfigurationManager manager = server.getHandle();
EntityPlayer entity = getHandle();
+ boolean teleportSuccess;
if (oldWorld != newWorld) {
- manager.c.k.a(entity);
- manager.c.k.b(entity);
- oldWorld.manager.b(entity);
- manager.b.remove(entity);
- oldWorld.e(entity);
EntityPlayer newEntity = new EntityPlayer(manager.c, newWorld, entity.name, new ItemInWorldManager(newWorld));
@@ -160,17 +156,31 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
newEntity.inventory.e = newEntity;
newEntity.activeContainer = entity.activeContainer;
newEntity.defaultContainer = entity.defaultContainer;
+ newEntity.locX = location.getX();
+ newEntity.locY = location.getY();
+ newEntity.locZ = location.getZ();
newWorld.u.d((int) location.getBlockX() >> 4, (int) location.getBlockZ() >> 4);
- newEntity.a.a(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
- newWorld.manager.a(newEntity);
- newWorld.a(newEntity);
- manager.b.add(newEntity);
+ teleportSuccess = newEntity.a.teleport(location);
- entity.a.e = newEntity;
- this.entity = newEntity;
+ if (teleportSuccess) {
+ manager.c.k.a(entity);
+ manager.c.k.b(entity);
+ oldWorld.manager.b(entity);
+ manager.b.remove(entity);
+ oldWorld.e(entity);
+
+ newWorld.manager.a(newEntity);
+ newWorld.a(newEntity);
+ manager.b.add(newEntity);
+
+ entity.a.e = newEntity;
+ this.entity = newEntity;
+ }
+
+ return teleportSuccess;
} else {
- entity.a.a(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
+ return entity.a.teleport(location);
}
}