From fd4facf6502eddd3ebaaf4a9a6ef2c4f957e3364 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 20 May 2023 20:47:56 +0200 Subject: [PATCH] work --- src/client/ui/factory.js | 32 ++++++++++++++++--------------- src/server/components/auth.js | 29 +++++++++++++++------------- src/server/world/atlas.js | 6 +++--- src/server/world/mapManager.js | 1 + src/server/world/threadManager.js | 26 ++++++++++++++++--------- 5 files changed, 54 insertions(+), 40 deletions(-) diff --git a/src/client/ui/factory.js b/src/client/ui/factory.js index 93e4c326..99297263 100644 --- a/src/client/ui/factory.js +++ b/src/client/ui/factory.js @@ -37,26 +37,28 @@ define([ events.clearQueue(); await Promise.all( - globals.clientConfig.uiList.map(u => { - const uiType = u.path ? u.path.split('/').pop() : u; + globals.clientConfig.uiList + .filter(u => u.autoLoadOnPlay !== false) + .map(u => { + const uiType = u.path ? u.path.split('/').pop() : u; - return new Promise(res => { - const doneCheck = () => { - const isDone = this.uis.some(ui => ui.type === uiType); - if (isDone) { - res(); + return new Promise(res => { + const doneCheck = () => { + const isDone = this.uis.some(ui => ui.type === uiType); + if (isDone) { + res(); - return; - } + return; + } - setTimeout(doneCheck, 100); - }; + setTimeout(doneCheck, 100); + }; - this.build(uiType, { path: u.path }); + this.build(uiType, { path: u.path }); - doneCheck(); - }); - }) + doneCheck(); + }); + }) ); this.ingameUisBuilt = true; diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 27037b37..fc7a5623 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -426,8 +426,8 @@ module.exports = { }, createCharacter: async function (msg) { - let data = msg.data; - let name = data.name; + const data = msg.data; + const name = data.name; let error = null; @@ -460,7 +460,7 @@ module.exports = { const releaseCreateLock = await getCreateLock(); - let exists = await io.getAsync({ + const exists = await io.getAsync({ key: name, ignoreCase: true, table: 'character', @@ -474,23 +474,19 @@ module.exports = { return; } - let obj = this.obj; + const simple = this.obj.getSimple(true); - extend(obj, { - name: name, - skinId: data.skinId, + Object.assign(simple, { + name, class: data.class, + skinId: data.skinId, cell: skins.getCell(data.skinId), - sheetName: skins.getSpritesheet(data.skinId), - x: null, - y: null + sheetName: skins.getSpritesheet(data.skinId) }); - let simple = this.obj.getSimple(true); - await this.verifySkin(simple); - let prophecies = (data.prophecies || []).filter(p => p); + const prophecies = (data.prophecies ?? []).filter(p => p); simple.components.push({ type: 'prophecies', @@ -500,6 +496,13 @@ module.exports = { customChannels: this.customChannels }); + const emBeforeCreateCharacter = { + obj: simple, + createData: data + }; + + await eventEmitter.emit('beforeCreateCharacter', emBeforeCreateCharacter); + await io.setAsync({ key: name, table: 'character', diff --git a/src/server/world/atlas.js b/src/server/world/atlas.js index a4fe4486..ed4ff6b3 100644 --- a/src/server/world/atlas.js +++ b/src/server/world/atlas.js @@ -2,7 +2,7 @@ const objects = require('../objects/objects'); const events = require('../misc/events'); const { - getThread, killThread, sendMessageToThread, getThreadFromId, returnWhenThreadsIdle, gePlayerCountInThread, addPlayerToThread, removePlayerFromThread + getThread, sendMessageToThread, getThreadFromId, returnWhenThreadsIdle, addPlayerToThread, removePlayerFromThread } = require('./threadManager'); const { registerCallback, removeCallback } = require('./atlas/registerCallback'); @@ -15,7 +15,7 @@ module.exports = { if (!serverObj) return; - events.emit('onBeforePlayerEnterWorld', obj); + await events.emit('onBeforePlayerEnterWorld', { obj }); let { zoneName, zoneId } = obj; @@ -30,7 +30,7 @@ module.exports = { const { thread, resetObjPosition } = await getThread({ zoneName, zoneId, - playerId: obj.id + obj }); if (resetObjPosition) { diff --git a/src/server/world/mapManager.js b/src/server/world/mapManager.js index 4c1765dc..a144453b 100644 --- a/src/server/world/mapManager.js +++ b/src/server/world/mapManager.js @@ -16,6 +16,7 @@ const mapList = [ //Helpers const init = () => { events.emit('onBeforeGetMapList', mapList); + events.emit('onBeforeFinalizeMapList', mapList); }; //Exports diff --git a/src/server/world/threadManager.js b/src/server/world/threadManager.js index ede4ba3c..c0740907 100644 --- a/src/server/world/threadManager.js +++ b/src/server/world/threadManager.js @@ -26,6 +26,7 @@ const objects = require('../objects/objects'); const connections = require('../security/connections'); const { mapList } = require('./mapManager'); const { registerCallback } = require('./atlas/registerCallback'); +const events = require('../misc/events'); //Internals const threads = []; @@ -165,7 +166,7 @@ const onMessage = (thread, message) => { messageHandlers[message.method](thread, message); }; -const spawnThread = async ({ name, path, instanced, destroyWhenEmptyForMs = -1 }) => { +const spawnThread = async ({ name, path, instanced, destroyWhenEmptyForMs = -1 }, obj) => { let cbOnInitialized; const promise = new Promise(resolveOnReady => { @@ -174,7 +175,16 @@ const spawnThread = async ({ name, path, instanced, destroyWhenEmptyForMs = -1 } const worker = childProcess.fork('./world/worker', [name]); - const id = instanced ? _.getGuid() : name; + let id = instanced ? _.getGuid() : name; + const emBeforeGetThreadId = { + id, + obj, + name, + instanced + }; + events.emit('beforeGetThreadId', emBeforeGetThreadId); + + id = emBeforeGetThreadId.id; const thread = { id, @@ -199,7 +209,7 @@ const spawnThread = async ({ name, path, instanced, destroyWhenEmptyForMs = -1 } return promise; }; -const getThread = async ({ zoneName, zoneId, playerId }) => { +const getThread = async ({ zoneName, zoneId, obj }) => { const result = { resetObjPosition: false, thread: null @@ -214,15 +224,13 @@ const getThread = async ({ zoneName, zoneId, playerId }) => { //Maybe this player has been in a thread for this map before if (!thread) - thread = threads.find(t => t.name === zoneName && t.players.includes(playerId)); + thread = threads.find(t => t.name === zoneName && t.players.includes(obj.id)); if (!thread) { - if (map.instanced) { + if (map.instanced) result.resetObjPosition = true; - thread = await spawnThread(map); - } else - thread = getThreadFromName(map.name); + thread = await spawnThread(map, obj); } if (!thread.isReady) @@ -274,7 +282,7 @@ const returnWhenThreadsIdle = async () => { const spawnMapThreads = async () => { const promises = mapList - .filter(m => !m.disabled && !m.instanced) + .filter(m => !m.disabled && !m.instanced && m.autoSpawn !== false) .map(m => spawnThread(m)); await Promise.all(promises);