diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java index 65fa01a..d68d3fe 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -1548,6 +1548,16 @@ { return getDataDirectory(); } + + public File getVanillaFile(String name) + { + return getFile(name); + } + + public File getStorageFile(String name) + { + return getFile(name); + } public File getBackupDir() { diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java index 1bcfb57..6f9e9da 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -53,6 +53,7 @@ import org.ultramine.server.internal.JLineSupport; import org.ultramine.server.util.BasicTypeParser; import org.ultramine.server.util.GlobalExecutors; +import org.ultramine.server.world.WorldDescriptor; @SideOnly(Side.SERVER) public class DedicatedServer extends MinecraftServer implements IServer @@ -71,7 +72,7 @@ public DedicatedServer(File p_i1508_1_) { super(p_i1508_1_, Proxy.NO_PROXY); - field_152367_a = new File(getDataDirectory(), "usercache.json"); + field_152367_a = getVanillaFile("usercache.json"); field_152366_X = new PlayerProfileCache(this, field_152367_a); Thread thread = new Thread("Server Infinisleeper") { @@ -608,16 +609,22 @@ } @Override - protected File getDataDirectory() - { - return ConfigurationHandler.getStorageDir(); - } - - @Override public File getHomeDirectory() { return FMLLaunchHandler.getMinecraftHome(); } + + @Override + public File getVanillaFile(String name) + { + return new File(ConfigurationHandler.getVanillaConfigsDir(), name); + } + + @Override + public File getStorageFile(String name) + { + return new File(ConfigurationHandler.getStorageDir(), name); + } @Override public BackupManager getBackupManager() diff --git a/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java b/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java index 32c6d89..defaf23 100644 --- a/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java +++ b/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java @@ -64,7 +64,6 @@ import net.minecraft.world.WorldProvider; import net.minecraft.world.WorldServer; import net.minecraft.world.WorldSettings; -import net.minecraft.world.chunk.Chunk; import net.minecraft.world.demo.DemoWorldManager; import net.minecraft.world.storage.IPlayerFileData; @@ -72,18 +71,16 @@ import org.apache.logging.log4j.Logger; import org.ultramine.permission.MinecraftPermissions; import org.ultramine.server.ConfigurationHandler; -import org.ultramine.server.PermissionHandler; -import org.ultramine.server.chunk.IChunkLoadCallback; import org.ultramine.server.data.ServerDataLoader; import org.ultramine.server.internal.UMHooks; import org.ultramine.server.util.WarpLocation; public abstract class ServerConfigurationManager { - public static File field_152613_a = MinecraftServer.getServer().getFile("banned-players.json"); - public static File field_152614_b = MinecraftServer.getServer().getFile("banned-ips.json"); - public static File field_152615_c = MinecraftServer.getServer().getFile("ops.json"); - public static File field_152616_d = MinecraftServer.getServer().getFile("whitelist.json"); + public static File field_152613_a = MinecraftServer.getServer().getVanillaFile("banned-players.json"); + public static File field_152614_b = MinecraftServer.getServer().getVanillaFile("banned-ips.json"); + public static File field_152615_c = MinecraftServer.getServer().getVanillaFile("ops.json"); + public static File field_152616_d = MinecraftServer.getServer().getVanillaFile("whitelist.json"); private static final Logger logger = LogManager.getLogger(); private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd \'at\' HH:mm:ss z"); private final MinecraftServer mcServer; @@ -104,10 +101,10 @@ public ServerConfigurationManager(MinecraftServer p_i1500_1_) { - field_152613_a = p_i1500_1_.getFile("banned-players.json"); - field_152614_b = p_i1500_1_.getFile("banned-ips.json"); - field_152615_c = p_i1500_1_.getFile("ops.json"); - field_152616_d = p_i1500_1_.getFile("whitelist.json"); + field_152613_a = p_i1500_1_.getVanillaFile("banned-players.json"); + field_152614_b = p_i1500_1_.getVanillaFile("banned-ips.json"); + field_152615_c = p_i1500_1_.getVanillaFile("ops.json"); + field_152616_d = p_i1500_1_.getVanillaFile("whitelist.json"); this.bannedPlayers = new UserListBans(field_152613_a); this.bannedIPs = new BanList(field_152614_b); diff --git a/src/main/java/org/ultramine/server/ConfigurationHandler.java b/src/main/java/org/ultramine/server/ConfigurationHandler.java index 311ae18..006cbc3 100644 --- a/src/main/java/org/ultramine/server/ConfigurationHandler.java +++ b/src/main/java/org/ultramine/server/ConfigurationHandler.java @@ -1,8 +1,13 @@ package org.ultramine.server; import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Random; +import net.minecraft.server.MinecraftServer; +import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.ultramine.server.util.AsyncIOUtils; @@ -12,15 +17,17 @@ import cpw.mods.fml.relauncher.FMLLaunchHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import org.ultramine.server.world.WorldDescriptor; @SideOnly(Side.SERVER) public class ConfigurationHandler { - public static Logger log = LogManager.getLogger(); + private static Logger log = LogManager.getLogger(); - private static File settingsDir = new File(FMLLaunchHandler.getMinecraftHome(), "settings"); - private static File storageDir = new File(FMLLaunchHandler.getMinecraftHome(), "storage"); - private static File worldsDir = new File(FMLLaunchHandler.getMinecraftHome(), "worlds"); + private static File settingsDir = new File(FMLLaunchHandler.getMinecraftHome(), System.getProperty("org.ultramine.dirs.settings", "settings")); + private static File storageDir = new File(FMLLaunchHandler.getMinecraftHome(), System.getProperty("org.ultramine.dirs.storage", "storage")); + private static File worldsDir = new File(FMLLaunchHandler.getMinecraftHome(), System.getProperty("org.ultramine.dirs.worlds", "worlds")); + private static File vanillaConfigsDir = new File(FMLLaunchHandler.getMinecraftHome(), System.getProperty("org.ultramine.dirs.vanilla", "storage")); private static File serverConfigFile = new File(getSettingDir(), "server.yml"); private static File worldsConfigFile = new File(getSettingDir(), "worlds.yml"); @@ -30,9 +37,14 @@ static { - if(!settingsDir.exists()) settingsDir.mkdir(); - if(!storageDir.exists()) storageDir.mkdir(); - if(!worldsDir.exists()) worldsDir.mkdir(); + try { + FileUtils.forceMkdir(settingsDir); + FileUtils.forceMkdir(storageDir); + FileUtils.forceMkdir(worldsDir); + FileUtils.forceMkdir(vanillaConfigsDir); + } catch (IOException e) { + throw new RuntimeException("Failed to create necessary server directories", e); + } } public static void load() @@ -50,6 +62,29 @@ worldsConfig = YamlConfigProvider.readConfig(worldsConfigFile, WorldsConfig.class); } } + + static void postWorldDescsLoad() + { + // Creating symlink ./world -> ./worlds/world for mods compatibility + WorldDescriptor desc = MinecraftServer.getServer().getMultiWorld().getDescByID(0); + if(desc != null) + { + try { + Path vanillaDir = new File(FMLLaunchHandler.getMinecraftHome(), desc.getName()).toPath(); + Path realDir = desc.getDirectory().toPath(); + if(!vanillaDir.equals(realDir)) + { + if(!Files.exists(realDir)) + Files.createDirectory(realDir); + if(Files.isSymbolicLink(vanillaDir) && !Files.isSameFile(vanillaDir, realDir)) + Files.delete(vanillaDir); + if(!Files.exists(vanillaDir)) + Files.createSymbolicLink(vanillaDir, realDir); + } + } catch (IOException ignored) {} + + } + } public static File getSettingDir() { @@ -65,6 +100,11 @@ { return worldsDir; } + + public static File getVanillaConfigsDir() + { + return vanillaConfigsDir; + } public static UltramineServerConfig getServerConfig() { diff --git a/src/main/java/org/ultramine/server/UltramineServerModContainer.java b/src/main/java/org/ultramine/server/UltramineServerModContainer.java index 9780f31..64ac8f8 100644 --- a/src/main/java/org/ultramine/server/UltramineServerModContainer.java +++ b/src/main/java/org/ultramine/server/UltramineServerModContainer.java @@ -5,7 +5,6 @@ import java.util.Map; import net.minecraft.command.CommandHandler; -import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.server.MinecraftServer; import net.minecraftforge.common.MinecraftForge; @@ -102,6 +101,7 @@ ConfigurationHandler.load(); Databases.init(); MinecraftServer.getServer().getMultiWorld().preloadConfigs(); + ConfigurationHandler.postWorldDescsLoad(); } } catch (Throwable t) diff --git a/src/main/java/org/ultramine/server/data/NBTFileDataProvider.java b/src/main/java/org/ultramine/server/data/NBTFileDataProvider.java index 62d98b7..08b6e6d 100644 --- a/src/main/java/org/ultramine/server/data/NBTFileDataProvider.java +++ b/src/main/java/org/ultramine/server/data/NBTFileDataProvider.java @@ -125,7 +125,7 @@ @Override public Map loadWarps() { - File file = mgr.getServerInstance().getFile("warps.yml"); + File file = mgr.getServerInstance().getStorageFile("warps.yml"); if(file.exists()) { YamlWarpList warps = YamlConfigProvider.getOrCreateConfig(file, YamlWarpList.class); @@ -246,7 +246,7 @@ private void writeWarpList() { - File file = mgr.getServerInstance().getFile("warps.yml"); + File file = mgr.getServerInstance().getStorageFile("warps.yml"); YamlWarpList warps = new YamlWarpList(); warps.warps = mgr.getDataLoader().getWarps(); warps.fastWarps = mgr.getDataLoader().getFastWarps();