diff --git a/common/net/minecraftforge/common/DimensionManager.java b/common/net/minecraftforge/common/DimensionManager.java index 13144510f..fb6e8bfe8 100644 --- a/common/net/minecraftforge/common/DimensionManager.java +++ b/common/net/minecraftforge/common/DimensionManager.java @@ -64,6 +64,11 @@ public class DimensionManager return dimensions.get(dim); } + public static WorldProvider getProvider(int dim) + { + return getWorld(dim).provider; + } + public static Integer[] getIDs() { return dimensions.keySet().toArray(new Integer[0]); diff --git a/patches/common/net/minecraft/src/ServerConfigurationManager.java.patch b/patches/common/net/minecraft/src/ServerConfigurationManager.java.patch new file mode 100644 index 000000000..f3710938b --- /dev/null +++ b/patches/common/net/minecraft/src/ServerConfigurationManager.java.patch @@ -0,0 +1,81 @@ +--- ../src_base/common/net/minecraft/src/ServerConfigurationManager.java ++++ ../src_work/common/net/minecraft/src/ServerConfigurationManager.java +@@ -15,6 +15,7 @@ + import cpw.mods.fml.common.network.FMLNetworkHandler; + import cpw.mods.fml.common.network.NetworkRegistry; + import net.minecraft.server.MinecraftServer; ++import net.minecraftforge.common.DimensionManager; + + public abstract class ServerConfigurationManager + { +@@ -317,6 +318,7 @@ + + EntityPlayerMP var6 = new EntityPlayerMP(this.mcServer, this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension), par1EntityPlayerMP.username, (ItemInWorldManager)var5); + var6.clonePlayer(par1EntityPlayerMP, par3); ++ var6.dimension = par2; + var6.entityId = par1EntityPlayerMP.entityId; + var6.serverForThisPlayer = par1EntityPlayerMP.serverForThisPlayer; + WorldServer var7 = this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension); +@@ -359,6 +361,11 @@ + + public void transferPlayerToDimension(EntityPlayerMP par1EntityPlayerMP, int par2) + { ++ transferPlayerToDimension(par1EntityPlayerMP, par2, new Teleporter()); ++ } ++ ++ public void transferPlayerToDimension(EntityPlayerMP par1EntityPlayerMP, int par2, Teleporter teleporter) ++ { + int var3 = par1EntityPlayerMP.dimension; + WorldServer var4 = this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension); + par1EntityPlayerMP.dimension = par2; +@@ -366,33 +373,14 @@ + par1EntityPlayerMP.serverForThisPlayer.sendPacketToPlayer(new Packet9Respawn(par1EntityPlayerMP.dimension, (byte)par1EntityPlayerMP.worldObj.difficultySetting, var5.getWorldInfo().getTerrainType(), var5.getHeight(), par1EntityPlayerMP.theItemInWorldManager.getGameType())); + var4.removeEntity(par1EntityPlayerMP); + par1EntityPlayerMP.isDead = false; +- double var6 = par1EntityPlayerMP.posX; +- double var8 = par1EntityPlayerMP.posZ; +- double var10 = 8.0D; +- +- if (par1EntityPlayerMP.dimension == -1) +- { +- var6 /= var10; +- var8 /= var10; +- par1EntityPlayerMP.setLocationAndAngles(var6, par1EntityPlayerMP.posY, var8, par1EntityPlayerMP.rotationYaw, par1EntityPlayerMP.rotationPitch); +- +- if (par1EntityPlayerMP.isEntityAlive()) +- { +- var4.updateEntityWithOptionalForce(par1EntityPlayerMP, false); +- } +- } +- else if (par1EntityPlayerMP.dimension == 0) +- { +- var6 *= var10; +- var8 *= var10; +- par1EntityPlayerMP.setLocationAndAngles(var6, par1EntityPlayerMP.posY, var8, par1EntityPlayerMP.rotationYaw, par1EntityPlayerMP.rotationPitch); +- +- if (par1EntityPlayerMP.isEntityAlive()) +- { +- var4.updateEntityWithOptionalForce(par1EntityPlayerMP, false); +- } +- } +- else ++ ++ WorldProvider pOld = DimensionManager.getProvider(var3); ++ WorldProvider pNew = DimensionManager.getProvider(par2); ++ double moveFactor = pOld.getMovementFactor() / pNew.getMovementFactor(); ++ double var6 = par1EntityPlayerMP.posX * moveFactor; ++ double var8 = par1EntityPlayerMP.posZ * moveFactor; ++ ++ if (par1EntityPlayerMP.dimension == 1) + { + ChunkCoordinates var12 = var5.getEntrancePortalLocation(); + var6 = (double)var12.posX; +@@ -416,7 +404,7 @@ + var5.spawnEntityInWorld(par1EntityPlayerMP); + par1EntityPlayerMP.setLocationAndAngles(var6, par1EntityPlayerMP.posY, var8, par1EntityPlayerMP.rotationYaw, par1EntityPlayerMP.rotationPitch); + var5.updateEntityWithOptionalForce(par1EntityPlayerMP, false); +- (new Teleporter()).placeInPortal(var5, par1EntityPlayerMP); ++ teleporter.placeInPortal(var5, par1EntityPlayerMP); + } + } +