mirror of
https://github.com/GeyserMC/GeyserConnect.git
synced 2025-06-26 14:15:22 +02:00
Add form response handling and basic server transfer
This commit is contained in:
parent
4a3119f730
commit
ba036ee3dd
10 changed files with 108 additions and 50 deletions
|
@ -5,6 +5,8 @@ import com.nukkitx.protocol.bedrock.BedrockServer;
|
||||||
import com.nukkitx.protocol.bedrock.BedrockServerEventHandler;
|
import com.nukkitx.protocol.bedrock.BedrockServerEventHandler;
|
||||||
import com.nukkitx.protocol.bedrock.BedrockServerSession;
|
import com.nukkitx.protocol.bedrock.BedrockServerSession;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import org.geysermc.multi.utils.Logger;
|
||||||
|
import org.geysermc.multi.utils.Player;
|
||||||
|
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
|
@ -11,12 +11,14 @@ import com.nukkitx.protocol.bedrock.BedrockServerSession;
|
||||||
import com.nukkitx.protocol.bedrock.handler.BedrockPacketHandler;
|
import com.nukkitx.protocol.bedrock.handler.BedrockPacketHandler;
|
||||||
import com.nukkitx.protocol.bedrock.packet.*;
|
import com.nukkitx.protocol.bedrock.packet.*;
|
||||||
import com.nukkitx.protocol.bedrock.util.EncryptionUtils;
|
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.io.IOException;
|
||||||
import java.security.interfaces.ECPublicKey;
|
import java.security.interfaces.ECPublicKey;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class PacketHandler implements BedrockPacketHandler {
|
public class PacketHandler implements BedrockPacketHandler {
|
||||||
|
|
||||||
|
@ -142,7 +144,7 @@ public class PacketHandler implements BedrockPacketHandler {
|
||||||
public boolean handle(SetLocalPlayerAsInitializedPacket packet) {
|
public boolean handle(SetLocalPlayerAsInitializedPacket packet) {
|
||||||
masterServer.getLogger().debug("Player initialized: " + player.getDisplayName());
|
masterServer.getLogger().debug("Player initialized: " + player.getDisplayName());
|
||||||
|
|
||||||
player.sendServerList();
|
player.sendWindow(FormID.MAIN, UIHandler.getServerListFormPacket(player.getServers()));;
|
||||||
|
|
||||||
/*TransferPacket transferPacket = new TransferPacket();
|
/*TransferPacket transferPacket = new TransferPacket();
|
||||||
transferPacket.setAddress("81.174.164.211");
|
transferPacket.setAddress("81.174.164.211");
|
||||||
|
@ -151,4 +153,30 @@ public class PacketHandler implements BedrockPacketHandler {
|
||||||
|
|
||||||
return false;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
package org.geysermc.multi.UI;
|
|
||||||
|
|
||||||
public enum FormID {
|
|
||||||
MAIN,
|
|
||||||
DIRECT_CONNECT,
|
|
||||||
ADD_SERVER,
|
|
||||||
REMOVE_SERVER,
|
|
||||||
ERROR;
|
|
||||||
}
|
|
|
@ -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<Server> 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;
|
|
||||||
}
|
|
||||||
}
|
|
15
src/main/java/org/geysermc/multi/ui/FormID.java
Normal file
15
src/main/java/org/geysermc/multi/ui/FormID.java
Normal file
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
36
src/main/java/org/geysermc/multi/ui/UIHandler.java
Normal file
36
src/main/java/org/geysermc/multi/ui/UIHandler.java
Normal file
|
@ -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<Server> 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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +1,10 @@
|
||||||
package org.geysermc.multi;
|
package org.geysermc.multi.utils;
|
||||||
|
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import net.minecrell.terminalconsole.SimpleTerminalConsole;
|
import net.minecrell.terminalconsole.SimpleTerminalConsole;
|
||||||
import org.apache.logging.log4j.core.config.Configurator;
|
import org.apache.logging.log4j.core.config.Configurator;
|
||||||
import org.geysermc.common.ChatColor;
|
import org.geysermc.common.ChatColor;
|
||||||
|
import org.geysermc.multi.MasterServer;
|
||||||
|
|
||||||
@Log4j2
|
@Log4j2
|
||||||
public class Logger extends SimpleTerminalConsole {
|
public class Logger extends SimpleTerminalConsole {
|
|
@ -1,4 +1,4 @@
|
||||||
package org.geysermc.multi;
|
package org.geysermc.multi.utils;
|
||||||
|
|
||||||
import com.nukkitx.nbt.CompoundTagBuilder;
|
import com.nukkitx.nbt.CompoundTagBuilder;
|
||||||
import com.nukkitx.nbt.NbtUtils;
|
import com.nukkitx.nbt.NbtUtils;
|
|
@ -1,4 +1,4 @@
|
||||||
package org.geysermc.multi;
|
package org.geysermc.multi.utils;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.JsonNode;
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
import com.nukkitx.math.vector.Vector2f;
|
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.data.*;
|
||||||
import com.nukkitx.protocol.bedrock.packet.*;
|
import com.nukkitx.protocol.bedrock.packet.*;
|
||||||
import lombok.Getter;
|
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.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -25,6 +26,9 @@ public class Player {
|
||||||
|
|
||||||
private final List<Server> servers = new ArrayList<>();
|
private final List<Server> servers = new ArrayList<>();
|
||||||
|
|
||||||
|
private FormWindow currentWindow;
|
||||||
|
private FormID currentWindowId;
|
||||||
|
|
||||||
public Player(JsonNode extraData, BedrockServerSession session) {
|
public Player(JsonNode extraData, BedrockServerSession session) {
|
||||||
this.xuid = extraData.get("XUID").asText();
|
this.xuid = extraData.get("XUID").asText();
|
||||||
this.identity = UUID.fromString(extraData.get("identity").asText());
|
this.identity = UUID.fromString(extraData.get("identity").asText());
|
||||||
|
@ -33,7 +37,7 @@ public class Player {
|
||||||
this.session = session;
|
this.session = session;
|
||||||
|
|
||||||
// Should fetch the servers from some form of db
|
// 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));
|
servers.add(new Server("81.174.164.211", 25580));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,7 +118,17 @@ public class Player {
|
||||||
session.sendPacket(setEntityMotionPacket);
|
session.sendPacket(setEntityMotionPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendServerList() {
|
public void sendWindow(FormID id, FormWindow window) {
|
||||||
session.sendPacket(UIHandler.getServerListFormPacket(servers));
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package org.geysermc.multi;
|
package org.geysermc.multi.utils;
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
Loading…
Add table
Reference in a new issue