From c7795d4078454829afb7eaa1d1e8b7d602f81b47 Mon Sep 17 00:00:00 2001 From: Shaun Date: Fri, 30 Jul 2021 22:03:48 +0200 Subject: [PATCH] enhancement #1819: Recreated change because could not cherry-pick --- src/server/components/auth.js | 2 +- src/server/security/connections.js | 5 ++++- src/server/world/atlas.js | 20 ++++++++++++++++++++ src/server/world/instancer.js | 18 ++++++++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index a5674f63..92fa744f 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -293,7 +293,7 @@ module.exports = { } this.username = msg.data.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 7d114a53..2981d3fc 100644 --- a/src/server/security/connections.js +++ b/src/server/security/connections.js @@ -154,7 +154,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++) { @@ -163,6 +163,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 5f31a847..abeed5ae 100644 --- a/src/server/world/atlas.js +++ b/src/server/world/atlas.js @@ -258,5 +258,25 @@ 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 2f5d62db..d59ca16c 100644 --- a/src/server/world/instancer.js +++ b/src/server/world/instancer.js @@ -337,5 +337,23 @@ 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 + } + }); } + };