diff options
| author | Matthew <pugmatt@gmail.com> | 2021-01-22 23:38:53 -0500 |
|---|---|---|
| committer | Matthew <pugmatt@gmail.com> | 2021-01-22 23:38:53 -0500 |
| commit | a9abb45baa0273a7fee254985cea49f3c6f6813a (patch) | |
| tree | a4340fd7cfe7d1a996e47f37ad54d76da10914dc | |
| parent | 01becb452585f8c58fd250358e42a863f4bbe3e2 (diff) | |
| download | BedrockConnect-a9abb45baa0273a7fee254985cea49f3c6f6813a.tar.gz BedrockConnect-a9abb45baa0273a7fee254985cea49f3c6f6813a.tar.bz2 BedrockConnect-a9abb45baa0273a7fee254985cea49f3c6f6813a.zip | |
Add way for popup to reopen if it closes from packet loss
3 files changed, 73 insertions, 6 deletions
diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BCPlayer.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BCPlayer.java index 76a2d6b..53f38f0 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BCPlayer.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BCPlayer.java @@ -15,6 +15,7 @@ import com.nukkitx.protocol.bedrock.data.inventory.ItemData; import com.nukkitx.protocol.bedrock.packet.*; import com.nukkitx.math.vector.Vector3f; import main.com.pyratron.pugmatt.bedrockconnect.gui.UIComponents; +import main.com.pyratron.pugmatt.bedrockconnect.gui.UIForms; import main.com.pyratron.pugmatt.bedrockconnect.sql.Data; import java.io.ByteArrayOutputStream; @@ -37,6 +38,9 @@ public class BCPlayer { private LocalTime lastAction; + private int currentForm = 0; + private LocalTime movementOpenCoolDown = LocalTime.now(); + private static final NbtMap EMPTY_TAG = NbtMap.EMPTY; private static final byte[] EMPTY_LEVEL_CHUNK_DATA; @@ -98,10 +102,49 @@ public class BCPlayer { this.serverLimit = serverLimit; } + public int getCurrentForm() { + return currentForm; + } + + public void setCurrentForm(int form) { + currentForm = form; + } + public boolean isActive() { return Duration.between(lastAction, LocalTime.now()).toMillis() <= 600000; } + public boolean canMovementOpen() { return Duration.between(movementOpenCoolDown, LocalTime.now()).toMillis() > 1000; } + + public void resetMovementOpen() { movementOpenCoolDown = LocalTime.now(); } + public void setActive() { lastAction = LocalTime.now(); } + public void movementOpen() { + + if(canMovementOpen()) { + + ModalFormRequestPacket form; + + switch (getCurrentForm()) { + case UIForms.MAIN: + form = UIForms.createMain(getServerList()); + break; + case UIForms.DIRECT_CONNECT: + form = UIForms.createDirectConnect(); + break; + case UIForms.REMOVE_SERVER: + form = UIForms.createRemoveServer(getServerList()); + break; + default: + form = UIForms.createMain(getServerList()); + break; + } + + session.sendPacketImmediately(form); + + movementOpenCoolDown = LocalTime.now(); + } + } + public void joinGame() { MovePlayerPacket mp = new MovePlayerPacket(); diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java index f20c431..e917481 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java @@ -93,7 +93,7 @@ public class Server { }); // Start server up server.bind().join(); - System.out.println("Bedrock Connection Started: localhost:19132"); + System.out.println("Bedrock Connection Started: 0.0.0.0:19132"); if(BedrockConnect.kickInactive) { Timer timer = new Timer(); TimerTask task = new TimerTask() { diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java index a50307a..bb1e5b1 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java @@ -20,6 +20,7 @@ import com.nukkitx.protocol.bedrock.packet.LoginPacket; import com.nukkitx.protocol.bedrock.util.EncryptionUtils; import com.nukkitx.protocol.bedrock.v388.Bedrock_v388; import com.nukkitx.protocol.bedrock.v407.Bedrock_v407; +import io.netty.handler.codec.MessageAggregationException; import io.netty.util.AsciiString; import io.netty.util.internal.ThreadLocalRandom; import main.com.pyratron.pugmatt.bedrockconnect.BCPlayer; @@ -42,8 +43,6 @@ import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -// Heavily referenced from https://github.com/NukkitX/ProxyPass/blob/master/src/main/java/com/nukkitx/proxypass/network/bedrock/session/UpstreamPacketHandler.java - public class PacketHandler implements BedrockPacketHandler { private Server server; @@ -72,15 +71,32 @@ public class PacketHandler implements BedrockPacketHandler { return false; } + // Occasionally, a sent form will not correctly send to a player for whatever reason, and they float in space. This works as a way to open the form back up. + + @Override + public boolean handle(PlayerActionPacket packet) { + player.movementOpen(); + return false; + } + @Override + public boolean handle(MovePlayerPacket packet) { + if(packet.getMode() == MovePlayerPacket.Mode.NORMAL || packet.getMode() == MovePlayerPacket.Mode.HEAD_ROTATION) + player.movementOpen(); + return false; + } + @Override public boolean handle(ModalFormResponsePacket packet) { player.setActive(); + player.resetMovementOpen(); + switch (packet.getFormId()) { case UIForms.MAIN: if(UIForms.currentForm == UIForms.MAIN) { // Re-open window if closed if (packet.getFormData().contains("null")) { - session.sendPacketImmediately(UIForms.createMain(player.getServerList())); + //session.sendPacketImmediately(UIForms.createMain(player.getServerList())); + player.setCurrentForm(UIForms.MAIN); } else { // If selecting button int chosen = Integer.parseInt(packet.getFormData().replaceAll("\\s+","")); @@ -94,9 +110,11 @@ public class PacketHandler implements BedrockPacketHandler { switch(button) { case CONNECT: session.sendPacketImmediately(UIForms.createDirectConnect()); + player.setCurrentForm(UIForms.DIRECT_CONNECT); break; case REMOVE: session.sendPacketImmediately(UIForms.createRemoveServer(player.getServerList())); + player.setCurrentForm(UIForms.REMOVE_SERVER); break; case EXIT: player.disconnect("Exiting Server List", server); @@ -151,8 +169,10 @@ public class PacketHandler implements BedrockPacketHandler { break; case UIForms.DIRECT_CONNECT: try { - if(packet.getFormData().contains("null")) + if(packet.getFormData().contains("null")) { session.sendPacketImmediately(UIForms.createMain(player.getServerList())); + player.setCurrentForm(UIForms.MAIN); + } else { ArrayList<String> data = UIComponents.getFormData(packet.getFormData()); if(data.size() > 1) { @@ -194,8 +214,10 @@ public class PacketHandler implements BedrockPacketHandler { break; case UIForms.REMOVE_SERVER: try { - if(packet.getFormData().contains("null")) + if(packet.getFormData().contains("null")) { session.sendPacketImmediately(UIForms.createMain(player.getServerList())); + player.setCurrentForm(UIForms.MAIN); + } else { ArrayList<String> data = UIComponents.getFormData(packet.getFormData()); @@ -301,6 +323,8 @@ public class PacketHandler implements BedrockPacketHandler { return true; } + // Heavily referenced from https://github.com/NukkitX/ProxyPass/blob/master/src/main/java/com/nukkitx/proxypass/network/bedrock/session/UpstreamPacketHandler.java + @Override public boolean handle(LoginPacket packet) { int protocolVersion = packet.getProtocolVersion(); |
