package net.kennux.cubicworld; import java.io.File; import java.io.FileOutputStream; import net.kennux.cubicworld.networking.CubicWorldServerClient; import net.kennux.cubicworld.serialization.BitWriter; import net.kennux.cubicworld.util.ConsoleHelper; /** * <pre> * The server save thread handles user, entity and voxel saving. * The voxel save file takes chunk / voxel updates and enquenes them for the next save. * This thread flushes this quenes in a given interval. * </pre> * * @author KennuX * */ public class CubicWorldServerSaveThread implements Runnable { /** * The cubic world server instance. */ private CubicWorldServer server; /** * The millisecond timestamp when the last save was performed. */ private long lastSave; /** * Save interval in milliseconds. */ private final int saveInterval = 1000; public CubicWorldServerSaveThread(CubicWorldServer server) { this.server = server; } @Override public void run() { while (server.isRunning()) { // Save if (System.currentTimeMillis() - this.lastSave >= this.saveInterval) { try { // Save user info synchronized (this.server.clientsLockObject) { for (CubicWorldServerClient client : this.server.clients) { if (client != null) client.saveUserInfo(); } } // Save entity manager state BitWriter writer = new BitWriter(); this.server.entityManager.serialize(writer); // Write state to entity data file FileOutputStream fos = new FileOutputStream(new File(this.server.savePath + "entities.dat")); fos.write(writer.getPacket()); fos.close(); // Update world file this.server.voxelWorld.flushSave(); } catch (Exception e) { ConsoleHelper.writeLog("ERROR", "Error while writing savegame: ", "Server"); ConsoleHelper.logError(e); System.exit(-1); } this.lastSave = System.currentTimeMillis(); } try { Thread.sleep(1000); } catch (InterruptedException e) { /* NOT EXPECTED */ } } } }