From 9d7b1a91c31505b3c72525cff832594686c2a8cf Mon Sep 17 00:00:00 2001 From: Shaun Date: Sun, 21 May 2023 12:02:37 +0200 Subject: [PATCH] work --- .../components/extensions/factionVendor.js | 2 +- src/server/config/consts.js | 26 ++++++++++- src/server/config/serverConfig.js | 2 +- src/server/items/generator.js | 2 + src/server/items/generators/stats.js | 4 +- src/server/security/connections.js | 7 ++- src/server/server/index.js | 2 +- src/server/world/instancer.js | 7 ++- src/server/world/threadManager.js | 44 +++++++++++-------- src/server/world/worker.js | 5 ++- 10 files changed, 72 insertions(+), 29 deletions(-) diff --git a/src/server/components/extensions/factionVendor.js b/src/server/components/extensions/factionVendor.js index 17c04c79..6328c48e 100644 --- a/src/server/components/extensions/factionVendor.js +++ b/src/server/components/extensions/factionVendor.js @@ -74,7 +74,7 @@ module.exports = { for (let i = 0; i < itemCount; i++) { let minLevel = blueprint.items.minLevel || Math.max(1, list.level * 0.75); let maxLevel = blueprint.items.maxLevel || (list.level * 1.25); - let level = Math.min(20, ~~(minLevel + (Math.random() * (maxLevel - minLevel)))); + let level = Math.min(consts.maxLevel, ~~(minLevel + (Math.random() * (maxLevel - minLevel)))); let item = generator.generate({ noSpell: true, diff --git a/src/server/config/consts.js b/src/server/config/consts.js index 6b8c2ac9..9de849d7 100644 --- a/src/server/config/consts.js +++ b/src/server/config/consts.js @@ -1,3 +1,7 @@ +//Imports +const eventEmitter = require('../misc/events'); + +//Module module.exports = { //At which interval does each zone tick in ms tickTime: 350, @@ -15,5 +19,25 @@ module.exports = { viewDistanceX: 25, //How far a player can see objects vertically - viewDistanceY: 14 + viewDistanceY: 14, + + init: function (threadArgs) { + const emBeforeGetConsts = { + threadArgs, + constValues: {} + }; + + Object.entries(this).forEach(([k, v]) => { + if (typeof(v) === 'function') + return; + + emBeforeGetConsts.constValues[k] = v; + }); + + eventEmitter.emit('beforeGetConsts', emBeforeGetConsts); + + Object.entries(emBeforeGetConsts.constValues).forEach(([k, v]) => { + this[k] = v; + }); + } }; diff --git a/src/server/config/serverConfig.js b/src/server/config/serverConfig.js index 16f02a31..35307bc4 100644 --- a/src/server/config/serverConfig.js +++ b/src/server/config/serverConfig.js @@ -3,7 +3,7 @@ module.exports = { version: '0.11.0', port: 4000, - startupMessage: 'Server: ready', + startupMessage: 'Ready: Server', nodeEnv: process.env.NODE_ENV, diff --git a/src/server/items/generator.js b/src/server/items/generator.js index 5cc40010..8979e3e0 100644 --- a/src/server/items/generator.js +++ b/src/server/items/generator.js @@ -48,6 +48,8 @@ module.exports = { currencyChance = 0; else if (blueprint.level < 14) currencyChance *= (blueprint.level - 4) / 11; + else if (blueprint.level > consts.maxLevel) + blueprint.level = consts.maxLevel; //If you kill a mob that's too low of a level, idols are much more rare if ( diff --git a/src/server/items/generators/stats.js b/src/server/items/generators/stats.js index b3a1e359..b64f5cff 100644 --- a/src/server/items/generators/stats.js +++ b/src/server/items/generators/stats.js @@ -590,7 +590,7 @@ module.exports = { if (!value) { if (statBlueprint.generator) { - let level = Math.min(20, item.originalLevel || item.level); + let level = Math.min(consts.maxLevel, item.originalLevel || item.level); value = Math.ceil(this.generators[statBlueprint.generator](item, level, blueprint, blueprint.perfection, null, statBlueprint)); } else if (!blueprint.perfection) value = Math.ceil(random.norm(statBlueprint.min, statBlueprint.max)); @@ -675,7 +675,7 @@ module.exports = { } }; - const itemLevel = Math.min(20, item.level); + const itemLevel = Math.min(consts.maxLevel, item.level); stat.value = Math.ceil(generator(item, itemLevel, blueprint)); } else stat.value = Math.ceil(random.norm(statBlueprint.min, statBlueprint.max) * i.valueMult); diff --git a/src/server/security/connections.js b/src/server/security/connections.js index 8aa53771..d0ffa06b 100644 --- a/src/server/security/connections.js +++ b/src/server/security/connections.js @@ -93,8 +93,11 @@ module.exports = { keys.forEach(function (k) { let val = player[k]; if (val && val.type) { - if (['player', 'auth', 'syncer'].indexOf(val.type) === -1) + if (['player', 'auth', 'syncer'].indexOf(val.type) === -1) { delete player[k]; + + player.components.spliceWhere(c => c.type === val.type); + } } }); @@ -111,11 +114,13 @@ module.exports = { //If we don't do this, the atlas will try to remove it from the thread delete player.zoneName; delete player.name; + delete player.zoneId; //A hack to allow us to actually call methods again (like retrieve the player list) player.dead = false; player.permadead = false; delete player.auth.charname; + player.id = objects.getNextId(); this.modifyPlayerCount(-1); diff --git a/src/server/server/index.js b/src/server/server/index.js index e44fcfb9..298ffa26 100644 --- a/src/server/server/index.js +++ b/src/server/server/index.js @@ -12,7 +12,7 @@ const rest = require('../security/rest'); const { port = 4000, - startupMessage = 'Server: Ready', + startupMessage = 'Ready: Server', nodeEnv } = require('../config/serverConfig'); diff --git a/src/server/world/instancer.js b/src/server/world/instancer.js index ce9bb36b..50f9fbf0 100644 --- a/src/server/world/instancer.js +++ b/src/server/world/instancer.js @@ -26,6 +26,9 @@ module.exports = { lastTime: 0, + mapName: null, + threadArgs: null, + init: function (args) { const { zoneId, zoneName } = args; @@ -65,7 +68,7 @@ module.exports = { map.randomMap.init(fakeInstance); this.startRegen(); } else - _.log('(M ' + map.name + '): Ready'); + _.log(`Ready: ${JSON.stringify(this.threadArgs, null, '\t')}`); map.clientMap.zoneId = this.zoneId; @@ -164,7 +167,7 @@ module.exports = { this.addQueue = []; - _.log('(M ' + map.name + '): Ready'); + _.log(`Ready: ${JSON.stringify(this.threadArgs, null, '\t')}`); }, tick: function () { diff --git a/src/server/world/threadManager.js b/src/server/world/threadManager.js index c0740907..4347482e 100644 --- a/src/server/world/threadManager.js +++ b/src/server/world/threadManager.js @@ -166,32 +166,20 @@ const onMessage = (thread, message) => { messageHandlers[message.method](thread, message); }; -const spawnThread = async ({ name, path, instanced, destroyWhenEmptyForMs = -1 }, obj) => { +const spawnThread = async ({ map: { name, path, instanced, destroyWhenEmptyForMs = -1 }, obj }) => { let cbOnInitialized; const promise = new Promise(resolveOnReady => { cbOnInitialized = resolveOnReady; }); - const worker = childProcess.fork('./world/worker', [name]); - let id = instanced ? _.getGuid() : name; - const emBeforeGetThreadId = { - id, - obj, - name, - instanced - }; - events.emit('beforeGetThreadId', emBeforeGetThreadId); - - id = emBeforeGetThreadId.id; - const thread = { id, name, instanced, path, - worker, + worker: null, isReady: false, promise, cbOnInitialized, @@ -199,10 +187,25 @@ const spawnThread = async ({ name, path, instanced, destroyWhenEmptyForMs = -1 } playersCurrent: [], birthEpoch: +new Date(), destroyWhenEmptyForMs, - emptySinceEpoch: null + emptySinceEpoch: null, + sendArgsToWorker: ['name', 'id'] }; - worker.on('message', onMessage.bind(null, thread)); + const emBeforeSpawnThread = { + thread, + spawnForObject: obj + }; + events.emit('beforeSpawnThread', emBeforeSpawnThread); + + const workerArgs = JSON.stringify( + Object.fromEntries( + thread.sendArgsToWorker.map(a => [a, thread[a]]) + ) + ); + + thread.worker = childProcess.fork('./world/worker', [workerArgs]); + + thread.worker.on('message', onMessage.bind(null, thread)); threads.push(thread); @@ -221,16 +224,19 @@ const getThread = async ({ zoneName, zoneId, obj }) => { map = mapList.find(m => m.name === clientConfig.config.defaultZone); let thread = threads.find(t => t.id === zoneId && t.name === zoneName); - + //Maybe this player has been in a thread for this map before - if (!thread) + if (!thread) thread = threads.find(t => t.name === zoneName && t.players.includes(obj.id)); if (!thread) { if (map.instanced) result.resetObjPosition = true; - thread = await spawnThread(map, obj); + thread = await spawnThread({ + map, + obj + }); } if (!thread.isReady) diff --git a/src/server/world/worker.js b/src/server/world/worker.js index 8f84f418..5be5ca84 100644 --- a/src/server/world/worker.js +++ b/src/server/world/worker.js @@ -26,7 +26,9 @@ const profanities = require('../misc/profanities'); const eventEmitter = require('../misc/events'); //Worker -instancer.mapName = process.argv[2]; +const threadArgs = JSON.parse(process.argv[2]); +instancer.mapName = threadArgs.name; +instancer.threadArgs = threadArgs; const onCpnsReady = async function () { factions.init(); @@ -51,6 +53,7 @@ const onCpnsReady = async function () { }; const onModsReady = function () { + consts.init(threadArgs); components.init(onCpnsReady); };