diff --git a/src/main/java/cn/nukkit/Player.java b/src/main/java/cn/nukkit/Player.java index b765e3054eb..e57ae6899bf 100644 --- a/src/main/java/cn/nukkit/Player.java +++ b/src/main/java/cn/nukkit/Player.java @@ -174,7 +174,8 @@ public class Player extends EntityHuman implements CommandSender, InventoryHolde protected Vector3 teleportPosition = null; protected boolean connected = true; - protected final InetSocketAddress socketAddress; + protected final InetSocketAddress rawSocketAddress; + protected InetSocketAddress socketAddress; protected boolean removeFormat = true; protected String username; @@ -616,6 +617,7 @@ public Player(SourceInterface interfaz, Long clientID, InetSocketAddress socketA this.perm = new PermissibleBase(this); this.server = Server.getInstance(); this.lastBreak = -1; + this.rawSocketAddress = socketAddress; this.socketAddress = socketAddress; this.clientID = clientID; this.loaderId = Level.generateChunkLoaderId(this); @@ -678,6 +680,18 @@ public void setSkin(Skin skin) { } } + public String getRawAddress() { + return this.rawSocketAddress.getAddress().getHostAddress(); + } + + public int getRawPort() { + return this.rawSocketAddress.getPort(); + } + + public InetSocketAddress getRawSocketAddress() { + return this.rawSocketAddress; + } + public String getAddress() { return this.socketAddress.getAddress().getHostAddress(); } @@ -2107,6 +2121,10 @@ public void handleDataPacket(DataPacket packet) { break; } + if (this.server.getConfig("settings.waterdogpe", false) && loginChainData.getWaterdogIP() != null) { + this.socketAddress = new InetSocketAddress(this.loginChainData.getWaterdogIP(), this.getRawPort()); + } + this.randomClientId = loginPacket.clientId; this.uuid = loginPacket.clientUUID; diff --git a/src/main/java/cn/nukkit/Server.java b/src/main/java/cn/nukkit/Server.java index 75b55d37975..c53facf7a64 100644 --- a/src/main/java/cn/nukkit/Server.java +++ b/src/main/java/cn/nukkit/Server.java @@ -705,7 +705,7 @@ public void batchPackets(Player[] players, DataPacket[] packets, boolean forceSy List targets = new ArrayList<>(); for (Player p : players) { if (p.isConnected()) { - targets.add(p.getSocketAddress()); + targets.add(p.getRawSocketAddress()); } } @@ -1851,7 +1851,7 @@ public Player[] matchPlayer(String partialName) { } public void removePlayer(Player player) { - Player toRemove = this.players.remove(player.getSocketAddress()); + Player toRemove = this.players.remove(player.getRawSocketAddress()); if (toRemove != null) { return; } diff --git a/src/main/java/cn/nukkit/network/RakNetInterface.java b/src/main/java/cn/nukkit/network/RakNetInterface.java index 238bea31618..5dddbc28e36 100644 --- a/src/main/java/cn/nukkit/network/RakNetInterface.java +++ b/src/main/java/cn/nukkit/network/RakNetInterface.java @@ -132,7 +132,7 @@ public boolean process() { @Override public int getNetworkLatency(Player player) { - RakNetServerSession session = this.raknet.getSession(player.getSocketAddress()); + RakNetServerSession session = this.raknet.getSession(player.getRawSocketAddress()); return session == null ? -1 : (int) session.getPing(); } @@ -143,7 +143,7 @@ public void close(Player player) { @Override public void close(Player player, String reason) { - RakNetServerSession session = this.raknet.getSession(player.getSocketAddress()); + RakNetServerSession session = this.raknet.getSession(player.getRawSocketAddress()); if (session != null) { session.close(); } @@ -214,7 +214,7 @@ public Integer putPacket(Player player, DataPacket packet, boolean needACK) { @Override public Integer putPacket(Player player, DataPacket packet, boolean needACK, boolean immediate) { - NukkitRakNetSession session = this.sessions.get(player.getSocketAddress()); + NukkitRakNetSession session = this.sessions.get(player.getRawSocketAddress()); if (session != null) { packet.tryEncode(); diff --git a/src/main/java/cn/nukkit/utils/ClientChainData.java b/src/main/java/cn/nukkit/utils/ClientChainData.java index ab1213aac8a..bb154a60cb2 100644 --- a/src/main/java/cn/nukkit/utils/ClientChainData.java +++ b/src/main/java/cn/nukkit/utils/ClientChainData.java @@ -1,5 +1,6 @@ package cn.nukkit.utils; +import cn.nukkit.Server; import cn.nukkit.network.protocol.LoginPacket; import com.google.gson.Gson; import com.google.gson.JsonObject; @@ -109,7 +110,11 @@ public String getLanguageCode() { @Override public String getXUID() { - return xuid; + if (Server.getInstance().getConfig("waterdogpe", false) && Waterdog_XUID != null) { + return Waterdog_XUID; + } else { + return xuid; + } } private boolean xboxAuthed; @@ -137,6 +142,16 @@ public int getUIProfile() { return UIProfile; } + @Override + public String getWaterdogXUID() { + return Waterdog_XUID; + } + + @Override + public String getWaterdogIP() { + return Waterdog_IP; + } + @Override public JsonObject getRawData() { return rawData; @@ -180,6 +195,8 @@ private static ECPublicKey generateKey(String base64) throws NoSuchAlgorithmExce private String languageCode; private int currentInputMode; private int defaultInputMode; + private String Waterdog_IP; + private String Waterdog_XUID; private int UIProfile; @@ -215,6 +232,14 @@ private void decodeSkinData() { if (skinToken.has("DefaultInputMode")) this.defaultInputMode = skinToken.get("DefaultInputMode").getAsInt(); if (skinToken.has("UIProfile")) this.UIProfile = skinToken.get("UIProfile").getAsInt(); if (skinToken.has("CapeData")) this.capeData = skinToken.get("CapeData").getAsString(); + if (skinToken.has("Waterdog_IP")) this.Waterdog_IP = skinToken.get("Waterdog_IP").getAsString(); + if (skinToken.has("Waterdog_XUID")) this.Waterdog_XUID = skinToken.get("Waterdog_XUID").getAsString(); + + boolean useWaterdog = Server.getInstance().getConfig("settings.waterdogpe", false); + + if (useWaterdog && this.Waterdog_XUID != null) { + xboxAuthed = true; + } this.rawData = skinToken; } diff --git a/src/main/java/cn/nukkit/utils/LoginChainData.java b/src/main/java/cn/nukkit/utils/LoginChainData.java index 398d9367d10..a96381d8f76 100644 --- a/src/main/java/cn/nukkit/utils/LoginChainData.java +++ b/src/main/java/cn/nukkit/utils/LoginChainData.java @@ -43,5 +43,9 @@ public interface LoginChainData { int getUIProfile(); + String getWaterdogXUID(); + + String getWaterdogIP(); + JsonObject getRawData(); } diff --git a/src/main/resources/lang b/src/main/resources/lang index bd94ef3f78b..f6f851bf4f2 160000 --- a/src/main/resources/lang +++ b/src/main/resources/lang @@ -1 +1 @@ -Subproject commit bd94ef3f78b5401e41c6614cae1787ea24250996 +Subproject commit f6f851bf4f202b44a2c61eff29ff404596d7e204