diff --git a/src/main/java/net/minecraft/world/WorldProvider.java b/src/main/java/net/minecraft/world/WorldProvider.java index 0fe7b5a..ecc76f0 100644 --- a/src/main/java/net/minecraft/world/WorldProvider.java +++ b/src/main/java/net/minecraft/world/WorldProvider.java @@ -226,9 +226,10 @@ */ public String getSaveFolder() { - return (worldObj instanceof WorldServerMulti || MinecraftServer.getServer() == null || MinecraftServer.getServer().isSinglePlayer()) ? - (dimensionId == 0 ? null : "DIM" + dimensionId) : - "../" + MinecraftServer.getServer().getMultiWorld().getNameByID(dimensionId); + return (MinecraftServer.getServer() == null || MinecraftServer.getServer().isSinglePlayer() || + worldObj instanceof WorldServerMulti && !((WorldServerMulti)worldObj).isSplitted) ? + (dimensionId == 0 ? null : "DIM" + dimensionId) : + "../" + MinecraftServer.getServer().getMultiWorld().getNameByID(dimensionId); } /** diff --git a/src/main/java/net/minecraft/world/WorldServerMulti.java b/src/main/java/net/minecraft/world/WorldServerMulti.java index e8e5c3f..e516dfc 100644 --- a/src/main/java/net/minecraft/world/WorldServerMulti.java +++ b/src/main/java/net/minecraft/world/WorldServerMulti.java @@ -8,17 +8,19 @@ public class WorldServerMulti extends WorldServer { private static final String __OBFID = "CL_00001430"; + public boolean isSplitted; public WorldServerMulti(MinecraftServer p_i45283_1_, ISaveHandler p_i45283_2_, String p_i45283_3_, int p_i45283_4_, WorldSettings p_i45283_5_, WorldServer p_i45283_6_, Profiler p_i45283_7_) { super(p_i45283_1_, p_i45283_2_, p_i45283_3_, p_i45283_4_, p_i45283_5_, p_i45283_7_); this.mapStorage = p_i45283_6_.mapStorage; this.worldScoreboard = p_i45283_6_.getScoreboard(); - this.worldInfo = new DerivedWorldInfo(p_i45283_6_.getWorldInfo()); +// this.worldInfo = new DerivedWorldInfo(p_i45283_6_.getWorldInfo()); } protected void saveLevel() throws MinecraftException { + this.saveHandler.saveWorldInfoWithPlayer(this.worldInfo, null); this.perWorldStorage.saveAllData(); } } \ No newline at end of file diff --git a/src/main/java/org/ultramine/server/world/WorldDescriptor.java b/src/main/java/org/ultramine/server/world/WorldDescriptor.java index 8de8a4b..ba099c4 100644 --- a/src/main/java/org/ultramine/server/world/WorldDescriptor.java +++ b/src/main/java/org/ultramine/server/world/WorldDescriptor.java @@ -14,6 +14,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.WorldManager; +import net.minecraft.world.WorldProvider; import net.minecraft.world.WorldServer; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.MinecraftForge; @@ -61,7 +62,6 @@ this.splitWorldDirs = splitWorldDirs; this.dimension = dimension; this.name = name; - this.directory = new File(server.getWorldsDir(), name); } public int getDimension() @@ -80,12 +80,30 @@ { this.mw.transitDescName(this, this.name, name); this.name = name; - this.directory = new File(server.getWorldsDir(), this.name); + if(dimension == 0 || splitWorldDirs) + this.directory = new File(server.getWorldsDir(), this.name); + } + } + + private void inferDirectory() + { + if(dimension == 0 || splitWorldDirs) + { + this.directory = new File(server.getWorldsDir(), name); + } + else + { + String dirName = WorldProvider.getProviderForDimension(dimension).getSaveFolder(); + if(dirName == null || dirName.startsWith("../")) + dirName = "DIM" + dimension; + this.directory = new File(mw.getDescByID(0).getDirectory(), dirName); } } public File getDirectory() { + if(this.directory == null) + inferDirectory(); return this.directory; } @@ -140,8 +158,6 @@ { this.world = world; this.directory = world.getSaveHandler().getWorldDirectory(); - if(dimension != 0 && !splitWorldDirs) - this.directory = new File(this.directory, world.provider.getSaveFolder()); } public WorldServer getOrLoadWorld() diff --git a/src/main/java/org/ultramine/server/world/load/NotSplittedWorldLoader.java b/src/main/java/org/ultramine/server/world/load/NotSplittedWorldLoader.java index 069e96c..fa4c6ab 100644 --- a/src/main/java/org/ultramine/server/world/load/NotSplittedWorldLoader.java +++ b/src/main/java/org/ultramine/server/world/load/NotSplittedWorldLoader.java @@ -1,5 +1,7 @@ package org.ultramine.server.world.load; +import net.minecraft.world.WorldProvider; +import net.minecraft.world.chunk.storage.AnvilSaveHandler; import org.ultramine.server.world.WorldDescriptor; import net.minecraft.server.MinecraftServer; @@ -20,15 +22,17 @@ { WorldServer mainWorld = server.getMultiWorld().getWorldByID(0); ISaveHandler mainSaveHandler = mainWorld.getSaveHandler(); - WorldInfo mainWorldInfo = mainWorld.getWorldInfo(); + String name = desc.getDirectory().getName(); + AnvilSaveHandler save = new AnvilSaveHandler(mainSaveHandler.getWorldDirectory(), name, true); + save.setSingleStorage(); return new WorldServerMulti( server, - mainSaveHandler, - mainWorldInfo.getWorldName(), + save, + name, desc.getDimension(), - makeSettings(mainWorldInfo, desc.getConfig()), + makeSettings(save.loadWorldInfo(), desc.getConfig()), mainWorld, server.theProfiler - ); + ); } } diff --git a/src/main/java/org/ultramine/server/world/load/SplittedWorldLoader.java b/src/main/java/org/ultramine/server/world/load/SplittedWorldLoader.java index 4bb6874..e89f159 100644 --- a/src/main/java/org/ultramine/server/world/load/SplittedWorldLoader.java +++ b/src/main/java/org/ultramine/server/world/load/SplittedWorldLoader.java @@ -1,5 +1,6 @@ package org.ultramine.server.world.load; +import net.minecraft.world.WorldServerMulti; import org.ultramine.server.world.WorldDescriptor; import net.minecraft.server.MinecraftServer; @@ -17,13 +18,24 @@ @Override public WorldServer doLoad() { + WorldServer mainWorld = server.getMultiWorld().getWorldByID(0); ISaveHandler save = getSaveHandler(); ((AnvilSaveHandler)save).setSingleStorage(); - return new WorldServer(server, save, desc.getName(), desc.getDimension(), makeSettings(save.loadWorldInfo(), desc.getConfig()), server.theProfiler); + WorldServerMulti world = new WorldServerMulti( + server, + save, + desc.getName(), + desc.getDimension(), + makeSettings(save.loadWorldInfo(), desc.getConfig()), + mainWorld, + server.theProfiler + ); + world.isSplitted = true; + return world; } protected ISaveHandler getSaveHandler() { - return server.getActiveAnvilConverter().getSaveLoader(desc.getName(), false); + return server.getActiveAnvilConverter().getSaveLoader(desc.getName(), true); } }