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) {
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));
}
/**

View file

@ -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}")

View file

@ -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;

View file

@ -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()