Initial Stargate plugin: Paper gate plugin + Velocity/Bungee cross-server bridges

This commit is contained in:
Michael Burgess
2026-08-09 09:53:55 -04:00
commit 83a0392ee9
34 changed files with 2317 additions and 0 deletions
+22
View File
@@ -0,0 +1,22 @@
plugins {
id("com.gradleup.shadow") version "8.3.5"
}
dependencies {
implementation(project(":stargate-common"))
compileOnly("net.md-5:bungeecord-api:1.21-R0.4")
}
tasks.shadowJar {
archiveClassifier.set("")
}
tasks.build {
dependsOn(tasks.shadowJar)
}
tasks.processResources {
filesMatching("bungee.yml") {
expand("version" to project.version)
}
}
@@ -0,0 +1,80 @@
package dev.skywalker3200.stargate.bungee;
import dev.skywalker3200.stargate.common.network.StargateChannel;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.connection.Server;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.event.PluginMessageEvent;
import net.md_5.bungee.api.event.ServerConnectedEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.event.EventHandler;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
/** BungeeCord counterpart of the Velocity bridge: same wire protocol, same job. */
public class StargateBungeePlugin extends Plugin implements Listener {
private final Map<UUID, String> pendingGateByPlayer = new ConcurrentHashMap<>();
@Override
public void onEnable() {
getProxy().registerChannel(StargateChannel.CHANNEL);
getProxy().getPluginManager().registerListener(this, this);
getLogger().info("Stargate Bungee bridge ready on channel " + StargateChannel.CHANNEL);
}
@EventHandler
public void onPluginMessage(PluginMessageEvent event) {
if (!event.getTag().equals(StargateChannel.CHANNEL)) return;
event.setCancelled(true);
try {
DataInputStream in = new DataInputStream(new ByteArrayInputStream(event.getData()));
byte op = in.readByte();
if (op != StargateChannel.OP_TELEPORT_REQUEST) return;
UUID playerId = UUID.fromString(in.readUTF());
String targetServer = in.readUTF();
String gateId = in.readUTF();
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(playerId);
ServerInfo target = ProxyServer.getInstance().getServerInfo(targetServer);
if (player == null || target == null) {
getLogger().warning("Stargate teleport request for unknown player/server (" + playerId + "/" + targetServer + ")");
return;
}
pendingGateByPlayer.put(playerId, gateId);
player.connect(target);
} catch (Exception e) {
getLogger().warning("Failed to process stargate plugin message: " + e.getMessage());
}
}
@EventHandler
public void onServerConnected(ServerConnectedEvent event) {
ProxiedPlayer player = event.getPlayer();
String gateId = pendingGateByPlayer.remove(player.getUniqueId());
if (gateId == null) return;
Server server = event.getServer();
try {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(bytes);
out.writeByte(StargateChannel.OP_TELEPORT_DELIVER);
out.writeUTF(player.getUniqueId().toString());
out.writeUTF(gateId);
server.sendData(StargateChannel.CHANNEL, bytes.toByteArray());
} catch (Exception e) {
getLogger().warning("Failed to deliver stargate teleport: " + e.getMessage());
}
}
}
@@ -0,0 +1,5 @@
name: StargateBungee
main: dev.skywalker3200.stargate.bungee.StargateBungeePlugin
version: '${version}'
author: skywalker3200
description: Relays Stargate cross-server teleport requests for BungeeCord.