Fix players spawning above portals. Fixes BUKKIT-3542.

Vanilla does not check for blocks in which the player could
suffocate when changing dimension, so portals will happily spawn
players in blocks when using a portal under certain
circumstances. However, we currently check for these instances
and move the player up until they will not suffocate. This means
that players can sometimes be taken to above the target portal,
making it seem as if a portal was not created. Instead, we now
disable this suffocation check when moveToWorld is called from
changeDimension, mirroring vanilla behavior more accurately.
This commit is contained in:
James Clarke 2013-02-03 00:32:07 +00:00 committed by feildmaster
parent d661c67a70
commit 4d3865a036
2 changed files with 5 additions and 5 deletions

View File

@ -322,10 +322,10 @@ public abstract class PlayerList {
// CraftBukkit start
public EntityPlayer moveToWorld(EntityPlayer entityplayer, int i, boolean flag) {
return this.moveToWorld(entityplayer, i, flag, null);
return this.moveToWorld(entityplayer, i, flag, null, true);
}
public EntityPlayer moveToWorld(EntityPlayer entityplayer, int i, boolean flag, Location location) {
public EntityPlayer moveToWorld(EntityPlayer entityplayer, int i, boolean flag, Location location, boolean avoidSuffocation) {
// CraftBukkit end
entityplayer.p().getTracker().untrackPlayer(entityplayer);
// entityplayer.p().getTracker().untrackEntity(entityplayer); // CraftBukkit
@ -378,7 +378,7 @@ public abstract class PlayerList {
worldserver.chunkProviderServer.getChunkAt((int) entityplayer1.locX >> 4, (int) entityplayer1.locZ >> 4);
while (!worldserver.getCubes(entityplayer1, entityplayer1.boundingBox).isEmpty()) {
while (avoidSuffocation && !worldserver.getCubes(entityplayer1, entityplayer1.boundingBox).isEmpty()) { // CraftBukkit
entityplayer1.setPosition(entityplayer1.locX, entityplayer1.locY + 1.0D, entityplayer1.locZ);
}
@ -468,7 +468,7 @@ public abstract class PlayerList {
exitWorld.s().adjustExit(entityplayer, exit, velocity);
exitWorld.chunkProviderServer.forceChunkLoad = before;
this.moveToWorld(entityplayer, exitWorld.dimension, true, exit);
this.moveToWorld(entityplayer, exitWorld.dimension, true, exit, false); // Vanilla doesn't check for suffocation when handling portals, so neither should we
if (entityplayer.motX != velocity.getX() || entityplayer.motY != velocity.getY() || entityplayer.motZ != velocity.getZ()) {
entityplayer.getBukkitEntity().setVelocity(velocity);
}

View File

@ -389,7 +389,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
if (getHandle().activeContainer != getHandle().defaultContainer){
getHandle().closeInventory();
}
server.getHandle().moveToWorld(entity, toWorld.dimension, true, to);
server.getHandle().moveToWorld(entity, toWorld.dimension, true, to, true);
}
return true;
}