diff --git a/src/main/scala/li/cil/oc/common/SaveHandler.scala b/src/main/scala/li/cil/oc/common/SaveHandler.scala index ddc4873c5..9df0fc7bd 100644 --- a/src/main/scala/li/cil/oc/common/SaveHandler.scala +++ b/src/main/scala/li/cil/oc/common/SaveHandler.scala @@ -3,52 +3,46 @@ package li.cil.oc.common import java.io import java.util.logging.Level import li.cil.oc.{OpenComputers, Settings} -import net.minecraft.nbt.NBTTagCompound import net.minecraft.world.ChunkCoordIntPair import net.minecraftforge.common.DimensionManager import net.minecraftforge.event.ForgeSubscribe import net.minecraftforge.event.world.WorldEvent import scala.collection.mutable -// TODO Save all data to an NBT compound and save it as a single file, to improve file I/O performance. object SaveHandler { val saveData = mutable.Map.empty[ChunkCoordIntPair, mutable.Map[String, Array[Byte]]] - var cachedNbt = new NBTTagCompound() - def savePath = new io.File(DimensionManager.getCurrentSaveRootDirectory, Settings.savePath + "state") def scheduleSave(chunk: ChunkCoordIntPair, name: String, data: Array[Byte]) = saveData.synchronized { - if (chunk == null) OpenComputers.log.warning("Cannot save machines with non tile entity owners.") + if (chunk == null) throw new IllegalArgumentException("chunk is null") else saveData.getOrElseUpdate(chunk, mutable.Map.empty[String, Array[Byte]]) += name -> data } def load(chunk: ChunkCoordIntPair, name: String): Array[Byte] = { - if (chunk == null) null - else { - val path = savePath - val chunkPath = new io.File(path, s"${chunk.chunkXPos}.${chunk.chunkZPos}") - val file = new io.File(chunkPath, name) - try { - // val bis = new io.BufferedInputStream(new GZIPInputStream(new io.FileInputStream(file))) - val bis = new io.BufferedInputStream(new io.FileInputStream(file)) - val bos = new io.ByteArrayOutputStream - val buffer = new Array[Byte](8 * 1024) - var read = 0 - do { - read = bis.read(buffer) - if (read > 0) { - bos.write(buffer, 0, read) - } - } while (read >= 0) - bis.close() - bos.toByteArray - } - catch { - case e: io.IOException => - OpenComputers.log.log(Level.WARNING, "Error loading auxiliary tile entity data.", e) - Array.empty[Byte] - } + if (chunk == null) throw new IllegalArgumentException("chunk is null") + val path = savePath + val chunkPath = new io.File(path, s"${chunk.chunkXPos}.${chunk.chunkZPos}") + val file = new io.File(chunkPath, name) + try { + // val bis = new io.BufferedInputStream(new GZIPInputStream(new io.FileInputStream(file))) + val bis = new io.BufferedInputStream(new io.FileInputStream(file)) + val bos = new io.ByteArrayOutputStream + val buffer = new Array[Byte](8 * 1024) + var read = 0 + do { + read = bis.read(buffer) + if (read > 0) { + bos.write(buffer, 0, read) + } + } while (read >= 0) + bis.close() + bos.toByteArray + } + catch { + case e: io.IOException => + OpenComputers.log.log(Level.WARNING, "Error loading auxiliary tile entity data.", e) + Array.empty[Byte] } }