Initial Stargate plugin: Paper gate plugin + Velocity/Bungee cross-server bridges
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
+80
@@ -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.
|
||||
Reference in New Issue
Block a user