diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java index 1be706b..cdc9f49 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -595,6 +595,9 @@ this.serverConfigManager.saveOnePlayerData(tickCounter); for(WorldServer world : worldServers) world.theChunkProviderServer.saveOneChunk(tickCounter); + if(tickCounter % 2401 == 0) + for(WorldServer world : worldServers) + world.saveOtherData(); this.theProfiler.endSection(); // } diff --git a/src/main/java/net/minecraft/world/WorldServer.java b/src/main/java/net/minecraft/world/WorldServer.java index 4fcde66..9816030 100644 --- a/src/main/java/net/minecraft/world/WorldServer.java +++ b/src/main/java/net/minecraft/world/WorldServer.java @@ -1060,4 +1060,13 @@ { return border; } + + public void saveOtherData() + { + try + { + saveLevel(); + } catch (MinecraftException ignored) {} + MinecraftForge.EVENT_BUS.post(new WorldEvent.Save(this)); + } } \ No newline at end of file diff --git a/src/main/java/net/minecraft/world/storage/MapStorage.java b/src/main/java/net/minecraft/world/storage/MapStorage.java index b7b0a60..29f32ef 100644 --- a/src/main/java/net/minecraft/world/storage/MapStorage.java +++ b/src/main/java/net/minecraft/world/storage/MapStorage.java @@ -10,6 +10,9 @@ import java.util.Iterator; import java.util.List; import java.util.Map; + +import org.ultramine.server.util.AsyncIOUtils; + import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; @@ -125,9 +128,7 @@ p_75747_1_.writeToNBT(nbttagcompound); NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setTag("data", nbttagcompound); - FileOutputStream fileoutputstream = new FileOutputStream(file1); - CompressedStreamTools.writeCompressed(nbttagcompound1, fileoutputstream); - fileoutputstream.close(); + AsyncIOUtils.safeWriteNBT(file1, nbttagcompound1); } } catch (Exception exception) diff --git a/src/main/java/net/minecraft/world/storage/SaveHandler.java b/src/main/java/net/minecraft/world/storage/SaveHandler.java index 3a60995..c915deb 100644 --- a/src/main/java/net/minecraft/world/storage/SaveHandler.java +++ b/src/main/java/net/minecraft/world/storage/SaveHandler.java @@ -16,8 +16,10 @@ import net.minecraft.world.MinecraftException; import net.minecraft.world.WorldProvider; import net.minecraft.world.chunk.storage.IChunkLoader; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.ultramine.server.util.GlobalExecutors; public class SaveHandler implements ISaveHandler, IPlayerFileData { @@ -161,41 +163,48 @@ public void saveWorldInfoWithPlayer(WorldInfo p_75755_1_, NBTTagCompound p_75755_2_) { NBTTagCompound nbttagcompound1 = p_75755_1_.cloneNBTCompound(p_75755_2_); - NBTTagCompound nbttagcompound2 = new NBTTagCompound(); + final NBTTagCompound nbttagcompound2 = new NBTTagCompound(); nbttagcompound2.setTag("Data", nbttagcompound1); FMLCommonHandler.instance().handleWorldDataSave(this, p_75755_1_, nbttagcompound2); - try + GlobalExecutors.writingIOExecutor().execute(new Runnable() { - File file1 = new File(this.worldDirectory, "level.dat_new"); - File file2 = new File(this.worldDirectory, "level.dat_old"); - File file3 = new File(this.worldDirectory, "level.dat"); - CompressedStreamTools.writeCompressed(nbttagcompound2, new FileOutputStream(file1)); - - if (file2.exists()) + @Override + public void run() { - file2.delete(); + try + { + File file1 = new File(worldDirectory, "level.dat_new"); + File file2 = new File(worldDirectory, "level.dat_old"); + File file3 = new File(worldDirectory, "level.dat"); + CompressedStreamTools.writeCompressed(nbttagcompound2, new FileOutputStream(file1)); + + if (file2.exists()) + { + file2.delete(); + } + + file3.renameTo(file2); + + if (file3.exists()) + { + file3.delete(); + } + + file1.renameTo(file3); + + if (file1.exists()) + { + file1.delete(); + } + } + catch (Exception exception) + { + exception.printStackTrace(); + } } - - file3.renameTo(file2); - - if (file3.exists()) - { - file3.delete(); - } - - file1.renameTo(file3); - - if (file1.exists()) - { - file1.delete(); - } - } - catch (Exception exception) - { - exception.printStackTrace(); - } + }); } public void saveWorldInfo(WorldInfo p_75761_1_)