diff --git a/README.md b/README.md index 905de10..b5c742a 100644 --- a/README.md +++ b/README.md @@ -23,4 +23,4 @@ GeyserConnect is a server that Minecraft: Bedrock Edition clients can connect to - [ ] Remove - [ ] Stop Geyser server after its idle for a while - [x] Config file -- [ ] Fix server images not loading straight away on Win10 +- [x] Fix server images not loading straight away on Win10 diff --git a/src/main/java/org/geysermc/connect/PacketHandler.java b/src/main/java/org/geysermc/connect/PacketHandler.java index c975ea4..8e83a05 100644 --- a/src/main/java/org/geysermc/connect/PacketHandler.java +++ b/src/main/java/org/geysermc/connect/PacketHandler.java @@ -34,6 +34,7 @@ import com.nimbusds.jose.JWSObject; import com.nimbusds.jose.crypto.factories.DefaultJWSVerifierFactory; import com.nukkitx.network.util.DisconnectReason; import com.nukkitx.protocol.bedrock.BedrockServerSession; +import com.nukkitx.protocol.bedrock.data.Attribute; import com.nukkitx.protocol.bedrock.handler.BedrockPacketHandler; import com.nukkitx.protocol.bedrock.packet.*; import com.nukkitx.protocol.bedrock.util.EncryptionUtils; @@ -43,9 +44,13 @@ import org.geysermc.common.window.response.SimpleFormResponse; import org.geysermc.connect.ui.FormID; import org.geysermc.connect.ui.UIHandler; import org.geysermc.connect.utils.Player; +import org.geysermc.connector.entity.attribute.AttributeType; +import org.geysermc.connector.utils.AttributeUtils; import java.io.IOException; import java.security.interfaces.ECPublicKey; +import java.util.ArrayList; +import java.util.List; public class PacketHandler implements BedrockPacketHandler { @@ -210,6 +215,10 @@ public class PacketHandler implements BedrockPacketHandler { UIHandler.handleDirectConnectResponse(player, (CustomFormResponse) window.getResponse()); break; + case EDIT_SERVERS: + UIHandler.handleEditServerListResponse(player, (SimpleFormResponse) window.getResponse()); + break; + default: player.resendWindow(); break; @@ -218,4 +227,17 @@ public class PacketHandler implements BedrockPacketHandler { return true; } + + @Override + public boolean handle(NetworkStackLatencyPacket packet) { + // This is to fix a bug in the client where it doesn't load form images + UpdateAttributesPacket updateAttributesPacket = new UpdateAttributesPacket(); + updateAttributesPacket.setRuntimeEntityId(1); + List attributes = new ArrayList<>(); + attributes.add(AttributeUtils.getBedrockAttribute(AttributeType.EXPERIENCE_LEVEL.getAttribute(0f))); + updateAttributesPacket.setAttributes(attributes); + session.sendPacket(updateAttributesPacket); + + return false; + } } diff --git a/src/main/java/org/geysermc/connect/ui/UIHandler.java b/src/main/java/org/geysermc/connect/ui/UIHandler.java index b26cb56..a9b78ec 100644 --- a/src/main/java/org/geysermc/connect/ui/UIHandler.java +++ b/src/main/java/org/geysermc/connect/ui/UIHandler.java @@ -55,6 +55,8 @@ public class UIHandler { // Add a button for each global server for (Server server : MasterServer.getInstance().getGeyserConnectConfig().getServers()) { + // These images would be better if there was a default to fall back on + // But that would require a web api as bedrock doesn't support doing that window.getButtons().add(new FormButton(server.toString(), new FormImage(FormImage.FormImageType.URL, "https://eu.mc-api.net/v3/server/favicon/" + server.getAddress() + ":" + server.getPort() + ".png"))); } @@ -127,7 +129,7 @@ public class UIHandler { // Cant be done in a switch as we need to calculate the last 2 buttons if ((!MasterServer.getInstance().getGeyserConnectConfig().getCustomServers().isEnabled() && data.getClickedButtonId() == servers.size()) || data.getClickedButtonId() == servers.size() + 2) { - player.getSession().disconnect("Bye!"); // Seems to be super slow if we specify an empty string + player.getSession().disconnect("disconnect.disconnected"); } else if (data.getClickedButtonId() == servers.size()) { player.sendWindow(FormID.EDIT_SERVERS, getEditServerList(player.getServers())); } else if (data.getClickedButtonId() == servers.size() + 1) { diff --git a/src/main/java/org/geysermc/connect/utils/Player.java b/src/main/java/org/geysermc/connect/utils/Player.java index b17b405..166bd95 100644 --- a/src/main/java/org/geysermc/connect/utils/Player.java +++ b/src/main/java/org/geysermc/connect/utils/Player.java @@ -31,16 +31,21 @@ import com.nukkitx.math.vector.Vector2f; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3i; import com.nukkitx.protocol.bedrock.BedrockServerSession; +import com.nukkitx.protocol.bedrock.data.Attribute; import com.nukkitx.protocol.bedrock.data.GamePublishSetting; import com.nukkitx.protocol.bedrock.data.GameRuleData; import com.nukkitx.protocol.bedrock.data.PlayerPermission; import com.nukkitx.protocol.bedrock.packet.*; +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import lombok.Getter; import lombok.Setter; import org.geysermc.common.window.FormWindow; import org.geysermc.connect.MasterServer; import org.geysermc.connect.ui.FormID; import org.geysermc.connect.ui.UIHandler; +import org.geysermc.connector.entity.attribute.AttributeType; +import org.geysermc.connector.utils.AttributeUtils; import java.util.ArrayList; import java.util.List; @@ -56,6 +61,7 @@ public class Player { private BedrockServerSession session; private final List servers = new ArrayList<>(); + private final Long2ObjectMap forms = new Long2ObjectOpenHashMap<>(); private FormWindow currentWindow; private FormID currentWindowId; @@ -169,7 +175,13 @@ public class Player { ModalFormRequestPacket modalFormRequestPacket = new ModalFormRequestPacket(); modalFormRequestPacket.setFormId(id.ordinal()); modalFormRequestPacket.setFormData(window.getJSONData()); - session.sendPacketImmediately(modalFormRequestPacket); + session.sendPacket(modalFormRequestPacket); + + // This packet is used to fix the image loading bug + NetworkStackLatencyPacket networkStackLatencyPacket = new NetworkStackLatencyPacket(); + networkStackLatencyPacket.setSendBack(true); + networkStackLatencyPacket.setTimestamp(System.currentTimeMillis()); + session.sendPacket(networkStackLatencyPacket); } public void resendWindow() {