Add form response handling and basic server transfer

This commit is contained in:
rtm516 2020-06-14 20:08:11 +01:00
parent 4a3119f730
commit ba036ee3dd
10 changed files with 108 additions and 50 deletions

View file

@ -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;

View file

@ -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;
}
}

View file

@ -1,9 +0,0 @@
package org.geysermc.multi.UI;
public enum FormID {
MAIN,
DIRECT_CONNECT,
ADD_SERVER,
REMOVE_SERVER,
ERROR;
}

View file

@ -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;
}
}

View 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;
}
}

View 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);
}
}

View file

@ -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 {

View file

@ -1,4 +1,4 @@
package org.geysermc.multi;
package org.geysermc.multi.utils;
import com.nukkitx.nbt.CompoundTagBuilder;
import com.nukkitx.nbt.NbtUtils;

View file

@ -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);
}
}

View file

@ -1,4 +1,4 @@
package org.geysermc.multi;
package org.geysermc.multi.utils;
import lombok.AllArgsConstructor;
import lombok.Getter;