kenshinshideandseek/src/main/java/net/tylermurphy/hideAndSeek/command/SaveMap.java

111 lines
3.6 KiB
Java
Raw Normal View History

2021-09-01 01:55:27 +00:00
package net.tylermurphy.hideAndSeek.command;
2021-08-27 21:20:07 +00:00
import static net.tylermurphy.hideAndSeek.Store.*;
import java.io.File;
2021-08-28 00:32:50 +00:00
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
2021-08-27 21:20:07 +00:00
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
2021-08-28 00:32:50 +00:00
import org.bukkit.scheduler.BukkitRunnable;
2021-08-27 21:20:07 +00:00
import net.tylermurphy.hideAndSeek.Main;
import net.tylermurphy.hideAndSeek.util.ICommand;
public class SaveMap implements ICommand {
public void execute(CommandSender sender, String[] args) {
2021-10-11 15:52:56 +00:00
if(!status.equals("Standby")) {
sender.sendMessage(errorPrefix + "Game is currently in session");
return;
}
2021-08-27 21:20:07 +00:00
if(spawnPosition.getBlockX() == 0 && spawnPosition.getBlockY() == 0 && spawnPosition.getBlockZ() == 0) {
sender.sendMessage(errorPrefix + "Please set spawn location first");
return;
}
2021-08-28 00:32:50 +00:00
sender.sendMessage(messagePrefix + "Starting map save");
sender.sendMessage(warningPrefix + "All commands will be disabled when the save is in progress. Do not turn off the server.");
2021-08-27 21:20:07 +00:00
Bukkit.getServer().getWorld(spawnWorld).save();
2021-08-28 00:32:50 +00:00
BukkitRunnable runnable = new BukkitRunnable() {
public void run() {
File current = new File(Main.root+File.separator+spawnWorld);
if(current.exists()) {
File temp_destenation = new File(Main.root+File.separator+"temp_hideandseek_"+spawnWorld);
File destenation = new File(Main.root+File.separator+"hideandseek_"+spawnWorld);
copyFileStructure(current, temp_destenation);
if(destenation.exists()) {
deleteDirectory(destenation);
destenation.mkdir();
}
temp_destenation.renameTo(destenation);
sender.sendMessage(messagePrefix + "Map save complete");
runningBackup = false;
} else {
sender.sendMessage(errorPrefix + "Coudnt find current map");
}
2021-08-27 21:20:07 +00:00
}
2021-08-28 00:32:50 +00:00
};
runnable.runTaskAsynchronously(Main.plugin);
runningBackup = true;
}
private static void copyFileStructure(File source, File target){
try {
ArrayList<String> ignore = new ArrayList<>(Arrays.asList("uid.dat", "session.lock"));
if(!ignore.contains(source.getName())) {
if(source.isDirectory()) {
if(!target.exists())
if (!target.mkdirs())
throw new IOException("Couldn't create world directory!");
String files[] = source.list();
for (String file : files) {
File srcFile = new File(source, file);
File destFile = new File(target, file);
copyFileStructure(srcFile, destFile);
}
} else {
InputStream in = new FileInputStream(source);
OutputStream out = new FileOutputStream(target);
byte[] buffer = new byte[1024];
int length;
while ((length = in.read(buffer)) > 0)
out.write(buffer, 0, length);
in.close();
out.close();
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
2021-08-27 21:20:07 +00:00
}
2021-08-28 00:32:50 +00:00
private boolean deleteDirectory(File directoryToBeDeleted) {
2021-08-27 21:20:07 +00:00
File[] allContents = directoryToBeDeleted.listFiles();
if (allContents != null) {
for (File file : allContents) {
deleteDirectory(file);
}
}
return directoryToBeDeleted.delete();
}
public String getLabel() {
return "saveMap";
}
public String getUsage() {
return "";
}
public String getDescription() {
return "Saves current map for the game. May lag server.";
}
}