mirror of
https://gitlab.com/2009scape/2009scape.git
synced 2025-12-12 01:21:20 -07:00
Disconnecting while dying no longer results in improper death handling in safe zones (e.g. fight caves)
This commit is contained in:
parent
0546d7e8b9
commit
b6fa73d94c
4 changed files with 12 additions and 10 deletions
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -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}")
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue