summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew <pugmatt@gmail.com>2021-01-22 23:38:53 -0500
committerMatthew <pugmatt@gmail.com>2021-01-22 23:38:53 -0500
commita9abb45baa0273a7fee254985cea49f3c6f6813a (patch)
treea4340fd7cfe7d1a996e47f37ad54d76da10914dc
parent01becb452585f8c58fd250358e42a863f4bbe3e2 (diff)
downloadBedrockConnect-a9abb45baa0273a7fee254985cea49f3c6f6813a.tar.gz
BedrockConnect-a9abb45baa0273a7fee254985cea49f3c6f6813a.tar.bz2
BedrockConnect-a9abb45baa0273a7fee254985cea49f3c6f6813a.zip
Add way for popup to reopen if it closes from packet loss
-rw-r--r--serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BCPlayer.java43
-rw-r--r--serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java2
-rw-r--r--serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java34
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();