Fix server images not loading straight away on Win10

This commit is contained in:
rtm516 2020-06-17 11:32:03 +01:00
parent bb5628acf6
commit 4e5e717ff6
4 changed files with 39 additions and 3 deletions

View file

@ -23,4 +23,4 @@ GeyserConnect is a server that Minecraft: Bedrock Edition clients can connect to
- [ ] Remove - [ ] Remove
- [ ] Stop Geyser server after its idle for a while - [ ] Stop Geyser server after its idle for a while
- [x] Config file - [x] Config file
- [ ] Fix server images not loading straight away on Win10 - [x] Fix server images not loading straight away on Win10

View file

@ -34,6 +34,7 @@ import com.nimbusds.jose.JWSObject;
import com.nimbusds.jose.crypto.factories.DefaultJWSVerifierFactory; import com.nimbusds.jose.crypto.factories.DefaultJWSVerifierFactory;
import com.nukkitx.network.util.DisconnectReason; import com.nukkitx.network.util.DisconnectReason;
import com.nukkitx.protocol.bedrock.BedrockServerSession; 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.handler.BedrockPacketHandler;
import com.nukkitx.protocol.bedrock.packet.*; import com.nukkitx.protocol.bedrock.packet.*;
import com.nukkitx.protocol.bedrock.util.EncryptionUtils; 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.FormID;
import org.geysermc.connect.ui.UIHandler; import org.geysermc.connect.ui.UIHandler;
import org.geysermc.connect.utils.Player; 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.io.IOException;
import java.security.interfaces.ECPublicKey; import java.security.interfaces.ECPublicKey;
import java.util.ArrayList;
import java.util.List;
public class PacketHandler implements BedrockPacketHandler { public class PacketHandler implements BedrockPacketHandler {
@ -210,6 +215,10 @@ public class PacketHandler implements BedrockPacketHandler {
UIHandler.handleDirectConnectResponse(player, (CustomFormResponse) window.getResponse()); UIHandler.handleDirectConnectResponse(player, (CustomFormResponse) window.getResponse());
break; break;
case EDIT_SERVERS:
UIHandler.handleEditServerListResponse(player, (SimpleFormResponse) window.getResponse());
break;
default: default:
player.resendWindow(); player.resendWindow();
break; break;
@ -218,4 +227,17 @@ public class PacketHandler implements BedrockPacketHandler {
return true; 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<Attribute> attributes = new ArrayList<>();
attributes.add(AttributeUtils.getBedrockAttribute(AttributeType.EXPERIENCE_LEVEL.getAttribute(0f)));
updateAttributesPacket.setAttributes(attributes);
session.sendPacket(updateAttributesPacket);
return false;
}
} }

View file

@ -55,6 +55,8 @@ public class UIHandler {
// Add a button for each global server // Add a button for each global server
for (Server server : MasterServer.getInstance().getGeyserConnectConfig().getServers()) { 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"))); 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 // 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) { 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()) { } else if (data.getClickedButtonId() == servers.size()) {
player.sendWindow(FormID.EDIT_SERVERS, getEditServerList(player.getServers())); player.sendWindow(FormID.EDIT_SERVERS, getEditServerList(player.getServers()));
} else if (data.getClickedButtonId() == servers.size() + 1) { } else if (data.getClickedButtonId() == servers.size() + 1) {

View file

@ -31,16 +31,21 @@ import com.nukkitx.math.vector.Vector2f;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.math.vector.Vector3i; import com.nukkitx.math.vector.Vector3i;
import com.nukkitx.protocol.bedrock.BedrockServerSession; 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.GamePublishSetting;
import com.nukkitx.protocol.bedrock.data.GameRuleData; import com.nukkitx.protocol.bedrock.data.GameRuleData;
import com.nukkitx.protocol.bedrock.data.PlayerPermission; import com.nukkitx.protocol.bedrock.data.PlayerPermission;
import com.nukkitx.protocol.bedrock.packet.*; 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.Getter;
import lombok.Setter; import lombok.Setter;
import org.geysermc.common.window.FormWindow; import org.geysermc.common.window.FormWindow;
import org.geysermc.connect.MasterServer; import org.geysermc.connect.MasterServer;
import org.geysermc.connect.ui.FormID; import org.geysermc.connect.ui.FormID;
import org.geysermc.connect.ui.UIHandler; 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.ArrayList;
import java.util.List; import java.util.List;
@ -56,6 +61,7 @@ public class Player {
private BedrockServerSession session; private BedrockServerSession session;
private final List<Server> servers = new ArrayList<>(); private final List<Server> servers = new ArrayList<>();
private final Long2ObjectMap<ModalFormRequestPacket> forms = new Long2ObjectOpenHashMap<>();
private FormWindow currentWindow; private FormWindow currentWindow;
private FormID currentWindowId; private FormID currentWindowId;
@ -169,7 +175,13 @@ public class Player {
ModalFormRequestPacket modalFormRequestPacket = new ModalFormRequestPacket(); ModalFormRequestPacket modalFormRequestPacket = new ModalFormRequestPacket();
modalFormRequestPacket.setFormId(id.ordinal()); modalFormRequestPacket.setFormId(id.ordinal());
modalFormRequestPacket.setFormData(window.getJSONData()); 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() { public void resendWindow() {