forked from git-mirrors/GeyserConnect
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.BedrockServerSession;
|
||||
import lombok.Getter;
|
||||
import org.geysermc.multi.utils.Logger;
|
||||
import org.geysermc.multi.utils.Player;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
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.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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 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 {
|
|
@ -1,4 +1,4 @@
|
|||
package org.geysermc.multi;
|
||||
package org.geysermc.multi.utils;
|
||||
|
||||
import com.nukkitx.nbt.CompoundTagBuilder;
|
||||
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.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<Server> 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);
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package org.geysermc.multi;
|
||||
package org.geysermc.multi.utils;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
Loading…
Add table
Reference in a new issue