diff --git a/src/main/java/com/alttd/datalock/EventListener.java b/src/main/java/com/alttd/datalock/EventListener.java index a047859..0be0d7f 100644 --- a/src/main/java/com/alttd/datalock/EventListener.java +++ b/src/main/java/com/alttd/datalock/EventListener.java @@ -52,18 +52,20 @@ public class EventListener { } public void clearServer(int hashCode) { - channelLockMap.forEach((identifier, value) -> { + channelLockMap.keySet().forEach(key -> { HashSet temp = new HashSet<>(); - for (Lock lock : value) { + HashSet locks = channelLockMap.get(key); + for (Lock lock : locks) { if (lock.getServerHash() == hashCode) temp.add(lock); } for (Lock lock : temp) { - value.remove(lock); - queueNextLock(value, lock, identifier); + locks.remove(lock); + queueNextLock(locks, lock, key); if (Config.DEBUG) - Logger.info("Clearing % from % due to clear server being called for the server that lock is on", lock.getData(), identifier.getId()); + Logger.info("Clearing % from % due to clear server being called for the server that lock is on", lock.getData(), key.getId()); } + channelLockMap.put(key, locks); }); } @@ -72,7 +74,9 @@ public class EventListener { for (ChannelIdentifier plugin : map.keySet()) { stringBuilder .append(plugin) - .append("\n") + .append(": ") + .append(map.get(plugin).size()) + .append(" entries\n") .append( map.get(plugin) .stream() @@ -204,9 +208,9 @@ public class EventListener { out.writeBoolean(true); out.writeUTF(lock.getData()); lockSet.remove(lock); + queueNextLock(lockSet, lock, identifier); channelLockMap.put(identifier, lockSet); serverConnection.sendPluginMessage(identifier, out.toByteArray()); - queueNextLock(lockSet, lock, identifier); return; } @@ -270,17 +274,19 @@ public class EventListener { if (!queuedLocks.containsKey(identifier)) return; HashSet queuedLockSet = queuedLocks.get(identifier); - Optional optionalQueuedLock = queuedLockSet.stream().filter(l -> l.compareTo(lock) == 0).findFirst(); + Optional optionalQueuedLock = queuedLockSet.stream().filter(l -> l.getData().equals(lock.getData())).findFirst(); if (optionalQueuedLock.isEmpty()) return; Lock queuedLock = optionalQueuedLock.get(); - queuedLockSet.remove(lock); + queuedLockSet.remove(queuedLock); + queuedLocks.put(identifier, queuedLockSet); Optional optionalRegisteredServer = DataLock.getServer().getAllServers().stream() .filter(registeredServer -> registeredServer.getServerInfo().hashCode() == queuedLock.getServerHash()) .findAny(); if (optionalRegisteredServer.isEmpty()) { Logger.warn("Removing queued lock [%] due to being unable to find a server where that lock could be active", queuedLock.getData()); + queueNextLock(lockSet, lock, identifier); return; } RegisteredServer registeredServer = optionalRegisteredServer.get(); diff --git a/src/main/java/com/alttd/datalock/PlayerListener.java b/src/main/java/com/alttd/datalock/PlayerListener.java index a56ccc9..5dbff70 100644 --- a/src/main/java/com/alttd/datalock/PlayerListener.java +++ b/src/main/java/com/alttd/datalock/PlayerListener.java @@ -6,6 +6,7 @@ import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.server.RegisteredServer; import com.velocitypowered.api.proxy.server.ServerInfo; +import java.util.Collection; import java.util.Optional; public class PlayerListener { @@ -14,14 +15,15 @@ public class PlayerListener { void onPlayerConnect(ServerConnectedEvent event) { Player player = event.getPlayer(); ServerInfo serverInfo = event.getServer().getServerInfo(); - if (event.getServer().getPlayersConnected().stream().filter(p -> p.equals(player)).findAny().isEmpty()) + Collection playersConnected = event.getServer().getPlayersConnected(); + if (playersConnected.isEmpty() || playersConnected.size() == 1 && playersConnected.contains(player)) EventListener.getInstance().clearServer(serverInfo.hashCode()); Optional previousServer = event.getPreviousServer(); if (previousServer.isEmpty()) return; serverInfo = previousServer.get().getServerInfo(); - if (event.getServer().getPlayersConnected().stream().filter(p -> p.equals(player)).findAny().isEmpty()) + if (playersConnected.isEmpty() || playersConnected.size() == 1 && playersConnected.contains(player)) EventListener.getInstance().clearServer(serverInfo.hashCode()); }