Merge f08b5632ccdb730586b880987c66e241e5ee8e7b into 29cac77e794ed84d3953941c18e670c3db8661e7

This commit is contained in:
Steven Berdak 2017-12-01 20:17:37 +00:00 committed by GitHub
commit 38cd434aa4
4 changed files with 414 additions and 291 deletions

View File

@ -1,6 +1,5 @@
package net.simon987.server; package net.simon987.server;
import net.simon987.server.event.GameEvent; import net.simon987.server.event.GameEvent;
import net.simon987.server.event.GameEventDispatcher; import net.simon987.server.event.GameEventDispatcher;
import net.simon987.server.event.TickEvent; import net.simon987.server.event.TickEvent;
@ -33,6 +32,10 @@ public class GameServer implements Runnable {
private int maxExecutionTime; private int maxExecutionTime;
public ArrayList<byte[]> saveArchive;
public int maxArchiveSize;
public GameServer() { public GameServer() {
this.config = new ServerConfiguration(new File("config.properties")); this.config = new ServerConfiguration(new File("config.properties"));
@ -62,6 +65,9 @@ public class GameServer implements Runnable {
eventDispatcher = new GameEventDispatcher(pluginManager); eventDispatcher = new GameEventDispatcher(pluginManager);
saveArchive = new ArrayList<byte[]>();
maxArchiveSize = config.getInt("max_archive_size");
} }
public GameUniverse getGameUniverse() { public GameUniverse getGameUniverse() {
@ -91,7 +97,8 @@ public class GameServer implements Runnable {
uTime = System.currentTimeMillis() - startTime; uTime = System.currentTimeMillis() - startTime;
waitTime = config.getInt("tick_length") - uTime; waitTime = config.getInt("tick_length") - uTime;
LogManager.LOGGER.info("Wait time : " + waitTime + "ms | Update time: " + uTime + "ms | " + (int) (((double) uTime / waitTime) * 100) + "% load"); LogManager.LOGGER.info("Wait time : " + waitTime + "ms | Update time: " + uTime + "ms | "
+ (int) (((double) uTime / waitTime) * 100) + "% load");
try { try {
if (waitTime >= 0) { if (waitTime >= 0) {
@ -103,7 +110,6 @@ public class GameServer implements Runnable {
} }
} }
private void tick() { private void tick() {
@ -113,7 +119,6 @@ public class GameServer implements Runnable {
GameEvent event = new TickEvent(gameUniverse.getTime()); GameEvent event = new TickEvent(gameUniverse.getTime());
GameServer.INSTANCE.getEventDispatcher().dispatch(event); // Ignore cancellation GameServer.INSTANCE.getEventDispatcher().dispatch(event); // Ignore cancellation
// Process user code // Process user code
ArrayList<User> users_ = gameUniverse.getUsers(); ArrayList<User> users_ = gameUniverse.getUsers();
for (User user : users_) { for (User user : users_) {
@ -155,10 +160,18 @@ public class GameServer implements Runnable {
/** /**
* Save game universe to file in JSON format * Save game universe to file in JSON format
* *
* @param file JSON file to save * @param file
* JSON file to save
*/ */
public void save(File file) { public void save(File file) {
if (new File(new File("save.json").getAbsolutePath()).exists()) {
saveArchive.add(ZipUtils.bytifyFile("save.json"));
while(saveArchive.size() > maxArchiveSize) {
saveArchive.remove(0);
}
}
try { try {
FileWriter fileWriter = new FileWriter(file); FileWriter fileWriter = new FileWriter(file);
@ -194,4 +207,8 @@ public class GameServer implements Runnable {
public void setSocketServer(SocketServer socketServer) { public void setSocketServer(SocketServer socketServer) {
this.socketServer = socketServer; this.socketServer = socketServer;
} }
public ArrayList<byte[]> getSaveArchive() {
return this.saveArchive;
}
} }

View File

@ -4,12 +4,24 @@ import net.simon987.server.logging.LogManager;
import net.simon987.server.webserver.SocketServer; import net.simon987.server.webserver.SocketServer;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
public class Main { public class Main {
public static void main(String[] args) { public static void main(String[] args) {
//Writes all of the files stored in GameServer.saveArray to a zip file.
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
try {
ZipUtils.writeSavesToZip(GameServer.INSTANCE.getSaveArchive());
} catch (IOException e) {
System.out.println("Error writing saves to zip");
e.printStackTrace();
}
}
}, "Shutdown-thread"));
LogManager.initialize(); LogManager.initialize();
ServerConfiguration config = new ServerConfiguration(new File("config.properties")); ServerConfiguration config = new ServerConfiguration(new File("config.properties"));

View File

@ -0,0 +1,91 @@
package net.simon987.server;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import net.simon987.server.logging.LogManager;
public class ZipUtils {
private static final int BUFFER_SIZE = 1024;
public static byte[] bytifyFile(String fileName) {
Path path = Paths.get(fileName);
byte[] bytes = null;
try {
bytes = Files.readAllBytes(path);
} catch (IOException e) {
System.out.println("Failed to extract bytes from: " + fileName);
e.printStackTrace();
}
return bytes;
}
public static String getByteArrAsString(byte[] bytes) throws UnsupportedEncodingException {
return new String(bytes, "UTF-8");
}
public static void writeSavesToZip(ArrayList<byte[]> array) throws IOException {
int writeCount = 0;
FileOutputStream output = new FileOutputStream("archive_" + getDateTimeStamp() + ".zip");
ZipOutputStream stream = new ZipOutputStream(output);
byte[] buffer = new byte[BUFFER_SIZE];
ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
while ((bais.read(buffer)) > -1) {
for (int i = 0; i < array.size(); i++) {
ZipEntry entry = new ZipEntry("save_" + getTickTime(array.get(i)) + ".json");
stream.putNextEntry(entry);
stream.write(array.get(i));
stream.closeEntry();
writeCount++;
}
}
stream.close();
output.close();
LogManager.LOGGER.info(writeCount + " saves moved to zip file archive");
}
private static String getTickTime(byte[] bytes) throws UnsupportedEncodingException {
Pattern pattern = Pattern.compile("\"time\"");
String stringedBytes = getByteArrAsString(bytes);
Matcher matcher = pattern.matcher(stringedBytes);
int startIndex = 0;
while (matcher.find()) {
startIndex = matcher.end() + 1;
}
int endIndex = stringedBytes.indexOf(",", startIndex);
return stringedBytes.substring(startIndex, endIndex);
}
private static String getDateTimeStamp() {
Date millisToDate = new Date(System.currentTimeMillis());
SimpleDateFormat f = new SimpleDateFormat("yyyyMMddHHmmss");
return f.format(millisToDate);
}
}

View File

@ -63,3 +63,6 @@ wg_maxCopperCount=2
user_timeout=500 user_timeout=500
# Free CPU execution time in ms # Free CPU execution time in ms
user_free_execution_time=2 user_free_execution_time=2
# ----------------------------------------------
# Max saves to archive when the server is shutdown
max_archive_size=10