diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 0000000..7aad4db
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+MelonProxy.java
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..20a94da
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..aa00ffa
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 0000000..31fd7b4
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..463551f
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..fe15007
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/MelonEconomy-Proxy.iml b/MelonEconomy-Proxy.iml
new file mode 100644
index 0000000..a587e97
--- /dev/null
+++ b/MelonEconomy-Proxy.iml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+ VELOCITY
+ ADVENTURE
+
+ 1
+
+
+
+
\ No newline at end of file
diff --git a/Melon_Proxy.iml b/Melon_Proxy.iml
new file mode 100644
index 0000000..a587e97
--- /dev/null
+++ b/Melon_Proxy.iml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+ VELOCITY
+ ADVENTURE
+
+ 1
+
+
+
+
\ No newline at end of file
diff --git a/Melon_Proxy_Helper.iml b/Melon_Proxy_Helper.iml
new file mode 100644
index 0000000..0572102
--- /dev/null
+++ b/Melon_Proxy_Helper.iml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ VELOCITY
+
+ 1
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..17d51d2
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,62 @@
+
+ 4.0.0
+
+ org.derek
+ MelonEconomy-Proxy
+ 1.3.1
+ jar
+
+ Melon Proxy
+
+
+ 17
+ UTF-8
+
+
+
+
+ papermc-repo
+ https://repo.papermc.io/repository/maven-public/
+
+
+
+ kyori
+ https://repo.kyori.net/repository/maven-public/
+
+
+
+
+
+ com.velocitypowered
+ velocity-api
+ 3.3.0-SNAPSHOT
+ provided
+
+
+ net.kyori
+ adventure-platform-api
+ 4.3.0
+
+
+ net.kyori
+ adventure-text-minimessage
+ 4.14.0
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+ ${java.version}
+ ${java.version}
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/org/derek/melon_proxy/MelonProxy.java b/src/main/java/org/derek/melon_proxy/MelonProxy.java
new file mode 100644
index 0000000..ab69149
--- /dev/null
+++ b/src/main/java/org/derek/melon_proxy/MelonProxy.java
@@ -0,0 +1,151 @@
+package org.derek.melon_proxy;
+
+import com.velocitypowered.api.command.CommandSource;
+import com.velocitypowered.api.command.SimpleCommand;
+import com.velocitypowered.api.event.Subscribe;
+import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
+import com.velocitypowered.api.plugin.Plugin;
+import com.velocitypowered.api.proxy.ProxyServer;
+import com.velocitypowered.api.proxy.server.RegisteredServer;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.minimessage.MiniMessage;
+
+import javax.inject.Inject;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+@Plugin(id = "melon_proxy", name = "Melon Proxy", version = "1.3", authors = {"Derek1256"})
+public class MelonProxy {
+
+ private final ProxyServer server;
+
+ @Inject
+ public MelonProxy(ProxyServer server) {
+ this.server = server;
+ }
+
+ @Subscribe
+ public void onProxyInitialization(ProxyInitializeEvent event) {
+ server.getCommandManager().register("melonproxy", new MelonProxyCommand(server));
+ }
+
+ public static class MelonProxyCommand implements SimpleCommand {
+
+ private final ProxyServer server;
+ private final MiniMessage miniMessage = MiniMessage.miniMessage();
+
+ public MelonProxyCommand(ProxyServer server) {
+ this.server = server;
+ }
+
+ @Override
+ public void execute(Invocation invocation) {
+ CommandSource source = invocation.source();
+ String[] args = invocation.arguments();
+
+ if (args.length == 0) {
+ source.sendMessage(Component.text("Usage: /melonproxy "));
+ return;
+ }
+
+ String subCommand = args[0].toLowerCase();
+
+ switch (subCommand) {
+ case "broadcast":
+ handleBroadcast(source, String.join(" ", Arrays.copyOfRange(args, 1, args.length)));
+ break;
+ case "storebroadcast":
+ handleStoreBroadcast(source, String.join(" ", Arrays.copyOfRange(args, 1, args.length)));
+ break;
+ default:
+ source.sendMessage(Component.text("Usage: /melonproxy "));
+ break;
+ }
+ }
+
+ private void handleBroadcast(CommandSource source, String message) {
+ if (message.isEmpty()) {
+ source.sendMessage(miniMessage.deserialize("Usage: /melonproxy broadcast "));
+ return;
+ }
+
+ String formattedMessage = convertLegacyColorsToMiniMessage(message);
+ Component broadcastMessage = miniMessage.deserialize(
+ "Melon Nexu" +
+ "s" +
+ " | Pro" +
+ "xy » " +
+ "" + formattedMessage + ""
+ );
+
+ for (RegisteredServer registeredServer : server.getAllServers()) {
+ for (var player : registeredServer.getPlayersConnected()) {
+ player.sendMessage(broadcastMessage);
+ }
+ }
+ }
+
+ private void handleStoreBroadcast(CommandSource source, String message) {
+ if (message.isEmpty()) {
+ source.sendMessage(miniMessage.deserialize("Usage: /melonproxy storebroadcast "));
+ return;
+ }
+
+ String formattedMessage = convertLegacyColorsToMiniMessage(message);
+ Component storeBroadcastMessage = miniMessage.deserialize(
+ "Melon Nexu" +
+ "s" +
+ " | Sto" +
+ "re » " +
+ "" + formattedMessage + ""
+ );
+
+ for (RegisteredServer registeredServer : server.getAllServers()) {
+ if (!registeredServer.getServerInfo().getName().equalsIgnoreCase("prisons")) {
+ for (var player : registeredServer.getPlayersConnected()) {
+ player.sendMessage(storeBroadcastMessage);
+ }
+ }
+ }
+ }
+
+
+ private String convertLegacyColorsToMiniMessage(String message) {
+ Map legacyToMiniMessage = new HashMap<>();
+ legacyToMiniMessage.put("&0", "");
+ legacyToMiniMessage.put("&1", "");
+ legacyToMiniMessage.put("&2", "");
+ legacyToMiniMessage.put("&3", "");
+ legacyToMiniMessage.put("&4", "");
+ legacyToMiniMessage.put("&5", "");
+ legacyToMiniMessage.put("&6", "");
+ legacyToMiniMessage.put("&7", "");
+ legacyToMiniMessage.put("&8", "");
+ legacyToMiniMessage.put("&9", "");
+ legacyToMiniMessage.put("&a", "");
+ legacyToMiniMessage.put("&b", "");
+ legacyToMiniMessage.put("&c", "");
+ legacyToMiniMessage.put("&d", "");
+ legacyToMiniMessage.put("&e", "");
+ legacyToMiniMessage.put("&f", "");
+ legacyToMiniMessage.put("&k", "");
+ legacyToMiniMessage.put("&l", "");
+ legacyToMiniMessage.put("&m", "");
+ legacyToMiniMessage.put("&n", "");
+ legacyToMiniMessage.put("&o", "");
+ legacyToMiniMessage.put("&r", "");
+
+ for (Map.Entry entry : legacyToMiniMessage.entrySet()) {
+ message = message.replace(entry.getKey(), entry.getValue());
+ }
+
+ return message;
+ }
+
+ @Override
+ public boolean hasPermission(Invocation invocation) {
+ return invocation.source().hasPermission("melonproxy.use");
+ }
+ }
+}