diff --git a/Bukkit/Loader/pom.xml b/Bukkit/Loader/pom.xml
new file mode 100644
index 0000000..5f80b67
--- /dev/null
+++ b/Bukkit/Loader/pom.xml
@@ -0,0 +1,91 @@
+
+
+ 4.0.0
+
+ dev.brighten.antivpn
+ Bukkit
+ 1.9.4
+
+ dev.brighten.antivpn.bukkit
+ Loader
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+ spigot-repo
+ https://hub.spigotmc.org/nexus/content/repositories/snapshots/
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.13.0
+
+ 17
+ 17
+ -XDignore.symbol.file
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.6.0
+
+
+ package
+
+ shade
+
+
+ true
+
+
+ antivpn-bukkit.jarinjar
+ ${project.parent.basedir}/Plugin/target/Plugin-${project.version}.jar
+
+
+
+
+
+
+
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ org.spigotmc
+ spigot-api
+ 1.20.2-R0.1-SNAPSHOT
+ provided
+
+
+ dev.brighten.antivpn
+ Plugin
+ ${project.version}
+ provided
+
+
+ dev.brighten.antivpn
+ loader-utils
+ 1.9.4
+ compile
+
+
+
+
\ No newline at end of file
diff --git a/Bukkit/Loader/src/main/java/dev/brighten/antivpn/bukkit/loader/BukkitLoaderPlugin.java b/Bukkit/Loader/src/main/java/dev/brighten/antivpn/bukkit/loader/BukkitLoaderPlugin.java
new file mode 100644
index 0000000..d953c38
--- /dev/null
+++ b/Bukkit/Loader/src/main/java/dev/brighten/antivpn/bukkit/loader/BukkitLoaderPlugin.java
@@ -0,0 +1,35 @@
+package dev.brighten.antivpn.bukkit.loader;
+
+import dev.brighten.antivpn.loader.JarInJarClassLoader;
+import dev.brighten.antivpn.loader.LoaderBootstrap;
+import org.bukkit.plugin.java.JavaPlugin;
+
+public class BukkitLoaderPlugin extends JavaPlugin {
+
+ private static final String JAR_NAME = "antivpn-bukkit.jarinjar";
+ private static final String BOOTSTRAP_CLASS = "me.lucko.luckperms.bukkit.LPBukkitBootstrap";
+
+ private final LoaderBootstrap plugin;
+
+ public BukkitLoaderPlugin() {
+ JarInJarClassLoader loader = new JarInJarClassLoader(getClass().getClassLoader(), JAR_NAME);
+ this.plugin = loader.instantiatePlugin(BOOTSTRAP_CLASS, JavaPlugin.class, this);
+ }
+
+ @Override
+ public void onLoad() {
+ this.plugin.onLoad(getDataFolder());
+ }
+
+ @Override
+ public void onEnable() {
+ this.plugin.onEnable();
+ }
+
+ @Override
+ public void onDisable() {
+ this.plugin.onDisable();
+ }
+
+
+}
diff --git a/Bukkit/src/main/resources/plugin.yml b/Bukkit/Loader/src/main/resources/plugin.yml
similarity index 100%
rename from Bukkit/src/main/resources/plugin.yml
rename to Bukkit/Loader/src/main/resources/plugin.yml
diff --git a/Bukkit/Plugin/pom.xml b/Bukkit/Plugin/pom.xml
new file mode 100644
index 0000000..cae0a10
--- /dev/null
+++ b/Bukkit/Plugin/pom.xml
@@ -0,0 +1,102 @@
+
+
+ 4.0.0
+
+ dev.brighten.antivpn
+ Bukkit
+ 1.9.4
+
+
+ Plugin
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+ spigot-repo
+ https://hub.spigotmc.org/nexus/content/repositories/snapshots/
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.13.0
+
+ 17
+ 17
+ -XDignore.symbol.file
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.6.0
+
+
+ package
+
+ shade
+
+
+ true
+
+
+ org.bstats
+
+ dev.brighten.antivpn.bukkit.org.bstats
+
+
+ org.yaml.snakeyaml
+ dev.brighten.antivpn.shaded.org.yaml.snakeyaml
+
+
+
+
+
+
+
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ org.spigotmc
+ spigot-api
+ 1.20.2-R0.1-SNAPSHOT
+ provided
+
+
+ dev.brighten.antivpn
+ Source
+ 1.9.4
+ compile
+
+
+ org.bstats
+ bstats-bukkit
+ 2.2.1
+ compile
+
+
+ dev.brighten.antivpn
+ loader-utils
+ 1.9.4
+ compile
+
+
+
+
\ No newline at end of file
diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitCommandExecutor.java b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitCommandExecutor.java
similarity index 100%
rename from Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitCommandExecutor.java
rename to Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitCommandExecutor.java
diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java
similarity index 96%
rename from Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java
rename to Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java
index 9c51ef6..d509b18 100644
--- a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java
+++ b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitListener.java
@@ -25,8 +25,8 @@ public class BukkitListener extends VPNExecutor implements Listener {
@Override
public void registerListeners() {
- BukkitPlugin.pluginInstance.getServer().getPluginManager()
- .registerEvents(this, BukkitPlugin.pluginInstance);
+ Bukkit.getPluginManager()
+ .registerEvents(this, BukkitPlugin.pluginInstance.getPlugin());
}
@Override
@@ -53,7 +53,7 @@ public class BukkitListener extends VPNExecutor implements Listener {
@Override
public void disablePlugin() {
HandlerList.unregisterAll(this);
- BukkitPlugin.pluginInstance.getServer().getPluginManager().disablePlugin(BukkitPlugin.pluginInstance);
+ Bukkit.getPluginManager().disablePlugin(BukkitPlugin.pluginInstance.getPlugin());
}
@EventHandler(priority = EventPriority.HIGH)
diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayer.java b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayer.java
similarity index 94%
rename from Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayer.java
rename to Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayer.java
index 660094b..5f8e6ac 100644
--- a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayer.java
+++ b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayer.java
@@ -27,7 +27,7 @@ public class BukkitPlayer extends APIPlayer {
public void run() {
player.kickPlayer(ChatColor.translateAlternateColorCodes('&', reason));
}
- }.runTask(BukkitPlugin.pluginInstance);
+ }.runTask(BukkitPlugin.pluginInstance.getPlugin());
} else player.kickPlayer(ChatColor.translateAlternateColorCodes('&', reason));
}
diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayerExecutor.java b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayerExecutor.java
similarity index 100%
rename from Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayerExecutor.java
rename to Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayerExecutor.java
diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java
similarity index 85%
rename from Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java
rename to Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java
index fcd48a0..1153063 100644
--- a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java
+++ b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java
@@ -7,30 +7,42 @@ import dev.brighten.antivpn.database.VPNDatabase;
import dev.brighten.antivpn.database.local.H2VPN;
import dev.brighten.antivpn.database.mongo.MongoVPN;
import dev.brighten.antivpn.database.sql.MySqlVPN;
+import dev.brighten.antivpn.loader.LoaderBootstrap;
import lombok.Getter;
import org.bstats.bukkit.Metrics;
import org.bstats.charts.SimplePie;
import org.bukkit.Bukkit;
import org.bukkit.command.SimpleCommandMap;
import org.bukkit.event.HandlerList;
+import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.SimplePluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
+import java.io.File;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-public class BukkitPlugin extends JavaPlugin {
+public class BukkitPlugin implements LoaderBootstrap {
public static BukkitPlugin pluginInstance;
private SimpleCommandMap commandMap;
+ @Getter
+ private File dataFolder;
private final List registeredCommands = new ArrayList<>();
+ @Getter
+ private Plugin plugin;
@Getter
private PlayerCommandRunner playerCommandRunner;
+ @Override
+ public void onLoad(File dataFolder) {
+ this.dataFolder = dataFolder;
+ }
+
public void onEnable() {
pluginInstance = this;
@@ -40,21 +52,23 @@ public class BukkitPlugin extends JavaPlugin {
playerCommandRunner = new PlayerCommandRunner();
playerCommandRunner.start();
+ plugin = Bukkit.getPluginManager().getPlugin("AntiVPN");
+
// Loading our bStats metrics to be pushed to https://bstats.org
if(AntiVPN.getInstance().getVpnConfig().metrics()) {
Bukkit.getLogger().info("Starting bStats metrics...");
- Metrics metrics = new Metrics(this, 12615);
+ Metrics metrics = new Metrics((JavaPlugin) plugin, 12615);
metrics.addCustomChart(new SimplePie("database_used", this::getDatabaseType));
new BukkitRunnable() {
public void run() {
AntiVPN.getInstance().checked = AntiVPN.getInstance().detections = 0;
}
- }.runTaskTimerAsynchronously(this, 12000, 12000);
+ }.runTaskTimerAsynchronously(plugin, 12000, 12000);
}
Bukkit.getLogger().info("Setting up and registering commands...");
// We need access to the commandMap to register our commands without using the "proper" method
- if (pluginInstance.getServer().getPluginManager() instanceof SimplePluginManager manager) {
+ if (Bukkit.getServer().getPluginManager() instanceof SimplePluginManager manager) {
try {
Field field = SimplePluginManager.class.getDeclaredField("commandMap");
field.setAccessible(true);
@@ -73,7 +87,7 @@ public class BukkitPlugin extends JavaPlugin {
registeredCommands.add(newCommand);
// This tells Bukkit to register our command for use.
- commandMap.register(pluginInstance.getName(), newCommand);
+ commandMap.register(plugin.getName(), newCommand);
}
//TODO Finish system before implementing on startup
@@ -83,7 +97,7 @@ public class BukkitPlugin extends JavaPlugin {
.get());
AntiVPN.getInstance().getMessageHandler().reloadStrings();*/
- reloadConfig();
+ plugin.reloadConfig();
}
@Override
@@ -109,10 +123,10 @@ public class BukkitPlugin extends JavaPlugin {
}
Bukkit.getLogger().info("Unregistering listeners...");
- HandlerList.unregisterAll(this);
+ HandlerList.unregisterAll(plugin);
Bukkit.getLogger().info("Cancelling any running tasks...");
- Bukkit.getScheduler().cancelTasks(this);
+ Bukkit.getScheduler().cancelTasks(plugin);
}
private String getDatabaseType() {
diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/PlayerCommandRunner.java b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/PlayerCommandRunner.java
similarity index 96%
rename from Bukkit/src/main/java/dev/brighten/antivpn/bukkit/PlayerCommandRunner.java
rename to Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/PlayerCommandRunner.java
index 3a285a8..8ac64a7 100644
--- a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/PlayerCommandRunner.java
+++ b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/PlayerCommandRunner.java
@@ -35,7 +35,7 @@ public class PlayerCommandRunner {
public void run() {
action.getAction().run();
}
- }.runTask(BukkitPlugin.pluginInstance);
+ }.runTask(BukkitPlugin.pluginInstance.getPlugin());
playerActions.poll();
}
diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/command/BukkitCommand.java b/Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/command/BukkitCommand.java
similarity index 100%
rename from Bukkit/src/main/java/dev/brighten/antivpn/bukkit/command/BukkitCommand.java
rename to Bukkit/Plugin/src/main/java/dev/brighten/antivpn/bukkit/command/BukkitCommand.java
diff --git a/Bukkit/pom.xml b/Bukkit/pom.xml
index 724a62d..e44a743 100644
--- a/Bukkit/pom.xml
+++ b/Bukkit/pom.xml
@@ -7,89 +7,19 @@
dev.brighten.antivpn1.9.4
+ pom
+
+ Plugin
+ Loader
+
+
4.0.0Bukkit
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.13.0
-
- 17
- 17
- -XDignore.symbol.file
-
-
-
- org.apache.maven.plugins
- maven-shade-plugin
- 3.6.0
-
-
- package
-
- shade
-
-
- true
-
-
- org.bstats
-
- dev.brighten.antivpn.bukkit.org.bstats
-
-
- org.yaml.snakeyaml
- dev.brighten.antivpn.shaded.org.yaml.snakeyaml
-
-
-
-
-
-
-
-
-
- src/main/resources
- true
-
-
-
-
1717
-
-
- spigot-repo
- https://hub.spigotmc.org/nexus/content/repositories/snapshots/
-
-
-
-
-
- org.spigotmc
- spigot-api
- 1.20.2-R0.1-SNAPSHOT
- provided
-
-
- dev.brighten.antivpn
- Common
- 1.9.4
- provided
-
-
- org.bstats
- bstats-bukkit
- 2.2.1
- compile
-
-
-
\ No newline at end of file
diff --git a/Bungee/pom.xml b/Bungee/pom.xml
index 561d9ac..deba83b 100644
--- a/Bungee/pom.xml
+++ b/Bungee/pom.xml
@@ -66,7 +66,7 @@
dev.brighten.antivpn
- Common
+ Source1.9.4provided
diff --git a/Common/Source/pom.xml b/Common/Source/pom.xml
new file mode 100644
index 0000000..44fe127
--- /dev/null
+++ b/Common/Source/pom.xml
@@ -0,0 +1,178 @@
+
+
+ 4.0.0
+
+ dev.brighten.antivpn
+ Common
+ 1.9.4
+
+
+ Source
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.13.0
+
+ 17
+ 17
+ -XDignore.symbol.file
+
+
+ org.projectlombok
+ lombok
+ 1.18.30
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.6.0
+
+
+ package
+
+ shade
+
+
+ true
+
+
+ org.yaml.snakeyaml
+ dev.brighten.antivpn.shaded.org.yaml.snakeyaml
+
+
+ dev.brighten.antivpn.depends.Relocate
+ dev.brighten.antivpn.depends.MavenLibraries
+
+
+
+ com.github.benmanes.caffeine
+ dev.brighten.antivpn.shaded.com.github.benmanes.caffeine
+
+
+ org.h2
+ dev.brighten.antivpn.shaded.org.h2
+
+
+ dev.brighten.antivpn.depends.Relocate
+ dev.brighten.antivpn.depends.MavenLibraries
+
+
+
+ org.bson
+ dev.brighten.antivpn.shaded.org.bson
+
+
+ dev.brighten.antivpn.depends.Relocate
+ dev.brighten.antivpn.depends.MavenLibraries
+
+
+
+ com.mongodb
+ dev.brighten.antivpn.shaded.com.mongodb
+
+
+ dev.brighten.antivpn.depends.Relocate
+ dev.brighten.antivpn.depends.MavenLibraries
+
+
+
+ com.mysql.cj
+ dev.brighten.antivpn.shaded.com.mysql.cj
+
+
+ dev.brighten.antivpn.depends.Relocate
+ dev.brighten.antivpn.depends.MavenLibraries
+
+
+
+ com.mysql.jdbc
+ dev.brighten.antivpn.shaded.com.mysql.jdbc
+
+
+ dev.brighten.antivpn.depends.Relocate
+ dev.brighten.antivpn.depends.MavenLibraries
+
+
+
+
+
+
+
+
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ funkemunky-releases
+ https://nexus.funkemunky.cc/content/repositories/releases/
+
+
+
+
+
+ com.mysql
+ mysql-connector-j
+ 9.1.0
+ jar
+ provided
+
+
+ com.h2database
+ h2
+ 2.2.220
+ provided
+
+
+ org.ow2.asm
+ asm
+ 9.8
+ compile
+
+
+ org.ow2.asm
+ asm-commons
+ 9.8
+ compile
+
+
+ org.yaml
+ snakeyaml
+ 2.2
+ compile
+
+
+ com.github.ben-manes.caffeine
+ caffeine
+ 3.1.8
+ provided
+
+
+
+ org.mongodb
+ mongo-java-driver
+ 3.12.14
+ provided
+
+
+
+
\ No newline at end of file
diff --git a/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java b/Common/Source/src/main/java/dev/brighten/antivpn/AntiVPN.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/AntiVPN.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/AntiVPN.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/api/APIPlayer.java b/Common/Source/src/main/java/dev/brighten/antivpn/api/APIPlayer.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/api/APIPlayer.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/api/APIPlayer.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/api/CheckResult.java b/Common/Source/src/main/java/dev/brighten/antivpn/api/CheckResult.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/api/CheckResult.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/api/CheckResult.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/api/OfflinePlayer.java b/Common/Source/src/main/java/dev/brighten/antivpn/api/OfflinePlayer.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/api/OfflinePlayer.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/api/OfflinePlayer.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/api/PlayerExecutor.java b/Common/Source/src/main/java/dev/brighten/antivpn/api/PlayerExecutor.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/api/PlayerExecutor.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/api/PlayerExecutor.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/api/ResultType.java b/Common/Source/src/main/java/dev/brighten/antivpn/api/ResultType.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/api/ResultType.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/api/ResultType.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/api/VPNConfig.java b/Common/Source/src/main/java/dev/brighten/antivpn/api/VPNConfig.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/api/VPNConfig.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/api/VPNConfig.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/api/VPNExecutor.java b/Common/Source/src/main/java/dev/brighten/antivpn/api/VPNExecutor.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/api/VPNExecutor.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/api/VPNExecutor.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/command/Command.java b/Common/Source/src/main/java/dev/brighten/antivpn/command/Command.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/command/Command.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/command/Command.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/command/CommandExecutor.java b/Common/Source/src/main/java/dev/brighten/antivpn/command/CommandExecutor.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/command/CommandExecutor.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/command/CommandExecutor.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/command/impl/AlertsCommand.java b/Common/Source/src/main/java/dev/brighten/antivpn/command/impl/AlertsCommand.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/command/impl/AlertsCommand.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/command/impl/AlertsCommand.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/command/impl/AllowlistCommand.java b/Common/Source/src/main/java/dev/brighten/antivpn/command/impl/AllowlistCommand.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/command/impl/AllowlistCommand.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/command/impl/AllowlistCommand.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/command/impl/AntiVPNCommand.java b/Common/Source/src/main/java/dev/brighten/antivpn/command/impl/AntiVPNCommand.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/command/impl/AntiVPNCommand.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/command/impl/AntiVPNCommand.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/command/impl/ClearCacheCommand.java b/Common/Source/src/main/java/dev/brighten/antivpn/command/impl/ClearCacheCommand.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/command/impl/ClearCacheCommand.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/command/impl/ClearCacheCommand.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/command/impl/LookupCommand.java b/Common/Source/src/main/java/dev/brighten/antivpn/command/impl/LookupCommand.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/command/impl/LookupCommand.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/command/impl/LookupCommand.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/command/impl/PlanCommand.java b/Common/Source/src/main/java/dev/brighten/antivpn/command/impl/PlanCommand.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/command/impl/PlanCommand.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/command/impl/PlanCommand.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/command/impl/ReloadCommand.java b/Common/Source/src/main/java/dev/brighten/antivpn/command/impl/ReloadCommand.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/command/impl/ReloadCommand.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/command/impl/ReloadCommand.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/VPNDatabase.java b/Common/Source/src/main/java/dev/brighten/antivpn/database/VPNDatabase.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/database/VPNDatabase.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/database/VPNDatabase.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/local/H2VPN.java b/Common/Source/src/main/java/dev/brighten/antivpn/database/local/H2VPN.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/database/local/H2VPN.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/database/local/H2VPN.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/mongo/MongoVPN.java b/Common/Source/src/main/java/dev/brighten/antivpn/database/mongo/MongoVPN.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/database/mongo/MongoVPN.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/database/mongo/MongoVPN.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/sql/MySqlVPN.java b/Common/Source/src/main/java/dev/brighten/antivpn/database/sql/MySqlVPN.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/database/sql/MySqlVPN.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/database/sql/MySqlVPN.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/sql/utils/ExecutableStatement.java b/Common/Source/src/main/java/dev/brighten/antivpn/database/sql/utils/ExecutableStatement.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/database/sql/utils/ExecutableStatement.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/database/sql/utils/ExecutableStatement.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/sql/utils/MySQL.java b/Common/Source/src/main/java/dev/brighten/antivpn/database/sql/utils/MySQL.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/database/sql/utils/MySQL.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/database/sql/utils/MySQL.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/sql/utils/NonClosableConnection.java b/Common/Source/src/main/java/dev/brighten/antivpn/database/sql/utils/NonClosableConnection.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/database/sql/utils/NonClosableConnection.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/database/sql/utils/NonClosableConnection.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/sql/utils/Query.java b/Common/Source/src/main/java/dev/brighten/antivpn/database/sql/utils/Query.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/database/sql/utils/Query.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/database/sql/utils/Query.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/database/sql/utils/ResultSetIterator.java b/Common/Source/src/main/java/dev/brighten/antivpn/database/sql/utils/ResultSetIterator.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/database/sql/utils/ResultSetIterator.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/database/sql/utils/ResultSetIterator.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/depends/LibraryLoader.java b/Common/Source/src/main/java/dev/brighten/antivpn/depends/LibraryLoader.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/depends/LibraryLoader.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/depends/LibraryLoader.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/depends/MavenLibraries.java b/Common/Source/src/main/java/dev/brighten/antivpn/depends/MavenLibraries.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/depends/MavenLibraries.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/depends/MavenLibraries.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/depends/MavenLibrary.java b/Common/Source/src/main/java/dev/brighten/antivpn/depends/MavenLibrary.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/depends/MavenLibrary.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/depends/MavenLibrary.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/depends/Relocate.java b/Common/Source/src/main/java/dev/brighten/antivpn/depends/Relocate.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/depends/Relocate.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/depends/Relocate.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/depends/Repository.java b/Common/Source/src/main/java/dev/brighten/antivpn/depends/Repository.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/depends/Repository.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/depends/Repository.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/depends/URLClassLoaderAccess.java b/Common/Source/src/main/java/dev/brighten/antivpn/depends/URLClassLoaderAccess.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/depends/URLClassLoaderAccess.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/depends/URLClassLoaderAccess.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/message/MessageHandler.java b/Common/Source/src/main/java/dev/brighten/antivpn/message/MessageHandler.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/message/MessageHandler.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/message/MessageHandler.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/message/VpnString.java b/Common/Source/src/main/java/dev/brighten/antivpn/message/VpnString.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/message/VpnString.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/message/VpnString.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/ConfigDefault.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/ConfigDefault.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/ConfigDefault.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/ConfigDefault.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/EvictingMap.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/EvictingMap.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/EvictingMap.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/EvictingMap.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/ExtraObjectsMethodsForWeb.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/ExtraObjectsMethodsForWeb.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/ExtraObjectsMethodsForWeb.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/ExtraObjectsMethodsForWeb.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/MiscUtils.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/MiscUtils.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/MiscUtils.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/MiscUtils.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/NonnullByDefault.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/NonnullByDefault.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/NonnullByDefault.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/NonnullByDefault.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/NullnessCasts.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/NullnessCasts.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/NullnessCasts.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/NullnessCasts.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/Preconditions.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/Preconditions.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/Preconditions.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/Preconditions.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/StringUtil.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/StringUtil.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/StringUtil.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/StringUtil.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/Supplier.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/Supplier.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/Supplier.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/Supplier.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/Suppliers.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/Suppliers.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/Suppliers.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/Suppliers.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/Tuple.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/Tuple.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/Tuple.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/Tuple.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/config/Configuration.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/config/Configuration.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/config/Configuration.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/config/Configuration.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/config/ConfigurationProvider.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/config/ConfigurationProvider.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/config/ConfigurationProvider.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/config/ConfigurationProvider.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/config/YamlConfiguration.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/config/YamlConfiguration.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/config/YamlConfiguration.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/config/YamlConfiguration.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/json/CDL.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/json/CDL.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/json/CDL.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/json/CDL.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/json/Cookie.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/json/Cookie.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/json/Cookie.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/json/Cookie.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/json/CookieList.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/json/CookieList.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/json/CookieList.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/json/CookieList.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/json/HTTP.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/json/HTTP.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/json/HTTP.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/json/HTTP.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/json/HTTPTokener.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/json/HTTPTokener.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/json/HTTPTokener.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/json/HTTPTokener.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/json/JSONArray.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/json/JSONArray.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/json/JSONArray.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/json/JSONArray.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/json/JSONException.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/json/JSONException.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/json/JSONException.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/json/JSONException.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/json/JSONML.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/json/JSONML.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/json/JSONML.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/json/JSONML.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/json/JSONObject.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/json/JSONObject.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/json/JSONObject.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/json/JSONObject.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/json/JSONString.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/json/JSONString.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/json/JSONString.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/json/JSONString.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/json/JSONStringer.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/json/JSONStringer.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/json/JSONStringer.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/json/JSONStringer.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/json/JSONTokener.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/json/JSONTokener.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/json/JSONTokener.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/json/JSONTokener.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/json/JSONWriter.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/json/JSONWriter.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/json/JSONWriter.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/json/JSONWriter.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/json/JsonReader.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/json/JsonReader.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/json/JsonReader.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/json/JsonReader.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/json/XML.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/json/XML.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/json/XML.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/json/XML.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/json/XMLTokener.java b/Common/Source/src/main/java/dev/brighten/antivpn/utils/json/XMLTokener.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/utils/json/XMLTokener.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/utils/json/XMLTokener.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/web/FunkemunkyAPI.java b/Common/Source/src/main/java/dev/brighten/antivpn/web/FunkemunkyAPI.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/web/FunkemunkyAPI.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/web/FunkemunkyAPI.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/web/objects/QueryResponse.java b/Common/Source/src/main/java/dev/brighten/antivpn/web/objects/QueryResponse.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/web/objects/QueryResponse.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/web/objects/QueryResponse.java
diff --git a/Common/src/main/java/dev/brighten/antivpn/web/objects/VPNResponse.java b/Common/Source/src/main/java/dev/brighten/antivpn/web/objects/VPNResponse.java
similarity index 100%
rename from Common/src/main/java/dev/brighten/antivpn/web/objects/VPNResponse.java
rename to Common/Source/src/main/java/dev/brighten/antivpn/web/objects/VPNResponse.java
diff --git a/Common/src/main/resources/config.yml b/Common/Source/src/main/resources/config.yml
similarity index 100%
rename from Common/src/main/resources/config.yml
rename to Common/Source/src/main/resources/config.yml
diff --git a/Common/loader-utils/pom.xml b/Common/loader-utils/pom.xml
new file mode 100644
index 0000000..9763696
--- /dev/null
+++ b/Common/loader-utils/pom.xml
@@ -0,0 +1,48 @@
+
+
+ 4.0.0
+
+ dev.brighten.antivpn
+ Common
+ 1.9.4
+
+
+ loader-utils
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.13.0
+
+ 17
+ 17
+ -XDignore.symbol.file
+
+
+ org.projectlombok
+ lombok
+ 1.18.30
+
+
+
+
+
+
+
+ src/main/resources
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/JarInJarClassLoader.java b/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/JarInJarClassLoader.java
new file mode 100644
index 0000000..6488c0e
--- /dev/null
+++ b/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/JarInJarClassLoader.java
@@ -0,0 +1,155 @@
+/*
+ * This file is part of LuckPerms, licensed under the MIT License.
+ *
+ * Copyright (c) lucko (Luck)
+ * Copyright (c) contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package dev.brighten.antivpn.loader;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Constructor;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+
+/**
+ * Classloader that can load a jar from within another jar file.
+ *
+ *
The "loader" jar contains the loading code & public API classes,
+ * and is class-loaded by the platform.
+ *
+ *
The inner "plugin" jar contains the plugin itself, and is class-loaded
+ * by the loading code & this classloader.
+ */
+public class JarInJarClassLoader extends URLClassLoader {
+ static {
+ ClassLoader.registerAsParallelCapable();
+ }
+
+ /**
+ * Creates a new jar-in-jar class loader.
+ *
+ * @param loaderClassLoader the loader plugin's classloader (setup and created by the platform)
+ * @param jarResourcePath the path to the jar-in-jar resource within the loader jar
+ * @throws LoadingException if something unexpectedly bad happens
+ */
+ public JarInJarClassLoader(ClassLoader loaderClassLoader, String jarResourcePath) throws LoadingException {
+ super(new URL[]{extractJar(loaderClassLoader, jarResourcePath)}, loaderClassLoader);
+ }
+
+ public void addJarToClasspath(URL url) {
+ addURL(url);
+ }
+
+ public void deleteJarResource() {
+ URL[] urls = getURLs();
+ if (urls.length == 0) {
+ return;
+ }
+
+ try {
+ Path path = Paths.get(urls[0].toURI());
+ Files.deleteIfExists(path);
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+
+ /**
+ * Creates a new plugin instance.
+ *
+ * @param bootstrapClass the name of the bootstrap plugin class
+ * @param loaderPluginType the type of the loader plugin, the only parameter of the bootstrap
+ * plugin constructor
+ * @param loaderPlugin the loader plugin instance
+ * @param the type of the loader plugin
+ * @return the instantiated bootstrap plugin
+ */
+ public LoaderBootstrap instantiatePlugin(String bootstrapClass, Class loaderPluginType, T loaderPlugin) throws LoadingException {
+ Class extends LoaderBootstrap> plugin;
+ try {
+ plugin = loadClass(bootstrapClass).asSubclass(LoaderBootstrap.class);
+ } catch (ReflectiveOperationException e) {
+ throw new LoadingException("Unable to load bootstrap class", e);
+ }
+
+ Constructor extends LoaderBootstrap> constructor;
+ try {
+ constructor = plugin.getConstructor(loaderPluginType);
+ } catch (ReflectiveOperationException e) {
+ throw new LoadingException("Unable to get bootstrap constructor", e);
+ }
+
+ try {
+ return constructor.newInstance(loaderPlugin);
+ } catch (ReflectiveOperationException e) {
+ throw new LoadingException("Unable to create bootstrap plugin instance", e);
+ }
+ }
+
+ /**
+ * Extracts the "jar-in-jar" from the loader plugin into a temporary file,
+ * then returns a URL that can be used by the {@link JarInJarClassLoader}.
+ *
+ * @param loaderClassLoader the classloader for the "host" loader plugin
+ * @param jarResourcePath the inner jar resource path
+ * @return a URL to the extracted file
+ */
+ private static URL extractJar(ClassLoader loaderClassLoader, String jarResourcePath) throws LoadingException {
+ // get the jar-in-jar resource
+ URL jarInJar = loaderClassLoader.getResource(jarResourcePath);
+ if (jarInJar == null) {
+ throw new LoadingException("Could not locate jar-in-jar");
+ }
+
+ // create a temporary file
+ // on posix systems by default this is only read/writable by the process owner
+ Path path;
+ try {
+ path = Files.createTempFile("luckperms-jarinjar", ".jar.tmp");
+ } catch (IOException e) {
+ throw new LoadingException("Unable to create a temporary file", e);
+ }
+
+ // mark that the file should be deleted on exit
+ path.toFile().deleteOnExit();
+
+ // copy the jar-in-jar to the temporary file path
+ try (InputStream in = jarInJar.openStream()) {
+ Files.copy(in, path, StandardCopyOption.REPLACE_EXISTING);
+ } catch (IOException e) {
+ throw new LoadingException("Unable to copy jar-in-jar to temporary path", e);
+ }
+
+ try {
+ return path.toUri().toURL();
+ } catch (MalformedURLException e) {
+ throw new LoadingException("Unable to get URL from path", e);
+ }
+ }
+
+}
diff --git a/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/LoaderBootstrap.java b/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/LoaderBootstrap.java
new file mode 100644
index 0000000..38cbb29
--- /dev/null
+++ b/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/LoaderBootstrap.java
@@ -0,0 +1,41 @@
+/*
+ * This file is part of LuckPerms, licensed under the MIT License.
+ *
+ * Copyright (c) lucko (Luck)
+ * Copyright (c) contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package dev.brighten.antivpn.loader;
+
+import java.io.File;
+
+/**
+ * Minimal bootstrap plugin, called by the loader plugin.
+ */
+public interface LoaderBootstrap {
+
+ void onLoad(File dataFolder);
+
+ default void onEnable() {}
+
+ default void onDisable() {}
+
+}
diff --git a/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/LoadingException.java b/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/LoadingException.java
new file mode 100644
index 0000000..191ae03
--- /dev/null
+++ b/Common/loader-utils/src/main/java/dev/brighten/antivpn/loader/LoadingException.java
@@ -0,0 +1,41 @@
+/*
+ * This file is part of LuckPerms, licensed under the MIT License.
+ *
+ * Copyright (c) lucko (Luck)
+ * Copyright (c) contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package dev.brighten.antivpn.loader;
+
+/**
+ * Runtime exception used if there is a problem during loading
+ */
+public class LoadingException extends RuntimeException {
+
+ public LoadingException(String message) {
+ super(message);
+ }
+
+ public LoadingException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+}
diff --git a/Common/pom.xml b/Common/pom.xml
index 7926c16..dff27de 100644
--- a/Common/pom.xml
+++ b/Common/pom.xml
@@ -7,6 +7,11 @@
dev.brighten.antivpn1.9.4
+ pom
+
+ loader-utils
+ Source
+ 4.0.0Common
@@ -16,162 +21,4 @@
17
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.13.0
-
- 17
- 17
- -XDignore.symbol.file
-
-
- org.projectlombok
- lombok
- 1.18.30
-
-
-
-
-
- org.apache.maven.plugins
- maven-shade-plugin
- 3.6.0
-
-
- package
-
- shade
-
-
- true
-
-
- org.yaml.snakeyaml
- dev.brighten.antivpn.shaded.org.yaml.snakeyaml
-
-
- dev.brighten.antivpn.depends.Relocate
- dev.brighten.antivpn.depends.MavenLibraries
-
-
-
- com.github.benmanes.caffeine
- dev.brighten.antivpn.shaded.com.github.benmanes.caffeine
-
-
- org.h2
- dev.brighten.antivpn.shaded.org.h2
-
-
- dev.brighten.antivpn.depends.Relocate
- dev.brighten.antivpn.depends.MavenLibraries
-
-
-
- org.bson
- dev.brighten.antivpn.shaded.org.bson
-
-
- dev.brighten.antivpn.depends.Relocate
- dev.brighten.antivpn.depends.MavenLibraries
-
-
-
- com.mongodb
- dev.brighten.antivpn.shaded.com.mongodb
-
-
- dev.brighten.antivpn.depends.Relocate
- dev.brighten.antivpn.depends.MavenLibraries
-
-
-
- com.mysql.cj
- dev.brighten.antivpn.shaded.com.mysql.cj
-
-
- dev.brighten.antivpn.depends.Relocate
- dev.brighten.antivpn.depends.MavenLibraries
-
-
-
- com.mysql.jdbc
- dev.brighten.antivpn.shaded.com.mysql.jdbc
-
-
- dev.brighten.antivpn.depends.Relocate
- dev.brighten.antivpn.depends.MavenLibraries
-
-
-
-
-
-
-
-
-
-
- src/main/resources
- true
-
-
-
-
-
-
- funkemunky-releases
- https://nexus.funkemunky.cc/content/repositories/releases/
-
-
-
-
-
- com.mysql
- mysql-connector-j
- 9.1.0
- jar
- provided
-
-
- com.h2database
- h2
- 2.2.220
- provided
-
-
- org.ow2.asm
- asm
- 9.8
- compile
-
-
- org.ow2.asm
- asm-commons
- 9.8
- compile
-
-
- org.yaml
- snakeyaml
- 2.2
- compile
-
-
- com.github.ben-manes.caffeine
- caffeine
- 3.1.8
- provided
-
-
-
- org.mongodb
- mongo-java-driver
- 3.12.14
- provided
-
-
-
\ No newline at end of file
diff --git a/Sponge/pom.xml b/Sponge/pom.xml
index 188a5f3..c9ce89b 100644
--- a/Sponge/pom.xml
+++ b/Sponge/pom.xml
@@ -31,7 +31,7 @@
dev.brighten.antivpn
- Common
+ Source1.9.4compile
@@ -63,8 +63,8 @@
- 21
- 21
+ 17
+ 17
@@ -74,8 +74,8 @@
maven-compiler-plugin3.13.0
- 21
- 21
+ 17
+ 17-XDignore.symbol.file
diff --git a/Universal/pom.xml b/Universal/pom.xml
index dfbec0e..260300c 100644
--- a/Universal/pom.xml
+++ b/Universal/pom.xml
@@ -25,8 +25,8 @@
compile
- dev.brighten.antivpn
- Bukkit
+ dev.brighten.antivpn.bukkit
+ Loader${project.version}compile
diff --git a/Velocity/pom.xml b/Velocity/pom.xml
index 8d2db5a..a8c9a4c 100644
--- a/Velocity/pom.xml
+++ b/Velocity/pom.xml
@@ -16,23 +16,17 @@
17
-
-
- velocity
- https://nexus.velocitypowered.com/repository/maven-public/
-
-
-
- com.velocitypowered
+ com.velocitypowered.localvelocity-api3.4.0-SNAPSHOT
- provided
+ C:/Users/647519/IdeaProjects/AntiVPN/Velocity/velocity-proxy-3.0.1.jar
+ systemdev.brighten.antivpn
- Common
+ Source1.9.4provided