From ba036ee3dd673aab947a0eea4ce43da534c2de3a Mon Sep 17 00:00:00 2001 From: rtm516 Date: Sun, 14 Jun 2020 20:08:11 +0100 Subject: [PATCH] Add form response handling and basic server transfer --- .../java/org/geysermc/multi/MasterServer.java | 2 ++ .../org/geysermc/multi/PacketHandler.java | 36 ++++++++++++++++--- .../java/org/geysermc/multi/UI/FormID.java | 9 ----- .../java/org/geysermc/multi/UI/UIHandler.java | 29 --------------- .../java/org/geysermc/multi/ui/FormID.java | 15 ++++++++ .../java/org/geysermc/multi/ui/UIHandler.java | 36 +++++++++++++++++++ .../geysermc/multi/{ => utils}/Logger.java | 3 +- .../multi/{ => utils}/PalleteManger.java | 2 +- .../geysermc/multi/{ => utils}/Player.java | 24 ++++++++++--- .../geysermc/multi/{ => utils}/Server.java | 2 +- 10 files changed, 108 insertions(+), 50 deletions(-) delete mode 100644 src/main/java/org/geysermc/multi/UI/FormID.java delete mode 100644 src/main/java/org/geysermc/multi/UI/UIHandler.java create mode 100644 src/main/java/org/geysermc/multi/ui/FormID.java create mode 100644 src/main/java/org/geysermc/multi/ui/UIHandler.java rename src/main/java/org/geysermc/multi/{ => utils}/Logger.java (96%) rename src/main/java/org/geysermc/multi/{ => utils}/PalleteManger.java (98%) rename src/main/java/org/geysermc/multi/{ => utils}/Player.java (86%) rename src/main/java/org/geysermc/multi/{ => utils}/Server.java (88%) diff --git a/src/main/java/org/geysermc/multi/MasterServer.java b/src/main/java/org/geysermc/multi/MasterServer.java index 277527a..65c0afb 100644 --- a/src/main/java/org/geysermc/multi/MasterServer.java +++ b/src/main/java/org/geysermc/multi/MasterServer.java @@ -5,6 +5,8 @@ import com.nukkitx.protocol.bedrock.BedrockServer; import com.nukkitx.protocol.bedrock.BedrockServerEventHandler; import com.nukkitx.protocol.bedrock.BedrockServerSession; import lombok.Getter; +import org.geysermc.multi.utils.Logger; +import org.geysermc.multi.utils.Player; import java.net.InetSocketAddress; import java.util.HashMap; diff --git a/src/main/java/org/geysermc/multi/PacketHandler.java b/src/main/java/org/geysermc/multi/PacketHandler.java index 5c702b3..dc98640 100644 --- a/src/main/java/org/geysermc/multi/PacketHandler.java +++ b/src/main/java/org/geysermc/multi/PacketHandler.java @@ -11,12 +11,14 @@ import com.nukkitx.protocol.bedrock.BedrockServerSession; import com.nukkitx.protocol.bedrock.handler.BedrockPacketHandler; import com.nukkitx.protocol.bedrock.packet.*; import com.nukkitx.protocol.bedrock.util.EncryptionUtils; -import org.geysermc.multi.UI.UIHandler; +import org.geysermc.common.window.FormWindow; +import org.geysermc.common.window.response.SimpleFormResponse; +import org.geysermc.multi.ui.FormID; +import org.geysermc.multi.ui.UIHandler; +import org.geysermc.multi.utils.Player; import java.io.IOException; import java.security.interfaces.ECPublicKey; -import java.util.ArrayList; -import java.util.List; public class PacketHandler implements BedrockPacketHandler { @@ -142,7 +144,7 @@ public class PacketHandler implements BedrockPacketHandler { public boolean handle(SetLocalPlayerAsInitializedPacket packet) { masterServer.getLogger().debug("Player initialized: " + player.getDisplayName()); - player.sendServerList(); + player.sendWindow(FormID.MAIN, UIHandler.getServerListFormPacket(player.getServers()));; /*TransferPacket transferPacket = new TransferPacket(); transferPacket.setAddress("81.174.164.211"); @@ -151,4 +153,30 @@ public class PacketHandler implements BedrockPacketHandler { return false; } + + @Override + public boolean handle(ModalFormResponsePacket packet) { + FormID id = FormID.fromId(packet.getFormId()); + if (id != player.getCurrentWindowId()) + return false; + + FormWindow window = player.getCurrentWindow(); + window.setResponse(packet.getFormData().trim()); + + if (window.getResponse() == null) { + player.resendWindow(); + } else { + switch (id) { + case MAIN: + UIHandler.handleServerListResponse(player, (SimpleFormResponse) window.getResponse()); + break; + + default: + player.resendWindow(); + break; + } + } + + return true; + } } diff --git a/src/main/java/org/geysermc/multi/UI/FormID.java b/src/main/java/org/geysermc/multi/UI/FormID.java deleted file mode 100644 index 6e5fff6..0000000 --- a/src/main/java/org/geysermc/multi/UI/FormID.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.geysermc.multi.UI; - -public enum FormID { - MAIN, - DIRECT_CONNECT, - ADD_SERVER, - REMOVE_SERVER, - ERROR; -} \ No newline at end of file diff --git a/src/main/java/org/geysermc/multi/UI/UIHandler.java b/src/main/java/org/geysermc/multi/UI/UIHandler.java deleted file mode 100644 index c38c775..0000000 --- a/src/main/java/org/geysermc/multi/UI/UIHandler.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.geysermc.multi.UI; - -import com.nukkitx.protocol.bedrock.packet.ModalFormRequestPacket; -import org.geysermc.common.window.FormWindow; -import org.geysermc.common.window.SimpleFormWindow; -import org.geysermc.common.window.button.FormButton; -import org.geysermc.common.window.button.FormImage; -import org.geysermc.multi.Server; - -import java.util.List; - -public class UIHandler { - public static ModalFormRequestPacket getServerListFormPacket(List servers) { - SimpleFormWindow window = new SimpleFormWindow("Servers", ""); - - for (Server server : servers) { - window.getButtons().add(new FormButton(server.getAddress(), new FormImage(FormImage.FormImageType.URL, "https://eu.mc-api.net/v3/server/favicon/" + server.getAddress() + ":" + server.getPort() + ".png"))); - } - - return generatePacket(FormID.MAIN, window); - } - - private static ModalFormRequestPacket generatePacket(FormID id, FormWindow form) { - ModalFormRequestPacket modalFormRequestPacket = new ModalFormRequestPacket(); - modalFormRequestPacket.setFormId(id.ordinal()); - modalFormRequestPacket.setFormData(form.getJSONData()); // This fixes a bug in Geyser - return modalFormRequestPacket; - } -} diff --git a/src/main/java/org/geysermc/multi/ui/FormID.java b/src/main/java/org/geysermc/multi/ui/FormID.java new file mode 100644 index 0000000..c97369a --- /dev/null +++ b/src/main/java/org/geysermc/multi/ui/FormID.java @@ -0,0 +1,15 @@ +package org.geysermc.multi.ui; + +public enum FormID { + MAIN, + DIRECT_CONNECT, + ADD_SERVER, + REMOVE_SERVER, + ERROR; + + private static final FormID[] VALUES = values(); + + public static FormID fromId(int id) { + return id >= 0 && id < VALUES.length ? VALUES[id] : ERROR; + } +} \ No newline at end of file diff --git a/src/main/java/org/geysermc/multi/ui/UIHandler.java b/src/main/java/org/geysermc/multi/ui/UIHandler.java new file mode 100644 index 0000000..28e1c66 --- /dev/null +++ b/src/main/java/org/geysermc/multi/ui/UIHandler.java @@ -0,0 +1,36 @@ +package org.geysermc.multi.ui; + +import com.nukkitx.protocol.bedrock.packet.TransferPacket; +import org.geysermc.common.window.FormWindow; +import org.geysermc.common.window.SimpleFormWindow; +import org.geysermc.common.window.button.FormButton; +import org.geysermc.common.window.button.FormImage; +import org.geysermc.common.window.response.SimpleFormResponse; +import org.geysermc.multi.MasterServer; +import org.geysermc.multi.utils.Player; +import org.geysermc.multi.utils.Server; + +import java.util.List; + +public class UIHandler { + public static FormWindow getServerListFormPacket(List servers) { + SimpleFormWindow window = new SimpleFormWindow("Servers", ""); + + for (Server server : servers) { + window.getButtons().add(new FormButton(server.getAddress(), new FormImage(FormImage.FormImageType.URL, "https://eu.mc-api.net/v3/server/favicon/" + server.getAddress() + ":" + server.getPort() + ".png"))); + } + + return window; + } + + public static void handleServerListResponse(Player player, SimpleFormResponse data) { + MasterServer.getInstance().getLogger().debug(data.getClickedButton().getText()); + + Server server = player.getServers().get(data.getClickedButtonId()); + + TransferPacket transferPacket = new TransferPacket(); + transferPacket.setAddress(server.getAddress()); + transferPacket.setPort(server.getPort()); + player.getSession().sendPacket(transferPacket); + } +} diff --git a/src/main/java/org/geysermc/multi/Logger.java b/src/main/java/org/geysermc/multi/utils/Logger.java similarity index 96% rename from src/main/java/org/geysermc/multi/Logger.java rename to src/main/java/org/geysermc/multi/utils/Logger.java index 933994c..c585f5e 100644 --- a/src/main/java/org/geysermc/multi/Logger.java +++ b/src/main/java/org/geysermc/multi/utils/Logger.java @@ -1,9 +1,10 @@ -package org.geysermc.multi; +package org.geysermc.multi.utils; import lombok.extern.log4j.Log4j2; import net.minecrell.terminalconsole.SimpleTerminalConsole; import org.apache.logging.log4j.core.config.Configurator; import org.geysermc.common.ChatColor; +import org.geysermc.multi.MasterServer; @Log4j2 public class Logger extends SimpleTerminalConsole { diff --git a/src/main/java/org/geysermc/multi/PalleteManger.java b/src/main/java/org/geysermc/multi/utils/PalleteManger.java similarity index 98% rename from src/main/java/org/geysermc/multi/PalleteManger.java rename to src/main/java/org/geysermc/multi/utils/PalleteManger.java index fb6e0d6..3ff35f7 100644 --- a/src/main/java/org/geysermc/multi/PalleteManger.java +++ b/src/main/java/org/geysermc/multi/utils/PalleteManger.java @@ -1,4 +1,4 @@ -package org.geysermc.multi; +package org.geysermc.multi.utils; import com.nukkitx.nbt.CompoundTagBuilder; import com.nukkitx.nbt.NbtUtils; diff --git a/src/main/java/org/geysermc/multi/Player.java b/src/main/java/org/geysermc/multi/utils/Player.java similarity index 86% rename from src/main/java/org/geysermc/multi/Player.java rename to src/main/java/org/geysermc/multi/utils/Player.java index 8330f34..ce11c2b 100644 --- a/src/main/java/org/geysermc/multi/Player.java +++ b/src/main/java/org/geysermc/multi/utils/Player.java @@ -1,4 +1,4 @@ -package org.geysermc.multi; +package org.geysermc.multi.utils; import com.fasterxml.jackson.databind.JsonNode; import com.nukkitx.math.vector.Vector2f; @@ -8,7 +8,8 @@ import com.nukkitx.protocol.bedrock.BedrockServerSession; import com.nukkitx.protocol.bedrock.data.*; import com.nukkitx.protocol.bedrock.packet.*; import lombok.Getter; -import org.geysermc.multi.UI.UIHandler; +import org.geysermc.common.window.FormWindow; +import org.geysermc.multi.ui.FormID; import java.util.ArrayList; import java.util.List; @@ -25,6 +26,9 @@ public class Player { private final List servers = new ArrayList<>(); + private FormWindow currentWindow; + private FormID currentWindowId; + public Player(JsonNode extraData, BedrockServerSession session) { this.xuid = extraData.get("XUID").asText(); this.identity = UUID.fromString(extraData.get("identity").asText()); @@ -33,7 +37,7 @@ public class Player { this.session = session; // Should fetch the servers from some form of db - servers.add(new Server("mc.hypixel.net")); + servers.add(new Server("play.cubecraft.net")); servers.add(new Server("81.174.164.211", 25580)); } @@ -114,7 +118,17 @@ public class Player { session.sendPacket(setEntityMotionPacket); } - public void sendServerList() { - session.sendPacket(UIHandler.getServerListFormPacket(servers)); + public void sendWindow(FormID id, FormWindow window) { + this.currentWindow = window; + this.currentWindowId = id; + + ModalFormRequestPacket modalFormRequestPacket = new ModalFormRequestPacket(); + modalFormRequestPacket.setFormId(id.ordinal()); + modalFormRequestPacket.setFormData(window.getJSONData()); + session.sendPacket(modalFormRequestPacket); + } + + public void resendWindow() { + sendWindow(currentWindowId, currentWindow); } } diff --git a/src/main/java/org/geysermc/multi/Server.java b/src/main/java/org/geysermc/multi/utils/Server.java similarity index 88% rename from src/main/java/org/geysermc/multi/Server.java rename to src/main/java/org/geysermc/multi/utils/Server.java index e317562..7995ef4 100644 --- a/src/main/java/org/geysermc/multi/Server.java +++ b/src/main/java/org/geysermc/multi/utils/Server.java @@ -1,4 +1,4 @@ -package org.geysermc.multi; +package org.geysermc.multi.utils; import lombok.AllArgsConstructor; import lombok.Getter;