3
0
Mirror von https://github.com/PaperMC/Paper.git synchronisiert 2024-11-16 21:10:17 +01:00

Fixed the PLAYER_TELEPORT event so event.getTo().getWorld() is correct. (#451)

Dieser Commit ist enthalten in:
Byron Shelden 2011-03-22 23:50:14 -07:00 committet von Erik Broes
Ursprung d08ee17352
Commit 376ac51cea
3 geänderte Dateien mit 56 neuen und 19 gelöschten Zeilen

Datei anzeigen

@ -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 -- Delegate for a(double, double, double, float, float)
// CraftBukkit start 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(); Player player = getPlayer();
Location from = player.getLocation(); 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); PlayerMoveEvent event = new PlayerMoveEvent(Type.PLAYER_TELEPORT, player, from, to);
server.getPluginManager().callEvent(event); server.getPluginManager().callEvent(event);
from = event.getFrom(); from = event.getFrom();
to = event.isCancelled() ? from : event.getTo(); to = event.isCancelled() ? from : event.getTo();
double d0, d1, d2;
float f, f1;
d0 = to.getX(); d0 = to.getX();
d1 = to.getY(); d1 = to.getY();
d2 = to.getZ(); d2 = to.getZ();
f = to.getYaw(); f = to.getYaw();
f1 = to.getPitch(); f1 = to.getPitch();
// CraftBukkit end
// net.minecraft.server start
this.l = false; this.l = false;
this.i = d0; this.i = d0;
this.j = d1; this.j = d1;
this.k = d2; this.k = d2;
this.e.b(d0, d1, d2, f, f1); this.e.b(d0, d1, d2, f, f1);
this.e.a.b((Packet) (new Packet13PlayerLookMove(d0, d1 + 1.6200000047683716D, d1, d2, f, f1, false))); 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) { public void a(Packet14BlockDig packet14blockdig) {

Datei anzeigen

@ -107,13 +107,23 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
return ((WorldServer)entity.world).getWorld(); return ((WorldServer)entity.world).getWorld();
} }
public void teleportTo(Location location) { public boolean teleport(Location location) {
entity.world = ((CraftWorld)location.getWorld()).getHandle(); entity.world = ((CraftWorld)location.getWorld()).getHandle();
entity.b(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); 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) { public void teleportTo(org.bukkit.entity.Entity destination) {
teleportTo(destination.getLocation()); teleport(destination);
} }
public int getEntityId() { public int getEntityId() {

Datei anzeigen

@ -137,18 +137,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
} }
@Override @Override
public void teleportTo(Location location) { public boolean teleport(Location location) {
WorldServer oldWorld = ((CraftWorld)getWorld()).getHandle(); WorldServer oldWorld = ((CraftWorld)getWorld()).getHandle();
WorldServer newWorld = ((CraftWorld)location.getWorld()).getHandle(); WorldServer newWorld = ((CraftWorld)location.getWorld()).getHandle();
ServerConfigurationManager manager = server.getHandle(); ServerConfigurationManager manager = server.getHandle();
EntityPlayer entity = getHandle(); EntityPlayer entity = getHandle();
boolean teleportSuccess;
if (oldWorld != newWorld) { 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)); 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.inventory.e = newEntity;
newEntity.activeContainer = entity.activeContainer; newEntity.activeContainer = entity.activeContainer;
newEntity.defaultContainer = entity.defaultContainer; 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); newWorld.u.d((int) location.getBlockX() >> 4, (int) location.getBlockZ() >> 4);
newEntity.a.a(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); teleportSuccess = newEntity.a.teleport(location);
newWorld.manager.a(newEntity);
newWorld.a(newEntity);
manager.b.add(newEntity);
entity.a.e = newEntity; if (teleportSuccess) {
this.entity = newEntity; 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 { } else {
entity.a.a(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); return entity.a.teleport(location);
} }
} }