Disconnecting while dying no longer results in improper death handling in safe zones (e.g. fight caves)

This commit is contained in:
Ceikry 2023-03-03 01:13:38 +00:00 committed by Ryan
parent 0546d7e8b9
commit b6fa73d94c
4 changed files with 12 additions and 10 deletions

View file

@ -353,8 +353,11 @@ public class Player extends Entity {
public void clear(boolean force) { public void clear(boolean force) {
if (!isActive()) if (!isActive())
return; return;
if (force) { if (!force) {
Repository.getDisconnectionQueue().remove(getName()); Repository.getDisconnectionQueue().remove(getName());
Repository.getDisconnectionQueue().add(this, true);
details.save();
return;
} }
if (!isArtificial()) if (!isArtificial())
GameWorld.getLogoutListeners().forEach((it) -> it.logout(this)); GameWorld.getLogoutListeners().forEach((it) -> it.logout(this));
@ -372,9 +375,7 @@ public class Player extends Entity {
getZoneMonitor().clear(); getZoneMonitor().clear();
HouseManager.leave(this); HouseManager.leave(this);
UpdateSequence.getRenderablePlayers().remove(this); UpdateSequence.getRenderablePlayers().remove(this);
details.save();
sendLogoutEvents(); sendLogoutEvents();
Repository.getDisconnectionQueue().add(this);
checkForWealthUpdate(true); checkForWealthUpdate(true);
} }
@ -913,7 +914,7 @@ public class Player extends Entity {
* @return {@code True} if so. * @return {@code True} if so.
*/ */
public boolean allowRemoval() { public boolean allowRemoval() {
return inCombat() || getSkills().getLifepoints() < 1 || DeathTask.isDead(this); return !(inCombat() || getSkills().getLifepoints() < 1 || DeathTask.isDead(this));
} }
/** /**

View file

@ -48,12 +48,12 @@ class DisconnectionQueue {
*/ */
private fun finish(entry: DisconnectionEntry?, force: Boolean): Boolean { private fun finish(entry: DisconnectionEntry?, force: Boolean): Boolean {
val player = entry!!.player val player = entry!!.player
if (!force && player.allowRemoval()) { if (!force && !player.allowRemoval()) {
return false return false
} }
if (entry.isClear) { if (entry.isClear) {
log(this::class.java, Log.FINE, "Clearing player...") log(this::class.java, Log.FINE, "Clearing player...")
player.clear() player.clear(true)
} }
Repository.removePlayer(player) Repository.removePlayer(player)
log(this::class.java, Log.INFO, "Player cleared. Removed ${player.details.username}") log(this::class.java, Log.INFO, "Player cleared. Removed ${player.details.username}")

View file

@ -62,7 +62,7 @@ public class IoEventHandler {
try { try {
if (channel.read(buffer) == -1) { if (channel.read(buffer) == -1) {
if (session != null && session.getPlayer() != null) { if (session != null && session.getPlayer() != null) {
Repository.getDisconnectionQueue().add(session.getPlayer()); Repository.getDisconnectionQueue().add(session.getPlayer(), false);
} }
key.cancel(); key.cancel();
return; return;
@ -71,7 +71,7 @@ public class IoEventHandler {
if (e.getMessage().contains("reset by peer") && session != null) { if (e.getMessage().contains("reset by peer") && session != null) {
session.disconnect(); session.disconnect();
if (session.getPlayer() != null) if (session.getPlayer() != null)
session.getPlayer().clear(true); Repository.getDisconnectionQueue().add(session.getPlayer(), false);
} else { } else {
key.cancel(); key.cancel();
return; return;

View file

@ -84,6 +84,9 @@ class MajorUpdateWorker {
fun handleTickActions(skipPulseUpdate: Boolean = false) { fun handleTickActions(skipPulseUpdate: Boolean = false) {
PacketProcessor.processQueue() PacketProcessor.processQueue()
//disconnect all players waiting to be disconnected
Repository.disconnectionQueue.update()
if (!skipPulseUpdate) { if (!skipPulseUpdate) {
GameWorld.Pulser.updateAll() GameWorld.Pulser.updateAll()
} }
@ -98,8 +101,6 @@ class MajorUpdateWorker {
} }
//increment global ticks variable //increment global ticks variable
GameWorld.pulse() GameWorld.pulse()
//disconnect all players waiting to be disconnected
Repository.disconnectionQueue.update()
//tick all manager plugins //tick all manager plugins
Managers.tick() Managers.tick()