diff --git a/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java b/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java index 97abe69..3af849d 100644 --- a/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java +++ b/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java @@ -461,6 +461,8 @@ public void travelToDimension(int p_71027_1_) { + if(mcServer.worldServerForDimension(p_71027_1_) == null) + return; int enderLink = ((WorldServer)worldObj).getConfig().portals.enderLink; if (this.dimension == enderLink && p_71027_1_ == enderLink) { @@ -1050,6 +1052,58 @@ this.lastFoodLevel = -1; } + /** Safe transferToDimension and setPosition */ + public boolean setWorldPosition(int dim, double x, double y, double z) + { + if(dim == this.dimension) + { + playerNetServerHandler.setPlayerLocation(x, y, z, this.rotationYaw, this.rotationPitch); + return true; + } + if(mcServer.worldServerForDimension(dim) == null) + return false; + int lastDim = this.dimension; + double lastX = this.posX; + double lastY = this.posY; + double lastZ = this.posZ; + setPosition(x, y, z); + try { + transferToDimension(dim); + } catch (RuntimeException e) { + setPosition(lastX, lastY, lastZ); + this.dimension = lastDim; + throw e; + } + return true; + } + + /** Safe transferToDimension and setPositionAndRotation */ + public boolean setWorldPositionAndRotation(int dim, double x, double y, double z, float yaw, float pitch) + { + if(dim == this.dimension) + { + playerNetServerHandler.setPlayerLocation(x, y, z, yaw, pitch); + return true; + } + if(mcServer.worldServerForDimension(dim) == null) + return false; + int lastDim = this.dimension; + double lastX = this.posX; + double lastY = this.posY; + double lastZ = this.posZ; + float lastYaw = this.rotationYaw; + float lastPitch = this.rotationPitch; + setPositionAndRotation(x, y, z, yaw, pitch); + try { + transferToDimension(dim); + } catch (RuntimeException e) { + setPositionAndRotation(lastX, lastY, lastZ, lastYaw, lastPitch); + this.dimension = lastDim; + throw e; + } + return true; + } + public void setStatisticsFile(StatisticsFile stats) { this.field_147103_bO = stats; diff --git a/src/main/java/org/ultramine/server/Teleporter.java b/src/main/java/org/ultramine/server/Teleporter.java index 78c9bac..f2ab461 100644 --- a/src/main/java/org/ultramine/server/Teleporter.java +++ b/src/main/java/org/ultramine/server/Teleporter.java @@ -88,15 +88,8 @@ { player.getData().core().setLastLocation(WarpLocation.getFromPlayer(player)); - if(player.dimension != dimension) - { - player.setPositionAndRotation(x, y, z, yaw, pitch); - player.transferToDimension(dimension); - } - else - { - player.playerNetServerHandler.setPlayerLocation(x, y, z, yaw, pitch); - } + if(!player.setWorldPositionAndRotation(dimension, x, y, z, yaw, pitch)) + player.addChatMessage(new ChatComponentTranslation("teleporter.fail.dim").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))); if(isServer) { diff --git a/src/main/resources/assets/ultramine/lang/en_US.lang b/src/main/resources/assets/ultramine/lang/en_US.lang index 997323b..a3daf7d 100644 --- a/src/main/resources/assets/ultramine/lang/en_US.lang +++ b/src/main/resources/assets/ultramine/lang/en_US.lang @@ -1,5 +1,6 @@ #Server core teleporter.fail.cooldownd=You will be able to teleport in %s seconds +teleporter.fail.dim=Failed to teleport: the world is not exists or was held teleporter.delay=You will be teleported in %s seconds teleporter.canceled=Teleportation canceled diff --git a/src/main/resources/assets/ultramine/lang/ru_RU.lang b/src/main/resources/assets/ultramine/lang/ru_RU.lang index 6655667..8e7ddeb 100644 --- a/src/main/resources/assets/ultramine/lang/ru_RU.lang +++ b/src/main/resources/assets/ultramine/lang/ru_RU.lang @@ -1,5 +1,6 @@ #Server core teleporter.fail.cooldownd=Вы сможете телепортироваться через %s секунд +teleporter.fail.dim=Не удалось телепортироваться: мир не существует или заблокирован teleporter.delay=Вы будете телепортированы через %s секунд teleporter.canceled=Телепортация отменена