Skip to content

Commit

Permalink
Fix possible player data desyncs
Browse files Browse the repository at this point in the history
  • Loading branch information
ME1312 committed Jul 25, 2020
1 parent 891913d commit efc12e0
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 17 deletions.
19 changes: 16 additions & 3 deletions SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Proxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import net.ME1312.Galaxi.Library.Container.NamedContainer;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Server.ClientHandler;
import net.ME1312.SubServers.Bungee.Network.Packet.PacketExSyncPlayer;
import net.ME1312.SubServers.Bungee.SubAPI;
import net.ME1312.SubServers.Bungee.SubProxy;
import net.md_5.bungee.api.ProxyServer;
Expand Down Expand Up @@ -49,6 +50,7 @@ public DataClient[] getSubData() {
return channels.toArray(new DataClient[0]);
}

@SuppressWarnings("deprecation")
public void setSubData(SubDataClient client, int channel) {
boolean update = false;
if (channel < 0) throw new IllegalArgumentException("Subchannel ID cannot be less than zero");
Expand All @@ -65,9 +67,20 @@ public void setSubData(SubDataClient client, int channel) {

if (update) {
DataClient[] subdata = getSubData();
if (subdata[0] == null && subdata.length <= 1 && !persistent) {
ProxyServer.getInstance().getPluginManager().callEvent(new SubRemoveProxyEvent(this));
SubAPI.getInstance().getInternals().proxies.remove(getName().toLowerCase());
if (subdata[0] == null && subdata.length <= 1) {
SubProxy plugin = SubAPI.getInstance().getInternals();
for (UUID id : Util.getBackwards(plugin.rPlayerLinkP, this)) {
plugin.rPlayerLinkS.remove(id);
plugin.rPlayerLinkP.remove(id);
plugin.rPlayers.remove(id);
}
for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData()[0] != null && proxy != this) {
((SubDataClient) proxy.getSubData()[0]).sendPacket(new PacketExSyncPlayer(getName(), null, (RemotePlayer[]) null));
}
if (!persistent) {
ProxyServer.getInstance().getPluginManager().callEvent(new SubRemoveProxyEvent(this));
SubAPI.getInstance().getInternals().proxies.remove(getName().toLowerCase());
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
public class PacketExSyncPlayer implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private SubProxy plugin;
private String name;
private boolean mode;
private Boolean mode;
private RemotePlayer[] values;

/**
Expand All @@ -41,7 +41,6 @@ public PacketExSyncPlayer(SubProxy plugin) {
* @param values RemotePlayers
*/
public PacketExSyncPlayer(String name, Boolean mode, RemotePlayer... values) {
if (Util.isNull(mode)) throw new NullPointerException();
this.name = name;
this.mode = mode;
this.values = values;
Expand Down Expand Up @@ -73,7 +72,7 @@ public void receive(SubDataClient client, ObjectMap<Integer> data) {
}
}
if (data.getBoolean(0x0001) != Boolean.FALSE) {
for (Map<String, Object> object : (List<Map<String, Object>>) data.getObjectList(0x0002)) {
if (data.contains(0x0002)) for (Map<String, Object> object : (List<Map<String, Object>>) data.getObjectList(0x0002)) {
Server server = (object.getOrDefault("server", null) != null)?plugin.api.getServer(object.get("server").toString()):null;
RemotePlayer player = new RemotePlayer(object.get("name").toString(), UUID.fromString(object.get("id").toString()), (Proxy) client.getHandler(), server,
new InetSocketAddress(object.get("address").toString().split(":")[0], Integer.parseInt(object.get("address").toString().split(":")[1])));
Expand All @@ -84,7 +83,7 @@ public void receive(SubDataClient client, ObjectMap<Integer> data) {
if (server != null) plugin.rPlayerLinkS.put(player.getUniqueId(), server);
}
} else {
for (Map<String, Object> object : (List<Map<String, Object>>) data.getObjectList(0x0002)) {
if (data.contains(0x0002)) for (Map<String, Object> object : (List<Map<String, Object>>) data.getObjectList(0x0002)) {
UUID id = UUID.fromString(object.get("id").toString());
RemotePlayer player = plugin.rPlayers.get(id);

Expand All @@ -95,7 +94,7 @@ public void receive(SubDataClient client, ObjectMap<Integer> data) {
}
}
for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData()[0] != null && proxy != client.getHandler()) {
((SubDataClient) proxy.getSubData()[0]).sendPacket(new PacketExSyncPlayer(proxy.getName(), data.getBoolean(0x0001), forward.toArray(new RemotePlayer[0])));
((SubDataClient) proxy.getSubData()[0]).sendPacket(new PacketExSyncPlayer(((Proxy) client.getHandler()).getName(), data.getBoolean(0x0001), forward.toArray(new RemotePlayer[0])));
}
}
}
Expand Down
6 changes: 5 additions & 1 deletion SubServers.Sync/src/net/ME1312/SubServers/Sync/ExProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,10 @@ public void stopListeners() {
for (ListenerInfo listener : getConfig().getListeners()) {
if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(listener.getHost().getPort())) UPnP.closePortTCP(listener.getHost().getPort());
}

rPlayerLinkS.clear();
rPlayerLinkP.clear();
rPlayers.clear();
} catch (Exception e) {
e.printStackTrace();
}
Expand Down Expand Up @@ -410,7 +414,7 @@ public void setPlayer(ServerConnectedEvent e) {
raw.set("server", e.getServer().getInfo().getName());
RemotePlayer player = new RemotePlayer(raw);
rPlayers.put(player.getUniqueId(), player);
rPlayerLinkP.put(player.getUniqueId(), player.getProxy());
rPlayerLinkP.put(player.getUniqueId(), player.getProxy().toLowerCase());
if (e.getServer().getInfo() instanceof ServerImpl) rPlayerLinkS.put(player.getUniqueId(), (ServerImpl) e.getServer().getInfo());
if (api.getSubDataNetwork()[0] != null) {
((SubDataClient) api.getSubDataNetwork()[0]).sendPacket(new PacketExSyncPlayer(true, player));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
*/
public class PacketExSyncPlayer implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private ExProxy plugin;
private boolean mode;
private Boolean mode;
private RemotePlayer[] values;

/**
Expand All @@ -36,7 +36,6 @@ public PacketExSyncPlayer(ExProxy plugin) {
* @param values RemotePlayers
*/
public PacketExSyncPlayer(Boolean mode, RemotePlayer... values) {
if (Util.isNull(mode)) throw new NullPointerException();
this.mode = mode;
this.values = values;
}
Expand Down Expand Up @@ -65,7 +64,7 @@ public void receive(SubDataSender client, ObjectMap<Integer> data) {
}
}
if (data.getBoolean(0x0001) != Boolean.FALSE) {
for (Map<String, Object> object : (List<Map<String, Object>>) data.getObjectList(0x0002)) {
if (data.contains(0x0002)) for (Map<String, Object> object : (List<Map<String, Object>>) data.getObjectList(0x0002)) {
ServerImpl server = (object.getOrDefault("server", null) != null)?plugin.servers.getOrDefault(object.get("server").toString().toLowerCase(), null):null;
RemotePlayer player = new RemotePlayer(new ObjectMap<>(object));

Expand All @@ -74,7 +73,7 @@ public void receive(SubDataSender client, ObjectMap<Integer> data) {
if (server != null) plugin.rPlayerLinkS.put(player.getUniqueId(), server);
}
} else {
for (Map<String, Object> object : (List<Map<String, Object>>) data.getObjectList(0x0002)) {
if (data.contains(0x0002)) for (Map<String, Object> object : (List<Map<String, Object>>) data.getObjectList(0x0002)) {
UUID id = UUID.fromString(object.get("id").toString());
plugin.rPlayerLinkS.remove(id);
plugin.rPlayerLinkP.remove(id);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,7 @@
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Timer;
import java.util.TimerTask;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;

Expand Down Expand Up @@ -161,6 +158,18 @@ public SubDataClient open(Callback<Runnable> scheduler, Logger logger, InetAddre
e.printStackTrace();
}

ArrayList<RemotePlayer> localPlayers = new ArrayList<RemotePlayer>();
for (UUID id : new ArrayList<UUID>(plugin.rPlayers.keySet())) {
if (plugin.getPlayer(id) != null) {
localPlayers.add(plugin.rPlayers.get(id));
} else {
plugin.rPlayerLinkS.remove(id);
plugin.rPlayerLinkP.remove(id);
plugin.rPlayers.remove(id);
}
}
subdata.sendPacket(new PacketExSyncPlayer(null, localPlayers.toArray(new RemotePlayer[0])));

plugin.api.getServers(servers -> {
for (Server server : servers.values()) {
plugin.merge(server);
Expand Down

0 comments on commit efc12e0

Please sign in to comment.