diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3f45d484..44c31c2e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -16,7 +16,7 @@ audit: lint-server: stage: test script: - - npm install eslint eslint-plugin-prettier prettier babel-eslint + - npm install eslint eslint-plugin-prettier prettier babel-eslint eslint-plugin-requirejs - cd src/server - ../../node_modules/.bin/eslint . only: diff --git a/src/client/js/components/components.js b/src/client/js/components/components.js index 04535e62..e0b343f6 100644 --- a/src/client/js/components/components.js +++ b/src/client/js/components/components.js @@ -1,50 +1,15 @@ -let components = [ - 'keyboardMover', - 'mouseMover', - 'touchMover', - 'player', - 'pather', - 'attackAnimation', - 'lightningEffect', - 'moveAnimation', - 'bumpAnimation', - 'animation', - 'light', - 'lightPatch', - 'projectile', - 'particles', - 'explosion', - 'spellbook', - 'inventory', - 'stats', - 'chest', - 'effects', - 'quests', - 'events', - 'resourceNode', - 'gatherer', - 'stash', - 'flash', - 'chatter', - 'dialogue', - 'trade', - 'reputation', - 'serverActions', - 'social', - 'passives', - 'sound', - 'whirlwind', - 'fadeInOut' -].map(function (c) { - return 'js/components/' + c; -}); - define([ - ...components, - '../system/events' -], function () { - const events = arguments[arguments.length - 1]; - + 'js/system/events', + 'js/system/globals' +], function ( + events, + globals +) { + //Store templates here after loading them + const templates = []; + const extenders = []; + + //Bound Methods const hookEvent = function (e, cb) { if (!this.eventList[e]) this.eventList[e] = []; @@ -59,30 +24,54 @@ define([ }); }; - let templates = {}; + //Helpers + const loadComponent = cpn => { + return new Promise(res => { + require([cpn.path], tpl => { + if (cpn.type) + templates.push(tpl); + if (cpn.extends) + extenders.push(tpl); + + res(); + }); + }); + }; - [].forEach.call(arguments, function (t, i) { - //Don't do this for the events module - if (i === arguments[2].length - 1) - return; + //Init Methods + const loadComponents = paths => { + return Promise.all( + paths.map(p => loadComponent(p)) + ); + }; + + const buildComponents = () => { + templates.forEach(t => { + const extensions = extenders.filter(e => e.extends === t.type); - t.eventList = {}; - t.hookEvent = hookEvent; - t.unhookEvents = unhookEvents; + extensions.forEach(e => $.extend(true, t, e)); - templates[t.type] = t; - }); + t.eventList = {}; + t.hookEvent = hookEvent; + t.unhookEvents = unhookEvents; + }); + }; + //Export return { + init: async function () { + const paths = globals.clientConfig.clientComponents; + + await loadComponents(paths); + + buildComponents(); + }, + getTemplate: function (type) { if (type === 'lightpatch') type = 'lightPatch'; - let template = templates[type] || { - type: type - }; - - return template; + return templates.find(t => t.type === type) || { type: type }; } }; }); diff --git a/src/client/js/main.js b/src/client/js/main.js index 6c76dde9..25120e9c 100644 --- a/src/client/js/main.js +++ b/src/client/js/main.js @@ -10,6 +10,7 @@ define([ 'js/resources', 'js/sound/sound', 'js/system/globals', + 'js/components/components', 'ui/templates/online/online', 'ui/templates/tooltips/tooltips' ], function ( @@ -23,7 +24,8 @@ define([ events, resources, sound, - globals + globals, + components ) { let fnQueueTick = null; const getQueueTick = updateMethod => { @@ -69,6 +71,8 @@ define([ globals.clientConfig = config; await resources.init(); + await components.init(); + events.emit('onResourcesLoaded'); this.start(); diff --git a/src/server/clientComponents/.eslintrc b/src/server/clientComponents/.eslintrc new file mode 100644 index 00000000..7658189f --- /dev/null +++ b/src/server/clientComponents/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": "../../client/.eslintrc" +} \ No newline at end of file diff --git a/src/client/js/components/animation.js b/src/server/clientComponents/animation.js similarity index 100% rename from src/client/js/components/animation.js rename to src/server/clientComponents/animation.js diff --git a/src/client/js/components/attackAnimation.js b/src/server/clientComponents/attackAnimation.js similarity index 100% rename from src/client/js/components/attackAnimation.js rename to src/server/clientComponents/attackAnimation.js diff --git a/src/client/js/components/bumpAnimation.js b/src/server/clientComponents/bumpAnimation.js similarity index 100% rename from src/client/js/components/bumpAnimation.js rename to src/server/clientComponents/bumpAnimation.js diff --git a/src/client/js/components/chatter.js b/src/server/clientComponents/chatter.js similarity index 100% rename from src/client/js/components/chatter.js rename to src/server/clientComponents/chatter.js diff --git a/src/client/js/components/chest.js b/src/server/clientComponents/chest.js similarity index 100% rename from src/client/js/components/chest.js rename to src/server/clientComponents/chest.js diff --git a/src/client/js/components/dialogue.js b/src/server/clientComponents/dialogue.js similarity index 100% rename from src/client/js/components/dialogue.js rename to src/server/clientComponents/dialogue.js diff --git a/src/client/js/components/effects.js b/src/server/clientComponents/effects.js similarity index 100% rename from src/client/js/components/effects.js rename to src/server/clientComponents/effects.js diff --git a/src/client/js/components/events.js b/src/server/clientComponents/events.js similarity index 100% rename from src/client/js/components/events.js rename to src/server/clientComponents/events.js diff --git a/src/client/js/components/explosion.js b/src/server/clientComponents/explosion.js similarity index 100% rename from src/client/js/components/explosion.js rename to src/server/clientComponents/explosion.js diff --git a/src/client/js/components/fadeInOut.js b/src/server/clientComponents/fadeInOut.js similarity index 100% rename from src/client/js/components/fadeInOut.js rename to src/server/clientComponents/fadeInOut.js diff --git a/src/client/js/components/flash.js b/src/server/clientComponents/flash.js similarity index 100% rename from src/client/js/components/flash.js rename to src/server/clientComponents/flash.js diff --git a/src/client/js/components/gatherer.js b/src/server/clientComponents/gatherer.js similarity index 100% rename from src/client/js/components/gatherer.js rename to src/server/clientComponents/gatherer.js diff --git a/src/client/js/components/inventory.js b/src/server/clientComponents/inventory.js similarity index 100% rename from src/client/js/components/inventory.js rename to src/server/clientComponents/inventory.js diff --git a/src/client/js/components/keyboardMover.js b/src/server/clientComponents/keyboardMover.js similarity index 100% rename from src/client/js/components/keyboardMover.js rename to src/server/clientComponents/keyboardMover.js diff --git a/src/client/js/components/light.js b/src/server/clientComponents/light.js similarity index 100% rename from src/client/js/components/light.js rename to src/server/clientComponents/light.js diff --git a/src/client/js/components/lightPatch.js b/src/server/clientComponents/lightPatch.js similarity index 100% rename from src/client/js/components/lightPatch.js rename to src/server/clientComponents/lightPatch.js diff --git a/src/client/js/components/lightningEffect.js b/src/server/clientComponents/lightningEffect.js similarity index 100% rename from src/client/js/components/lightningEffect.js rename to src/server/clientComponents/lightningEffect.js diff --git a/src/client/js/components/mouseMover.js b/src/server/clientComponents/mouseMover.js similarity index 100% rename from src/client/js/components/mouseMover.js rename to src/server/clientComponents/mouseMover.js diff --git a/src/client/js/components/moveAnimation.js b/src/server/clientComponents/moveAnimation.js similarity index 100% rename from src/client/js/components/moveAnimation.js rename to src/server/clientComponents/moveAnimation.js diff --git a/src/client/js/components/particles.js b/src/server/clientComponents/particles.js similarity index 100% rename from src/client/js/components/particles.js rename to src/server/clientComponents/particles.js diff --git a/src/client/js/components/passives.js b/src/server/clientComponents/passives.js similarity index 100% rename from src/client/js/components/passives.js rename to src/server/clientComponents/passives.js diff --git a/src/client/js/components/pather.js b/src/server/clientComponents/pather.js similarity index 100% rename from src/client/js/components/pather.js rename to src/server/clientComponents/pather.js diff --git a/src/client/js/components/player.js b/src/server/clientComponents/player.js similarity index 100% rename from src/client/js/components/player.js rename to src/server/clientComponents/player.js diff --git a/src/client/js/components/projectile.js b/src/server/clientComponents/projectile.js similarity index 100% rename from src/client/js/components/projectile.js rename to src/server/clientComponents/projectile.js diff --git a/src/client/js/components/quests.js b/src/server/clientComponents/quests.js similarity index 100% rename from src/client/js/components/quests.js rename to src/server/clientComponents/quests.js diff --git a/src/client/js/components/reputation.js b/src/server/clientComponents/reputation.js similarity index 100% rename from src/client/js/components/reputation.js rename to src/server/clientComponents/reputation.js diff --git a/src/client/js/components/resourceNode.js b/src/server/clientComponents/resourceNode.js similarity index 100% rename from src/client/js/components/resourceNode.js rename to src/server/clientComponents/resourceNode.js diff --git a/src/client/js/components/serverActions.js b/src/server/clientComponents/serverActions.js similarity index 100% rename from src/client/js/components/serverActions.js rename to src/server/clientComponents/serverActions.js diff --git a/src/client/js/components/social.js b/src/server/clientComponents/social.js similarity index 100% rename from src/client/js/components/social.js rename to src/server/clientComponents/social.js diff --git a/src/client/js/components/sound.js b/src/server/clientComponents/sound.js similarity index 100% rename from src/client/js/components/sound.js rename to src/server/clientComponents/sound.js diff --git a/src/client/js/components/spellbook.js b/src/server/clientComponents/spellbook.js similarity index 100% rename from src/client/js/components/spellbook.js rename to src/server/clientComponents/spellbook.js diff --git a/src/client/js/components/stash.js b/src/server/clientComponents/stash.js similarity index 100% rename from src/client/js/components/stash.js rename to src/server/clientComponents/stash.js diff --git a/src/client/js/components/stats.js b/src/server/clientComponents/stats.js similarity index 100% rename from src/client/js/components/stats.js rename to src/server/clientComponents/stats.js diff --git a/src/client/js/components/touchMover.js b/src/server/clientComponents/touchMover.js similarity index 100% rename from src/client/js/components/touchMover.js rename to src/server/clientComponents/touchMover.js diff --git a/src/client/js/components/trade.js b/src/server/clientComponents/trade.js similarity index 100% rename from src/client/js/components/trade.js rename to src/server/clientComponents/trade.js diff --git a/src/client/js/components/whirlwind.js b/src/server/clientComponents/whirlwind.js similarity index 100% rename from src/client/js/components/whirlwind.js rename to src/server/clientComponents/whirlwind.js diff --git a/src/server/config/clientConfig.js b/src/server/config/clientConfig.js index 5c401b38..a2f3934d 100644 --- a/src/server/config/clientConfig.js +++ b/src/server/config/clientConfig.js @@ -1,6 +1,7 @@ const imageSize = require('image-size'); const events = require('../misc/events'); +const fileLister = require('../misc/fileLister'); const tos = require('./tos'); const config = { @@ -197,6 +198,7 @@ const config = { player: [], npc: [] }, + clientComponents: [], sounds: { ui: [] }, @@ -207,6 +209,18 @@ module.exports = { config, init: async function () { + fileLister.getFolder('./clientComponents').forEach(f => { + if (!f.endsWith('.js')) return; + + const type = f.split('.')[0]; + const path = 'server/clientComponents/' + f; + + config.clientComponents.push({ + type, + path + }); + }); + events.emit('onBeforeGetClientConfig', config); //Deprecated diff --git a/src/server/server/requestHandlers.js b/src/server/server/requestHandlers.js index b3a9704f..46833af1 100644 --- a/src/server/server/requestHandlers.js +++ b/src/server/server/requestHandlers.js @@ -11,13 +11,17 @@ const appFile = (req, res) => { let file = req.params[0]; file = file.replace('/' + root + '/', ''); - + const validRequest = ( root !== 'server' || - ( - file.includes('mods/') && - validModPatterns.some(v => file.includes(v)) - ) + ( + root === 'server' && + file.startsWith('clientComponents/') + ) || + ( + file.includes('mods/') && + validModPatterns.some(v => file.includes(v)) + ) ); if (!validRequest)