Files
KeYiMC/patches/server/0002-Config-and-command.patch
2022-10-20 14:36:16 +08:00

282 lines
10 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: nostalgic853 <yuu8583@proton.me>
Date: Thu, 20 Oct 2022 10:57:42 +0800
Subject: [PATCH] Config and command
diff --git a/src/main/java/cc/keyimc/keyi/KeyiCommand.java b/src/main/java/cc/keyimc/keyi/KeyiCommand.java
new file mode 100644
index 0000000000000000000000000000000000000000..5ec7a427abba42de2fdcb480586cc17e74bc5c52
--- /dev/null
+++ b/src/main/java/cc/keyimc/keyi/KeyiCommand.java
@@ -0,0 +1,66 @@
+package cc.keyimc.keyi;
+
+import cc.keyimc.keyi.utils.TextUtil;
+import net.minecraft.server.MinecraftServer;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public final class KeyiCommand extends Command {
+
+ public KeyiCommand() {
+ super("keyi");
+ this.description = "KeYi command";
+ this.usageMessage = "/keyi help";
+ this.setPermission("keyi.command");
+ }
+
+ @Override
+ public List<String> tabComplete(CommandSender sender, String alias, String[] args, Location location) throws IllegalArgumentException {
+ List<String> feedback = new ArrayList<>();
+
+ if (args.length >= 1) {
+ feedback.add("reload");
+ feedback.add("help");
+ feedback.add("version");
+ }
+
+ return feedback;
+ }
+
+ @Override
+ public boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, @NotNull String[] args) {
+ if (args.length > 0) {
+ if (args[0].equalsIgnoreCase("help")) {
+ sender.sendMessage(TextUtil.deserialize("<#00f898>KeYi commands:"));
+ sender.sendMessage(TextUtil.deserialize("<gray>/keyi reload - reload KeYi config."));
+ sender.sendMessage(TextUtil.deserialize("<gray>/keyi help - show this help message."));
+ sender.sendMessage(TextUtil.deserialize("<gray>/keyi version - show server version information."));
+ return true;
+ }
+
+ if (args[0].equalsIgnoreCase("reload")) {
+ KeyiConfig.reload();
+ sender.sendMessage(TextUtil.deserialize("<#00f898>Reload completed!"));
+
+ var minecraftServer = MinecraftServer.getServer();
+ minecraftServer.server.reloadCount++;
+ }
+
+ if (args[0].equalsIgnoreCase("version")) {
+ Bukkit.dispatchCommand(sender, "bukkit:version");
+ }
+ }
+
+ return true;
+ }
+
+ public static void init() {
+ MinecraftServer.getServer().server.getCommandMap().register("keyi", "KeYi", new KeyiCommand());
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/cc/keyimc/keyi/KeyiConfig.java b/src/main/java/cc/keyimc/keyi/KeyiConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..bc9403d002ef24e71be67a962d099f5d73db9540
--- /dev/null
+++ b/src/main/java/cc/keyimc/keyi/KeyiConfig.java
@@ -0,0 +1,135 @@
+
+package cc.keyimc.keyi;
+
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableMap;
+import net.minecraft.server.MinecraftServer;
+import org.bukkit.Bukkit;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.configuration.InvalidConfigurationException;
+import org.bukkit.configuration.file.YamlConfiguration;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+
+public final class KeyiConfig {
+ private static File CONFIG_FILE;
+
+ public static YamlConfiguration config;
+
+ public static int version;
+ static boolean verbose;
+
+ public static void init(File configFile) {
+ CONFIG_FILE = configFile;
+ config = new YamlConfiguration();
+ try {
+ config.load(CONFIG_FILE);
+ } catch (IOException ignore) {
+ } catch (InvalidConfigurationException ex) {
+ Bukkit.getLogger().log(Level.SEVERE, "Could not load keyi.yml, please correct your syntax errors.", ex);
+ throw Throwables.propagate(ex);
+ }
+ config.options().copyDefaults(true);
+ verbose = getBoolean("verbose", false);
+
+ version = getInt("version", 1);
+ set("version", 1);
+
+ readConfig(KeyiConfig.class, null);
+ }
+
+ protected static void log(String s) {
+ if (verbose) {
+ log(Level.INFO, s);
+ }
+ }
+
+ protected static void log(Level level, String s) {
+ Bukkit.getLogger().log(level, s);
+ }
+
+ static void readConfig(Class<?> clazz, Object instance) {
+ for (Method method : clazz.getDeclaredMethods()) {
+ if (Modifier.isPrivate(method.getModifiers())) {
+ if (method.getParameterTypes().length == 0 && method.getReturnType() == Void.TYPE) {
+ try {
+ method.setAccessible(true);
+ method.invoke(instance);
+ } catch (InvocationTargetException ex) {
+ throw Throwables.propagate(ex.getCause());
+ } catch (Exception ex) {
+ Bukkit.getLogger().log(Level.SEVERE, "Error invoking " + method, ex);
+ }
+ }
+ }
+ }
+
+ try {
+ config.save(CONFIG_FILE);
+ } catch (IOException ex) {
+ Bukkit.getLogger().log(Level.SEVERE, "Could not save " + CONFIG_FILE, ex);
+ }
+ }
+
+ private static void set(String path, Object val) {
+ config.addDefault(path, val);
+ config.set(path, val);
+ }
+
+ private static String getString(String path, String def) {
+ config.addDefault(path, def);
+ return config.getString(path, config.getString(path));
+ }
+
+ private static boolean getBoolean(String path, boolean def) {
+ config.addDefault(path, def);
+ return config.getBoolean(path, config.getBoolean(path));
+ }
+
+ private static double getDouble(String path, double def) {
+ config.addDefault(path, def);
+ return config.getDouble(path, config.getDouble(path));
+ }
+
+ private static int getInt(String path, int def) {
+ config.addDefault(path, def);
+ return config.getInt(path, config.getInt(path));
+ }
+
+ private static <T> List getList(String path, T def) {
+ config.addDefault(path, def);
+ return config.getList(path, config.getList(path));
+ }
+
+ static Map<String, Object> getMap(String path, Map<String, Object> def) {
+ if (def != null && config.getConfigurationSection(path) == null) {
+ config.addDefault(path, def);
+ return def;
+ }
+ return toMap(config.getConfigurationSection(path));
+ }
+
+ private static Map<String, Object> toMap(ConfigurationSection section) {
+ ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder();
+ if (section != null) {
+ for (String key : section.getKeys(false)) {
+ Object obj = section.get(key);
+ if (obj != null) {
+ builder.put(key, obj instanceof ConfigurationSection val ? toMap(val) : obj);
+ }
+ }
+ }
+ return builder.build();
+ }
+
+ public static void reload() {
+ KeyiConfig.init((File) MinecraftServer.getServer().options.valueOf("keyi-settings"));
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/cc/keyimc/keyi/utils/TextUtil.java b/src/main/java/cc/keyimc/keyi/utils/TextUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..510eea6066fb0743a9c561eb577de9d972551771
--- /dev/null
+++ b/src/main/java/cc/keyimc/keyi/utils/TextUtil.java
@@ -0,0 +1,14 @@
+package cc.keyimc.keyi.utils;
+
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.minimessage.MiniMessage;
+import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
+
+public final class TextUtil {
+ private TextUtil() {
+ }
+
+ public static Component deserialize(String str, TagResolver... tagResolvers) {
+ return MiniMessage.miniMessage().deserialize(str, tagResolvers);
+ }
+}
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
index a029f51983bcfe49beab1359f282f0f957723ef2..ca0ddafe66dd5d02b1e96b1fc1c574490b68e6d4 100644
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
@@ -239,6 +239,16 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
gg.pufferfish.pufferfish.PufferfishConfig.load(); // Pufferfish
gg.pufferfish.pufferfish.PufferfishCommand.init(); // Pufferfish
+ // KeYi start - init config
+ try {
+ cc.keyimc.keyi.KeyiConfig.init((java.io.File) options.valueOf("keyi-settings"));
+ }catch (Exception e) {
+ LOGGER.error("Failed to load keyi.yml!", e);
+ }
+ // KeYi end
+
+ cc.keyimc.keyi.KeyiCommand.init(); // KeYi - init command
+
this.setPvpAllowed(dedicatedserverproperties.pvp);
this.setFlightAllowed(dedicatedserverproperties.allowFlight);
this.setMotd(dedicatedserverproperties.motd);
diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
index 8a4c8701122edf2f29edbe97e4fa199da2744e9e..ebf774da1f2614c0ecb00cf9260ba5a5ca676cb2 100644
--- a/src/main/java/org/bukkit/craftbukkit/Main.java
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java
@@ -180,6 +180,14 @@ public class Main {
.describedAs("Yml file");
// Purpur end
+ // KeYi start
+ acceptsAll(asList("keyi", "keyi-settings"), "File for KeYi settings")
+ .withRequiredArg()
+ .ofType(File.class)
+ .defaultsTo(new File("keyi.yml"))
+ .describedAs("Yml file");
+ // KeYi end
+
// Paper start
acceptsAll(asList("server-name"), "Name of the server")
.withRequiredArg()