From 295b4c89af2637fa380008663605262a2e40bec2 Mon Sep 17 00:00:00 2001 From: Shaun Date: Fri, 30 Jul 2021 22:02:06 +0200 Subject: [PATCH] enhancement #1819 --- src/server/components/auth.js | 2 +- src/server/security/connections.js | 5 ++++- src/server/world/atlas.js | 19 +++++++++++++++++++ src/server/world/instancer.js | 17 +++++++++++++++++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 851e843d..e0aa7855 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -283,7 +283,7 @@ module.exports = { } this.username = username; - cons.logOut(this.obj); + await cons.logOut(this.obj); this.initTracker(); diff --git a/src/server/security/connections.js b/src/server/security/connections.js index f05feaa0..7bd04b83 100644 --- a/src/server/security/connections.js +++ b/src/server/security/connections.js @@ -152,7 +152,7 @@ module.exports = { msg.callback(); }, - logOut: function (exclude) { + logOut: async function (exclude) { let players = this.players; let pLen = players.length; for (let i = 0; i < pLen; i++) { @@ -161,6 +161,9 @@ module.exports = { if ((!p) || (p === exclude) || (!p.auth)) continue; + if (p.name && p.zoneName) + await atlas.forceSavePlayer(p.name, p.zoneName); + if (p.auth.username === exclude.auth.username) p.socket.emit('dc', {}); } diff --git a/src/server/world/atlas.js b/src/server/world/atlas.js index 42f80c60..6305d32f 100644 --- a/src/server/world/atlas.js +++ b/src/server/world/atlas.js @@ -262,5 +262,24 @@ module.exports = { }); }); }); + }, + + forceSavePlayer: async function (playerName, zoneName) { + const thread = this.getThreadFromName(zoneName); + + if (!thread) + return; + + return new Promise(res => { + const callbackId = this.registerCallback(res); + + thread.worker.send({ + method: 'forceSavePlayer', + args: { + playerName, + callbackId + } + }); + }); } }; diff --git a/src/server/world/instancer.js b/src/server/world/instancer.js index cacafd6b..90255486 100644 --- a/src/server/world/instancer.js +++ b/src/server/world/instancer.js @@ -337,5 +337,22 @@ module.exports = { process.send({ method: 'onZoneIdle' }); + }, + + forceSavePlayer: async function ({ playerName, callbackId }) { + const player = objects.objects.find(o => o.player && o.name === playerName); + + if (!player?.auth) + return; + + await player.auth.doSave(); + + process.send({ + module: 'atlas', + method: 'resolveCallback', + msg: { + id: callbackId + } + }); } };