mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-24 18:07:39 +01:00
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:
parent
d661c67a70
commit
4d3865a036
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user