package de.fanta.challengesjoinentities;
import org.apache.commons.io.FileUtils;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class Server {
public static HashMap<Server, UUID> serverPlayers = new HashMap<>();
private final ChallengesJoinEntities plugin;
private final String name;
private final String gPLocation;
private final String dir;
private final ServerType serverType;
private final Location piglinLocation;
private boolean online;
public Server(String name, String gPLocation, String dir, ServerType serverType, ChallengesJoinEntities plugin, Location piglinLocation) {
this.name = name;
this.gPLocation = gPLocation;
this.dir = dir;
this.serverType = serverType;
this.plugin = plugin;
this.online = (plugin.getGlobalDataHelper().getServer(name) != null);
this.piglinLocation = piglinLocation;
}
public static Server getServerfromPlayer(Player p) {
Server server = null;
if (serverPlayers.containsValue(p.getUniqueId()))
for (Map.Entry<Server, UUID> entry : serverPlayers.entrySet()) {
if (entry.getValue().equals(p.getUniqueId()))
server = entry.getKey();
}
return server;
}
public boolean isOnline() {
return this.online;
}
public void setOnline(boolean online) {
this.online = online;
}
public String getName() {
return this.name;
}
public String getGPLocation() {
return this.gPLocation;
}
public void loadSaved(Player p, String slot) {
this.online = true;
serverPlayers.put(this, p.getUniqueId());
UUID uuid = p.getUniqueId();
File dir;
dir = new File("/home/minecraft/" + this.serverType.getDir() + "/" + uuid + "/" + slot);
if (!dir.isDirectory()) {
ChatUtil.sendErrorMessage(p, "Du hast noch keine Map gespeichert!");
this.online = false;
serverPlayers.remove(this);
return;
}
load(p, this.serverType.getDir(), uuid + "/" + slot, getMapVersion(new File(dir + "/Challenges/serverconfig.yml"))); //TODO LOAD VERSION FROM ADVENTURE CONFIG
}
public void loadSaved(Player p, String mapname, String slot) {
this.online = true;
serverPlayers.put(this, p.getUniqueId());
File dir;
dir = new File("/home/minecraft/" + this.serverType.getDir() + "/" + mapname + "/" + slot);
mapname = mapname + "/" + slot;
if (!dir.isDirectory()) {
ChatUtil.sendErrorMessage(p, "Map " + mapname + " nicht gefunden!");
this.online = false;
serverPlayers.remove(this);
return;
}
load(p, this.serverType.getDir(), mapname, getMapVersion(new File(dir + "/Challenges/serverconfig.yml"))); //TODO LOAD VERSION FROM ADVENTURE CONFIG
}
public void loadNewAdventure(Player player, String category, String map) {
this.online = true;
serverPlayers.put(this, player.getUniqueId());
File dir = new File("/home/minecraft/Adventure-Maps", category + "/" + map);
if (!dir.isDirectory()) {
ChatUtil.sendErrorMessage(player, "Map " + map + " nicht gefunden!");
this.online = false;
serverPlayers.remove(this);
return;
}
load(player, "Adventure-Maps", category + "/" + map, getMapVersion(new File(dir + "/Challenges/serverconfig.yml"))); //TODO LOAD VERSION FROM ADVENTURE CONFIG
}
public void load(Player p, String serverTypeDir, String targetDir, String ServerVersion) {
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
File configs = new File("/home/minecraft/" + this.dir + "/plugins/Challenges");
File end = new File("/home/minecraft/" + this.dir + "/world_the_end");
File nether = new File("/home/minecraft/" + this.dir + "/world_nether");
File world = new File("/home/minecraft/" + this.dir + "/world");
File mlgworld = new File("/home/minecraft/" + this.dir + "/mlg_challenge");
File serverJar = new File("/home/minecraft/" + this.dir + "/paper.jar");
File saveServerJar = new File("/home/minecraft/ServerJars/" + ServerVersion + "/paper.jar");
File saveend = new File("/home/minecraft/" + serverTypeDir + "/" + targetDir + "/world_the_end");
File savenether = new File("/home/minecraft/" + serverTypeDir + "/" + targetDir + "/world_nether");
File saveworld = new File("/home/minecraft/" + serverTypeDir + "/" + targetDir + "/world");
File saveconfigs = new File("/home/minecraft/" + serverTypeDir + "/" + targetDir + "/Challenges");
ChatUtil.sendNormalMessage(p, "Versuche Map zu laden!");
try {
if (world.isDirectory()) {
FileUtils.deleteDirectory(world);
FileUtils.deleteDirectory(end);
FileUtils.deleteDirectory(nether);
}
if (mlgworld.isDirectory()) {
FileUtils.deleteDirectory(mlgworld);
}
if (serverJar.exists()) {
FileUtils.delete(serverJar);
}
FileUtils.copyFile(saveServerJar, serverJar);
FileUtils.copyDirectory(saveconfigs, configs);
FileUtils.copyDirectory(saveworld, world);
FileUtils.copyDirectory(savenether, nether);
FileUtils.copyDirectory(saveend, end);
File serverConfigFile = new File("/home/minecraft/" + this.dir + "/plugins/Challenges/serverconfig.yml");
YamlConfiguration serverConfig = new YamlConfiguration();
serverConfig.load(serverConfigFile);
String tempServerType = serverConfig.getString("servertype");
if (tempServerType == null || tempServerType.equals("CHALLENGE")) {
serverConfig.set("servertype", "CHALLENGE_LOAD");
serverConfig.save(serverConfigFile);
Bukkit.getLogger().info(serverConfigFile.getAbsolutePath());
}
} catch (IOException | InvalidConfigurationException e) {
e.printStackTrace();
ChatUtil.sendErrorMessage(p, "Map konnte nicht geladen werden!");
this.online = false;
serverPlayers.remove(this);
return;
}
ChatUtil.sendNormalMessage(p, "Map wurde geladen! Server wird nun gestartet!");
start(p);
});
}
public void start(Player player) {
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("screen", "-AmdS", player.getName(), "./start.sh").directory(new File("/home/minecraft/" + this.dir));
try {
processBuilder.start();
Bukkit.getLogger().info(this.serverType.toString().toLowerCase() + " Server: " + getServerfromPlayer(player).gPLocation + " wurde von " + player.getName() + " gestartet!");
} catch (IOException e) {
e.printStackTrace();
}
}
public void spawnPiglin(Player player) {
this.plugin.spawnPiglin(this.piglinLocation, this.name, this.gPLocation, player.getName(), false);
}
public void despawnPiglin() {
this.plugin.despawnPiglin(this.name);
}
public void spawnNPC(Player player) {
this.plugin.spawnNPC(this.piglinLocation, this.name, this.gPLocation, player.getName(), false);
}
public void despawnNPC() {
this.plugin.despawnNPC(this.name);
}
public String getMapVersion(File config) {
String serverVersion;
YamlConfiguration serverConfiguration = new YamlConfiguration();
if (!config.exists()) {
serverVersion = "latest";
return serverVersion;
}
try {
serverConfiguration.load(config);
} catch (IOException | org.bukkit.configuration.InvalidConfigurationException e) {
e.printStackTrace();
}
String configServerVersion = serverConfiguration.getString("serverversion");
File serverversionfolder = new File("/home/minecraft/ServerJars/" + configServerVersion);
if (configServerVersion != null) {
if (serverversionfolder.isDirectory()) {
serverVersion = configServerVersion;
} else {
serverVersion = "latest";
}
} else {
serverVersion = "latest";
}
return serverVersion;
}
}