diff --git a/Server/src/main/core/game/node/entity/player/Player.java b/Server/src/main/core/game/node/entity/player/Player.java index 6d5af46da..824b13c9b 100644 --- a/Server/src/main/core/game/node/entity/player/Player.java +++ b/Server/src/main/core/game/node/entity/player/Player.java @@ -353,8 +353,11 @@ public class Player extends Entity { public void clear(boolean force) { if (!isActive()) return; - if (force) { + if (!force) { Repository.getDisconnectionQueue().remove(getName()); + Repository.getDisconnectionQueue().add(this, true); + details.save(); + return; } if (!isArtificial()) GameWorld.getLogoutListeners().forEach((it) -> it.logout(this)); @@ -372,9 +375,7 @@ public class Player extends Entity { getZoneMonitor().clear(); HouseManager.leave(this); UpdateSequence.getRenderablePlayers().remove(this); - details.save(); sendLogoutEvents(); - Repository.getDisconnectionQueue().add(this); checkForWealthUpdate(true); } @@ -913,7 +914,7 @@ public class Player extends Entity { * @return {@code True} if so. */ public boolean allowRemoval() { - return inCombat() || getSkills().getLifepoints() < 1 || DeathTask.isDead(this); + return !(inCombat() || getSkills().getLifepoints() < 1 || DeathTask.isDead(this)); } /** diff --git a/Server/src/main/core/game/world/repository/DisconnectionQueue.kt b/Server/src/main/core/game/world/repository/DisconnectionQueue.kt index 3cd3dae36..499f1d9d6 100644 --- a/Server/src/main/core/game/world/repository/DisconnectionQueue.kt +++ b/Server/src/main/core/game/world/repository/DisconnectionQueue.kt @@ -48,12 +48,12 @@ class DisconnectionQueue { */ private fun finish(entry: DisconnectionEntry?, force: Boolean): Boolean { val player = entry!!.player - if (!force && player.allowRemoval()) { + if (!force && !player.allowRemoval()) { return false } if (entry.isClear) { log(this::class.java, Log.FINE, "Clearing player...") - player.clear() + player.clear(true) } Repository.removePlayer(player) log(this::class.java, Log.INFO, "Player cleared. Removed ${player.details.username}") diff --git a/Server/src/main/core/net/IoEventHandler.java b/Server/src/main/core/net/IoEventHandler.java index 6b54b1fe2..a8b1b7e01 100644 --- a/Server/src/main/core/net/IoEventHandler.java +++ b/Server/src/main/core/net/IoEventHandler.java @@ -62,7 +62,7 @@ public class IoEventHandler { try { if (channel.read(buffer) == -1) { if (session != null && session.getPlayer() != null) { - Repository.getDisconnectionQueue().add(session.getPlayer()); + Repository.getDisconnectionQueue().add(session.getPlayer(), false); } key.cancel(); return; @@ -71,7 +71,7 @@ public class IoEventHandler { if (e.getMessage().contains("reset by peer") && session != null) { session.disconnect(); if (session.getPlayer() != null) - session.getPlayer().clear(true); + Repository.getDisconnectionQueue().add(session.getPlayer(), false); } else { key.cancel(); return; diff --git a/Server/src/main/core/worker/MajorUpdateWorker.kt b/Server/src/main/core/worker/MajorUpdateWorker.kt index b4b892ebc..dfe79c835 100644 --- a/Server/src/main/core/worker/MajorUpdateWorker.kt +++ b/Server/src/main/core/worker/MajorUpdateWorker.kt @@ -84,6 +84,9 @@ class MajorUpdateWorker { fun handleTickActions(skipPulseUpdate: Boolean = false) { PacketProcessor.processQueue() + //disconnect all players waiting to be disconnected + Repository.disconnectionQueue.update() + if (!skipPulseUpdate) { GameWorld.Pulser.updateAll() } @@ -98,8 +101,6 @@ class MajorUpdateWorker { } //increment global ticks variable GameWorld.pulse() - //disconnect all players waiting to be disconnected - Repository.disconnectionQueue.update() //tick all manager plugins Managers.tick()