From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=84=97=E3=84=A0=CB=8B=20=E3=84=91=E3=84=A7=CB=8A?= Date: Fri, 3 Apr 2020 14:59:22 +0800 Subject: [PATCH] Akarin configuration diff --git a/src/main/java/co/aikar/timings/TimingsExport.java b/src/main/java/co/aikar/timings/TimingsExport.java index 5dfa0658838c4801cdf260eae8b98163f729e5af..841a8d2b392acdcef90592b841cbbcb2237c6901 100644 --- a/src/main/java/co/aikar/timings/TimingsExport.java +++ b/src/main/java/co/aikar/timings/TimingsExport.java @@ -231,6 +231,7 @@ public class TimingsExport extends Thread { pair("bukkit", mapAsJSON(Bukkit.spigot().getBukkitConfig(), null)), pair("paper", mapAsJSON(Bukkit.spigot().getPaperConfig(), null)), // Tuinity - add config to timings report pair("tuinity", mapAsJSON(Bukkit.spigot().getTuinityConfig(), null)) // Tuinity - add config to timings report + , pair("akarin", mapAsJSON(Bukkit.spigot().getAkarinConfig(), null)) // Akarin - Server config )); new TimingsExport(listeners, parent, history).start(); diff --git a/src/main/java/io/akarin/server/Config.java b/src/main/java/io/akarin/server/Config.java new file mode 100644 index 0000000000000000000000000000000000000000..2ac8f02a97429f04f3e5c9206ec228edccaf24c9 --- /dev/null +++ b/src/main/java/io/akarin/server/Config.java @@ -0,0 +1,183 @@ +package io.akarin.server; + +import org.bukkit.Bukkit; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.List; +import java.util.logging.Level; + +public final class Config { + + public static final String CONFIG_HEADER = "Configuration file for Akarin."; + public static final int CURRENT_CONFIG_VERSION = 1; + + private static final Object[] EMPTY = new Object[0]; + + private static File configFile; + public static YamlConfiguration config; + private static int configVersion; + + public static void init(final File file) { + Config.configFile = file; + final YamlConfiguration config = new YamlConfiguration(); + config.options().header(CONFIG_HEADER); + config.options().copyDefaults(true); + + if (!file.exists()) { + try { + file.createNewFile(); + } catch (final Exception ex) { + Bukkit.getLogger().log(Level.SEVERE, "Failure to create Akarin config", ex); + } + } else { + try { + config.load(file); + } catch (final Exception ex) { + Bukkit.getLogger().log(Level.SEVERE, "Failure to load Akarin config", ex); + throw new RuntimeException(ex); + } + } + + Config.load(config); + } + + public static void load(final YamlConfiguration config) { + Config.config = config; + Config.configVersion = Config.getInt("config-version-please-do-not-modify-me", CURRENT_CONFIG_VERSION); + Config.set("config-version-please-do-not-modify-me", CURRENT_CONFIG_VERSION); + + for (final Method method : Config.class.getDeclaredMethods()) { + if (method.getReturnType() != void.class || method.getParameterCount() != 0 || + !Modifier.isPrivate(method.getModifiers()) || !Modifier.isStatic(method.getModifiers())) { + continue; + } + + try { + method.setAccessible(true); + method.invoke(null, EMPTY); + } catch (final Exception ex) { + throw new RuntimeException(ex); + } + } + + /* We re-save to add new options */ + try { + config.save(Config.configFile); + } catch (final Exception ex) { + Bukkit.getLogger().log(Level.SEVERE, "Unable to save Akarin config", ex); + } + } + + static void set(final String path, final Object value) { + Config.config.set(path, value); + } + + static boolean getBoolean(final String path, final boolean dfl) { + Config.config.addDefault(path, Boolean.valueOf(dfl)); + return Config.config.getBoolean(path, dfl); + } + + static int getInt(final String path, final int dfl) { + Config.config.addDefault(path, Integer.valueOf(dfl)); + return Config.config.getInt(path, dfl); + } + + static long getLong(final String path, final long dfl) { + Config.config.addDefault(path, Long.valueOf(dfl)); + return Config.config.getLong(path, dfl); + } + + static double getDouble(final String path, final double dfl) { + Config.config.addDefault(path, Double.valueOf(dfl)); + return Config.config.getDouble(path, dfl); + } + + public static final class WorldConfig { + + public final String worldName; + public ConfigurationSection config; + ConfigurationSection worldDefaults; + + public WorldConfig(final String worldName) { + this.worldName = worldName; + this.init(); + } + + public void init() { + this.worldDefaults = Config.config.getConfigurationSection("world-settings.default"); + if (this.worldDefaults == null) { + this.worldDefaults = Config.config.createSection("world-settings.default"); + } + + String worldSectionPath = "world-settings.".concat(this.worldName); + ConfigurationSection section = Config.config.getConfigurationSection(worldSectionPath); + if (section == null) { + section = Config.config.createSection(worldSectionPath); + } + Config.config.set(worldSectionPath, section); + + this.load(section); + } + + public void load(final ConfigurationSection config) { + this.config = config; + + for (final Method method : Config.WorldConfig.class.getDeclaredMethods()) { + if (method.getReturnType() != void.class || method.getParameterCount() != 0 || + !Modifier.isPrivate(method.getModifiers()) || Modifier.isStatic(method.getModifiers())) { + continue; + } + + try { + method.setAccessible(true); + method.invoke(this, EMPTY); + } catch (final Exception ex) { + throw new RuntimeException(ex); + } + } + + /* We re-save to add new options */ + try { + Config.config.save(Config.configFile); + } catch (final Exception ex) { + Bukkit.getLogger().log(Level.SEVERE, "Unable to save Akarin config", ex); + } + } + + /** + * update world defaults for the specified path, but also sets this world's config value for the path + * if it exists + */ + void set(final String path, final Object val) { + this.worldDefaults.set(path, val); + if (this.config.get(path) != null) { + this.config.set(path, val); + } + } + + boolean getBoolean(final String path, final boolean dfl) { + this.worldDefaults.addDefault(path, Boolean.valueOf(dfl)); + return this.config.getBoolean(path, this.worldDefaults.getBoolean(path)); + } + + int getInt(final String path, final int dfl) { + this.worldDefaults.addDefault(path, Integer.valueOf(dfl)); + return this.config.getInt(path, this.worldDefaults.getInt(path)); + } + + long getLong(final String path, final long dfl) { + this.worldDefaults.addDefault(path, Long.valueOf(dfl)); + return this.config.getLong(path, this.worldDefaults.getLong(path)); + } + + double getDouble(final String path, final double dfl) { + this.worldDefaults.addDefault(path, Double.valueOf(dfl)); + return this.config.getDouble(path, this.worldDefaults.getDouble(path)); + } + } + +} diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java index 2644b190813cc934914aeab78fbd6515d1a37c4a..1dc0f83847df72824af11a18b73906bc23e3d376 100644 --- a/src/main/java/net/minecraft/server/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/DedicatedServer.java @@ -19,6 +19,8 @@ import java.util.Optional; import java.util.function.BooleanSupplier; import java.util.regex.Pattern; import javax.annotation.Nullable; + +import io.akarin.server.Config; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -176,7 +178,8 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // load version history now // Paper end com.tuinity.tuinity.config.TuinityConfig.init((java.io.File) options.valueOf("tuinity-settings")); // Tuinity - Server Config - + Config.init((java.io.File) options.valueOf("akarin-settings")); // Akarin - Server Config + this.setPVP(dedicatedserverproperties.pvp); this.setAllowFlight(dedicatedserverproperties.allowFlight); this.setResourcePack(dedicatedserverproperties.resourcePack, this.ba()); diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java index 970c1be5477a01ab9c6d79e84c519e22775564ff..4020533364aa6a2075b700a3f98385b55146ace3 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -18,6 +18,8 @@ import java.util.function.Consumer; import java.util.function.Predicate; import java.util.function.Supplier; import javax.annotation.Nullable; + +import io.akarin.server.Config; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -95,6 +97,7 @@ public abstract class World implements GeneratorAccess, AutoCloseable { public final ChunkPacketBlockController chunkPacketBlockController; // Paper - Anti-Xray public final com.tuinity.tuinity.config.TuinityConfig.WorldConfig tuinityConfig; // Tuinity - Server Config + public final Config.WorldConfig akarinConfig; // Akarin - Server Config public final co.aikar.timings.WorldTimingsHandler timings; // Paper public static BlockPosition lastPhysicsProblem; // Spigot @@ -187,6 +190,7 @@ public abstract class World implements GeneratorAccess, AutoCloseable { this.paperConfig = new com.destroystokyo.paper.PaperWorldConfig(((WorldDataServer) worlddatamutable).getName(), this.spigotConfig); // Paper this.chunkPacketBlockController = this.paperConfig.antiXray ? new ChunkPacketBlockControllerAntiXray(this, executor) : ChunkPacketBlockController.NO_OPERATION_INSTANCE; // Paper - Anti-Xray this.tuinityConfig = new com.tuinity.tuinity.config.TuinityConfig.WorldConfig(((WorldDataServer)worlddatamutable).getName()); // Tuinity - Server Config + this.akarinConfig = new Config.WorldConfig(((WorldDataServer)worlddatamutable).getName()); // Akarin - Server Config this.generator = gen; this.world = new CraftWorld((WorldServer) this, gen, env); this.ticksPerAnimalSpawns = this.getServer().getTicksPerAnimalSpawns(); // CraftBukkit diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index f994e99ebc8fe22e6f6b45f6379ec410a598789f..edaf09bb3fbcc1752f16e893a761cec1497acca2 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -865,6 +865,7 @@ public final class CraftServer implements Server { org.spigotmc.SpigotConfig.init((File) console.options.valueOf("spigot-settings")); // Spigot com.destroystokyo.paper.PaperConfig.init((File) console.options.valueOf("paper-settings")); // Paper com.tuinity.tuinity.config.TuinityConfig.init((File) console.options.valueOf("tuinity-settings")); // Tuinity - Server Config + io.akarin.server.Config.init((File) console.options.valueOf("akarin-settings")); // Akarin - Server Config for (WorldServer world : console.getWorlds()) { world.worldDataServer.setDifficulty(config.difficulty); world.setSpawnFlags(config.spawnMonsters, config.spawnAnimals); @@ -900,6 +901,7 @@ public final class CraftServer implements Server { world.spigotConfig.init(); // Spigot world.paperConfig.init(); // Paper world.tuinityConfig.init(); // Tuinity - Server Config + world.akarinConfig.init(); // Akarin - Server Config } Plugin[] pluginClone = pluginManager.getPlugins().clone(); // Paper @@ -2357,6 +2359,14 @@ public final class CraftServer implements Server { } // Tuinity end - add config to timings report + // Akarin Start - Server Config + @Override + public YamlConfiguration getAkarinConfig() + { + return io.akarin.server.Config.config; + } + // Akarin End - Server Config + @Override public void restart() { org.spigotmc.RestartCommand.restart(); diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java index 0f6cb508a170360b6479f9c34048412453fbb89d..86a7d9c33fc156d689b8966dd3f02d6ce015fc58 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -146,6 +146,14 @@ public class Main { .describedAs("Yml file"); /* Conctete End - Server Config */ + // Akarin Start - Server Config + acceptsAll(asList("akarin", "akarin-settings"), "File for Akarin settings") + .withRequiredArg() + .ofType(File.class) + .defaultsTo(new File("akarin.yml")) + .describedAs("Yml file"); + // Akarin End - Server Config + // Paper start acceptsAll(asList("server-name"), "Name of the server") .withRequiredArg()