diff --git a/README.md b/README.md
index 6ef0566..1ff2c7d 100644
--- a/README.md
+++ b/README.md
@@ -73,10 +73,10 @@ dependencies {
可查看 [Contributing](./docs/CONTRIBUTING.md)
## BStats
+Temporarily use Luminol's.

## 特别感谢
-Temporarily use Luminol's.
感谢[LegacyLands](https://github.com/LegacyLands)对本项目的赞助,如果你想开发一些跨folia/非folia平台的插件,[legacy-lands-library](https://github.com/LegacyLands/legacy-lands-library/)将会是个不错的lib

diff --git a/lophine-api/paper-patches/features/0001-Rebrand-to-Lophine.patch b/lophine-api/paper-patches/features/0001-Rebrand-to-Lophine.patch
new file mode 100644
index 0000000..1211a45
--- /dev/null
+++ b/lophine-api/paper-patches/features/0001-Rebrand-to-Lophine.patch
@@ -0,0 +1,18 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Helvetica Volubi
+Date: Sun, 8 Jun 2025 01:23:55 +0800
+Subject: [PATCH] Rebrand to Lophine
+
+
+diff --git a/src/main/java/io/papermc/paper/ServerBuildInfo.java b/src/main/java/io/papermc/paper/ServerBuildInfo.java
+index db5e2f10278c20286779362cfdfadb2f42c724e0..c18c0cb45a193883aa12b5d1abe690e95d289f82 100644
+--- a/src/main/java/io/papermc/paper/ServerBuildInfo.java
++++ b/src/main/java/io/papermc/paper/ServerBuildInfo.java
+@@ -29,6 +29,7 @@ public interface ServerBuildInfo {
+ */
+ Key BRAND_LUMINOL_ID = Key.key("luminolmc", "luminol");
+ // Luminol end
++ Key BRAND_LOPHINE_ID = Key.key("luminolmc", "lophine"); // Lophine
+
+ /**
+ * Gets the {@code ServerBuildInfo}.
diff --git a/lophine-server/minecraft-patches/features/0001-Rebrand-to-Lophine.patch b/lophine-server/minecraft-patches/features/0001-Rebrand-to-Lophine.patch
new file mode 100644
index 0000000..1e67678
--- /dev/null
+++ b/lophine-server/minecraft-patches/features/0001-Rebrand-to-Lophine.patch
@@ -0,0 +1,34 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Helvetica Volubi
+Date: Sun, 8 Jun 2025 00:58:12 +0800
+Subject: [PATCH] Rebrand to Lophine
+
+
+diff --git a/net/minecraft/server/Main.java b/net/minecraft/server/Main.java
+index fcf599846a38beeb8f094d5376c01d5a690f7a2f..9ddcb2b5ced68ff619516ddbac2327c23e316438 100644
+--- a/net/minecraft/server/Main.java
++++ b/net/minecraft/server/Main.java
+@@ -108,7 +108,8 @@ public class Main {
+ JvmProfiler.INSTANCE.start(Environment.SERVER);
+ }
+
+- me.earthme.luminol.config.LuminolConfig.preLoadConfig(); // Luminol - Luminol config
++ me.earthme.lophine.config.LophineConfig.initConfigs(); // Lophine - Lophine config
++ me.earthme.lophine.config.LophineConfig.preLoad(); // Luminol - Luminol config // Lophine - Lophine config
+ io.papermc.paper.plugin.PluginInitializerManager.load(optionSet); // Paper
+ Bootstrap.bootStrap();
+ Bootstrap.validate();
+diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java
+index 5290b9cb524160717fb40704fb10fc0d0a37941b..ba0cdba050cd3bf9231e15dd9543d34f37d9dae5 100644
+--- a/net/minecraft/server/dedicated/DedicatedServer.java
++++ b/net/minecraft/server/dedicated/DedicatedServer.java
+@@ -171,8 +171,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
+ this.paperConfigurations.initializeGlobalConfiguration(this.registryAccess());
+ this.paperConfigurations.initializeWorldDefaultsConfiguration(this.registryAccess());
+ // Paper end - initialize global and world-defaults configuration
+- me.earthme.luminol.config.LuminolConfig.finalizeLoadConfig(); //Luminol - load config file
+- me.earthme.luminol.config.LuminolConfig.setupLatch(); //Luminol - load config file
++ me.earthme.lophine.config.LophineConfig.loadConfigFiles(); //Luminol - load config file // Lophine - load config file
+ if (false) this.server.spark.enableEarlyIfRequested(); // Paper - spark // Luminol - Force disable builtin spark
+ // Paper start - fix converting txt to json file; convert old users earlier after PlayerList creation but before file load/save
+ if (this.convertOldUsers()) {
diff --git a/lophine-server/paper-patches/features/0001-Rebrand-to-Lophine.patch b/lophine-server/paper-patches/features/0001-Rebrand-to-Lophine.patch
new file mode 100644
index 0000000..05569c9
--- /dev/null
+++ b/lophine-server/paper-patches/features/0001-Rebrand-to-Lophine.patch
@@ -0,0 +1,397 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Helvetica Volubi
+Date: Sun, 8 Jun 2025 00:58:13 +0800
+Subject: [PATCH] Rebrand to Lophine
+
+
+diff --git a/src/main/java/com/destroystokyo/paper/Metrics.java b/src/main/java/com/destroystokyo/paper/Metrics.java
+index 22c038e6556d9911e1eaedf71d7b86843af89c16..f5574eb883b1ee8747acc42832bc88ae03e27b67 100644
+--- a/src/main/java/com/destroystokyo/paper/Metrics.java
++++ b/src/main/java/com/destroystokyo/paper/Metrics.java
+@@ -593,7 +593,7 @@ public class Metrics {
+ boolean logFailedRequests = config.getBoolean("logFailedRequests", false);
+ // Only start Metrics, if it's enabled in the config
+ if (config.getBoolean("enabled", true)) {
+- Metrics metrics = new Metrics("Luminol", serverUUID, logFailedRequests, Bukkit.getLogger()); // Folia - we have our own bstats page // Luminol
++ Metrics metrics = new Metrics("Lophine", serverUUID, logFailedRequests, Bukkit.getLogger()); // Folia - we have our own bstats page // Luminol // Lophine
+
+ metrics.addCustomChart(new Metrics.SimplePie("minecraft_version", () -> {
+ String minecraftVersion = Bukkit.getVersion();
+@@ -607,11 +607,11 @@ public class Metrics {
+ final String implVersion = org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion();
+ if (implVersion != null) {
+ final String buildOrHash = implVersion.substring(implVersion.lastIndexOf('-') + 1);
+- paperVersion = "git-Luminol-%s-%s".formatted(Bukkit.getServer().getMinecraftVersion(), buildOrHash); // Folia - we have our own bstats page // Luminol - Rebrand to Luminol
++ paperVersion = "git-Lophine-%s-%s".formatted(Bukkit.getServer().getMinecraftVersion(), buildOrHash); // Folia - we have our own bstats page // Luminol - Rebrand to Luminol // Lophine - Rebrand to Lophine
+ } else {
+ paperVersion = "unknown";
+ }
+- metrics.addCustomChart(new Metrics.SimplePie("luminol_version", () -> paperVersion)); // Folia - we have our own bstats page // Luminol
++ metrics.addCustomChart(new Metrics.SimplePie("lophine_version", () -> paperVersion)); // Folia - we have our own bstats page // Luminol // Lophine
+
+ metrics.addCustomChart(new Metrics.DrilldownPie("java_version", () -> {
+ Map> map = new HashMap<>();
+diff --git a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
+index 22125dbe1765f930fe10fe420be1c275ec553139..d5b070d1a3d84e228960dacd614e0f1abe968e79 100644
+--- a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
++++ b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
+@@ -35,7 +35,7 @@ public class PaperVersionFetcher implements VersionFetcher {
+ private static final Logger LOGGER = LogUtils.getClassLogger();
+ private static final int DISTANCE_ERROR = -1;
+ private static final int DISTANCE_UNKNOWN = -2;
+- private static final String DOWNLOAD_PAGE = "https://github.com/LuminolMC/Luminol"; //Luminol
++ private static final String DOWNLOAD_PAGE = "https://github.com/LuminolMC/Lophine"; //Luminol // Lophine
+
+ @Override
+ public long getCacheTime() {
+@@ -49,7 +49,7 @@ public class PaperVersionFetcher implements VersionFetcher {
+ if (build.buildNumber().isEmpty() && build.gitCommit().isEmpty()) {
+ updateMessage = text("You are running a development version without access to version information", color(0xFF5300));
+ } else {
+- updateMessage = getUpdateStatusMessage("LuminolMC/Luminol", build); // Folia // Luminol
++ updateMessage = getUpdateStatusMessage("LuminolMC/Lophine", build); // Folia // Luminol // Lophine
+ }
+ final @Nullable Component history = this.getHistory();
+
+diff --git a/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java b/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java
+index e3c5f4c31f084294a59830f3e764921433dd80d5..8b08a578102caf078efb15565ae3006c6eb50662 100644
+--- a/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java
++++ b/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java
+@@ -32,6 +32,7 @@ public record ServerBuildInfoImpl(
+
+ private static final String BRAND_PAPER_NAME = "Paper";
+ private static final String BRAND_LUMINOL_NAME = "Luminol";
++ private static final String BRAND_LOPHINE_NAME = "Lophine";
+
+ private static final String BUILD_DEV = "DEV";
+
+@@ -43,9 +44,9 @@ public record ServerBuildInfoImpl(
+ this(
+ getManifestAttribute(manifest, ATTRIBUTE_BRAND_ID)
+ .map(Key::key)
+- .orElse(BRAND_LUMINOL_ID), // Folia // Luminol
++ .orElse(BRAND_LOPHINE_ID), // Folia // Luminol // Lophine
+ getManifestAttribute(manifest, ATTRIBUTE_BRAND_NAME)
+- .orElse(BRAND_LUMINOL_NAME), // Folia // Luminol
++ .orElse(BRAND_LOPHINE_NAME), // Folia // Luminol // Lophine
+ SharedConstants.getCurrentVersion().getId(),
+ SharedConstants.getCurrentVersion().getName(),
+ getManifestAttribute(manifest, ATTRIBUTE_BUILD_NUMBER)
+@@ -62,7 +63,7 @@ public record ServerBuildInfoImpl(
+
+ @Override
+ public boolean isBrandCompatible(final @NotNull Key brandId) {
+- return brandId.equals(this.brandId) || brandId.equals(BRAND_PAPER_ID) || brandId.equals(BRAND_FOLIA_ID); // Luminol
++ return brandId.equals(this.brandId) || brandId.equals(BRAND_PAPER_ID) || brandId.equals(BRAND_FOLIA_ID) || brandId.equals(BRAND_LUMINOL_ID); // Luminol // Lophine
+ }
+
+ @Override
+diff --git a/src/main/java/me/earthme/luminol/commands/LuminolConfigCommand.java b/src/main/java/me/earthme/luminol/commands/LuminolConfigCommand.java
+index fb63e2a3205ea9f7aaee0ff0f4dc0cc1a5268507..645f2f41de74f4461685c753dcd6cfc5dfa8b2ab 100644
+--- a/src/main/java/me/earthme/luminol/commands/LuminolConfigCommand.java
++++ b/src/main/java/me/earthme/luminol/commands/LuminolConfigCommand.java
+@@ -13,11 +13,17 @@ import java.util.ArrayList;
+ import java.util.List;
+
+ public class LuminolConfigCommand extends Command {
+- public LuminolConfigCommand() {
+- super("luminolconfig");
+- this.setPermission("luminol.commands.luminolconfig");
++ private LuminolConfig config;
++
++ public LuminolConfigCommand(String name) {
++ super(name + "config");
++ this.setPermission(name + ".commands." + name + "config");
+ this.setDescription("Manage config file");
+- this.setUsage("/luminolconfig");
++ this.setUsage("/" + name + "config");
++ }
++
++ public void initConfig(LuminolConfig config) {
++ this.config = config;
+ }
+
+ public void wrongUse(CommandSender sender) {
+@@ -38,7 +44,7 @@ public class LuminolConfigCommand extends Command {
+ result.add("reset");
+ result.add("reload");
+ } else if (args.length == 2 && (args[0].equals("query") || args[0].equals("set") || args[0].equals("reset"))) {
+- result.addAll(LuminolConfig.completeConfigPath(args[1]));
++ result.addAll(config.completeConfigPath(args[1]));
+ }
+ return result;
+ }
+@@ -59,7 +65,7 @@ public class LuminolConfigCommand extends Command {
+
+ switch (args[0]) {
+ case "reload" -> {
+- LuminolConfig.reloadAsync().thenAccept(nullValue -> sender.sendMessage(
++ config.reloadAsync().thenAccept(nullValue -> sender.sendMessage(
+ Component
+ .text("Reloaded config file!")
+ .color(TextColor.color(0, 255, 0))
+@@ -69,8 +75,8 @@ public class LuminolConfigCommand extends Command {
+ if (args.length == 2 || args.length > 3) {
+ wrongUse(sender);
+ return true;
+- } else if (LuminolConfig.setConfig(args[1], args[2])) {
+- LuminolConfig.reloadAsync().thenAccept(nullValue -> sender.sendMessage(
++ } else if (config.setConfig(args[1], args[2])) {
++ config.reloadAsync().thenAccept(nullValue -> sender.sendMessage(
+ Component
+ .text("Set Config " + args[1] + " to " + args[2] + " successfully!")
+ .color(TextColor.color(0, 255, 0))
+@@ -88,10 +94,10 @@ public class LuminolConfigCommand extends Command {
+ wrongUse(sender);
+ return true;
+ } else {
+- LuminolConfig.resetConfig(args[1]);
+- LuminolConfig.reloadAsync().thenAccept(nullValue -> sender.sendMessage(
++ config.resetConfig(args[1]);
++ config.reloadAsync().thenAccept(nullValue -> sender.sendMessage(
+ Component
+- .text("Reset Config " + args[1] + " to " + LuminolConfig.getConfig(args[1]) + " successfully!")
++ .text("Reset Config " + args[1] + " to " + config.getConfig(args[1]) + " successfully!")
+ .color(TextColor.color(0, 255, 0))
+ ));
+ }
+@@ -103,7 +109,7 @@ public class LuminolConfigCommand extends Command {
+ } else {
+ sender.sendMessage(
+ Component
+- .text("Config " + args[1] + " is " + LuminolConfig.getConfig(args[1]) + "!")
++ .text("Config " + args[1] + " is " + config.getConfig(args[1]) + "!")
+ .color(TextColor.color(0, 255, 0))
+ );
+ }
+diff --git a/src/main/java/me/earthme/luminol/config/LuminolConfig.java b/src/main/java/me/earthme/luminol/config/LuminolConfig.java
+index 0fed724ce1f0f4f731ab471333aa9fbaef70598e..145612d7ed358d3973f817f45fc5eb195a74daa0 100644
+--- a/src/main/java/me/earthme/luminol/config/LuminolConfig.java
++++ b/src/main/java/me/earthme/luminol/config/LuminolConfig.java
+@@ -29,22 +29,33 @@ import java.util.jar.JarEntry;
+ import java.util.jar.JarFile;
+
+ public class LuminolConfig {
+- public static final Logger logger = LogManager.getLogger();
+- private static final File baseConfigFolder = new File("luminol_config");
+- private static final File baseConfigFile = new File(baseConfigFolder, "luminol_global_config.toml");
+- private static final Set allInstanced = new HashSet<>();
+- private static final Map stagedConfigMap = new HashMap<>();
+- private static final Map defaultvalueMap = new HashMap<>();
+- public static boolean alreadyInit = false;
+- private static CommentedFileConfig configFileInstance;
+-
+- public static void setupLatch() {
+- Bukkit.getCommandMap().register("luminolconfig", "luminol", new LuminolConfigCommand());
++ public final Logger logger = LogManager.getLogger();
++ private final File baseConfigFolder;
++ private final File baseConfigFile;
++ private final String name;
++ private final String pack;
++ private final Set allInstanced = new HashSet<>();
++ private final Map stagedConfigMap = new HashMap<>();
++ private final Map defaultvalueMap = new HashMap<>();
++ public boolean alreadyInit = false;
++ private CommentedFileConfig configFileInstance;
++
++ public LuminolConfig(@NotNull File base, @NotNull String name, @NotNull String pack) {
++ this.baseConfigFolder = base;
++ this.name = name;
++ this.pack = pack;
++ this.baseConfigFile = new File(base, name + "_global_config.toml");
++ }
++
++ public void setupLatch() {
++ LuminolConfigCommand command = new LuminolConfigCommand(name);
++ Bukkit.getCommandMap().register(name + "config", name, command);
++ command.initConfig(this);
+ alreadyInit = true;
+ }
+
+- public static void reload() {
+- RegionizedServer.ensureGlobalTickThread("Reload luminol config off global region thread!");
++ public void reload() {
++ RegionizedServer.ensureGlobalTickThread("Reload " + name + " config off global region thread!");
+
+ dropAllInstanced();
+ try {
+@@ -56,8 +67,8 @@ public class LuminolConfig {
+ }
+
+ @Contract(" -> new")
+- public static @NotNull CompletableFuture reloadAsync() {
+- return CompletableFuture.runAsync(LuminolConfig::reload, task -> RegionizedServer.getInstance().addTask(() -> {
++ public @NotNull CompletableFuture reloadAsync() {
++ return CompletableFuture.runAsync(this::reload, task -> RegionizedServer.getInstance().addTask(() -> {
+ try {
+ task.run();
+ } catch (Exception e) {
+@@ -66,17 +77,17 @@ public class LuminolConfig {
+ }));
+ }
+
+- public static void dropAllInstanced() {
++ public void dropAllInstanced() {
+ allInstanced.clear();
+ }
+
+- public static void finalizeLoadConfig() {
++ public void finalizeLoadConfig() {
+ for (IConfigModule module : allInstanced) {
+ module.onLoaded(configFileInstance);
+ }
+ }
+
+- public static void preLoadConfig() throws IOException {
++ public void preLoadConfig() throws IOException {
+ baseConfigFolder.mkdirs();
+
+ if (!baseConfigFile.exists()) {
+@@ -98,21 +109,21 @@ public class LuminolConfig {
+ saveConfigs();
+ }
+
+- private static void loadAllModules() throws IllegalAccessException {
++ private void loadAllModules() throws IllegalAccessException {
+ for (IConfigModule instanced : allInstanced) {
+ loadForSingle(instanced);
+ }
+ }
+
+- private static void instanceAllModule() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
+- for (Class> clazz : getClasses("me.earthme.luminol.config.modules")) {
++ private void instanceAllModule() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
++ for (Class> clazz : getClasses(pack)) {
+ if (IConfigModule.class.isAssignableFrom(clazz)) {
+ allInstanced.add((IConfigModule) clazz.getConstructor().newInstance());
+ }
+ }
+ }
+
+- private static void loadForSingle(@NotNull IConfigModule singleConfigModule) throws IllegalAccessException {
++ private void loadForSingle(@NotNull IConfigModule singleConfigModule) throws IllegalAccessException {
+ final EnumConfigCategory category = singleConfigModule.getCategory();
+
+ Field[] fields = singleConfigModule.getClass().getDeclaredFields();
+@@ -199,7 +210,7 @@ public class LuminolConfig {
+ }
+ }
+
+- public static void removeConfig(String name, String[] keys) {
++ public void removeConfig(String name, String[] keys) {
+ configFileInstance.remove(name);
+ Object configAtPath = configFileInstance.get(String.join(".", keys));
+ if (configAtPath instanceof UnmodifiableConfig && ((UnmodifiableConfig) configAtPath).isEmpty()) {
+@@ -207,7 +218,7 @@ public class LuminolConfig {
+ }
+ }
+
+- public static void removeConfig(String[] keys) {
++ public void removeConfig(String[] keys) {
+ configFileInstance.remove(String.join(".", keys));
+ Object configAtPath = configFileInstance.get(String.join(".", Arrays.copyOfRange(keys, 1, keys.length)));
+ if (configAtPath instanceof UnmodifiableConfig && ((UnmodifiableConfig) configAtPath).isEmpty()) {
+@@ -215,11 +226,11 @@ public class LuminolConfig {
+ }
+ }
+
+- public static boolean setConfig(String[] keys, Object value) {
++ public boolean setConfig(String[] keys, Object value) {
+ return setConfig(String.join(".", keys), value);
+ }
+
+- public static boolean setConfig(String key, Object value) {
++ public boolean setConfig(String key, Object value) {
+ if (configFileInstance.contains(key) && configFileInstance.get(key) != null) {
+ stagedConfigMap.put(key, value);
+ return true;
+@@ -227,7 +238,7 @@ public class LuminolConfig {
+ return false;
+ }
+
+- private static Object tryTransform(Class> targetType, Object value) {
++ private Object tryTransform(Class> targetType, Object value) {
+ if (!targetType.isAssignableFrom(value.getClass())) {
+ try {
+ if (targetType == Integer.class) {
+@@ -251,27 +262,27 @@ public class LuminolConfig {
+ return value;
+ }
+
+- public static void saveConfigs() {
++ public void saveConfigs() {
+ configFileInstance.save();
+ }
+
+- public static void resetConfig(String[] keys) {
++ public void resetConfig(String[] keys) {
+ resetConfig(String.join(".", keys));
+ }
+
+- public static void resetConfig(String key) {
++ public void resetConfig(String key) {
+ stagedConfigMap.put(key, null);
+ }
+
+- public static String getConfig(String[] keys) {
++ public String getConfig(String[] keys) {
+ return getConfig(String.join(".", keys));
+ }
+
+- public static String getConfig(String key) {
++ public String getConfig(String key) {
+ return configFileInstance.get(key).toString();
+ }
+
+- public static List completeConfigPath(String partialPath) {
++ public List completeConfigPath(String partialPath) {
+ List allPaths = getAllConfigPaths(partialPath);
+ List result = new ArrayList<>();
+
+@@ -291,13 +302,13 @@ public class LuminolConfig {
+ return result;
+ }
+
+- private static List getAllConfigPaths(String currentPath) {
++ private List getAllConfigPaths(String currentPath) {
+ return defaultvalueMap.keySet().stream()
+ .filter(k -> k.startsWith(currentPath))
+ .toList();
+ }
+
+- public static @NotNull Set> getClasses(String pack) {
++ public @NotNull Set> getClasses(String pack) {
+ Set> classes = new LinkedHashSet<>();
+ String packageDirName = pack.replace('.', '/');
+ Enumeration dirs;
+@@ -328,7 +339,7 @@ public class LuminolConfig {
+ return classes;
+ }
+
+- private static void findClassesInPackageByFile(String packageName, String packagePath, Set> classes) {
++ private void findClassesInPackageByFile(String packageName, String packagePath, Set> classes) {
+ File dir = new File(packagePath);
+
+ if (!dir.exists() || !dir.isDirectory()) {
+@@ -352,7 +363,7 @@ public class LuminolConfig {
+ }
+ }
+
+- private static void findClassesInPackageByJar(String packageName, Enumeration entries, String packageDirName, Set> classes) {
++ private void findClassesInPackageByJar(String packageName, Enumeration entries, String packageDirName, Set> classes) {
+ while (entries.hasMoreElements()) {
+ JarEntry entry = entries.nextElement();
+ String name = entry.getName();
+diff --git a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java
+index 9699d7dcca5cf67f50ad05c0e875de424a4e00c5..1c3b94a2592cff74924cf9b355e30b0fa182b79b 100644
+--- a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java
++++ b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java
+@@ -11,7 +11,7 @@ public final class Versioning {
+ public static String getBukkitVersion() {
+ String result = "Unknown-Version";
+
+- InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/me.earthme.luminol/luminol-api/pom.properties"); // Folia //Luminol
++ InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/me.earthme.lophine/lophine-api/pom.properties"); // Folia //Luminol
+ Properties properties = new Properties();
+
+ if (stream != null) {
diff --git a/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/LophineConfig.java.patch b/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/LophineConfig.java.patch
new file mode 100644
index 0000000..6087585
--- /dev/null
+++ b/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/LophineConfig.java.patch
@@ -0,0 +1,35 @@
+--- /dev/null
++++ b/src/main/java/me/earthme/lophine/config/LophineConfig.java
+@@ -1,0 +_,32 @@
++package me.earthme.lophine.config;
++
++import me.earthme.luminol.config.LuminolConfig;
++
++import java.io.File;
++import java.io.IOException;
++import java.util.HashMap;
++import java.util.Map;
++
++public class LophineConfig {
++ public static final Map configfiles = new HashMap<>();
++ private static final File luminolConfigFolder = new File("luminol_config");
++ private static final File lophineConfigFolder = new File("lophine_config");
++
++ public static void initConfigs() {
++ configfiles.put("luminol", new LuminolConfig(luminolConfigFolder, "luminol", "me.earthme.luminol.config.modules"));
++ configfiles.put("lophine", new LuminolConfig(lophineConfigFolder, "lophine", "me.earthme.lophine.config.modules"));
++ }
++
++ public static void preLoad() throws IOException {
++ for (LuminolConfig config : configfiles.values()) {
++ config.preLoadConfig();
++ }
++ }
++
++ public static void loadConfigFiles() {
++ for (LuminolConfig config : configfiles.values()) {
++ config.finalizeLoadConfig();
++ config.setupLatch();
++ }
++ }
++}
diff --git a/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/removed/RemovedConfig.java.patch b/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/removed/RemovedConfig.java.patch
new file mode 100644
index 0000000..3015ad1
--- /dev/null
+++ b/lophine-server/paper-patches/files/src/main/java/me/earthme/lophine/config/modules/removed/RemovedConfig.java.patch
@@ -0,0 +1,29 @@
+--- /dev/null
++++ b/src/main/java/me/earthme/lophine/config/modules/removed/RemovedConfig.java
+@@ -1,0 +_,26 @@
++package me.earthme.lophine.config.modules.removed;
++
++import me.earthme.luminol.config.EnumConfigCategory;
++import me.earthme.luminol.config.IConfigModule;
++import me.earthme.luminol.config.flags.ConfigInfo;
++import me.earthme.luminol.config.flags.DoNotLoad;
++import me.earthme.luminol.config.flags.TransformedConfig;
++
++public class RemovedConfig implements IConfigModule {
++ @TransformedConfig(name = "example", category = {"removed", "example"}, transform = false)
++ @DoNotLoad
++ @ConfigInfo(baseName = "removed", comments =
++ """
++ RemovedConfig redirect to here, no any function.""")
++ public static boolean enabled = true;
++
++ @Override
++ public EnumConfigCategory getCategory() {
++ return EnumConfigCategory.REMOVED;
++ }
++
++ @Override
++ public String getBaseName() {
++ return "removed_config";
++ }
++}