From 231accded50bbfa4a17c0e7f0bbbe7858e86c94b Mon Sep 17 00:00:00 2001 From: kckckc Date: Wed, 15 Sep 2021 19:53:37 -0700 Subject: [PATCH 01/65] Move aura visual effect to its own file --- src/server/clientComponents/effects.js | 123 +++++-------------- src/server/clientComponents/effects/auras.js | 109 ++++++++++++++++ src/server/config/clientConfig.js | 5 + 3 files changed, 146 insertions(+), 91 deletions(-) create mode 100644 src/server/clientComponents/effects/auras.js diff --git a/src/server/clientComponents/effects.js b/src/server/clientComponents/effects.js index 06341b6e..30c09e31 100644 --- a/src/server/clientComponents/effects.js +++ b/src/server/clientComponents/effects.js @@ -3,133 +3,74 @@ define([ ], function ( renderer ) { - let auras = { - reflectDamage: 0, - stealth: 1, - regenHp: 9, - regenMana: 10, - swiftness: 11, - holyVengeance: 8, - rare: 16 - }; - return { type: 'effects', - alpha: 0, - alphaDir: 0.0025, + effects: [], - alphaMax: 0.6, - alphaMin: 0.35, + templates: { + + }, - alphaCutoff: 0.4, + init: function (blueprint) { + this.effects = this.effects.map(e => this.buildEffect(e)); + }, - effects: [], + buildEffect: function (data) { + if (typeof data === 'string') + data = { type: data }; + + let template = this.templates[data.type] || {}; - init: function (blueprint) { - this.effects = this.effects - .filter(e => auras[e] !== null) - .map(e => { - return { - name: e, - sprite: renderer.buildObject({ - layerName: 'effects', - sheetName: 'auras', - x: this.obj.x, - y: this.obj.y + 1, - w: scale * 3, - h: scale * 3, - cell: auras[e] - }) - }; - }); + let effect = $.extend(true, {}, template, data); + + effect.obj = this.obj; + + if (effect.init) + effect.init(); + + return effect; }, + extend: function (blueprint) { if (blueprint.addEffects) { - blueprint.addEffects = blueprint.addEffects - .filter(e => { - return (auras[e] !== null); - }) - .map(e => { - return { - name: e, - sprite: renderer.buildObject({ - layerName: 'effects', - sheetName: 'auras', - x: this.obj.x, - y: this.obj.y + 1, - w: scale * 3, - h: scale * 3, - cell: auras[e] - }) - }; - }); + blueprint.addEffects = blueprint.addEffects.map(e => this.buildEffect(e)); this.effects.push.apply(this.effects, blueprint.addEffects || []); } if (blueprint.removeEffects) { blueprint.removeEffects.forEach(r => { - let effect = this.effects.find(e => e.name === r); + let effect = this.effects.find(e => e.type === r); if (!effect) return; - renderer.destroyObject({ - layerName: 'effects', - sprite: effect.sprite - }); + if (effect.destroy) + effect.destroy(); - this.effects.spliceFirstWhere(e => e.name === r); + this.effects.spliceFirstWhere(e => e.type === r); }); } }, update: function () { - this.alpha += this.alphaDir; - if ((this.alphaDir > 0) && (this.alpha >= this.alphaMax)) { - this.alpha = this.alphaMax; - this.alphaDir *= -1; - } else if ((this.alphaDir < 0) && (this.alpha <= this.alphaMin)) { - this.alpha = this.alphaMin; - this.alphaDir *= -1; - } - - let x = this.obj.x; - let y = this.obj.y; - - let useAlpha = this.alpha; - if (useAlpha < this.alphaCutoff) - useAlpha = 0; - else { - useAlpha -= this.alphaCutoff; - useAlpha /= (this.alphaMax - this.alphaCutoff); - } - this.effects.forEach(e => { - renderer.setSpritePosition({ - x, - y: y + 1, - sprite: e.sprite - }); - - e.sprite.alpha = useAlpha; - - e.sprite.visible = this.obj.isVisible; + if (e.update) + e.update(); }); }, setVisible: function (visible) { this.effects.forEach(e => { - e.sprite.visible = visible; + if (e.setVisible) + e.setVisible(visible); }); }, destroy: function () { this.effects.forEach(e => { - renderer.destroyObject({ - layerName: 'effects', - sprite: e.sprite - }); + if (e.destroy) + e.destroy(); }); } }; diff --git a/src/server/clientComponents/effects/auras.js b/src/server/clientComponents/effects/auras.js new file mode 100644 index 00000000..93f72a5c --- /dev/null +++ b/src/server/clientComponents/effects/auras.js @@ -0,0 +1,109 @@ +define([ + 'js/rendering/renderer' +], function ( + renderer +) { + let auras = { + reflectDamage: 0, + stealth: 1, + regenHp: 9, + regenMana: 10, + swiftness: 11, + holyVengeance: 8, + rare: 16 + }; + + let templates = {}; + + Object.keys(auras).forEach(type => { + let cell = auras[type]; + + templates[type] = { + sprite: null, + + alpha: 0, + alphaDir: 0.0025, + + alphaMax: 0.6, + alphaMin: 0.35, + + alphaCutoff: 0.4, + + init: function () { + this.sprite = renderer.buildObject({ + layerName: 'effects', + sheetName: 'auras', + x: this.obj.x, + y: this.obj.y + 1, + w: scale * 3, + h: scale * 3, + cell: cell + }); + }, + + getAlpha: function () { + let listAuras = this.obj.effects.effects.filter(e => auras[e.type]); + let first = listAuras[0]; + + // The first aura in the list should do all the updating so that all auras pulse together + if (first === this) { + this.alpha += this.alphaDir; + if ((this.alphaDir > 0) && (this.alpha >= this.alphaMax)) { + this.alpha = this.alphaMax; + this.alphaDir *= -1; + } else if ((this.alphaDir < 0) && (this.alpha <= this.alphaMin)) { + this.alpha = this.alphaMin; + this.alphaDir *= -1; + } + } else { + this.alpha = first.alpha; + this.alphaDir = first.alphaDir; + } + + let useAlpha = this.alpha; + if (useAlpha < this.alphaCutoff) + useAlpha = 0; + else { + useAlpha -= this.alphaCutoff; + useAlpha /= (this.alphaMax - this.alphaCutoff); + } + + return useAlpha; + }, + + update: function () { + let useAlpha = this.getAlpha(); + + let x = this.obj.x; + let y = this.obj.y; + + renderer.setSpritePosition({ + x, + y: y + 1, + sprite: this.sprite + }); + + this.sprite.alpha = useAlpha; + + this.sprite.visible = this.obj.isVisible; + }, + + destroy: function () { + renderer.destroyObject({ + layerName: 'effects', + sprite: this.sprite + }); + }, + + setVisible: function (visible) { + this.sprite.visible = visible; + } + }; + }); + + return { + templates: { + ...templates + } + }; +}); diff --git a/src/server/config/clientConfig.js b/src/server/config/clientConfig.js index a2f3934d..3dacbd5a 100644 --- a/src/server/config/clientConfig.js +++ b/src/server/config/clientConfig.js @@ -221,6 +221,11 @@ module.exports = { }); }); + config.clientComponents.push({ + extends: 'effects', + path: 'server/clientComponents/effects/auras.js' + }); + events.emit('onBeforeGetClientConfig', config); //Deprecated From ed9162a843d73d997ebc50f1770e7208752c7a9a Mon Sep 17 00:00:00 2001 From: Shaun Date: Tue, 26 Oct 2021 21:04:04 +0200 Subject: [PATCH 02/65] bug ##1854 --- src/server/world/syncer.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/server/world/syncer.js b/src/server/world/syncer.js index a75e4eb5..4b1affde 100644 --- a/src/server/world/syncer.js +++ b/src/server/world/syncer.js @@ -172,7 +172,11 @@ module.exports = { for (let p in buffer) { const list = buffer[p]; - list.spliceWhere(l => l.to === targetServerId); + list.forEach(l => l.to.splice(f => f === targetServerId)); + list.spliceWhere(l => !l.to.length); + + if (!list.length) + delete buffer[p]; } }, From 41c257e222ba23ad0bc00df5f6effbc4e53883bb Mon Sep 17 00:00:00 2001 From: Shaun Date: Wed, 27 Oct 2021 07:45:08 +0200 Subject: [PATCH 03/65] modding #1857 --- src/server/components/auth.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 668e5231..09effa68 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -340,6 +340,20 @@ module.exports = { } } + const emBeforeRegisterAccount = { + obj: this.obj, + success: true, + msg: null + }; + + eventEmitter.emit('onBeforeRegisterAccount', emBeforeRegisterAccount); + + if (!emBeforeRegisterAccount.success) { + msg.callback(emBeforeRegisterAccount.msg); + + return; + } + let exists = await io.getAsync({ key: credentials.username, ignoreCase: true, @@ -350,6 +364,7 @@ module.exports = { if (exists) { msg.callback(messages.login.exists); + return; } From 2abeb38d64cfb370ea0e14907e7a471d7e28950b Mon Sep 17 00:00:00 2001 From: Shaun Date: Wed, 27 Oct 2021 16:18:06 +0200 Subject: [PATCH 04/65] modding #1858 --- src/server/components/auth.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 09effa68..de52cc17 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -260,6 +260,7 @@ module.exports = { if (credentials.username === '' || credentials.password === '') { msg.callback(messages.login.allFields); + return; } @@ -279,6 +280,18 @@ module.exports = { msg.callback(messages.login.incorrect); return; } + + const emBeforeLogin = { + obj: this.obj, + success: true, + msg: null + }; + await eventEmitter.emit('onBeforeLogin', emBeforeLogin); + if (!emBeforeLogin.success) { + msg.callback(emBeforeLogin.msg); + + return; + } this.username = username; await cons.logOut(this.obj); From ff424623e5ca72f162818767e78959d97ef2c24f Mon Sep 17 00:00:00 2001 From: Shaun Date: Wed, 27 Oct 2021 16:47:09 +0200 Subject: [PATCH 05/65] #1858 --- src/server/components/auth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index de52cc17..ca55f1fa 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -359,7 +359,7 @@ module.exports = { msg: null }; - eventEmitter.emit('onBeforeRegisterAccount', emBeforeRegisterAccount); + await eventEmitter.emit('onBeforeRegisterAccount', emBeforeRegisterAccount); if (!emBeforeRegisterAccount.success) { msg.callback(emBeforeRegisterAccount.msg); From da397333588c396e8f86784690462ed3c08c3a38 Mon Sep 17 00:00:00 2001 From: kckckc Date: Thu, 28 Oct 2021 12:30:34 -0700 Subject: [PATCH 06/65] closes #1859 --- src/client/ui/templates/tooltipInfo/template.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/ui/templates/tooltipInfo/template.html b/src/client/ui/templates/tooltipInfo/template.html index a4c06dbc..5a82abd8 100644 --- a/src/client/ui/templates/tooltipInfo/template.html +++ b/src/client/ui/templates/tooltipInfo/template.html @@ -1,3 +1,3 @@ -
- +
+
\ No newline at end of file From abd2d3b651258a676528a0f33f76def37fc77c90 Mon Sep 17 00:00:00 2001 From: kckckc Date: Tue, 2 Nov 2021 12:56:28 -0700 Subject: [PATCH 07/65] closes #1459 --- src/server/config/recipes/enchanting.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/config/recipes/enchanting.js b/src/server/config/recipes/enchanting.js index 35e39ba4..b40aef72 100644 --- a/src/server/config/recipes/enchanting.js +++ b/src/server/config/recipes/enchanting.js @@ -45,7 +45,7 @@ module.exports = [{ withProps: ['slot'], withoutProps: ['noAugment'], checks: [ - item => item.level && item.level < consts.maxLevel + item => item.level && (item.originalLevel || item.level) < consts.maxLevel ] }], craftAction: relevel From 7373797d338c4f9c5152194665bbec10ddd80043 Mon Sep 17 00:00:00 2001 From: kckckc Date: Tue, 9 Nov 2021 15:22:26 -0800 Subject: [PATCH 08/65] Fix extending for client components --- src/client/js/components/components.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/js/components/components.js b/src/client/js/components/components.js index e0b343f6..8a223654 100644 --- a/src/client/js/components/components.js +++ b/src/client/js/components/components.js @@ -31,7 +31,7 @@ define([ if (cpn.type) templates.push(tpl); if (cpn.extends) - extenders.push(tpl); + extenders.push({ extends: cpn.extends, tpl }); res(); }); @@ -49,7 +49,7 @@ define([ templates.forEach(t => { const extensions = extenders.filter(e => e.extends === t.type); - extensions.forEach(e => $.extend(true, t, e)); + extensions.forEach(e => $.extend(true, t, e.tpl)); t.eventList = {}; t.hookEvent = hookEvent; From 02b58b4a35a13c95b4bb83c1f9ce5af9d2eb2b1f Mon Sep 17 00:00:00 2001 From: kckckc Date: Thu, 11 Nov 2021 13:40:01 -0800 Subject: [PATCH 09/65] Add/remove effects by ID, add client effect extending --- src/server/clientComponents/effects.js | 36 +++++++++++--- src/server/components/effects.js | 52 ++++++++++++++------- src/server/config/effects/effectTemplate.js | 15 +++++- 3 files changed, 79 insertions(+), 24 deletions(-) diff --git a/src/server/clientComponents/effects.js b/src/server/clientComponents/effects.js index 30c09e31..7b547667 100644 --- a/src/server/clientComponents/effects.js +++ b/src/server/clientComponents/effects.js @@ -1,13 +1,17 @@ define([ - 'js/rendering/renderer' + ], function ( - renderer + ) { return { type: 'effects', effects: [], + effectBase: { + + }, + templates: { }, @@ -17,12 +21,15 @@ define([ }, buildEffect: function (data) { - if (typeof data === 'string') + if (typeof data === 'string') { + //TODO: temporary while we work on effects + console.error('String type effects should be deprecated, this effect will be missing an id'); data = { type: data }; + } let template = this.templates[data.type] || {}; - let effect = $.extend(true, {}, template, data); + let effect = $.extend(true, {}, this.effectBase, template, data); effect.obj = this.obj; @@ -39,8 +46,8 @@ define([ this.effects.push.apply(this.effects, blueprint.addEffects || []); } if (blueprint.removeEffects) { - blueprint.removeEffects.forEach(r => { - let effect = this.effects.find(e => e.type === r); + blueprint.removeEffects.forEach(removeId => { + let effect = this.effects.find(e => e.id === removeId); if (!effect) return; @@ -48,7 +55,22 @@ define([ if (effect.destroy) effect.destroy(); - this.effects.spliceFirstWhere(e => e.type === r); + this.effects.spliceFirstWhere(e => e.id === removeId); + }); + } + if (blueprint.extendEffects) { + blueprint.extendEffects.forEach(u => { + let effect = this.effects.find(e => e.id === u.id); + + if (!effect) + return; + + if (effect.extend) + effect.extend(u.data); + else { + for (let p in u.data) + effect[p] = u.data[p]; + } }); } }, diff --git a/src/server/components/effects.js b/src/server/components/effects.js index b1e1ca74..4cf23719 100644 --- a/src/server/components/effects.js +++ b/src/server/components/effects.js @@ -145,6 +145,8 @@ module.exports = { if (!options.force && !this.canApplyEffect(options.type)) return; + // TODO: separate "stack ttl" flag/method + /* if (!options.new) { let exists = this.effects.find(e => e.type === options.type); if (exists) { @@ -160,6 +162,7 @@ module.exports = { return exists; } } + */ let typeTemplate = null; if (options.type) { @@ -179,14 +182,14 @@ module.exports = { builtEffect.obj = this.obj; builtEffect.id = this.nextId++; - builtEffect.noMsg = options.noMsg; + builtEffect.silent = options.silent; if (builtEffect.init) builtEffect.init(options.source); this.effects.push(builtEffect); - if (!options.noMsg) { + if (!options.silent) { this.obj.instance.syncer.queue('onGetBuff', { type: options.type, id: builtEffect.id @@ -198,7 +201,7 @@ module.exports = { text: '+' + options.type }, -1); - this.obj.syncer.setArray(false, 'effects', 'addEffects', options.type); + this.obj.syncer.setArray(false, 'effects', 'addEffects', builtEffect.simplify()); } this.obj.instance.eventEmitter.emit('onAddEffect', this.obj, builtEffect); @@ -206,6 +209,22 @@ module.exports = { return builtEffect; }, + syncExtend: function (id, data) { + let effect = this.effects.find(e => e.id === id); + if (!effect) + return; + + //Never sync silent effects + if (effect.silent) + return; + + //TODO: should this be for self? + this.obj.syncer.setArray(true, 'effects', 'extendEffects', { + id, + data + }); + }, + syncRemove: function (id, type, noMsg) { if ((noMsg) || (!type)) return; @@ -220,23 +239,24 @@ module.exports = { text: '-' + type }, -1); - this.obj.syncer.setArray(false, 'effects', 'removeEffects', type); + this.obj.syncer.setArray(false, 'effects', 'removeEffects', id); }, - removeEffect: function (checkEffect, noMsg) { - let effects = this.effects; - let eLen = effects.length; - for (let i = 0; i < eLen; i++) { - let effect = effects[i]; - if (effect === checkEffect) { - this.destroyEffect(effect); + removeEffect: function (id, noMsg) { + if (noMsg) { + console.error('removeEffect: noMsg is deprecated!'); + } + if (typeof id !== 'number') { + console.error('removeEffect: id should be a number'); + id = id.id; + } - this.syncRemove(effect.id, effect.type, noMsg || effect.noMsg); - effects.splice(i, 1); + let effect = this.effects.find(e => e.id === id); + this.destroyEffect(effect); - return; - } - } + this.syncRemove(effect.id, effect.type); + + this.effects.spliceWhere(e => e.id === id); }, removeEffectByName: function (effectName, noMsg) { let effects = this.effects; diff --git a/src/server/config/effects/effectTemplate.js b/src/server/config/effects/effectTemplate.js index 24ef084b..760e885e 100644 --- a/src/server/config/effects/effectTemplate.js +++ b/src/server/config/effects/effectTemplate.js @@ -1,4 +1,15 @@ module.exports = { + syncExtend: function (data) { + let effects = this.obj.effects; + effects.syncExtend(this.id, data); + }, + + isFirstOfType: function () { + let effects = this.obj.effects; + let firstOfType = effects.find(f => f.type === this.type); + return (firstOfType.id === this); + }, + save: function () { if (!this.persist) return null; @@ -19,6 +30,8 @@ module.exports = { }, simplify: function () { - return this.type; + return { + type: this.type + }; } }; From d86e05a72f2d8708bad92bc47ae59a18b35d4399 Mon Sep 17 00:00:00 2001 From: kckckc Date: Thu, 11 Nov 2021 13:51:06 -0800 Subject: [PATCH 10/65] Remove removeEffectByName and use IDs to remove effects --- src/server/components/effects.js | 36 +++++++------------ src/server/config/spells/spellAura.js | 6 ++-- src/server/config/spells/spellCharge.js | 2 +- src/server/config/spells/spellFireblast.js | 2 +- .../config/spells/spellReflectDamage.js | 2 +- src/server/config/spells/spellStealth.js | 8 +++-- 6 files changed, 24 insertions(+), 32 deletions(-) diff --git a/src/server/components/effects.js b/src/server/components/effects.js index 4cf23719..1b12c844 100644 --- a/src/server/components/effects.js +++ b/src/server/components/effects.js @@ -110,14 +110,14 @@ module.exports = { let effect = effects[i]; if (!forceDestroy) { if (effect.persist) { - this.syncRemove(effect.id, effect.type); + this.syncRemove(effect.id); continue; } } this.destroyEffect(effect); - this.syncRemove(effect.id, effect.type); + this.syncRemove(effect.id); effects.splice(i, 1); eLen--; i--; @@ -225,8 +225,13 @@ module.exports = { }); }, - syncRemove: function (id, type, noMsg) { - if ((noMsg) || (!type)) + syncRemove: function (id) { + let effect = this.effects.find(e => e.id === id); + + if (!effect) + return; + + if (effect.silent) return; this.obj.instance.syncer.queue('onRemoveBuff', { @@ -243,9 +248,9 @@ module.exports = { }, removeEffect: function (id, noMsg) { - if (noMsg) { + if (noMsg) console.error('removeEffect: noMsg is deprecated!'); - } + if (typeof id !== 'number') { console.error('removeEffect: id should be a number'); id = id.id; @@ -254,25 +259,10 @@ module.exports = { let effect = this.effects.find(e => e.id === id); this.destroyEffect(effect); - this.syncRemove(effect.id, effect.type); + this.syncRemove(effect.id); this.effects.spliceWhere(e => e.id === id); }, - removeEffectByName: function (effectName, noMsg) { - let effects = this.effects; - let eLen = effects.length; - for (let i = 0; i < eLen; i++) { - let effect = effects[i]; - if (effect.type === effectName) { - this.destroyEffect(effect); - - this.syncRemove(effect.id, effect.type, noMsg || effects.noMsg); - effects.splice(i, 1); - - return effect; - } - } - }, getEffectByType: function (effectType) { const effect = this.effects.find(e => e.type === effectType); @@ -329,7 +319,7 @@ module.exports = { this.destroyEffect(e); - this.syncRemove(e.id, e.type, e.noMsg); + this.syncRemove(e.id); } } diff --git a/src/server/config/spells/spellAura.js b/src/server/config/spells/spellAura.js index 7036683b..e1fd9e35 100644 --- a/src/server/config/spells/spellAura.js +++ b/src/server/config/spells/spellAura.js @@ -69,7 +69,7 @@ module.exports = { if (distance > range) { if (effect) { delete effects[m]; - obj.effects.removeEffect(effect); + obj.effects.removeEffect(effect.id); } return; @@ -96,7 +96,7 @@ module.exports = { delete effects[serverId]; const obj = objects.find(f => ~~f.serverId === ~~serverId); if (obj) - obj.effects.removeEffect(effect); + obj.effects.removeEffect(effect.id); } }); }, @@ -117,7 +117,7 @@ module.exports = { return; } - obj.effects.removeEffect(effect); + obj.effects.removeEffect(effect.id); delete effects[m]; }, this); } diff --git a/src/server/config/spells/spellCharge.js b/src/server/config/spells/spellCharge.js index ec2577fd..3a65039d 100644 --- a/src/server/config/spells/spellCharge.js +++ b/src/server/config/spells/spellCharge.js @@ -115,7 +115,7 @@ module.exports = { obj.instance.physics.addObject(obj, obj.x, obj.y); - obj.effects.removeEffect(selfEffect, true); + obj.effects.removeEffect(selfEffect.id); this.obj.aggro.move(); diff --git a/src/server/config/spells/spellFireblast.js b/src/server/config/spells/spellFireblast.js index 288ecf8d..daf30014 100644 --- a/src/server/config/spells/spellFireblast.js +++ b/src/server/config/spells/spellFireblast.js @@ -147,7 +147,7 @@ module.exports = { }, endEffect: function (target, targetPos, targetEffect) { - target.effects.removeEffect(targetEffect, true); + target.effects.removeEffect(targetEffect.id); target.instance.physics.removeObject(target, target.x, target.y); diff --git a/src/server/config/spells/spellReflectDamage.js b/src/server/config/spells/spellReflectDamage.js index e9f8a7a4..d0734285 100644 --- a/src/server/config/spells/spellReflectDamage.js +++ b/src/server/config/spells/spellReflectDamage.js @@ -36,6 +36,6 @@ module.exports = { let obj = this.obj; - obj.effects.removeEffect(selfEffect); + obj.effects.removeEffect(selfEffect.id); } }; diff --git a/src/server/config/spells/spellStealth.js b/src/server/config/spells/spellStealth.js index 22ad77e0..afd6d4a8 100644 --- a/src/server/config/spells/spellStealth.js +++ b/src/server/config/spells/spellStealth.js @@ -8,6 +8,8 @@ module.exports = { targetGround: true, + effect: null, + cast: function (action) { //Clear Aggro this.obj.aggro.die(); @@ -15,10 +17,10 @@ module.exports = { let ttl = this.duration * consts.tickTime; let endCallback = this.queueCallback(this.endEffect.bind(this), ttl - 50); - this.obj.effects.addEffect({ + this.effect = this.obj.effects.addEffect({ type: 'stealth', endCallback: endCallback - }); + }); return true; }, @@ -28,7 +30,7 @@ module.exports = { let obj = this.obj; - obj.effects.removeEffectByName('stealth'); + obj.effects.removeEffect(this.effect.id); this.obj.aggro.move(); } }; From 034c50d76b5821ac137ca2ea4455f8d185e67a23 Mon Sep 17 00:00:00 2001 From: kckckc Date: Thu, 11 Nov 2021 14:11:24 -0800 Subject: [PATCH 11/65] Remove duplicate slowed text from ice spear --- src/server/config/spells/spellIceSpear.js | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/server/config/spells/spellIceSpear.js b/src/server/config/spells/spellIceSpear.js index 0d80f9e6..e54dd0e0 100644 --- a/src/server/config/spells/spellIceSpear.js +++ b/src/server/config/spells/spellIceSpear.js @@ -54,19 +54,11 @@ module.exports = { if (this.obj.destroyed) return; - let targetEffect = target.effects.addEffect({ + target.effects.addEffect({ type: 'slowed', ttl: this.freezeDuration }); - if (targetEffect) { - this.obj.instance.syncer.queue('onGetDamage', { - id: target.id, - event: true, - text: 'slowed' - }, -1); - } - let damage = this.getDamage(target); target.stats.takeDamage(damage, this.threatMult, this.obj); } From 6795f367fd15d9b1b5bea42a81be9ddaf596e83c Mon Sep 17 00:00:00 2001 From: kckckc Date: Thu, 11 Nov 2021 14:28:09 -0800 Subject: [PATCH 12/65] Destroy and remove effect before removing from array --- src/server/components/effects.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/server/components/effects.js b/src/server/components/effects.js index 1b12c844..9729d9e2 100644 --- a/src/server/components/effects.js +++ b/src/server/components/effects.js @@ -313,13 +313,13 @@ module.exports = { e.update(); if (e.destroyed) { - effects.splice(i, 1); - eLen--; - i--; - this.destroyEffect(e); this.syncRemove(e.id); + + effects.splice(i, 1); + eLen--; + i--; } } From b43f208d0e9832b47dff512f9cbe8ad50b60d0c8 Mon Sep 17 00:00:00 2001 From: kckckc Date: Thu, 11 Nov 2021 17:01:50 -0800 Subject: [PATCH 13/65] Create damage texts from client-side effects --- src/server/clientComponents/effects.js | 29 +++++++++++++++----- src/server/clientComponents/effects/auras.js | 4 +++ src/server/components/effects.js | 12 -------- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/server/clientComponents/effects.js b/src/server/clientComponents/effects.js index 7b547667..d9e58b4c 100644 --- a/src/server/clientComponents/effects.js +++ b/src/server/clientComponents/effects.js @@ -1,17 +1,31 @@ define([ - + 'js/rendering/numbers' ], function ( - + numbers ) { + const effectBase = { + init: function () { + this.defaultDamageText(false); + }, + + destroy: function () { + this.defaultDamageText(true); + }, + + defaultDamageText: function (removing) { + numbers.onGetDamage({ + id: this.obj.id, + event: true, + text: (removing ? '-' : '+') + this.type + }); + } + }; + return { type: 'effects', effects: [], - effectBase: { - - }, - templates: { }, @@ -29,8 +43,9 @@ define([ let template = this.templates[data.type] || {}; - let effect = $.extend(true, {}, this.effectBase, template, data); + let effect = $.extend(true, {}, effectBase, template, data); + effect.self = !!this.obj.self; effect.obj = this.obj; if (effect.init) diff --git a/src/server/clientComponents/effects/auras.js b/src/server/clientComponents/effects/auras.js index 93f72a5c..137c43e0 100644 --- a/src/server/clientComponents/effects/auras.js +++ b/src/server/clientComponents/effects/auras.js @@ -39,6 +39,8 @@ define([ h: scale * 3, cell: cell }); + + this.defaultDamageText(); }, getAlpha: function () { @@ -93,6 +95,8 @@ define([ layerName: 'effects', sprite: this.sprite }); + + this.defaultDamageText(true); }, setVisible: function (visible) { diff --git a/src/server/components/effects.js b/src/server/components/effects.js index 9729d9e2..2fbc06e2 100644 --- a/src/server/components/effects.js +++ b/src/server/components/effects.js @@ -195,12 +195,6 @@ module.exports = { id: builtEffect.id }, [this.obj.serverId]); - this.obj.instance.syncer.queue('onGetDamage', { - id: this.obj.id, - event: true, - text: '+' + options.type - }, -1); - this.obj.syncer.setArray(false, 'effects', 'addEffects', builtEffect.simplify()); } @@ -238,12 +232,6 @@ module.exports = { id: id }, [this.obj.serverId]); - this.obj.instance.syncer.queue('onGetDamage', { - id: this.obj.id, - event: true, - text: '-' + type - }, -1); - this.obj.syncer.setArray(false, 'effects', 'removeEffects', id); }, From b7d7bbd1dba202079270ff0dd4fe43b31a0241c3 Mon Sep 17 00:00:00 2001 From: kckckc Date: Fri, 12 Nov 2021 01:09:36 -0800 Subject: [PATCH 14/65] Rename buffs ui to effects and manage effect icons client-side --- src/client/ui/templates/buffs/buffs.js | 59 ------------------- src/client/ui/templates/buffs/styles.css | 1 - src/client/ui/templates/buffs/template.html | 1 - src/client/ui/templates/effects/effects.js | 54 +++++++++++++++++ src/client/ui/templates/effects/styles.css | 1 + .../templates/{buffs => effects}/styles.less | 4 +- src/client/ui/templates/effects/template.html | 1 + .../templateEffect.html} | 2 +- src/server/clientComponents/effects.js | 19 ++++++ src/server/clientComponents/effects/auras.js | 29 ++++++++- src/server/components/effects.js | 12 +--- src/server/config/clientConfig.js | 2 +- src/server/config/effects/effectTemplate.js | 1 + 13 files changed, 107 insertions(+), 79 deletions(-) delete mode 100644 src/client/ui/templates/buffs/buffs.js delete mode 100644 src/client/ui/templates/buffs/styles.css delete mode 100644 src/client/ui/templates/buffs/template.html create mode 100644 src/client/ui/templates/effects/effects.js create mode 100644 src/client/ui/templates/effects/styles.css rename src/client/ui/templates/{buffs => effects}/styles.less (91%) create mode 100644 src/client/ui/templates/effects/template.html rename src/client/ui/templates/{buffs/templateBuff.html => effects/templateEffect.html} (56%) diff --git a/src/client/ui/templates/buffs/buffs.js b/src/client/ui/templates/buffs/buffs.js deleted file mode 100644 index 73340c51..00000000 --- a/src/client/ui/templates/buffs/buffs.js +++ /dev/null @@ -1,59 +0,0 @@ -define([ - 'js/system/events', - 'html!ui/templates/buffs/template', - 'css!ui/templates/buffs/styles', - 'html!ui/templates/buffs/templateBuff' -], function ( - events, - template, - styles, - templateBuff -) { - let icons = { - stunned: [4, 0], - regenHp: [3, 1], - regenMana: [4, 1], - swiftness: [5, 1], - stealth: [7, 0], - reflectDamage: [2, 1], - holyVengeance: [4, 0] - }; - - return { - tpl: template, - - icons: {}, - - postRender: function () { - this.onEvent('onGetBuff', this.onGetBuff.bind(this)); - this.onEvent('onRemoveBuff', this.onRemoveBuff.bind(this)); - }, - - onGetBuff: function (buff) { - let icon = icons[buff.type]; - if (!icon) - return; - - let imgX = icon[0] * -32; - let imgY = icon[1] * -32; - - let html = templateBuff; - let el = $(html).appendTo(this.el) - .find('.inner') - .css({ - background: 'url(../../../images/statusIcons.png) ' + imgX + 'px ' + imgY + 'px' - }); - - this.icons[buff.id] = el.parent(); - }, - - onRemoveBuff: function (buff) { - let el = this.icons[buff.id]; - if (!el) - return; - - el.remove(); - delete this.icons[buff.id]; - } - }; -}); diff --git a/src/client/ui/templates/buffs/styles.css b/src/client/ui/templates/buffs/styles.css deleted file mode 100644 index 00ca7319..00000000 --- a/src/client/ui/templates/buffs/styles.css +++ /dev/null @@ -1 +0,0 @@ -.uiBuffs{position:absolute;left:16px;top:104px}.uiBuffs .icon{width:40px;height:40px;padding:4px;background-color:rgba(49,33,54,.75);margin-right:16px;float:left}.uiBuffs .icon .inner{width:32px;height:32px;background:url(../../../images/statusIcons.png) 0 0}.mobile .uiBuffs{left:316px;top:10px} \ No newline at end of file diff --git a/src/client/ui/templates/buffs/template.html b/src/client/ui/templates/buffs/template.html deleted file mode 100644 index 6201230f..00000000 --- a/src/client/ui/templates/buffs/template.html +++ /dev/null @@ -1 +0,0 @@ -
\ No newline at end of file diff --git a/src/client/ui/templates/effects/effects.js b/src/client/ui/templates/effects/effects.js new file mode 100644 index 00000000..593446a1 --- /dev/null +++ b/src/client/ui/templates/effects/effects.js @@ -0,0 +1,54 @@ +define([ + 'html!ui/templates/effects/template', + 'css!ui/templates/effects/styles', + 'html!ui/templates/effects/templateEffect' +], function ( + template, + styles, + templateEffect +) { + return { + tpl: template, + + icons: {}, + + postRender: function () { + this.onEvent('onGetEffectIcon', this.onGetEffectIcon.bind(this)); + this.onEvent('onRemoveEffectIcon', this.onRemoveEffectIcon.bind(this)); + }, + + buildIcon: function (config) { + let { icon, url } = config; + + if (!url) + url = '../../../images/statusIcons.png'; + + let imgX = icon[0] * -32; + let imgY = icon[1] * -32; + + let html = templateEffect; + let el = $(html).appendTo(this.el) + .find('.inner') + .css({ + background: `url(${url}) ${imgX}px ${imgY}px` + }); + + return el.parent(); + }, + + onGetEffectIcon: function (config) { + let el = this.buildIcon(config); + + this.icons[config.id] = el; + }, + + onRemoveEffectIcon: function (config) { + let el = this.icons[config.id]; + if (!el) + return; + + el.remove(); + delete this.icons[config.id]; + } + }; +}); diff --git a/src/client/ui/templates/effects/styles.css b/src/client/ui/templates/effects/styles.css new file mode 100644 index 00000000..507b50d1 --- /dev/null +++ b/src/client/ui/templates/effects/styles.css @@ -0,0 +1 @@ +.uiEffects{position:absolute;left:16px;top:104px}.uiEffects .icon{width:40px;height:40px;padding:4px;background-color:rgba(49,33,54,.75);margin-right:16px;float:left}.uiEffects .icon .inner{width:32px;height:32px;background:url(../../../images/statusIcons.png) 0 0}.mobile .uiEffects{left:316px;top:10px} \ No newline at end of file diff --git a/src/client/ui/templates/buffs/styles.less b/src/client/ui/templates/effects/styles.less similarity index 91% rename from src/client/ui/templates/buffs/styles.less rename to src/client/ui/templates/effects/styles.less index 3ec1066f..104844d5 100644 --- a/src/client/ui/templates/buffs/styles.less +++ b/src/client/ui/templates/effects/styles.less @@ -1,6 +1,6 @@ @import "../../../css/colors.less"; -.uiBuffs { +.uiEffects { position: absolute; left: 16px; top: 104px; @@ -23,7 +23,7 @@ } -.mobile .uiBuffs { +.mobile .uiEffects { left: 316px; top: 10px; } diff --git a/src/client/ui/templates/effects/template.html b/src/client/ui/templates/effects/template.html new file mode 100644 index 00000000..886b4c6c --- /dev/null +++ b/src/client/ui/templates/effects/template.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/src/client/ui/templates/buffs/templateBuff.html b/src/client/ui/templates/effects/templateEffect.html similarity index 56% rename from src/client/ui/templates/buffs/templateBuff.html rename to src/client/ui/templates/effects/templateEffect.html index 1fcd0b63..836047bf 100644 --- a/src/client/ui/templates/buffs/templateBuff.html +++ b/src/client/ui/templates/effects/templateEffect.html @@ -1,3 +1,3 @@ -
+
diff --git a/src/server/clientComponents/effects.js b/src/server/clientComponents/effects.js index d9e58b4c..9a25ec60 100644 --- a/src/server/clientComponents/effects.js +++ b/src/server/clientComponents/effects.js @@ -1,15 +1,34 @@ define([ + 'js/system/events', 'js/rendering/numbers' ], function ( + events, numbers ) { + const defaultBuffIcons = { + stunned: [4, 0] + }; + const effectBase = { init: function () { this.defaultDamageText(false); + + if (this.self && defaultBuffIcons[this.type]) { + events.emit('onGetEffectIcon', { + id: this.id, + icon: defaultBuffIcons[this.type] + }); + } }, destroy: function () { this.defaultDamageText(true); + + if (this.self && defaultBuffIcons[this.type]) { + events.emit('onRemoveEffectIcon', { + id: this.id + }); + } }, defaultDamageText: function (removing) { diff --git a/src/server/clientComponents/effects/auras.js b/src/server/clientComponents/effects/auras.js index 137c43e0..f09ba3b8 100644 --- a/src/server/clientComponents/effects/auras.js +++ b/src/server/clientComponents/effects/auras.js @@ -1,9 +1,11 @@ define([ - 'js/rendering/renderer' + 'js/rendering/renderer', + 'js/system/events' ], function ( - renderer + renderer, + events ) { - let auras = { + const auras = { reflectDamage: 0, stealth: 1, regenHp: 9, @@ -12,6 +14,14 @@ define([ holyVengeance: 8, rare: 16 }; + const buffIcons = { + regenHp: [3, 1], + regenMana: [4, 1], + swiftness: [5, 1], + stealth: [7, 0], + reflectDamage: [2, 1], + holyVengeance: [4, 0] + }; let templates = {}; @@ -41,6 +51,13 @@ define([ }); this.defaultDamageText(); + + if (this.self && buffIcons[type]) { + events.emit('onGetEffectIcon', { + id: this.id, + icon: buffIcons[type] + }); + } }, getAlpha: function () { @@ -97,6 +114,12 @@ define([ }); this.defaultDamageText(true); + + if (this.self && buffIcons[type]) { + events.emit('onRemoveEffectIcon', { + id: this.id + }); + } }, setVisible: function (visible) { diff --git a/src/server/components/effects.js b/src/server/components/effects.js index 2fbc06e2..bca7b005 100644 --- a/src/server/components/effects.js +++ b/src/server/components/effects.js @@ -189,14 +189,8 @@ module.exports = { this.effects.push(builtEffect); - if (!options.silent) { - this.obj.instance.syncer.queue('onGetBuff', { - type: options.type, - id: builtEffect.id - }, [this.obj.serverId]); - + if (!options.silent) this.obj.syncer.setArray(false, 'effects', 'addEffects', builtEffect.simplify()); - } this.obj.instance.eventEmitter.emit('onAddEffect', this.obj, builtEffect); @@ -228,10 +222,6 @@ module.exports = { if (effect.silent) return; - this.obj.instance.syncer.queue('onRemoveBuff', { - id: id - }, [this.obj.serverId]); - this.obj.syncer.setArray(false, 'effects', 'removeEffects', id); }, diff --git a/src/server/config/clientConfig.js b/src/server/config/clientConfig.js index 3dacbd5a..75020f0d 100644 --- a/src/server/config/clientConfig.js +++ b/src/server/config/clientConfig.js @@ -173,7 +173,7 @@ const config = { 'party', 'help', 'dialogue', - 'buffs', + 'effects', 'tooltips', 'tooltipInfo', 'tooltipItem', diff --git a/src/server/config/effects/effectTemplate.js b/src/server/config/effects/effectTemplate.js index 760e885e..166759ef 100644 --- a/src/server/config/effects/effectTemplate.js +++ b/src/server/config/effects/effectTemplate.js @@ -31,6 +31,7 @@ module.exports = { simplify: function () { return { + id: this.id, type: this.type }; } From 17607d14f0bc9debb31d802e940571b606ae8cea Mon Sep 17 00:00:00 2001 From: kckckc Date: Fri, 12 Nov 2021 17:12:13 -0800 Subject: [PATCH 15/65] Implement shouldStack/incrementStack handling --- src/server/components/effects.js | 45 +++++++++++++++++++------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/src/server/components/effects.js b/src/server/components/effects.js index bca7b005..fd7d9f84 100644 --- a/src/server/components/effects.js +++ b/src/server/components/effects.js @@ -137,39 +137,42 @@ module.exports = { }, addEffect: function (options, source) { + //Skip 0-duration effects if ((options.has('ttl')) && (options.ttl === 0)) return; options.caster = options.caster || source; + //"X of Y in Z" cc resist check if (!options.force && !this.canApplyEffect(options.type)) return; - // TODO: separate "stack ttl" flag/method - /* - if (!options.new) { - let exists = this.effects.find(e => e.type === options.type); - if (exists) { - exists.ttl += options.ttl; + //TODO: new stats that mitigate CC duration - for (let p in options) { - if (p === 'ttl') - continue; - - exists[p] = options[p]; - } + let oldEffect = this.effects.find(e => e.type === options.type); - return exists; - } + //If there is no existing effect or the effect is not stackable, make a new effect + if (!oldEffect || !oldEffect.shouldStack) + return this.buildEffect(options); + + //If the effect is stackable and the new effect should stack, stack with the old effect + let shouldStack = oldEffect.shouldStack(options); + if (shouldStack && oldEffect.incrementStack) { + oldEffect.incrementStack(options); + return oldEffect; } - */ + //Otherwise make a new effect + return this.buildEffect(options); + }, + + getTypeTemplate: function (type) { let typeTemplate = null; - if (options.type) { - let type = options.type[0].toUpperCase() + options.type.substr(1); + if (type) { + let capitalizedType = type[0].toUpperCase() + type.substr(1); let result = { type: type, - url: 'config/effects/effect' + type + '.js' + url: 'config/effects/effect' + capitalizedType + '.js' }; this.obj.instance.eventEmitter.emit('onBeforeGetEffect', result); @@ -177,6 +180,12 @@ module.exports = { } let builtEffect = extend({}, effectTemplate, typeTemplate); + return builtEffect; + }, + + buildEffect: function (options) { + let builtEffect = this.getTypeTemplate(options.type); + for (let p in options) builtEffect[p] = options[p]; From 66f3daf87b63346843b40568e4987f5a4e15125c Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 13 Nov 2021 10:31:48 +0200 Subject: [PATCH 16/65] feat #1866: Rebuilt rezone logic to use handshakes --- src/server/.eslintrc | 4 +- src/server/clientComponents/gatherer.js | 8 -- src/server/clientComponents/pather.js | 8 +- src/server/clientComponents/player.js | 4 +- src/server/components/player.js | 2 +- src/server/components/portal/sendObjToZone.js | 94 +++++++++++++++---- src/server/objects/objects.js | 15 ++- src/server/security/routerConfig.js | 4 +- src/server/world/atlas.js | 4 +- src/server/world/instancer.js | 28 ++++-- src/server/world/instancer/handshakes.js | 49 ++++++++++ src/server/world/rezoneManager.js | 55 +++++++++++ src/server/world/syncer.js | 26 +++++ src/server/world/worker.js | 3 + 14 files changed, 255 insertions(+), 49 deletions(-) create mode 100644 src/server/world/instancer/handshakes.js create mode 100644 src/server/world/rezoneManager.js diff --git a/src/server/.eslintrc b/src/server/.eslintrc index cf00716e..5165c488 100644 --- a/src/server/.eslintrc +++ b/src/server/.eslintrc @@ -58,7 +58,9 @@ "leaderboard": false, "clientConfig": false, "random": false, - "consts": false + "consts": false, + "rezoneManager": false, + "eventManager": false }, "rules": { diff --git a/src/server/clientComponents/gatherer.js b/src/server/clientComponents/gatherer.js index 0f3a81f1..8df1a5cb 100644 --- a/src/server/clientComponents/gatherer.js +++ b/src/server/clientComponents/gatherer.js @@ -13,7 +13,6 @@ define([ init: function () { this.obj.on('onKeyDown', this.onKeyDown.bind(this)); - this.hookEvent('onRezone', this.onRezone.bind(this)); }, extend: function (msg) { @@ -53,13 +52,6 @@ define([ } }, - onRezone: function () { - this.extend({ - progress: 100, - action: 'Fishing' - }); - }, - onKeyDown: function (key) { if (key !== 'g') return; diff --git a/src/server/clientComponents/pather.js b/src/server/clientComponents/pather.js index 4b48c58d..48fe5414 100644 --- a/src/server/clientComponents/pather.js +++ b/src/server/clientComponents/pather.js @@ -27,9 +27,9 @@ define([ lastY: 0, init: function () { - events.on('onRespawn', this.onDeath.bind(this)); - events.on('onDeath', this.onDeath.bind(this)); - events.on('onClearQueue', this.onDeath.bind(this)); + events.on('teleportToPosition', this.resetPath.bind(this)); + events.on('onDeath', this.resetPath.bind(this)); + events.on('onClearQueue', this.resetPath.bind(this)); this.pathPos.x = round(this.obj.x); this.pathPos.y = round(this.obj.y); @@ -46,7 +46,7 @@ define([ this.path = []; }, - onDeath: function () { + resetPath: function () { this.clearPath(); this.pathPos.x = round(this.obj.x); diff --git a/src/server/clientComponents/player.js b/src/server/clientComponents/player.js index d65aa0e2..36d576f2 100644 --- a/src/server/clientComponents/player.js +++ b/src/server/clientComponents/player.js @@ -29,7 +29,7 @@ define([ obj.addComponent('serverActions'); obj.addComponent('pather'); - this.hookEvent('onRespawn', this.onRespawn.bind(this)); + this.hookEvent('teleportToPosition', this.teleportToPosition.bind(this)); events.emit('onGetPortrait', obj.portrait); }, @@ -74,7 +74,7 @@ define([ }, instant); }, - onRespawn: function ({ x, y }) { + teleportToPosition: function ({ x, y }) { this.positionCamera(x, y, true); sound.update(x, y); }, diff --git a/src/server/components/player.js b/src/server/components/player.js index 4af46950..3caa4373 100644 --- a/src/server/components/player.js +++ b/src/server/components/player.js @@ -235,7 +235,7 @@ module.exports = { obj.instance.physics.addObject(obj, obj.x, obj.y); - obj.instance.syncer.queue('onRespawn', { + obj.instance.syncer.queue('teleportToPosition', { x: obj.x, y: obj.y }, [obj.serverId]); diff --git a/src/server/components/portal/sendObjToZone.js b/src/server/components/portal/sendObjToZone.js index a2b4c4dd..cb0a3bf7 100644 --- a/src/server/components/portal/sendObjToZone.js +++ b/src/server/components/portal/sendObjToZone.js @@ -1,9 +1,54 @@ -const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos }) => { - const { serverId, instance: { physics, syncer: globalSyncer } } = obj; +/* + atlas.onMessage.event / events -> only send if source zone = obj zoneName + + SERVER SIDE + 1. Change zone and position + 2. Save + 3. Syncer: Destroy, Flush and Notify other objects of destroyed obj + 4. Log IN CASE (if new events are queued) + 5. Stage rezone + 6. Tell client rezone is happening + + CLIENT SIDE + events.emit('rezoneStart'); + + events.emit('destroyAllObjects'); + events.emit('resetRenderer'); + events.emit('resetPhysics'); + events.emit('clearUis'); + + client.request({ + threadModule: 'rezoneManager', + method: 'clientAck', + data: {} + }); - globalSyncer.flushForTarget(serverId); + SERVER SIDE + 7. Server receives ack + 8. Map thread tells main thread about rezone + 9. Main thread does rezone + 10. New map thread registers handshake for map send + 11. New map thread sends new map + + CLIENT SIDE + events.emit('onGetMap', msg); + + client.request({ + threadModule: 'instancer', + method: 'clientAck', + data: {} + }); + + SERVER SIDE + 12. Add object to zone +*/ + +const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos }) => { + const { serverId, instance: { syncer: globalSyncer, physics } } = obj; if (obj.zoneName === zoneName) { + globalSyncer.flushForTarget(serverId); + physics.removeObject(obj, obj.x, obj.y); if (toRelativePos) { @@ -18,7 +63,7 @@ const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos physics.addObject(obj, obj.x, obj.y); - globalSyncer.queue('onRespawn', { + globalSyncer.queue('teleportToPosition', { x: obj.x, y: obj.y }, [obj.serverId]); @@ -26,28 +71,39 @@ const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos return; } - obj.fireEvent('beforeRezone'); - - obj.destroyed = true; + //We set this before saving so that objects aren't saved ON portals + obj.zoneName = zoneName; + if (toPos) { + obj.x = toPos.x; + obj.y = toPos.y; + } else if (toRelativePos) { + obj.x = invokingObj.obj.x + toRelativePos.x; + obj.y = invokingObj.obj.y + toRelativePos.y; + } await obj.auth.doSave(); - const simpleObj = obj.getSimple(true, false, true); + //Destroy, flush events and notify other objects + globalSyncer.processDestroyedObject(obj); - if (toPos) { - simpleObj.x = toPos.x; - simpleObj.y = toPos.y; - } else if (toRelativePos) { - simpleObj.x = invokingObj.obj.x + toRelativePos.x; - simpleObj.y = invokingObj.obj.y + toRelativePos.y; + //Test code, remove later + const queued = Object.values(globalSyncer.buffer).filter(b => b.to.includes(serverId)); + if (queued.length) { + /* eslint-disable-next-line */ + console.log('Found', queued.length, 'events for rezoning object'); } + const simpleObj = obj.getSimple(true, false, true); + + rezoneManager.stageRezone(simpleObj, zoneName); + process.send({ - method: 'rezone', - id: obj.serverId, - args: { - obj: simpleObj, - newZone: zoneName + method: 'events', + data: { + rezoneStart: [{ + obj: { msg: {} }, + to: [serverId] + }] } }); }; diff --git a/src/server/objects/objects.js b/src/server/objects/objects.js index 9f9a4374..acd2bca3 100644 --- a/src/server/objects/objects.js +++ b/src/server/objects/objects.js @@ -203,7 +203,7 @@ module.exports = { return newO; }, - sendEvent: function (msg) { + sendEvent: function (msg, sourceThread) { let player = this.objects.find(p => p.id === msg.id); if (!player) return; @@ -213,7 +213,7 @@ module.exports = { data: msg.data.data }); }, - sendEvents: function (msg) { + sendEvents: function (msg, sourceThread) { let players = {}; let objects = this.objects; @@ -239,13 +239,22 @@ module.exports = { if (!findPlayer) continue; else { + //If the message came from a map the player is no longer in, ignore + if (findPlayer.zoneName !== sourceThread.name) + continue; + player = (players[toId] = { socket: findPlayer.socket, - events: {} + events: {}, + obj: findPlayer }); } } + //If the message came from a map the player is no longer in, ignore + if (player.obj.zoneName !== sourceThread.name) + continue; + let eventList = player.events[e] || (player.events[e] = []); eventList.push(obj); } diff --git a/src/server/security/routerConfig.js b/src/server/security/routerConfig.js index 5038f287..f0f0fa86 100644 --- a/src/server/security/routerConfig.js +++ b/src/server/security/routerConfig.js @@ -24,7 +24,9 @@ const routerConfig = { globalAllowed: { clientConfig: ['getClientConfig'], leaderboard: ['requestList'], - cons: ['unzone'] + cons: ['unzone'], + rezoneManager: ['clientAck'], + instancer: ['clientAck'] }, allowTargetId: { door: ['lock', 'unlock'], diff --git a/src/server/world/atlas.js b/src/server/world/atlas.js index 6305d32f..8d06d6df 100644 --- a/src/server/world/atlas.js +++ b/src/server/world/atlas.js @@ -174,11 +174,11 @@ module.exports = { }, event: function (thread, message) { - objects.sendEvent(message); + objects.sendEvent(message, thread); }, events: function (thread, message) { - objects.sendEvents(message); + objects.sendEvents(message, thread); }, object: function (thread, message) { diff --git a/src/server/world/instancer.js b/src/server/world/instancer.js index 90255486..742f160b 100644 --- a/src/server/world/instancer.js +++ b/src/server/world/instancer.js @@ -13,6 +13,9 @@ let eventEmitter = require('../misc/events'); const mods = require('../misc/mods'); const transactions = require('../security/transactions'); +//Own helpers +const { stageZoneIn, unstageZoneIn, clientAck } = require('./instancer/handshakes'); + module.exports = { instances: [], zoneId: -1, @@ -65,6 +68,9 @@ module.exports = { [resourceSpawner, syncer, objects, questBuilder, events].forEach(i => i.init(fakeInstance)); this.tick(); + + this.clientAck = clientAck; + eventEmitter.on('removeObject', unstageZoneIn); }, startRegen: function (respawnMap, respawnPos) { @@ -211,15 +217,17 @@ module.exports = { obj.spawn = map.spawn; - syncer.queue('onGetMap', map.clientMap, [obj.serverId]); + stageZoneIn(msg); - if (!msg.transfer) - objects.addObject(obj, this.onAddObject.bind(this)); - else { - let o = objects.transferObject(obj); - questBuilder.obtain(o); - eventEmitter.emit('onAfterPlayerEnterZone', o); - } + process.send({ + method: 'events', + data: { + getMap: [{ + obj: map.clientMap, + to: [obj.serverId] + }] + } + }); }, onAddObject: function (obj) { @@ -302,6 +310,10 @@ module.exports = { return; } + //We fire this event because even though an object might be destroyed already, + // mods and modules might have staged events/actions we need to clear + eventEmitter.emit('removeObject', { obj: msg.obj }); + let obj = msg.obj; obj = objects.find(o => o.serverId === obj.id); if (!obj) { diff --git a/src/server/world/instancer/handshakes.js b/src/server/world/instancer/handshakes.js new file mode 100644 index 00000000..c082f502 --- /dev/null +++ b/src/server/world/instancer/handshakes.js @@ -0,0 +1,49 @@ +//Local State +const stagedZoneIns = []; + +//Methods + +//Fired when an object is removed through a socket dc +// We do this because a client might DC during rezone handshake +const unstageZoneIn = msg => { + stagedZoneIns.spliceWhere(s => s.obj.serverId === msg.obj.id); +}; + +const stageZoneIn = msg => { + const { serverId } = msg.obj; + + stagedZoneIns.spliceWhere(o => o.obj.serverId === serverId); + + stagedZoneIns.push(msg); +}; + +const doZoneIn = function (staged) { + const { onAddObject, instances: [ { objects, questBuilder, eventEmitter } ] } = instancer; + + const { transfer, obj } = staged; + + if (!transfer) + objects.addObject(obj, onAddObject.bind(instancer)); + else { + let o = objects.transferObject(obj); + questBuilder.obtain(o); + eventEmitter.emit('onAfterPlayerEnterZone', o); + } +}; + +const clientAck = msg => { + const staged = stagedZoneIns.find(s => s.obj.serverId === msg.sourceId); + if (!staged) + return; + + stagedZoneIns.spliceWhere(s => s === staged); + + doZoneIn(staged); +}; + +//Exports +module.exports = { + unstageZoneIn, + stageZoneIn, + clientAck +}; diff --git a/src/server/world/rezoneManager.js b/src/server/world/rezoneManager.js new file mode 100644 index 00000000..08bf8a97 --- /dev/null +++ b/src/server/world/rezoneManager.js @@ -0,0 +1,55 @@ +//Imports +const eventEmitter = require('../misc/events'); + +//Local State +const stagedRezones = []; + +//Methods + +//Fired when an object is removed through a socket dc +// We do this because a client might DC during rezone handshake +const unstageRezone = msg => { + stagedRezones.spliceWhere(s => s.simplifiedObj.serverId === msg.obj.id); +}; + +const stageRezone = (simplifiedObj, targetZone) => { + const { serverId } = simplifiedObj; + + stagedRezones.spliceWhere(o => o.simplifiedObj.serverId === serverId); + + stagedRezones.push({ simplifiedObj, targetZone }); +}; + +const doRezone = stagedRezone => { + const { simplifiedObj, targetZone } = stagedRezone; + + process.send({ + method: 'rezone', + id: simplifiedObj.serverId, + args: { + obj: simplifiedObj, + newZone: targetZone + } + }); +}; + +const clientAck = msg => { + const staged = stagedRezones.find(s => s.simplifiedObj.serverId === msg.sourceId); + if (!staged) + return; + + stagedRezones.spliceWhere(s => s === staged); + + doRezone(staged); +}; + +const init = () => { + eventEmitter.on('removeObject', unstageRezone); +}; + +//Exports +module.exports = { + init, + stageRezone, + clientAck +}; diff --git a/src/server/world/syncer.js b/src/server/world/syncer.js index 4b1affde..d89e780c 100644 --- a/src/server/world/syncer.js +++ b/src/server/world/syncer.js @@ -180,12 +180,38 @@ module.exports = { } }, + processDestroyedObject: function (obj) { + const { objects, queue } = this; + const { id, serverId } = obj; + + obj.destroyed = true; + this.flushForTarget(serverId); + + const msg = { + id: id, + destroyed: true + }; + + objects.removeObject(obj); + + const fnQueueMsg = queue.bind(this, 'onGetObject'); + + //Find any players that have seen this obj + objects + .filter(o => !o.destroyed && o?.player?.hasSeen(id)) + .forEach(o => { + fnQueueMsg(msg); + }); + }, + send: function () { if (!this.dirty) return; this.dirty = false; + console.log(Object.keys(this.buffer)); + process.send({ method: 'events', data: this.buffer diff --git a/src/server/world/worker.js b/src/server/world/worker.js index 456782e0..f3ab787d 100644 --- a/src/server/world/worker.js +++ b/src/server/world/worker.js @@ -5,6 +5,7 @@ global.consts = require('../config/consts'); global.instancer = require('./instancer'); global.eventManager = require('../events/events'); global.clientConfig = require('../config/clientConfig'); +global.rezoneManager = require('./rezoneManager'); const components = require('../components/components'); const mods = require('../misc/mods'); @@ -33,6 +34,8 @@ let onCpnsReady = async function () { recipes.init(); itemEffects.init(); profanities.init(); + rezoneManager.init(); + await clientConfig.init(); process.send({ From 2ea3a4528798e60ef16aa0192260fef9608399ad Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 13 Nov 2021 15:28:58 +0200 Subject: [PATCH 17/65] feat #1866: Added missing files and cleaned up code slightly --- src/client/js/misc/physics.js | 15 ++- src/client/js/objects/objBase.js | 2 +- src/client/js/objects/objects.js | 30 +++-- .../js/rendering/helpers/resetRenderer.js | 45 ++++++++ src/client/js/rendering/renderer.js | 7 +- src/client/js/system/client.js | 106 +++++++++++++---- src/client/ui/templates/death/death.js | 4 +- src/client/ui/templates/events/events.js | 4 +- src/client/ui/templates/mainMenu/mainMenu.js | 6 +- src/client/ui/templates/quests/quests.js | 4 +- src/client/ui/templates/talk/talk.js | 6 +- src/server/components/portal/sendObjToZone.js | 45 -------- src/server/components/social/rezone.js | 3 + src/server/config/serverConfig.js | 2 +- src/server/objects/objects.js | 107 ++++++++++-------- src/server/world/spawners.js | 1 - src/server/world/syncer.js | 2 - 17 files changed, 232 insertions(+), 157 deletions(-) create mode 100644 src/client/js/rendering/helpers/resetRenderer.js diff --git a/src/client/js/misc/physics.js b/src/client/js/misc/physics.js index 3a24bd17..f3b49199 100644 --- a/src/client/js/misc/physics.js +++ b/src/client/js/misc/physics.js @@ -1,7 +1,9 @@ define([ - 'js/misc/distanceToPolygon' + 'js/misc/distanceToPolygon', + 'js/system/events' ], function ( - distanceToPolygon + distanceToPolygon, + events ) { return { grid: null, @@ -10,6 +12,8 @@ define([ height: 0, init: function (collisionMap) { + events.on('resetPhysics', this.reset.bind(this)); + this.width = collisionMap.length; this.height = collisionMap[0].length; @@ -22,6 +26,13 @@ define([ } }, + reset: function () { + this.width = 0; + this.height = 0; + + this.grid = []; + }, + isTileBlocking: function (x, y, mob, obj) { if ((x < 0) || (y < 0) || (x >= this.width) | (y >= this.height)) return true; diff --git a/src/client/js/objects/objBase.js b/src/client/js/objects/objBase.js index e66f480b..92eda0a3 100644 --- a/src/client/js/objects/objBase.js +++ b/src/client/js/objects/objBase.js @@ -174,7 +174,7 @@ define([ offEvents: function () { if (this.pather) - this.pather.onDeath(); + this.pather.clearPath(); for (let e in this.eventCallbacks) this.eventCallbacks[e].forEach(c => events.off(e, c)); diff --git a/src/client/js/objects/objects.js b/src/client/js/objects/objects.js index fdc98bcd..33ffbbd2 100644 --- a/src/client/js/objects/objects.js +++ b/src/client/js/objects/objects.js @@ -15,11 +15,15 @@ define([ objects: [], init: function () { - events.on('onGetObject', this.onGetObject.bind(this)); - events.on('onRezone', this.onRezone.bind(this)); events.on('onChangeHoverTile', this.getLocation.bind(this)); - events.on('onTilesVisible', this.onTilesVisible.bind(this)); - events.on('onToggleNameplates', this.onToggleNameplates.bind(this)); + + [ + 'onGetObject', + 'onTilesVisible', + 'onToggleNameplates', + 'destroyAllObjects' + ] + .forEach(e => events.on(e, this[e].bind(this))); }, getLocation: function (x, y) { @@ -87,20 +91,14 @@ define([ return list[fromIndex]; }, - onRezone: function (oldZone) { - let objects = this.objects; - let oLen = objects.length; - for (let i = 0; i < oLen; i++) { - let o = objects[i]; + destroyAllObjects: function () { + this.objects.forEach(o => { + o.destroy(); + }); - if (oldZone === null) - o.destroy(); - else if (o.zoneId === oldZone) - o.destroy(); - } + this.objects.length = 0; - if (window.player) - window.player.offEvents(); + window?.player?.offEvents(); }, onGetObject: function (obj) { diff --git a/src/client/js/rendering/helpers/resetRenderer.js b/src/client/js/rendering/helpers/resetRenderer.js new file mode 100644 index 00000000..99fc8209 --- /dev/null +++ b/src/client/js/rendering/helpers/resetRenderer.js @@ -0,0 +1,45 @@ +define([ + 'js/rendering/spritePool' +], function ( + spritePool +) { + return function () { + let map = this.map; + let w = this.w = map.length; + let h = this.h = map[0].length; + + this.stage.removeChild(this.layers.hiders); + this.layers.hiders = new PIXI.Container(); + this.layers.hiders.layer = 'hiders'; + this.stage.addChild(this.layers.hiders); + + let container = this.layers.tileSprites; + this.stage.removeChild(container); + + this.layers.tileSprites = container = new PIXI.Container(); + container.layer = 'tiles'; + this.stage.addChild(container); + + this.stage.children.sort((a, b) => { + if (a.layer === 'hiders') + return 1; + else if (b.layer === 'hiders') + return -1; + else if (a.layer === 'tiles') + return -1; + else if (b.layer === 'tiles') + return 1; + return 0; + }); + + spritePool.clean(); + + this.sprites = _.get2dArray(w, h, 'array'); + + this.map = []; + this.w = 0; + this.h = 0; + + delete this.moveTo; + }; +}); diff --git a/src/client/js/rendering/renderer.js b/src/client/js/rendering/renderer.js index c8ef3486..71a567fa 100644 --- a/src/client/js/rendering/renderer.js +++ b/src/client/js/rendering/renderer.js @@ -8,7 +8,8 @@ define([ 'js/rendering/shaders/outline', 'js/rendering/spritePool', 'js/system/globals', - 'js/rendering/renderLoginBackground' + 'js/rendering/renderLoginBackground', + 'js/rendering/helpers/resetRenderer' ], function ( resources, events, @@ -19,7 +20,8 @@ define([ shaderOutline, spritePool, globals, - renderLoginBackground + renderLoginBackground, + resetRenderer ) { const mRandom = Math.random.bind(Math); @@ -84,6 +86,7 @@ define([ events.on('onGetMap', this.onGetMap.bind(this)); events.on('onToggleFullscreen', this.toggleScreen.bind(this)); events.on('onMoveSpeedChange', this.adaptCameraMoveSpeed.bind(this)); + events.on('resetRenderer', resetRenderer.bind(this)); this.width = $('body').width(); this.height = $('body').height(); diff --git a/src/client/js/system/client.js b/src/client/js/system/client.js index 4e92ec57..98b1a030 100644 --- a/src/client/js/system/client.js +++ b/src/client/js/system/client.js @@ -18,7 +18,38 @@ define([ this.socket.on('event', this.onEvent.bind(this)); this.socket.on('events', this.onEvents.bind(this)); this.socket.on('dc', this.onDisconnect.bind(this)); + + Object.entries(this.processAction).forEach(([k, v]) => { + this.processAction[k] = v.bind(this); + }); + }, + + onRezoneStart: function () { + //Fired for mods to listen to + events.emit('rezoneStart'); + + events.emit('destroyAllObjects'); + events.emit('resetRenderer'); + events.emit('resetPhysics'); + events.emit('clearUis'); + + client.request({ + threadModule: 'rezoneManager', + method: 'clientAck', + data: {} + }); + }, + + onGetMap: function ([msg]) { + events.emit('onGetMap', msg); + + client.request({ + threadModule: 'instancer', + method: 'clientAck', + data: {} + }); }, + onConnected: function (onReady) { if (this.doneConnect) this.onDisconnect(); @@ -28,45 +59,72 @@ define([ if (onReady) onReady(); }, + onDisconnect: function () { window.location = window.location; }, + onHandshake: function () { events.emit('onHandshake'); this.socket.emit('handshake'); }, + request: function (msg) { this.socket.emit('request', msg, msg.callback); }, - onEvent: function (response) { - events.emit(response.event, response.data); - }, - onEvents: function (response) { - //If we get objects, self needs to be first - // otherwise we might create the object (setting his position or attack animation) - // before instantiating it - let oList = response.onGetObject; - if (oList) { - let prepend = oList.filter(o => o.self); - oList.spliceWhere(o => prepend.some(p => p === o)); - oList.unshift.apply(oList, prepend); - } - for (let e in response) { - let r = response[e]; + processAction: { + default: function (eventName, msgs) { + msgs.forEach(m => events.emit(eventName, m)); + }, + + rezoneStart: function (eventName, msgs) { + events.emit('rezoneStart'); + + events.emit('destroyAllObjects'); + events.emit('resetRenderer'); + events.emit('resetPhysics'); + events.emit('clearUis'); - //Certain messages expect to be performed last (because the object they act on hasn't been created when they get queued) - r.sort(function (a, b) { - if (a.performLast) - return 1; - else if (b.performLast) - return -1; - return 0; + client.request({ + threadModule: 'rezoneManager', + method: 'clientAck', + data: {} }); + }, - r.forEach(function (o) { - events.emit(e, o); + getMap: function (eventName, msgs) { + events.emit('onGetMap', msgs[0]); + + client.request({ + threadModule: 'instancer', + method: 'clientAck', + data: {} }); + }, + + onGetObject: function (eventName, msgs) { + const prepend = msgs.filter(o => o.self); + msgs.spliceWhere(o => prepend.some(p => p === o)); + msgs.unshift.apply(msgs, prepend); + + this.processAction.default(eventName, msgs); + } + }, + + onEvent: function ({ event: eventName, data: eventData }) { + const handler = this.processAction[eventName] || this.processAction.default; + + handler(eventName, [eventData]); + }, + + onEvents: function (response) { + for (let eventName in response) { + const eventMsgs = response[eventName]; + + const handler = this.processAction[eventName] || this.processAction.default; + + handler(eventName, eventMsgs); } } }; diff --git a/src/client/ui/templates/death/death.js b/src/client/ui/templates/death/death.js index 0d132c46..f2a53b3b 100644 --- a/src/client/ui/templates/death/death.js +++ b/src/client/ui/templates/death/death.js @@ -20,14 +20,14 @@ define([ this.onEvent('onPermadeath', this.onPermadeath.bind(this)); this.find('.btn-logout').on('click', this.onLogout.bind(this)); - this.find('.btn-respawn').on('click', this.onRespawn.bind(this)); + this.find('.btn-respawn').on('click', this.performRespawn.bind(this)); }, onLogout: function () { $('.uiMainMenu').data('ui').charSelect(); }, - onRespawn: function () { + performRespawn: function () { events.emit('onHideOverlay', this.el); this.hide(true); diff --git a/src/client/ui/templates/events/events.js b/src/client/ui/templates/events/events.js index 1a7c8ba2..7aa870c3 100644 --- a/src/client/ui/templates/events/events.js +++ b/src/client/ui/templates/events/events.js @@ -26,7 +26,7 @@ define([ this.find('.btnCollapse').on('click', this.toggleButtons.bind(this)); } - this.onEvent('onRezone', this.onRezone.bind(this)); + this.onEvent('clearUis', this.clear.bind(this)); this.onEvent('onObtainEvent', this.onObtainEvent.bind(this)); this.onEvent('onRemoveEvent', this.onRemoveEvent.bind(this)); @@ -37,7 +37,7 @@ define([ this.onToggleEventsVisibility(config.showEvents); }, - onRezone: function () { + clear: function () { this.list = []; this.el.find('.list').empty(); }, diff --git a/src/client/ui/templates/mainMenu/mainMenu.js b/src/client/ui/templates/mainMenu/mainMenu.js index 5b79e5ad..42051cf4 100644 --- a/src/client/ui/templates/mainMenu/mainMenu.js +++ b/src/client/ui/templates/mainMenu/mainMenu.js @@ -58,8 +58,10 @@ define([ }, onCharSelect: function () { - renderer.clean(); - objects.onRezone(); + events.emit('destroyAllObjects'); + events.emit('resetRenderer'); + events.emit('resetPhysics'); + renderer.buildTitleScreen(); sound.unload(); diff --git a/src/client/ui/templates/quests/quests.js b/src/client/ui/templates/quests/quests.js index e83d688e..c4fd1fa2 100644 --- a/src/client/ui/templates/quests/quests.js +++ b/src/client/ui/templates/quests/quests.js @@ -25,7 +25,7 @@ define([ this.find('.btnCollapse').on('click', this.toggleButtons.bind(this)); } - this.onEvent('onRezone', this.onRezone.bind(this)); + this.onEvent('clearUis', this.clear.bind(this)); this.onEvent('onObtainQuest', this.onObtainQuest.bind(this)); this.onEvent('onUpdateQuest', this.onUpdateQuest.bind(this)); @@ -35,7 +35,7 @@ define([ this.onToggleQuestsVisibility(config.showQuests); }, - onRezone: function () { + clear: function () { this.quests = []; this.el.find('.list').empty(); }, diff --git a/src/client/ui/templates/talk/talk.js b/src/client/ui/templates/talk/talk.js index 47191bac..617c0f9a 100644 --- a/src/client/ui/templates/talk/talk.js +++ b/src/client/ui/templates/talk/talk.js @@ -18,11 +18,7 @@ define([ postRender: function () { this.onEvent('onGetTalk', this.onGetTalk.bind(this)); - this.onEvent('onRezone', this.onRezone.bind(this)); - }, - - onRezone: function () { - this.hide(); + this.onEvent('clearUis', this.hide.bind(this)); }, onGetTalk: function (dialogue) { diff --git a/src/server/components/portal/sendObjToZone.js b/src/server/components/portal/sendObjToZone.js index cb0a3bf7..677d2180 100644 --- a/src/server/components/portal/sendObjToZone.js +++ b/src/server/components/portal/sendObjToZone.js @@ -1,48 +1,3 @@ -/* - atlas.onMessage.event / events -> only send if source zone = obj zoneName - - SERVER SIDE - 1. Change zone and position - 2. Save - 3. Syncer: Destroy, Flush and Notify other objects of destroyed obj - 4. Log IN CASE (if new events are queued) - 5. Stage rezone - 6. Tell client rezone is happening - - CLIENT SIDE - events.emit('rezoneStart'); - - events.emit('destroyAllObjects'); - events.emit('resetRenderer'); - events.emit('resetPhysics'); - events.emit('clearUis'); - - client.request({ - threadModule: 'rezoneManager', - method: 'clientAck', - data: {} - }); - - SERVER SIDE - 7. Server receives ack - 8. Map thread tells main thread about rezone - 9. Main thread does rezone - 10. New map thread registers handshake for map send - 11. New map thread sends new map - - CLIENT SIDE - events.emit('onGetMap', msg); - - client.request({ - threadModule: 'instancer', - method: 'clientAck', - data: {} - }); - - SERVER SIDE - 12. Add object to zone -*/ - const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos }) => { const { serverId, instance: { syncer: globalSyncer, physics } } = obj; diff --git a/src/server/components/social/rezone.js b/src/server/components/social/rezone.js index e3edbc07..d5caeb12 100644 --- a/src/server/components/social/rezone.js +++ b/src/server/components/social/rezone.js @@ -3,6 +3,9 @@ const sendObjToZone = require('../portal/sendObjToZone'); module.exports = (cpnSocial, targetZone) => { const { obj } = cpnSocial; + if (obj.zoneName === targetZone) + return; + sendObjToZone({ obj, zoneName: targetZone diff --git a/src/server/config/serverConfig.js b/src/server/config/serverConfig.js index b04099c6..0b728cc0 100644 --- a/src/server/config/serverConfig.js +++ b/src/server/config/serverConfig.js @@ -8,7 +8,7 @@ module.exports = { // sqlite // rethink //eslint-disable-next-line no-process-env - db: process.env.IWD_DB || 'sqlite', + db: process.env.IWD_DB || 'rethink', //eslint-disable-next-line no-process-env dbHost: process.env.IWD_DB_HOST || 'localhost', //eslint-disable-next-line no-process-env diff --git a/src/server/objects/objects.js b/src/server/objects/objects.js index acd2bca3..a2c3e04f 100644 --- a/src/server/objects/objects.js +++ b/src/server/objects/objects.js @@ -203,73 +203,80 @@ module.exports = { return newO; }, - sendEvent: function (msg, sourceThread) { - let player = this.objects.find(p => p.id === msg.id); - if (!player) + + sendEvent: function (msg, { name: sourceZone }) { + const { id, data } = msg; + + const player = this.objects.find(p => p.id === id); + if (!player || player.zoneName !== sourceZone) return; player.socket.emit('event', { - event: msg.data.event, - data: msg.data.data + event: data.event, + data: data.data }); }, - sendEvents: function (msg, sourceThread) { - let players = {}; - let objects = this.objects; - let data = msg.data; + sendEvents: function ({ data }, { name: sourceZone }) { + const { objects } = this; + + //Store will contain all events to be sent to players + const store = {}; + for (let e in data) { - let event = data[e]; - let eLen = event.length; + const event = data[e]; + const eLen = event.length; for (let j = 0; j < eLen; j++) { - let eventEntry = event[j]; - - let obj = eventEntry.obj; - - if (e !== 'serverModule') { - let to = eventEntry.to; - let toLen = to.length; - for (let i = 0; i < toLen; i++) { - let toId = to[i]; - - let player = players[toId]; - if (!player) { - let findPlayer = objects.find(o => o.id === toId); - if (!findPlayer) - continue; - else { - //If the message came from a map the player is no longer in, ignore - if (findPlayer.zoneName !== sourceThread.name) - continue; - - player = (players[toId] = { - socket: findPlayer.socket, - events: {}, - obj: findPlayer - }); - } - } - - //If the message came from a map the player is no longer in, ignore - if (player.obj.zoneName !== sourceThread.name) + const eventEntry = event[j]; + + const { obj: eventObj, to } = eventEntry; + + if (e === 'serverModule') { + const { method, msg } = eventObj; + + if (Array.isArray(msg)) + global[eventObj.module][method](...msg); + else + global[eventObj.module][method](msg); + + continue; + } + + const toLen = to.length; + for (let i = 0; i < toLen; i++) { + const toId = to[i]; + + let storeEntry = store[toId]; + if (!storeEntry) { + const playerObj = objects.find(o => o.id === toId); + + if (!playerObj || playerObj.zoneName !== sourceZone) continue; - let eventList = player.events[e] || (player.events[e] = []); - eventList.push(obj); + store[toId] = { + obj: playerObj, + events: { [e]: [eventObj] } + }; + + continue; } - } else if (obj.msg instanceof Array) - global[obj.module][obj.method](...obj.msg); - else - global[obj.module][obj.method](obj.msg); + + if (!storeEntry.events[e]) + storeEntry.events[e] = []; + + storeEntry.events[e].push(eventObj); + } } } - for (let p in players) { - let player = players[p]; - player.socket.emit('events', player.events); + for (let p in store) { + const { obj: { socket }, events } = store[p]; + + socket.emit('events', events); } }, + updateObject: async function (msg) { let player = this.objects.find(p => p.id === msg.serverId); if (!player) diff --git a/src/server/world/spawners.js b/src/server/world/spawners.js index 3cad19bd..22fd59ca 100644 --- a/src/server/world/spawners.js +++ b/src/server/world/spawners.js @@ -60,7 +60,6 @@ module.exports = { this.syncer.queue('onGetObject', { id: obj.id, - performLast: true, components: [spawnAnimation] }, -1); } diff --git a/src/server/world/syncer.js b/src/server/world/syncer.js index d89e780c..a51a3c58 100644 --- a/src/server/world/syncer.js +++ b/src/server/world/syncer.js @@ -210,8 +210,6 @@ module.exports = { this.dirty = false; - console.log(Object.keys(this.buffer)); - process.send({ method: 'events', data: this.buffer From 73b5a56467a19060f49205df57eb3530661ddb89 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 13 Nov 2021 15:43:15 +0200 Subject: [PATCH 18/65] chore: Reverted config change --- src/server/config/serverConfig.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/config/serverConfig.js b/src/server/config/serverConfig.js index 0b728cc0..b04099c6 100644 --- a/src/server/config/serverConfig.js +++ b/src/server/config/serverConfig.js @@ -8,7 +8,7 @@ module.exports = { // sqlite // rethink //eslint-disable-next-line no-process-env - db: process.env.IWD_DB || 'rethink', + db: process.env.IWD_DB || 'sqlite', //eslint-disable-next-line no-process-env dbHost: process.env.IWD_DB_HOST || 'localhost', //eslint-disable-next-line no-process-env From 5f950db5632c8d7b0fd773cce68ebbc6be84fc0b Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 13 Nov 2021 15:47:16 +0200 Subject: [PATCH 19/65] chore: fixed eslint issue --- src/server/events/phases/phaseGiveRewards.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/events/phases/phaseGiveRewards.js b/src/server/events/phases/phaseGiveRewards.js index 866fa66d..d4941b92 100644 --- a/src/server/events/phases/phaseGiveRewards.js +++ b/src/server/events/phases/phaseGiveRewards.js @@ -1,6 +1,6 @@ module.exports = { init: function (event) { - const { config, rewards, eventManager } = event; + const { config, rewards, eventManager: eManager } = event; const { name: eventName, rewardSenderName } = config; @@ -26,7 +26,7 @@ module.exports = { }); if ((config.events) && (config.events.afterGiveRewards)) - config.events.afterGiveRewards(eventManager, config); + config.events.afterGiveRewards(eManager, config); this.end = true; } From 5dde12f1980292b9f74f733a15175d12bdecdf72 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sun, 14 Nov 2021 07:50:23 +0200 Subject: [PATCH 20/65] feat #1866: Moved save to after delete and ensured that deleted objects aren't processed (or crashing) objects update --- src/client/js/objects/objBase.js | 2 +- src/server/components/portal/sendObjToZone.js | 16 +++++++++------- src/server/objects/objects.js | 8 ++++++++ src/server/world/syncer.js | 7 ++++++- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/client/js/objects/objBase.js b/src/client/js/objects/objBase.js index 92eda0a3..c84747ec 100644 --- a/src/client/js/objects/objBase.js +++ b/src/client/js/objects/objBase.js @@ -174,7 +174,7 @@ define([ offEvents: function () { if (this.pather) - this.pather.clearPath(); + this.pather.resetPath(); for (let e in this.eventCallbacks) this.eventCallbacks[e].forEach(c => events.off(e, c)); diff --git a/src/server/components/portal/sendObjToZone.js b/src/server/components/portal/sendObjToZone.js index 677d2180..10c26674 100644 --- a/src/server/components/portal/sendObjToZone.js +++ b/src/server/components/portal/sendObjToZone.js @@ -36,17 +36,19 @@ const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos obj.y = invokingObj.obj.y + toRelativePos.y; } - await obj.auth.doSave(); - //Destroy, flush events and notify other objects globalSyncer.processDestroyedObject(obj); + await obj.auth.doSave(); //Test code, remove later - const queued = Object.values(globalSyncer.buffer).filter(b => b.to.includes(serverId)); - if (queued.length) { - /* eslint-disable-next-line */ - console.log('Found', queued.length, 'events for rezoning object'); - } + Object.entries(globalSyncer.buffer).forEach(([k, v]) => { + v.forEach(e => { + if (e.to.includes(serverId)) { + /* eslint-disable-next-line */ + console.log('Found event', k, 'for rezoning object'); + } + }); + }); const simpleObj = obj.getSimple(true, false, true); diff --git a/src/server/objects/objects.js b/src/server/objects/objects.js index a2c3e04f..ddf25b83 100644 --- a/src/server/objects/objects.js +++ b/src/server/objects/objects.js @@ -340,6 +340,14 @@ module.exports = { if ((o.update) && (!o.destroyed)) o.update(); + //When objects are sent to other zones, we destroy them immediately (thhrough sendObjToZone) + // In these cases, we DO need to remove it + if (o.forceDestroy) { + i--; + len--; + continue; + } + if (o.ttl) { o.ttl--; if (!o.ttl) diff --git a/src/server/world/syncer.js b/src/server/world/syncer.js index a51a3c58..802e4e9a 100644 --- a/src/server/world/syncer.js +++ b/src/server/world/syncer.js @@ -185,7 +185,10 @@ module.exports = { const { id, serverId } = obj; obj.destroyed = true; - this.flushForTarget(serverId); + + //We mark forceDestroy to tell objects that we're destroying an object outside of the + // syncer's update method + obj.forceDestroy = true; const msg = { id: id, @@ -194,6 +197,8 @@ module.exports = { objects.removeObject(obj); + this.flushForTarget(serverId); + const fnQueueMsg = queue.bind(this, 'onGetObject'); //Find any players that have seen this obj From 576f7258130fb0e4692d48f5056b4e641f5c03df Mon Sep 17 00:00:00 2001 From: Shaun Date: Sun, 14 Nov 2021 10:35:46 +0200 Subject: [PATCH 21/65] feat #1872: Implemented rune rotations --- src/server/components/aggro.js | 4 + src/server/components/mob.js | 30 +++-- src/server/components/spellbook.js | 54 ++++----- .../components/spellbook/rotationManager.js | 111 ++++++++++++++++++ src/server/objects/objBase.js | 28 ++--- src/server/world/mobBuilder.js | 17 +-- 6 files changed, 167 insertions(+), 77 deletions(-) create mode 100644 src/server/components/spellbook/rotationManager.js diff --git a/src/server/components/aggro.js b/src/server/components/aggro.js index bd46374a..df67e17b 100644 --- a/src/server/components/aggro.js +++ b/src/server/components/aggro.js @@ -403,5 +403,9 @@ module.exports = { clearIgnoreList: function () { this.ignoreList = []; + }, + + isInCombat: function () { + return this.list.length > 0; } }; diff --git a/src/server/components/mob.js b/src/server/components/mob.js index 51c1533c..2bc095b7 100644 --- a/src/server/components/mob.js +++ b/src/server/components/mob.js @@ -98,6 +98,8 @@ module.exports = { patrol: null, patrolTargetNode: 0, + needLos: null, + init: function (blueprint) { this.physics = this.obj.instance.physics; @@ -251,8 +253,8 @@ module.exports = { let ty = ~~target.y; let distance = max(abs(x - tx), abs(y - ty)); - let furthestAttackRange = obj.spellbook.getFurthestRange(null, true); - let furthestStayRange = obj.spellbook.getFurthestRange(null, false); + let furthestAttackRange = obj.spellbook.getFurthestRange(target, true); + let furthestStayRange = obj.spellbook.getFurthestRange(target, false); let doesCollide = null; let hasLos = null; @@ -263,18 +265,20 @@ module.exports = { hasLos = this.physics.hasLos(x, y, tx, ty); //Maybe we don't care if the mob has LoS if (hasLos || this.needLos === false) { - if (((obj.follower) && (obj.follower.master.player)) || (rnd() < 0.65)) { - let spell = obj.spellbook.getRandomSpell(target); - let success = obj.spellbook.cast({ - spell: spell, - target: target - }); - //null means we don't have LoS - if (success !== null) - return; - hasLos = false; - } else + let spell = obj.spellbook.getSpellToCast(target); + if (!spell) return; + + let success = obj.spellbook.cast({ + spell: spell.id, + target + }); + + //null means we don't have LoS + if (success !== null) + return; + + hasLos = false; } } } else if (furthestAttackRange === 0) { diff --git a/src/server/components/spellbook.js b/src/server/components/spellbook.js index a1cbf0e8..b26c88d0 100644 --- a/src/server/components/spellbook.js +++ b/src/server/components/spellbook.js @@ -3,6 +3,11 @@ let animations = require('../config/animations'); let playerSpells = require('../config/spells'); let playerSpellsConfig = require('../config/spellsConfig'); +//Helpers +const rotationManager = require('./spellbook/rotationManager'); + +//Component + module.exports = { type: 'spellbook', @@ -16,6 +21,8 @@ module.exports = { callbacks: [], + rotation: null, + init: function (blueprint) { this.objects = this.obj.instance.objects; this.physics = this.obj.instance.physics; @@ -24,7 +31,21 @@ module.exports = { (blueprint.spells || []).forEach(s => this.addSpell(s, -1)); + if (blueprint.rotation) { + const { duration, spells } = blueprint.rotation; + + this.rotation = { + currentTick: 0, + duration, + spells + }; + } + delete blueprint.spells; + + //External helpers that should form part of the component + this.getSpellToCast = rotationManager.getSpellToCast.bind(null, this); + this.getFurthestRange = rotationManager.getFurthestRange.bind(null, this); }, transfer: function () { @@ -243,17 +264,6 @@ module.exports = { }); }, - getRandomSpell: function (target) { - const valid = this.spells.filter(s => { - return (!s.selfCast && !s.procCast && !s.castOnDeath && s.canCast(target)); - }); - - if (!valid.length) - return null; - - return valid[~~(Math.random() * valid.length)].id; - }, - getTarget: function (spell, action) { let target = action.target; @@ -445,25 +455,6 @@ module.exports = { return this.closestRange; }, - getFurthestRange: function (spellNum, checkCanCast) { - if (spellNum) - return this.spells[spellNum].range; - - let spells = this.spells; - let sLen = spells.length; - let furthest = 0; - for (let i = 0; i < sLen; i++) { - let spell = spells[i]; - if (spell.procCast || spell.castOnDeath) - continue; - - if (spell.range > furthest && (!checkCanCast || spell.canCast())) - furthest = spell.range; - } - - return furthest; - }, - getCooldowns: function () { let cds = []; this.spells.forEach( @@ -480,6 +471,9 @@ module.exports = { let didCast = false; const isCasting = this.isCasting(); + if (this.rotation) + rotationManager.tick(this); + this.spells.forEach(s => { let auto = s.autoActive; if (auto) { diff --git a/src/server/components/spellbook/rotationManager.js b/src/server/components/spellbook/rotationManager.js new file mode 100644 index 00000000..72315bbe --- /dev/null +++ b/src/server/components/spellbook/rotationManager.js @@ -0,0 +1,111 @@ +//Mobs that define rotations (normally bosses) use this method to determine their spell choices +const getRotationSpell = (source, target) => { + const { spells, rotation: { currentTick, spells: rotationSpells } } = source; + + //Find spell matching current tick + let rotationEntry = rotationSpells.find(s => s.atRotationTicks?.includes(currentTick)); + + //If no rotation spell found, use a default spell + //Todo: round-robin/random/weighted/whatever when there are more than one + if (!rotationEntry) + rotationEntry = rotationSpells.find(s => !s.atRotationTicks); + + if (!rotationEntry) + return; + + //Don't cast anything + if (rotationEntry.spellIndex === -1) + return; + + const useSpell = spells[rotationEntry.spellIndex]; + + //Todo: We should set cdMax and manaCost to 0 of rotation spells (unless there's a mana drain mechanic) + // later and we want to allow that on bosses + useSpell.cd = 0; + useSpell.manaCost = 0; + if (!useSpell.selfCast && !useSpell.canCast(target)) + return; + + return useSpell; +}; + +//Mobs without rune rotations (normally the case) simple select any random spell that is valid +const getRandomSpell = (source, target) => { + const valid = source.spells.filter(s => { + return (!s.selfCast && !s.procCast && !s.castOnDeath && s.canCast(target)); + }); + + if (!valid.length) + return null; + + return valid[~~(Math.random() * valid.length)]; +}; + +const getSpellToCast = (source, target) => { + if (source.rotation) + return getRotationSpell(source, target); + + const { obj: { follower } } = source; + + //Mobs don't cast all the time but player followers do + if (!follower?.master?.player && Math.random() >= 0.65) + return; + + return getRandomSpell(source, target); +}; + +const tick = source => { + if (!source.obj.aggro.isInCombat()) + return; + + const { rotation } = source; + + rotation.currentTick++; + + if (rotation.currentTick === rotation.duration) + rotation.currentTick = 1; +}; + +//Gets the range we need to be at to cast a specific rotation spell +const getFurthestRangeRotation = (source, target, checkCanCast) => { + const spell = getRotationSpell(source, target); + + if (!spell) + return 0; + + return spell.range; +}; + +/* + This is used by mobs when in combat mode, + * When checkCanCast is true, we want to see if we can cast right now + * When checkCanCast is false, we want to see if there is a spell we could cast in the near future + -> This could be a spell that is currently on cooldown, or that the mob has insufficient mana for + ---> Even though mobs don't need mana for spells at the moment + -> Ultimately, this means the mob should not move, just wait +*/ +const getFurthestRange = (source, target, checkCanCast) => { + const { spells, rotation } = source; + + if (rotation) + return getFurthestRangeRotation(source, target, checkCanCast); + + let sLen = spells.length; + let furthest = 0; + for (let i = 0; i < sLen; i++) { + let spell = spells[i]; + if (spell.procCast || spell.castOnDeath) + continue; + + if (spell.range > furthest && (!checkCanCast || spell.canCast())) + furthest = spell.range; + } + + return furthest; +}; + +module.exports = { + tick, + getSpellToCast, + getFurthestRange +}; diff --git a/src/server/objects/objBase.js b/src/server/objects/objBase.js index c9397c01..699c1caf 100644 --- a/src/server/objects/objBase.js +++ b/src/server/objects/objBase.js @@ -277,7 +277,7 @@ module.exports = { }, performMove: function (action) { - const { x: xOld, y: yOld, syncer, aggro, mob, instance: { physics } } = this; + const { x: xOld, y: yOld, syncer, aggro, instance: { physics } } = this; const { maxDistance = 1, force, data } = action; const { x: xNew, y: yNew } = data; @@ -309,26 +309,16 @@ module.exports = { return false; } - //Don't allow mob overlap during combat - if (mob && mob.target) { - this.x = xNew; - this.y = yNew; + this.x = xNew; + this.y = yNew; - if (physics.addObject(this, xNew, yNew)) - physics.removeObject(this, xOld, yOld); - else { - this.x = xOld; - this.y = yOld; - - return false; - } - } else { - physics.removeObject(this, xOld, yOld, xNew, yNew); - - this.x = xNew; - this.y = yNew; + if (physics.addObject(this, xNew, yNew)) + physics.removeObject(this, xOld, yOld); + else { + this.x = xOld; + this.y = yOld; - physics.addObject(this, xNew, yNew, xOld, yOld); + return false; } //We can't use xNew and yNew because addObject could have changed the position (like entering a building interior with stairs) diff --git a/src/server/world/mobBuilder.js b/src/server/world/mobBuilder.js index 1f63faab..a5cb9bfa 100644 --- a/src/server/world/mobBuilder.js +++ b/src/server/world/mobBuilder.js @@ -50,6 +50,8 @@ module.exports = { if (cpnMob.patrol) cpnMob.walkDistance = 1; + cpnMob.needLos = blueprint.needLos; + let spells = extend([], blueprint.spells); spells.forEach(s => { if (!s.animation && mob.sheetName === 'mobs' && animations.mobs[mob.cell]) @@ -179,21 +181,6 @@ module.exports = { s.dmgMult = s.name ? dmgMult / 3 : dmgMult; s.statType = preferStat; s.manaCost = 0; - - /*if (mob.name.toLowerCase().includes('stinktooth')) { - mob.stats.values.critChance = 0; - mob.stats.values.attackCritChance = 0; - mob.stats.values.spellCritChance = 0; - - const n = mob.name + '-' + s.type; - if (!track[n]) - track[n] = []; - - track[n].push(~~s.getDamage(mob, true).amount); - track[n].sort((a, b) => a - b); - console.log(track); - console.log(''); - }*/ }); //Hack to disallow low level mobs from having any lifeOnHit From 913569200bbcb1d6ed87a150b5b74e5854f5eb09 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sun, 14 Nov 2021 12:55:05 +0200 Subject: [PATCH 22/65] feat #1872: More work on this --- src/server/components/mob.js | 24 +++++++++------- src/server/components/spellbook.js | 1 + .../components/spellbook/rotationManager.js | 28 ++++++++++++++++--- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/server/components/mob.js b/src/server/components/mob.js index 2bc095b7..735b9fbb 100644 --- a/src/server/components/mob.js +++ b/src/server/components/mob.js @@ -113,6 +113,7 @@ module.exports = { this.maxChaseDistance = blueprint.maxChaseDistance; }, + /* eslint-disable-next-line max-lines-per-function */ update: function () { let obj = this.obj; @@ -123,20 +124,22 @@ module.exports = { //Have we reached home? if (this.goHome) { let distanceFromHome = Math.max(abs(this.originX - obj.x), abs(this.originY - obj.y)); - if (!distanceFromHome) + if (!distanceFromHome) { this.goHome = false; - } - - //Are we too far from home? - if ((!this.goHome) && (!obj.follower) && (target)) { - if (!this.canChase(target)) { - obj.clearQueue(); - obj.aggro.unAggro(target); - target = obj.aggro.getHighest(); + obj.spellbook.resetRotation(); } } if (!this.goHome) { + //Are we too far from home? + if (!obj.follower && target) { + if (!this.canChase(target)) { + obj.clearQueue(); + obj.aggro.unAggro(target); + target = obj.aggro.getHighest(); + } + } + if ((target) && (target !== obj) && ((!obj.follower) || (obj.follower.master !== target))) { //If we just started attacking, patrols need to know where home is if (!this.target && this.patrol) { @@ -147,10 +150,11 @@ module.exports = { //Are we in fight mode? this.fight(target); return; - } else if ((!target) && (this.target)) { + } else if (!target && this.target) { //Is fight mode over? this.target = null; obj.clearQueue(); + obj.spellbook.resetRotation(); if (canPathHome(this)) this.goHome = true; diff --git a/src/server/components/spellbook.js b/src/server/components/spellbook.js index b26c88d0..41013c3c 100644 --- a/src/server/components/spellbook.js +++ b/src/server/components/spellbook.js @@ -46,6 +46,7 @@ module.exports = { //External helpers that should form part of the component this.getSpellToCast = rotationManager.getSpellToCast.bind(null, this); this.getFurthestRange = rotationManager.getFurthestRange.bind(null, this); + this.resetRotation = rotationManager.resetRotation.bind(null, this); }, transfer: function () { diff --git a/src/server/components/spellbook/rotationManager.js b/src/server/components/spellbook/rotationManager.js index 72315bbe..4db033b0 100644 --- a/src/server/components/spellbook/rotationManager.js +++ b/src/server/components/spellbook/rotationManager.js @@ -1,3 +1,17 @@ +const getDefaultRotationSpell = rotationSpells => { + const spells = rotationSpells.filter(s => !s.atRotationTicks); + + if (!spells.length) + return; + + if (spells.length === 0) + return spells[0]; + + const randomSpell = spells[~~(Math.random() * spells.length)]; + + return randomSpell; +}; + //Mobs that define rotations (normally bosses) use this method to determine their spell choices const getRotationSpell = (source, target) => { const { spells, rotation: { currentTick, spells: rotationSpells } } = source; @@ -5,10 +19,8 @@ const getRotationSpell = (source, target) => { //Find spell matching current tick let rotationEntry = rotationSpells.find(s => s.atRotationTicks?.includes(currentTick)); - //If no rotation spell found, use a default spell - //Todo: round-robin/random/weighted/whatever when there are more than one if (!rotationEntry) - rotationEntry = rotationSpells.find(s => !s.atRotationTicks); + rotationEntry = getDefaultRotationSpell(rotationSpells); if (!rotationEntry) return; @@ -24,7 +36,7 @@ const getRotationSpell = (source, target) => { useSpell.cd = 0; useSpell.manaCost = 0; if (!useSpell.selfCast && !useSpell.canCast(target)) - return; + return getDefaultRotationSpell(rotationSpells); return useSpell; }; @@ -104,8 +116,16 @@ const getFurthestRange = (source, target, checkCanCast) => { return furthest; }; +const resetRotation = source => { + if (!source.rotation) + return; + + source.rotation.currentTick = 0; +}; + module.exports = { tick, + resetRotation, getSpellToCast, getFurthestRange }; From 46a5a6bd072026b91809d64650b370311bbfcda1 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sun, 14 Nov 2021 12:55:57 +0200 Subject: [PATCH 23/65] bug #1872: Small bug fix --- src/server/components/spellbook/rotationManager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/components/spellbook/rotationManager.js b/src/server/components/spellbook/rotationManager.js index 4db033b0..c902120d 100644 --- a/src/server/components/spellbook/rotationManager.js +++ b/src/server/components/spellbook/rotationManager.js @@ -4,7 +4,7 @@ const getDefaultRotationSpell = rotationSpells => { if (!spells.length) return; - if (spells.length === 0) + if (spells.length === 1) return spells[0]; const randomSpell = spells[~~(Math.random() * spells.length)]; From fa3739cbd43f4621c97360113b4ad53c50d71adf Mon Sep 17 00:00:00 2001 From: kckckc Date: Tue, 23 Nov 2021 23:07:49 -0800 Subject: [PATCH 24/65] Only show -effect text when the effect is destroyed (not the whole object) --- src/server/clientComponents/effects.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/clientComponents/effects.js b/src/server/clientComponents/effects.js index 9a25ec60..c1dd34ad 100644 --- a/src/server/clientComponents/effects.js +++ b/src/server/clientComponents/effects.js @@ -22,7 +22,8 @@ define([ }, destroy: function () { - this.defaultDamageText(true); + if (!this.obj.destroyed) + this.defaultDamageText(true); if (this.self && defaultBuffIcons[this.type]) { events.emit('onRemoveEffectIcon', { From b0b3a4f2385e83add8b9f7a0c841a59a86c6f206 Mon Sep 17 00:00:00 2001 From: kckckc Date: Tue, 23 Nov 2021 23:35:58 -0800 Subject: [PATCH 25/65] Convert noMsg to silent and remove new from calls to addEffect --- src/server/config/spells/spellAura.js | 3 +-- src/server/config/spells/spellCharge.js | 13 ++----------- src/server/config/spells/spellFireblast.js | 3 +-- src/server/config/spells/spellTrailDash.js | 2 +- 4 files changed, 5 insertions(+), 16 deletions(-) diff --git a/src/server/config/spells/spellAura.js b/src/server/config/spells/spellAura.js index e1fd9e35..f0bb5feb 100644 --- a/src/server/config/spells/spellAura.js +++ b/src/server/config/spells/spellAura.js @@ -85,8 +85,7 @@ module.exports = { type: this.effect, amount: amount, caster: this.obj, - ttl: -1, - new: true + ttl: -1 }); }); diff --git a/src/server/config/spells/spellCharge.js b/src/server/config/spells/spellCharge.js index 3a65039d..7b7a394c 100644 --- a/src/server/config/spells/spellCharge.js +++ b/src/server/config/spells/spellCharge.js @@ -55,19 +55,10 @@ module.exports = { type: 'stunned' }); - if (targetEffect) { - this.obj.instance.syncer.queue('onGetDamage', { - id: target.id, - event: true, - text: 'stunned' - }, -1); - } - let selfEffect = this.obj.effects.addEffect({ type: 'stunned', - noMsg: true, - force: true, - new: true + silent: true, + force: true }); const moveAnimationEffect = { diff --git a/src/server/config/spells/spellFireblast.js b/src/server/config/spells/spellFireblast.js index daf30014..ad90f442 100644 --- a/src/server/config/spells/spellFireblast.js +++ b/src/server/config/spells/spellFireblast.js @@ -115,8 +115,7 @@ module.exports = { const targetEffect = m.effects.addEffect({ type: 'stunned', - noMsg: true, - new: true + silent: true }); //If targetEffect is undefined, it means that the target has become resistant diff --git a/src/server/config/spells/spellTrailDash.js b/src/server/config/spells/spellTrailDash.js index 8fb06fe8..966a39ac 100644 --- a/src/server/config/spells/spellTrailDash.js +++ b/src/server/config/spells/spellTrailDash.js @@ -164,7 +164,7 @@ module.exports = { this.castingEffect = this.obj.effects.addEffect({ type: 'casting', - noMsg: true + silent: true }); this.casting = true; From 662808ed670d39915c4a092b393adbbbb72d0653 Mon Sep 17 00:00:00 2001 From: kckckc Date: Tue, 23 Nov 2021 23:38:02 -0800 Subject: [PATCH 26/65] Remove logging (didn't see them at all!) --- src/client/ui/templates/effects/effects.js | 2 +- src/server/clientComponents/effects.js | 6 ------ src/server/components/effects.js | 8 -------- 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/src/client/ui/templates/effects/effects.js b/src/client/ui/templates/effects/effects.js index 593446a1..09128752 100644 --- a/src/client/ui/templates/effects/effects.js +++ b/src/client/ui/templates/effects/effects.js @@ -46,7 +46,7 @@ define([ let el = this.icons[config.id]; if (!el) return; - + el.remove(); delete this.icons[config.id]; } diff --git a/src/server/clientComponents/effects.js b/src/server/clientComponents/effects.js index c1dd34ad..503fc3d2 100644 --- a/src/server/clientComponents/effects.js +++ b/src/server/clientComponents/effects.js @@ -55,12 +55,6 @@ define([ }, buildEffect: function (data) { - if (typeof data === 'string') { - //TODO: temporary while we work on effects - console.error('String type effects should be deprecated, this effect will be missing an id'); - data = { type: data }; - } - let template = this.templates[data.type] || {}; let effect = $.extend(true, {}, effectBase, template, data); diff --git a/src/server/components/effects.js b/src/server/components/effects.js index fd7d9f84..f6bcb0ad 100644 --- a/src/server/components/effects.js +++ b/src/server/components/effects.js @@ -235,14 +235,6 @@ module.exports = { }, removeEffect: function (id, noMsg) { - if (noMsg) - console.error('removeEffect: noMsg is deprecated!'); - - if (typeof id !== 'number') { - console.error('removeEffect: id should be a number'); - id = id.id; - } - let effect = this.effects.find(e => e.id === id); this.destroyEffect(effect); From c1dd39a6dc7f50087ef3360304451134de324b75 Mon Sep 17 00:00:00 2001 From: kckckc Date: Wed, 24 Nov 2021 00:00:04 -0800 Subject: [PATCH 27/65] Remove todos that are mentioned in MR and remove unused param --- src/server/components/effects.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/server/components/effects.js b/src/server/components/effects.js index f6bcb0ad..c259448b 100644 --- a/src/server/components/effects.js +++ b/src/server/components/effects.js @@ -147,8 +147,6 @@ module.exports = { if (!options.force && !this.canApplyEffect(options.type)) return; - //TODO: new stats that mitigate CC duration - let oldEffect = this.effects.find(e => e.type === options.type); //If there is no existing effect or the effect is not stackable, make a new effect @@ -215,7 +213,6 @@ module.exports = { if (effect.silent) return; - //TODO: should this be for self? this.obj.syncer.setArray(true, 'effects', 'extendEffects', { id, data @@ -234,7 +231,7 @@ module.exports = { this.obj.syncer.setArray(false, 'effects', 'removeEffects', id); }, - removeEffect: function (id, noMsg) { + removeEffect: function (id) { let effect = this.effects.find(e => e.id === id); this.destroyEffect(effect); From b3abeeee139877f0a7373984a85583406bcbd904 Mon Sep 17 00:00:00 2001 From: Shaun Date: Thu, 25 Nov 2021 08:58:04 +0200 Subject: [PATCH 28/65] chore Fixed npm audit vuln --- src/server/package-lock.json | 547 +++++++++++++---------------------- src/server/package.json | 2 +- 2 files changed, 203 insertions(+), 346 deletions(-) diff --git a/src/server/package-lock.json b/src/server/package-lock.json index d022b0eb..0e099441 100644 --- a/src/server/package-lock.json +++ b/src/server/package-lock.json @@ -1,6 +1,6 @@ { "name": "isleward_server", - "version": "0.10.4", + "version": "0.10.5", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -145,6 +145,7 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.1.1", @@ -161,6 +162,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -172,6 +174,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, "requires": { "ms": "2.1.2" } @@ -180,6 +183,7 @@ "version": "13.11.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, "requires": { "type-fest": "^0.20.2" } @@ -187,7 +191,8 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, @@ -195,6 +200,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", @@ -205,6 +211,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, "requires": { "ms": "2.1.2" } @@ -212,14 +219,16 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, "@humanwhocodes/object-schema": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==" + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true }, "@types/component-emitter": { "version": "1.2.10", @@ -253,17 +262,20 @@ "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true }, "ajv": { "version": "6.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -274,17 +286,20 @@ "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -293,6 +308,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -302,38 +318,11 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true }, "axios": { "version": "0.22.0", @@ -360,7 +349,8 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "base64-arraybuffer": { "version": "0.1.4", @@ -377,14 +367,6 @@ "resolved": "https://registry.npmjs.org/bcrypt-nodejs/-/bcrypt-nodejs-0.0.3.tgz", "integrity": "sha1-xgkX8m3CNWYVZsaBBhwwPCsohCs=" }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -418,6 +400,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -431,12 +414,8 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true }, "chalk": { "version": "2.4.2", @@ -461,6 +440,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -468,15 +448,8 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "commander": { "version": "2.20.3", @@ -513,7 +486,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "content-disposition": { "version": "0.5.3", @@ -538,11 +512,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, "cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -556,20 +525,13 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -581,12 +543,8 @@ "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, "depd": { "version": "1.1.2", @@ -602,19 +560,11 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, "requires": { "esutils": "^2.0.2" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -623,7 +573,8 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "encodeurl": { "version": "1.0.2", @@ -676,6 +627,7 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, "requires": { "ansi-colors": "^4.1.1" } @@ -695,6 +647,7 @@ "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, "requires": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -742,6 +695,7 @@ "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -749,12 +703,14 @@ "@babel/helper-validator-identifier": { "version": "7.15.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true }, "@babel/highlight": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", @@ -765,6 +721,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -774,7 +731,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true } } }, @@ -782,6 +740,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -791,6 +750,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -799,6 +759,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -809,6 +770,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { "color-name": "~1.1.4" } @@ -816,12 +778,14 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, "requires": { "ms": "2.1.2" } @@ -829,22 +793,26 @@ "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true }, "eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "globals": { "version": "13.11.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, "requires": { "type-fest": "^0.20.2" } @@ -852,12 +820,14 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, @@ -891,6 +861,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -900,6 +871,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" } @@ -907,12 +879,14 @@ "eslint-visitor-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true }, "espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, "requires": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", @@ -922,19 +896,22 @@ "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true } } }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true }, "esquery": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, "requires": { "estraverse": "^5.1.0" }, @@ -942,7 +919,8 @@ "estraverse": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true } } }, @@ -950,6 +928,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "requires": { "estraverse": "^5.2.0" }, @@ -957,19 +936,22 @@ "estraverse": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true } } }, "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true }, "etag": { "version": "1.8.1", @@ -1023,20 +1005,11 @@ "uglify-js": "^3.0.28" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, "fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true }, "fast-diff": { "version": "1.2.0", @@ -1047,17 +1020,20 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, "requires": { "flat-cache": "^3.0.4" } @@ -1080,6 +1056,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" @@ -1088,28 +1065,14 @@ "flatted": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==" + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true }, "follow-redirects": { "version": "1.14.4", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -1123,25 +1086,20 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1155,6 +1113,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -1165,24 +1124,11 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "http-errors": { "version": "1.7.2", @@ -1196,16 +1142,6 @@ "toidentifier": "1.0.0" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1217,7 +1153,8 @@ "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true }, "image-size": { "version": "1.0.0", @@ -1231,6 +1168,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -1239,12 +1177,14 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -1263,96 +1203,69 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "requires": { "is-extglob": "^2.1.1" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, "requires": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -1367,22 +1280,26 @@ "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "requires": { "yallist": "^4.0.0" } @@ -1424,6 +1341,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1436,18 +1354,14 @@ "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -1470,6 +1384,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } @@ -1478,6 +1393,7 @@ "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, "requires": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -1491,6 +1407,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "requires": { "callsites": "^3.0.0" } @@ -1503,12 +1420,14 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true }, "path-parse": { "version": "1.0.7", @@ -1521,15 +1440,11 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true }, "prettier-linter-helpers": { "version": "1.0.0", @@ -1543,7 +1458,8 @@ "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true }, "proxy-addr": { "version": "2.0.6", @@ -1554,15 +1470,11 @@ "ipaddr.js": "1.9.1" } }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "qs": { "version": "6.7.0", @@ -1603,46 +1515,14 @@ "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - } - } + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true }, "resolve": { "version": "1.15.1", @@ -1656,7 +1536,8 @@ "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true }, "rethinkdbdash": { "version": "2.3.31", @@ -1670,6 +1551,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, "requires": { "glob": "^7.1.3" } @@ -1688,6 +1570,7 @@ "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -1739,6 +1622,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "requires": { "shebang-regex": "^3.0.0" } @@ -1746,12 +1630,14 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true }, "slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, "requires": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -1762,6 +1648,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -1770,6 +1657,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { "color-name": "~1.1.4" } @@ -1777,7 +1665,8 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true } } }, @@ -1850,23 +1739,8 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "statuses": { "version": "1.5.0", @@ -1877,6 +1751,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1887,6 +1762,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -1894,12 +1770,14 @@ "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -1908,6 +1786,7 @@ "version": "6.7.2", "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", + "dev": true, "requires": { "ajv": "^8.0.1", "lodash.clonedeep": "^4.5.0", @@ -1921,6 +1800,7 @@ "version": "8.6.3", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -1931,14 +1811,16 @@ "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true } } }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true }, "to-fast-properties": { "version": "2.0.0", @@ -1951,32 +1833,11 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, "requires": { "prelude-ls": "^1.2.1" } @@ -1984,7 +1845,8 @@ "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true }, "type-is": { "version": "1.6.18", @@ -2005,19 +1867,18 @@ } }, "universal-analytics": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", - "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.5.1.tgz", + "integrity": "sha512-raLjYsNQmJbK0o8veSU9GXA5XG/YhfuZDzWCAB4SNDnPI4ozXLrbFSDZiRENdOFEIUqmdUTYcaQCOa0Y36EtsQ==", "requires": { "debug": "^4.1.1", - "request": "^2.88.2", - "uuid": "^3.0.0" + "uuid": "^8.0.0" }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "requires": { "ms": "2.1.2" } @@ -2038,6 +1899,7 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, "requires": { "punycode": "^2.1.0" } @@ -2048,34 +1910,26 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "requires": { "isexe": "^2.0.0" } @@ -2083,12 +1937,14 @@ "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "ws": { "version": "7.4.6", @@ -2098,7 +1954,8 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } } diff --git a/src/server/package.json b/src/server/package.json index a80b9c08..e14d5258 100644 --- a/src/server/package.json +++ b/src/server/package.json @@ -11,7 +11,7 @@ "image-size": "^1.0.0", "rethinkdbdash": "^2.3.31", "socket.io": "^4.2.0", - "universal-analytics": "^0.4.23" + "universal-analytics": "^0.5.1" }, "devDependencies": { "babel-eslint": "^10.1.0", From d0f5f56048fdaa43486ea260f7f410c1a0aeb751 Mon Sep 17 00:00:00 2001 From: Vildravn Date: Thu, 25 Nov 2021 15:14:18 +0100 Subject: [PATCH 29/65] Relax profanity filter --- src/server/misc/profanities.js | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/src/server/misc/profanities.js b/src/server/misc/profanities.js index c17f8237..6d1dce47 100644 --- a/src/server/misc/profanities.js +++ b/src/server/misc/profanities.js @@ -9,7 +9,6 @@ let blacklist = [ 'blowjob', 'boner', 'boob', - 'breast', 'bukkake', 'cameltoe', 'carpetmuncher', @@ -28,8 +27,6 @@ let blacklist = [ 'dike', 'dildo', 'dong', - 'douche', - 'dumbass', 'dyke', 'ejaculate', 'erection', @@ -42,16 +39,11 @@ let blacklist = [ 'foreskin', 'fuck', 'fuk', - 'gay', 'goatse', - 'godamn', - 'goddammit', - 'goddamn', 'goldenshower', 'handjob', 'hardon', 'hitler', - 'homo', 'horny', 'jerkoff', 'jism', @@ -125,7 +117,6 @@ let blacklist = [ 'testis', 'tits', 'tramp', - 'transsex', 'turd', 'twat', 'undies', @@ -146,7 +137,9 @@ let blacklist = [ 'whoring', 'wigger', 'gaes', - 'gaez' + 'gaez', + 'pron', + 'nogger', ]; module.exports = { @@ -170,11 +163,6 @@ module.exports = { }, isClean: function (text, finalLevel) { - text = text - .toLowerCase() - .split(' ') - .join(''); - const tree = this.tree; let tLen = text.length; From a963cc8ec806c86da96181c6e1d6f66fbed9a4d8 Mon Sep 17 00:00:00 2001 From: Vildravn Date: Thu, 25 Nov 2021 15:23:41 +0100 Subject: [PATCH 30/65] Fix lint complaints --- src/server/misc/profanities.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/misc/profanities.js b/src/server/misc/profanities.js index 6d1dce47..aef642b9 100644 --- a/src/server/misc/profanities.js +++ b/src/server/misc/profanities.js @@ -139,7 +139,7 @@ let blacklist = [ 'gaes', 'gaez', 'pron', - 'nogger', + 'nogger' ]; module.exports = { From b69b637daec8a763dd0319ff78310a819d170610 Mon Sep 17 00:00:00 2001 From: Vildravn Date: Thu, 25 Nov 2021 16:36:59 +0100 Subject: [PATCH 31/65] Return the lowercase convert to profanities Also remove pron --- src/server/misc/profanities.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/server/misc/profanities.js b/src/server/misc/profanities.js index aef642b9..f0cda950 100644 --- a/src/server/misc/profanities.js +++ b/src/server/misc/profanities.js @@ -138,7 +138,6 @@ let blacklist = [ 'wigger', 'gaes', 'gaez', - 'pron', 'nogger' ]; @@ -154,7 +153,7 @@ module.exports = { buildPath: function (chain, node) { node = node || this.tree; const letter = chain[0]; - + if (!node[letter]) node[letter] = {}; @@ -163,6 +162,9 @@ module.exports = { }, isClean: function (text, finalLevel) { + text = text + .toLowerCase() + const tree = this.tree; let tLen = text.length; From bf4d7187aaa7aa2dfceef105814208e38426bae7 Mon Sep 17 00:00:00 2001 From: Vildravn Date: Thu, 25 Nov 2021 16:39:52 +0100 Subject: [PATCH 32/65] Stop the linter from complaining --- src/server/misc/profanities.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/misc/profanities.js b/src/server/misc/profanities.js index f0cda950..8d943f13 100644 --- a/src/server/misc/profanities.js +++ b/src/server/misc/profanities.js @@ -163,7 +163,7 @@ module.exports = { isClean: function (text, finalLevel) { text = text - .toLowerCase() + .toLowerCase(); const tree = this.tree; From d85552df4977e04ed24875a2a23e4285bf21642b Mon Sep 17 00:00:00 2001 From: Shaun Date: Thu, 25 Nov 2021 18:56:15 +0200 Subject: [PATCH 33/65] UNDO THIS: Made rezone level 0 --- src/server/components/extensions/socialCommands.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/components/extensions/socialCommands.js b/src/server/components/extensions/socialCommands.js index d3e11464..4b63d717 100644 --- a/src/server/components/extensions/socialCommands.js +++ b/src/server/components/extensions/socialCommands.js @@ -39,7 +39,7 @@ let commandRoles = { setPassword: 10, giveSkin: 10, getMaterials: 10, - rezone: 10, + rezone: 0, startEvent: 10, stopEvent: 10, teleport: 10, From e507241eb6bbdf3309f33bee5fa09081cf2c22c3 Mon Sep 17 00:00:00 2001 From: Shaun Date: Thu, 25 Nov 2021 19:41:27 +0200 Subject: [PATCH 34/65] bug: Fixed a crash caused by rezoning while someone was next to you --- src/server/world/syncer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/world/syncer.js b/src/server/world/syncer.js index 802e4e9a..f46704e9 100644 --- a/src/server/world/syncer.js +++ b/src/server/world/syncer.js @@ -205,7 +205,7 @@ module.exports = { objects .filter(o => !o.destroyed && o?.player?.hasSeen(id)) .forEach(o => { - fnQueueMsg(msg); + fnQueueMsg(msg, [o.serverId]); }); }, From 9c1984c79fbb44af55851514609d50e330d73d40 Mon Sep 17 00:00:00 2001 From: Shaun Date: Thu, 25 Nov 2021 20:20:48 +0200 Subject: [PATCH 35/65] Added missing function for effects --- src/server/components/effects.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/server/components/effects.js b/src/server/components/effects.js index c259448b..00d23734 100644 --- a/src/server/components/effects.js +++ b/src/server/components/effects.js @@ -240,6 +240,18 @@ module.exports = { this.effects.spliceWhere(e => e.id === id); }, + removeEffectByType: function (type) { + let effects = this.effects.filter(e => e.type === type); + + effects.forEach(e => { + this.destroyEffect(e); + + this.syncRemove(e.id); + + this.effects.spliceWhere(f => f === e); + }); + }, + getEffectByType: function (effectType) { const effect = this.effects.find(e => e.type === effectType); From 0951dd70971d3403f5464b18a8d518cf6679aecf Mon Sep 17 00:00:00 2001 From: Shaun Date: Thu, 25 Nov 2021 20:38:40 +0200 Subject: [PATCH 36/65] Bug: Fixed an issue with objects not being completely removed properly --- src/server/components/portal/sendObjToZone.js | 2 ++ src/server/objects/objects.js | 1 + 2 files changed, 3 insertions(+) diff --git a/src/server/components/portal/sendObjToZone.js b/src/server/components/portal/sendObjToZone.js index 10c26674..35227d1a 100644 --- a/src/server/components/portal/sendObjToZone.js +++ b/src/server/components/portal/sendObjToZone.js @@ -51,6 +51,8 @@ const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos }); const simpleObj = obj.getSimple(true, false, true); + simpleObj.destroyed = false; + simpleObj.forceDestroy = false; rezoneManager.stageRezone(simpleObj, zoneName); diff --git a/src/server/objects/objects.js b/src/server/objects/objects.js index ddf25b83..9919dab6 100644 --- a/src/server/objects/objects.js +++ b/src/server/objects/objects.js @@ -343,6 +343,7 @@ module.exports = { //When objects are sent to other zones, we destroy them immediately (thhrough sendObjToZone) // In these cases, we DO need to remove it if (o.forceDestroy) { + objects.splice(i, 1); i--; len--; continue; From 90b71ad704120106fc5664d63e3586fd5e661596 Mon Sep 17 00:00:00 2001 From: Shaun Date: Thu, 25 Nov 2021 21:11:09 +0200 Subject: [PATCH 37/65] bug: Fixed an issue causing portals to not spawn you in the correct location --- src/server/components/portal.js | 22 +++++++++++-------- src/server/components/portal/sendObjToZone.js | 22 +++++++++++++------ src/server/objects/objects.js | 2 -- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/server/components/portal.js b/src/server/components/portal.js index c6dd7371..d415f15e 100644 --- a/src/server/components/portal.js +++ b/src/server/components/portal.js @@ -16,18 +16,22 @@ module.exports = { this.patronLevel = ~~blueprint.patron; }, - collisionEnter: async function (obj) { + collisionEnter: function (obj) { if (!obj.player) return; - const { toZone: zoneName, toPos, toRelativePos } = this; + (async () => { + const { toZone: zoneName, toPos, toRelativePos } = this; - await sendObjToZone({ - obj, - invokingObj: this, - zoneName, - toPos, - toRelativePos - }); + await sendObjToZone({ + obj, + invokingObj: this, + zoneName, + toPos, + toRelativePos + }); + })(); + + return true; } }; diff --git a/src/server/components/portal/sendObjToZone.js b/src/server/components/portal/sendObjToZone.js index 35227d1a..7c53204c 100644 --- a/src/server/components/portal/sendObjToZone.js +++ b/src/server/components/portal/sendObjToZone.js @@ -1,3 +1,13 @@ +const fixPosition = (obj, toPos, toRelativePos, invokingObj) => { + if (toPos) { + obj.x = toPos.x; + obj.y = toPos.y; + } else if (toRelativePos) { + obj.x = invokingObj.obj.x + toRelativePos.x; + obj.y = invokingObj.obj.y + toRelativePos.y; + } +}; + const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos }) => { const { serverId, instance: { syncer: globalSyncer, physics } } = obj; @@ -28,18 +38,16 @@ const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos //We set this before saving so that objects aren't saved ON portals obj.zoneName = zoneName; - if (toPos) { - obj.x = toPos.x; - obj.y = toPos.y; - } else if (toRelativePos) { - obj.x = invokingObj.obj.x + toRelativePos.x; - obj.y = invokingObj.obj.y + toRelativePos.y; - } + fixPosition(obj, toPos, toRelativePos, invokingObj); //Destroy, flush events and notify other objects globalSyncer.processDestroyedObject(obj); await obj.auth.doSave(); + //We have to do this again. This is because onCollisionEnter in portal is not blocking (even though it is async) + // So physics will carry on and allow the obj to move onto the next tile (changing the position while we save above) + fixPosition(obj, toPos, toRelativePos, invokingObj); + //Test code, remove later Object.entries(globalSyncer.buffer).forEach(([k, v]) => { v.forEach(e => { diff --git a/src/server/objects/objects.js b/src/server/objects/objects.js index 9919dab6..4c713d1f 100644 --- a/src/server/objects/objects.js +++ b/src/server/objects/objects.js @@ -341,9 +341,7 @@ module.exports = { o.update(); //When objects are sent to other zones, we destroy them immediately (thhrough sendObjToZone) - // In these cases, we DO need to remove it if (o.forceDestroy) { - objects.splice(i, 1); i--; len--; continue; From abdb2196e12acb73868e97cfd43e0ff18179e428 Mon Sep 17 00:00:00 2001 From: Shaun Date: Fri, 26 Nov 2021 06:35:42 +0200 Subject: [PATCH 38/65] bug: Fixed an issue that was causing in-object portals (like interiors) to not work because objBase was setting the position back after attempting the portal which overrode the new position that was set BY the portal --- src/server/components/portal.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/server/components/portal.js b/src/server/components/portal.js index d415f15e..e0545206 100644 --- a/src/server/components/portal.js +++ b/src/server/components/portal.js @@ -31,7 +31,5 @@ module.exports = { toRelativePos }); })(); - - return true; } }; From a0d4a25e0f11a62a49b81401ae6d2a4bb8bdc95f Mon Sep 17 00:00:00 2001 From: Shaun Date: Fri, 26 Nov 2021 08:34:18 +0200 Subject: [PATCH 39/65] chore: minor refactor --- src/server/components/effects.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/server/components/effects.js b/src/server/components/effects.js index 00d23734..9d14fc72 100644 --- a/src/server/components/effects.js +++ b/src/server/components/effects.js @@ -241,15 +241,9 @@ module.exports = { }, removeEffectByType: function (type) { - let effects = this.effects.filter(e => e.type === type); + const effects = this.effects.filter(e => e.type === type); - effects.forEach(e => { - this.destroyEffect(e); - - this.syncRemove(e.id); - - this.effects.spliceWhere(f => f === e); - }); + effects.forEach(e => this.removeEffect(e.id)); }, getEffectByType: function (effectType) { From 1c6d7a544603d9a44b87d372b9d2335a1c2e4f89 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 27 Nov 2021 08:49:02 +0200 Subject: [PATCH 40/65] bug: Fixed a crash that happens when dying with an aura active --- src/server/components/effects.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/server/components/effects.js b/src/server/components/effects.js index 9d14fc72..4c67fe6f 100644 --- a/src/server/components/effects.js +++ b/src/server/components/effects.js @@ -232,7 +232,12 @@ module.exports = { }, removeEffect: function (id) { - let effect = this.effects.find(e => e.id === id); + const effect = this.effects.find(e => e.id === id); + + //It's possible that something else has removed the effect + if (!effect) + return; + this.destroyEffect(effect); this.syncRemove(effect.id); From 1192d169cf9d7d65ff8602c75610de20abfb6fec Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 27 Nov 2021 15:42:19 +0200 Subject: [PATCH 41/65] bug: Fixed being unable to zone in when DC'ing while dead, fixed a crash with effectStunned being applied to obj's without spellbooks --- src/server/components/auth.js | 3 +++ src/server/config/effects/effectStunned.js | 3 ++- src/server/security/connections.js | 7 +++++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index ca55f1fa..43ad9d46 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -93,6 +93,9 @@ module.exports = { doSave: async function (callback, saveStash = true) { const simple = this.obj.getSimple(true, true); + delete simple.destroyed; + delete simple.forceDestroy; + simple.components.spliceWhere(f => (f.type === 'stash')); await io.setAsync({ diff --git a/src/server/config/effects/effectStunned.js b/src/server/config/effects/effectStunned.js index 45c701dc..ccb46557 100644 --- a/src/server/config/effects/effectStunned.js +++ b/src/server/config/effects/effectStunned.js @@ -2,7 +2,8 @@ module.exports = { type: 'stunned', init: function () { - this.obj.spellbook.stopCasting(); + if (this.obj.spellbook) + this.obj.spellbook.stopCasting(); }, events: { diff --git a/src/server/security/connections.js b/src/server/security/connections.js index 7bd04b83..6f1b0913 100644 --- a/src/server/security/connections.js +++ b/src/server/security/connections.js @@ -77,8 +77,11 @@ module.exports = { (['getCharacterList', 'getCharacter', 'deleteCharacter'].indexOf(msg.method) === -1) ) || ( - (player.dead) && - (msg.data.method !== 'respawn') + player.dead && + !( + (msg.method === 'performAction' && ['respawn', 'notifyServerUiReady'].includes(msg.data.method)) || + (msg.method === 'clientAck') + ) ) ) return; From 6fff5a03a556e0c01049f627b97e96893bc848f6 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sun, 28 Nov 2021 08:42:33 +0200 Subject: [PATCH 42/65] feat #1735 --- src/client/images/abilityIcons.png | Bin 5721 -> 5920 bytes src/client/images/abilityIcons.pyxel | Bin 4849 -> 5005 bytes src/client/js/misc/statTranslations.js | 2 +- .../components/extensions/socialCommands.js | 2 +- src/server/components/spellbook.js | 3 +- src/server/components/stats.js | 6 ++- src/server/config/spells.js | 51 ++++++++++++++++++ .../config/spells/spellSingleTargetHeal.js | 41 ++++++++++++++ src/server/config/spellsConfig.js | 21 ++++++-- src/server/mods/class-necromancer/index.js | 2 +- 10 files changed, 119 insertions(+), 9 deletions(-) create mode 100644 src/server/config/spells/spellSingleTargetHeal.js diff --git a/src/client/images/abilityIcons.png b/src/client/images/abilityIcons.png index 0f6de171785549bbf92da126f772903df4ece570..9885cd344f8a96732528dabb41802ee23e60d99a 100644 GIT binary patch literal 5920 zcmd5=dt6gjw%!SeqCtV765quBtkDXIjtKIQ1nab;7-*$cEC>vuTzN$X3sFc2u|AMm ztSBl7Q9D4H3R*CL0!e7W)Qbp3s{}MjiRGb$5P2k!*WD*1fzfvUzWa}ylXK2qYklkS zt#wY;$AKTso4a@}0ASv>zi-_M02-d6f$c1K7-c-31i-m(+gATi8C{C!g6#19T|$*U zLh|9QPMPbbd$LVgvp#W56(#K4GcWKPb~EYR`$nProGs@%KE&+_>3sh)!mc>S6+b#> zcZZx#z#NgWB077o#4*|~bdP9#x%Oed`i}U<6h)|0WxZFV`uR{Lve>ak%}DRuCu)#f~;=k<;@2t+|ec@=lkl&rXi4-m0A zO&zS$*#Z;+VA#L`YO07`~mJ*8i)P@VhS;i4-Egk~7|I?0k^FR?<-S%%ld zqi)RO+z|+Rv@4d=Q*`Le6?mOy!qF@bpb-%mvjXH`x^U0Ib7DX0)@@oQakl;T(ZRJ@?`LaHA{Xp27F?Ep8g9V#+(fdd7w!nf4ewTNl5s32PYt zJ*Lo!F1Vd-v%iNU7$cm*QFTD1R(BaCWq93#3*V{(lJCuD531#_m}B3LJZb6{abs%m z00MHf3OD)aZG{dX+m6kre^+}ohFICZ1SDsGN~|&4etTcE|E+3I4Zm>pcODB}HG19H z*wcXI6Z1LWk~3ECb@E(spa31`BJgmKOx!u&8xkeb`^Fn6ER;De{}JwKObApqZ5CBZ zzEMV=<*vrx0R4DdPUN1vsS`M05j;bd z^_oTMv-7*P$1fzD&U&Oa^!a_$&ga_xPd_$BioT}o`^OOYZgbMZPXBe|@?XPUA*dcS z*GZ6? zA=ZFfl)t4C9hr+d%S1KP7~)kw@&%O9*{ijjS9Mf-H{4g{OxbusZe;aA4?mZjdGV1r& zyw|<5mPa_nJsJOKu-$(tdDnuB+$tF(z0LiGzUM z!&ySCV=6cjwW^P0hz)vBMaLT#dE3U4!>h&#KYL*3>ox0bd$eEl6Z-4Qz8K85X*fDi z>rT`jNl{(ZXn6&gMZ2m8=p#XIyXudeNLUc`tm?KC&Yw%@EHrd@iIw)t9Cm*#A-Aed zqtK8J*$5pHVC}uNTtBJr+~JYK^-ZAF*M6v*ctY;2`og6sJuKgeT(na=nMQ%(!?4vh zNaaEi4nTODmCh)0FTJuCZedOg+&bKPy!)g!JI8ZenhJ}vV=0dH937!$X!+Fiv5usH ze5HLwO-YzOxbG`wy(-G*1G0t#MNV;=t>u71%rhtFItAwzU6efW=%ZpUiKBLmm5uA{ zELd0te&$3DVkwD}**KOn;AOUZuKP!e@$4J`H)GfkqqQ{QKQkRT0P=NZNnLFgS!+{C z`*NQPy*!mgD)!Ry58hHP*+c>X#U&~7D( zSKaQik51{~x`Ik6*BitJVct=a19kdAmD{5D`|ZX^OX&mDA0iRF=Rn#~DJ;!A`^?x8 zeydg{!jcmgKj2*VAmpW7zwXm!q+g5O;mlTzC%YKiU240sC!+n&Vw*eLf~pBmi&n4h zUb&b~1|d}oAAFxiu`tdbDht^Uq6>yeSALFpL1T+oRd&&i?Q02q=X}EA2hO96j6IP% z6vLxO4+e(GBM^gV|JVc z8R9$3HHaIz+hWgNP3jk~YTTq!%iH?=ehCZ{Rz3A8;LUFAAoT{nGPQ5Wd_DLuMOJ1M zHDqTMQ^!{UpEOe}2*ACtf9R1-%l?LeGKysE>VAhP>)E>$;mf$FtIV zI9{X8*^{$`E~)kb$$86H%BDNaw5O(Xjtx4GLiV~tr#4|<{+RXUQId?AlN!q_&{eW8 zO-4~wQEoigwmkLCqJqh>|Mi$S!+e)pD~pNv`v(+*qNQznatH7e?8)DtRtYaPHr&~3 zfF3e=&63M+v}mN4xvQHG$V*lqOrsr<=R6M>;!MO-kdrebz zf_{W7ptnltVX>xqH%?L%_Xi2PDyEmBS9Z%Dtvw|O1RQJN!F`lNtf10jiqz9z= z2@swx9q(ILx)5YA^V{%MXOJB|_^{(^ z<-?JpT2r}Q%Y*RKSZfxrq`DpTi^Z8!edl|72`D30F*f^ zgq4pIC%@l2EYJ?Nc3jb5L$p}$nsWN<7H64eq!#$rClx36DB@h`1DVbgO41YOuf$oI zQv>pn1twF`R5-(%y$4WMv7>r)Htwh$J3enYMvQ;`Bxp3aj{S62Q-{%TP09_(5Qu1* zut7Y_uc`_ySIwLImI$lWkz!PPYU9o4E1feae&LGd<0ZS&-o1Rs=6Xsd3pR$nXyWNI zy}m5S?tFt$ULx+2ovCRfCH|V~^jmu+48Hozf0d16>9({4j-I0_RtbL~`#nze|5~&g zj&~7ut4`mfhuxBEiMV=(mXVmUNaR02n8q@gklBEG!!%TLtT08Ay_80d(Htxrz zJKOS54&*@haYzR*80m0uZ<9ykKg#!JRMIj}mOc%Az8N zQ4aqSxOl9&2X3u#z*v!42ICo;KC6@EFnyC6T_$lGNS!KGCDzx#a&{2wo4FAhEm88$ zr3OP1DyLw)C%SQ+I*T0}^z3{>R4eCbzx;BjGiDFLc9uozjJ|Ef)=%_V4_P$hw->|< zxLwtwtfDSp%{~YtT(haH-{*ILOSFcH3REA#u z!jBL1(~iV-zfeD^;a=>mhty;$yXKR~+uc1+Z;KLO@fJXvD43BLeb9QtHp_rX9rPM6lli}7)OaN7EJ-)13;e*kd(AZ$3bRB-#=2F#z* z61%)>vYCc(5R4Ln5`gjM9DDMGURO7OxnDa!=;p;<#)p^Z!l+zb~#i!JU-@WI9G2;a& zlZBQ*u{Yj#*1$%)`6oH4a~}oPz|xBqd$c1HzXphk*s0k z-EUG7kxn^KlT$F+gN~>$lp)OKIp@i8@=W6(AgCL}I_rM05#lAR+5Ta}E|eo(`FwRm z+7H}2Hjyv0olsK|pZ1$IOd-PsPGrCHST;68Jmf3bb@#v^He;Y*OQEf;^_e%)1w_&+ zv3>O?+)*bqA8OX46XEf%8%3p%k8bsfR5_c)P^!mmme& zC8pmA^*1SV{J_D7kBO2jQ=FXNjuX`dlEHJnhpn%CWbx!y3J+)K#HIKCc4lp{S1?(q zQuU}9C(%<*fQd#$G6};5;8L&@>(}kxzbHJ9S6CY}92ppR`1fUKvm?wUW#$GT{5K!u z(%4L8TZ#Wv8k(CUcw^v2$mhBBixoFnhr{n4=oi@l6ah?S8T1+e;qG9PBvXyokSTGk9R>sPKHi$- zJ7wZjVok*lM7rU0kNww;s%F}7Vh)Gwx4Qhk$Akj;xHG7FlJf2~WadZG&7=Us2Bwz< z5LxE$fY-rqKGmy88m3KTztf!NY~|zddLn69EDc?PQ8B_?&5im|P9Z(<`K`YB z>@Gq`*T^FLA)GfrBSHX%4W=Bx#>;#BkzGiLU4cMrUjqmWGm zxB&%#_PP?SV4$dAQ#jQ7H6FNr2jgg2d25SmMOo>V2tx#LI{HB<;!2OO$`8{N|B*o_ z_Ow@F{S4_f-4`m#8Yqn>rZa)ID4R0W(} zSydaw@*`MNGC>C-THSH1>iaiS8fymZ0fr4sDFb&$E)+MjV)4449=$5hQo}C>;VWj~ zSl7lezD}dV`6=THtOyG{0<_n78aFH_28BA|Uu;Th%o+LZzNpYC$ThlgHbBAqRA9oZ zNr2xHyA_`&t0j8)#gJS0JeC$FtGap$$9m@8zW|2Wiebc6!xOmBU5FCNT3aOSW_LnC dGZ#BcPyXrn!oG$r&C$s9ZGQ{gTCpXP^M6}Z4oUz3 literal 5721 zcmd5=e_Ya6_rD+{g{J$miEAZn-!0lIu_u2n6D_~n%85O*Z&|1?vwZMJ>MW#`AK|l> zS=rXICN1jKto1afY5qzDT^cznow*b-B`7t;kcEh#_*_ub^=$k8`@R2sE}wfp=bZOB z?{n_CWN)E<=(uRfA^?EnrjLR@0RRc7NPt-YA3Aos5datBrr@Bh?5^QQwK>cBWp$4y z$V>>pIl7>A06}h@+0}{XRgVW|iNpCxRwb_UDDe}WHD!G|-JXPi0P_v6a0=n6>{BK+lc!s@ z62%dVl>HwA1%z54n2@oEi(*BDCB`2|Uf`~xcK`K32- zV-2co={mhiio2CKiCswp`qe2WcLRrztPVYdr|=?fF30lOHL?Z?=|o_$qG*u9ofbQ% z0L}uTuTWMU7C7FogQ){47d=T_hO$B4!kOTN-95Fsb))_5cG7Si?FI*+NmEItB zcH#Hw(VqI=bu7?;HXrW@7&@mOZ9&GUTQ0rRE+Eg!oG*P&55l7H)`E?ZisY!wE0cHNp@;D!v&LixaZaQdOFMb2kse(CBjz0vvEKW zXWv;dLa7a*2g>LXvdd?EIU3$`+`?f~Hve#Rihi}Tk?YpCnBRr#Kei0DixNHD2tmE+ zJ|YwJjsh-vBiu-R86zD7M!SO>s6jqFi2^7#;#${MLmo(@-_Dm=#ns zIVqVkZ(~v;6{-e#7^fz!*?swqQS#S`r_^o8Pnp84S9)HJcmuOhwBjRhcL*jAljoNs>{`4EUWjzofA?T zi&hdUpkW1u19!adEne23jrm_~zczSVh)H}js94t_M@m-hA`j#^A+4N6{wD!|?Hxp- z#jbF#Of8XjxDRj$yyyKz`UZa!ODnpVbwRK6N^lY+hAUcg30Xuj{for{v2dqU?Atno zcR$k?OKEX;dzB|)og&`)*?Tg{ywFC9zXS%pQ)Xx6v0~mFz@e&7(cdSTCNJ74r;Fj5 z-xovh(%`>y6fbP*`$a`6%*J;dq4XLXGs~Z=RAC`$%Es_`I!|K{Am$M+q#_2udWr;R zAM)HHSKNE|%J!YOWcvAKc|ZE4n^JgM?QOH^$IQ>Rd5uz>|1R}gypNp zu2`}a(P+xS@hBOYAq!}K(@|Xi4JF^+I?MgCpC&s%;UD;T+ z{$O0Go*2>9m>EB58l;D$8GGmxf@|y7Y;nMZEDFg>IvADNx(G~znR&pl0Mx8PSU0~r z8BXpyQVlF#*qpVjOQ^cs;3HSd&=-*SEEK$g4f}J zGckDSll-;&oOP1|bv5%9;0^`)ygM390SeoE49m z!}wwCX>3PF3x9jT3>*h>)J}6ie~yu+cK|vnRlka^PmYF=@WO}ZObL$ z!gM&iI`I_UJEYomOZg@b`I8D=C~sHtZ*OD-X@(36E|bbKZKtrW!P8or^=2cQt8u5k zGlK&l=Gkr~L$*(OB3=S({X6_;_h}e9pdJ$eS2XFC3STVhgp$ zAPoVmY%reu{jy{?2O` zg_~K!_7As@)E}HQ4p$fW$tL3}a&vw5d+ZS+cR6EFHjG4DTZoz^9f-*53gwky%}(^1 zsC=9RBuE1L%SS`GGUQU88=i09LEcZT;S8%*uWwcMlkRs3)~s98T5!oJBrWrjz(y!r z#hfozOlPD9XB2wK{~gQZ^LpdcH6 zY|*vJMu1i8fYIGhCTxI(RC=wpvb8-v?CrJbf$i?CMfA#UKUsE6JdZbsv)iqis$`aX zvsJ^TIkeG7!M-nif;W4qxb3sTrWv4YbVbfYfq!5($-Bu#mx$Y59vCb2VS!j|O8JF2At>!_ zIT1G?@o}%z_NN|lGX)1~weh*>gMmki!eBqvz8ASv{`|?AwsWqiXPPfUkFEiUi%>Rz zbEOc>Y5LXOu!|5DIr4@1r(;-FW=$d@S0X|Ovv}J6ezQ5-2fe3=7g?veT%NSm66pNyed! zsWQ^@Cb5TfF<)oca59!|c=mD4Rr0AQhkp!=eOM!@A}{#*^@HI(UEbrhFDB0v_!V(S zwk6!=PO!BXA3P8iYL73rDFKKX9?XL3OivTBcMq4~#$!q5Z%l^L9L=hGZMhYi<#h!a z5#}BFIM~jaPdGh?J*rY+LRchJx$hm#UKmhneb`{#t zk=&bfuQQiGNFIa&5JX_DCYCe>z`Wf#k@J9|Q`MKXdG)+GtpXVcKZWbS<5$6Yy{dNV z(bG1s1YUsTz|+s3Ez$S_6dwS9AkGLn`*R!q3A{3&?$gyuep45FlBzk~?RdQ5v!}V= z!WOZ5Q?Z^6FXga*wCY6hq4)w+P~-?I)4CdgVOv|b@A!Z6HfB5F) zMEtY->(GaLJMs(GQ>ZAo$0`Y7g^LUXpiX=gn^~?PuLsJ@;;vBcJcn7AoAZsqlrl>} z4nw^d_ zpS!5tYi~fz`;Mn$05WjKZ&tIwpNwYR?F7;3zE#6!sM8Wu2p0f3Mo?zo*w{kI`%!zs z?j>hc2`*>^nVBh)efPRtbZR}k1Fwu)t5aDUsCiJyO8^Hy!Zy+HqVhdV-qbH0l+%5_ zZUAMCrnT}|92W>caUPmGNOUzC=G$-!Rll8Z`eCeaf>j;Gr0UrT>%MHwpqzosNPUSJ z#qGo+So0-m*iP77z)Q6*`=83j^muX)4sTFv3LOP(e|HzFT1YYkafT^u8Ctx}fqyZJ z@sH`(kkm*kR@AhGf~lKnW6{s@VGW@FVVFO0;Ap?)VCOLjAcz1kt|CrGWnN+79=ByF z28Kkizu~UWWBFUGhRf5Kr@6)8H4q2hz@*s+4L7DM8#Cg`?oVPUa~lCb@nIM*x~Qw{ zE_h?|^qIHO-Gapy`{qMYG*+^$|M>h_n*nAu@4`o7c6K5i!c#3C`kk~6!3{Q{oo}N5PT*r zCrx3KTklGwMdpm>Z!hG-`qdSBcwQX%cr3s28QI-X{pd%p)OyPM)xYGcwKd53TJzBq z`IGI{3c1c6AfaA9utw42m^ublGqa@!X)qOW{EMu&bGX5x^K4u_Z#1i7Cr(454lmze zg9lBi<29lU*1JCTvvZXS>A1o0;C?pAr9@$8;kQk54P4W(svmY&WfXa7^;fR=&|q4x zTA_sa91ngzU!XshJFJn)rP&o@iy$Lx9D|eJ4MxnAeaCkU=|rlhgJogU|4@T}+`th0 E8%ZwCOaK4? diff --git a/src/client/images/abilityIcons.pyxel b/src/client/images/abilityIcons.pyxel index 8ee1518c5c7f0432d2cdc6ec6c694cb6808208ca..a5ef4277877cb7e985bfaf197995eab74d58e84d 100644 GIT binary patch delta 3795 zcmZu!c{J4R`~J+BVeDfq6-EeILd96J%Wg>aeJMm{WQo`EVOlJeZEQ)lH)I0D{~Azy<(-7uHkHJ=k6DS`ap1ARB`nQ92s8LgS4cbP-t>mwHAC=!QOb ztl|5{!N_7<#0`1oZ+L@V(0fx@+>+~Y{*1{@yU2CXw3Q7}@rQ4dD;5@J$3voCUmv-{Ki@ae7W5}X5-JVncj zdi92=sWs_D>f1)r!&z%yiLSQ~)qMwb22Cx^!@Foj%iuaS_0E%wx;rUcoR0O559xzWBI5$x5z z%=fL9z0zPpZ+3iKt59+GY_)l@}Z@1Hj|Yd_OZ24Z}>le z_hfEt5aXZ#`j3L}9?C1pKFFBMjy{f4n)L7Z98(MNX7~rFJ*VG=4Ai@Ah)Rp+En-W( zNI)?dfHhRitjc1w@Q)jf8%MgV-HcY0e}qJ|EH@D*ggEyC8b5z_-0rR?(xSgPZ3a#( zEy`ctcvZbh3w2c+*@_z?uh2`Eeo=K-P0tcac5hJHSx3SMWj)<@g%@7`a=$sVcCsdX z?BlBsW;NKodym_wQeo>;ze4vaT5b-|NkL1bF)%ua7V5bDAcExFG`8hjGsbUr!MUPG zK`wc(R15B&8~DNb!cB}=i$WDYaaNLgs}SDg-tP7L@md|{Wro%C&Z zH5knPi(O-8+em8pTXNWg3qOhKo;7M5-Zb>EEAa=W^EQJMn|k>z%Vw3iv1qhzMTy3K zE$@A~3q4C;Kah`yP(i!6QY>Xk({}!cX}1{G$uW97>%+CW8J_Vj=}&u1Va`bvw!cb6 zcbXjiz9r2s%ZOXiw_aq>&n#Ev=j9Tzu1A2QQ4T_e^dIm=uoWt>06ISX(n<&Wj9MmK zSBFXH&>1JQkW6M1*YQ)H!UuR)SES2#zp#yW#k*Dpn4Z-vc=_)843mSv?>*DDLkG}5 z*TwRwcj#tj0H`}mmcw=7?;d{ThP)guz#CG>Y`m3VVQ#=q@P`S5kw$vjm&3j+Ijh}s zwm$m!z(e$j{Lz;Rsa@)99(vq=o0VU_Wp$KfA!be2IwoFV^~Fa7@0MZw?hP*sifFxG=S3`!25mb`cxny}CZSC4U|kypExz7p&k`E# zA7AL7A4l91U2V7-$^aVY577hH7E)9Prv@jEFj=ooO-&UH<+tpOTjd`t@8v_^^yEh# z+uFw7si0u_+eOvCus0?*`g4~y3hxV1x(}i^uW8xO53tkJ5#J)(C5XAsQ5;^k!nl3( zEh^58G7#rBABn-zk|$=KMYD9wz=`?0Z|9Z+*@?1EQ*9agQ1C87`IKh#nR&Q*JE&P; z0W@a9^R-pXMb4#i?uX-^?I}p20|IH8-_qrcMIg$FIE%y{A+DcgJ~kH1wJMO9ovb{t zL3%%$#e)T-tU`-|A$i!QvHA33Y4p}Cgv|Pr4}$36d>z#gU9T4{CGZ6Bmuz0$8e2Y3 zU*AE)CQpHyZBi-bS$wPoTMUNudF)-H1*}Sd_Ac=nGlS52Eay-zvlLhE-t=}1lvDeR z+eCv-*iyB80^pJMNJf)bd5OcKf~o+U^v!u71+AvGH3cea!OFHL;gYcQ^dmWm`*yGw z9&J@J<>i z#@P-$eI{Nf3#;4m0c#ru)weGT$!BcVe*Y{3MY1g<^(E=Q^h^3%R?TJsCGIhMdgors zTp1`G-?2Al#pC*Hzr;l|^w&ByO{iTn)OJLNJVZ|rPmH(R%$py+Au60&_kNnzyGa%(qrRi(1-Qq?T1L5&@iSy$ zb6X5oy5UOnwq*}yl)GTT0DO3y_SQW~A9x=87nHa4^+b*z)6{-IrVUq^N1J|m%P~Ih zR~@fI>TH~%&m?z$bvXg`-+0H+{ENy%@_N-X_9BKm4#>m$Zdn3(HqZ`8p&cwx|Mj>B zkF0R95$W*xC~+2a2jRuwmg@j1n5Bb1cOwkq5IH!Pl_nw`;}^#S2Bf~t+gErLTPCkn zQHnBF0X(WUq2yh^0r`=snd{rsJwaeszXG`glSPm_WR{ypG zIJo{IiaC@@k>gL882NY~#N`b)NTaXN#72}@UpSYOdBRlP)Dv7P0FRGfSy&u_R2c-G zB#BG&_H8>LzXFL6yAa@l`TnA6OrycO4ivMKBv9EI;@o=Q*vbTvxOHV_+D{AglFLG6y053*YDo_l$=K4s^D^9qV= zGB?OrCwG(})NL&>CS#Pc>DXC?YR$)tm2Qtu!O`5O8x0{{vyLXS(~K)^+JO!JM#xMb zj`m@`5lXSVo58uNu%^?J^am;yKoH?H%PDX|XIP3+ngbIhV-93SI%rgB@@vU4Kk1%P z6$*;ETBp;15>oqdgta4yo2+*~V$Rr`=u@)&CLCyqiyag6x19ZOJuTSbL;^|n&gi_h zyiq9=X=C+9O?IDP{NNpc1M%rA{2c?e?*4g7vO=`lurfu;?N(L(?2$(a32(eMQf`AY z=ix7db{rqsb*?Z?nL?%RIv_|>uj^eFJKtt%izdeCP_HSx8*p4#5jeLj+S_f}lAc=# z-07moq%P<8<;kLZ}LJ!8K)1n<$_SH3Kcw@AvTM_ZLbH0($J*uU?fZ6;9?EsC6nr z)|I0apP~?*T0b8=>dZt@1~JT65?5Ag*-SlLZrR$+Gcq@+(DE`(eU*t$R<<}~`?9m* zZhV1~m*6%F%j>1mLC0ar5?m7BHV&-HvGFOA)cnksAjW#_^jEZ);ayFWN1!%>eYRQ` z5c?A3d@Y-NDxv}+RjYD)6K2dNI6DuM51IR-FM;dLlkAFD)geK9je^`@eWk)O_@PBGF!T@_V?6aMKhBf&kw(zlNj~7V%_V8`jSoz*= zepRS8CmY*^=gy!C&-a}sS7t_|UdzXI7>`_9eu6UF3W>5{H#n%RZ&DiRy*=8u9I4OP z-)aByTSWnVubE)N8=eFYrl+|dMVb{IJ-JftFx^6vdsZFvqw9^&@l_VCZl7m-)GO}| zt^AVZGTT{DW?EF6nZ}4{@(LBT5-|P4m+rN9OylQ1b#Gyqr$Hq!%FxiNSgCloeRXs} z=0KuAu!PRD&y=pBhhc0Lm6YPu4*Z4}9BK>c4c~X$wFxUTxp7Uk(<}TMtAq4$R^w{G zZi!gl#!h0$h#}TfmG&HZk9Gl0K3YLz$Bjuel!^p_JY`) z$t;uCf)lLEQaltCD!%>R|L04oO2>OG0x_{8qz$-@@o5*Cxo};p^RuL7_~2#in5*yA zkFgzYAFMhH1g>9m$>>>Z>J+iM@J-u-GnK(#C11sh-=p-`_ttdRrUevV-%c#2n1?gB z*(>><#$VmmvF!X%ROYUi{v~4&Dx1lmSX5M3f0ZGuQ!JwEE3A~Vm{&cH_utf+6=>7A zUEO2bP0#dVZpbTZbrrr@&3KA+Iy{t4x1fr$nYi|8bY$Q+-xbd1*8t$z*>$>Qz?vx$LPH z`mC^osOs)sTf}NDML414U~_rWD)mQSc39x+rG`B!NGwUVXns7QLC(4z_IzoCyDR!JdUFr8P6B@dV|MAOh(=zO?n^rZcOb=*DZHF zOD^TQ-tm~KHek`1Ol1!#++fx)+?(Lr+f8C)+N5KXwm}R2Zy64xfT>KmKeP5Z{@(66 zt=qMBZ~(A8RK#JsdphA=?wnEb@p1!M!a@1uT!=J5%-8^PE%4j2-5+sw*M%|_j{F=-M`$JB4`J{Y3hU0H?~RQOsZ2h2>+>@4_b0oJtTp>h`<^U{VU+@faG9|VWv*P1yvIKuP@`zyOW!TZfyC@955Z%=V)c@#0|?ZH*)qambb)X8GCNk$DgGC`f8pn@X^pxmvRA6-AuO(mgA6o$pGIvzq zp)=EX+W`|$;2Tm=+%iL^ulb#j zr6vK+Bn)f$3)K(Wo~1*(AKD}dfC3#y0_bkonWv922wLRxxYdzm`)TE*Bz?e(NtjLt zfA_O02XH)SCN)sOFGBKG*ZU~*YgnPRhdjZ4a~F+bCRk6Y9Q=W>`=H$>ffhO;A^|2Y zQ`fwXfJbGrWA@mDi ztX4Bp+0h23wyM_3X({pYTyq|jXz-+~cPtsqnSVaoVg7N^JvBCsS@=TN8Y*)0HtXjk z=XDSgMPT8KWf%@O*~-{A-NW^l^3II z6=GH@))0dCG)@|K2(VbY@|qj>0D=Uqs7aHCJZ721rzZ9=)`wv6O-TCd{Sp-?To{JG zxp@U;H%X_63ug5|n~`;rC|c-m*Rx=*Dq>NPG;7};S#rVuTr z)1K$$clNI=<~w1!o&(J6MNPajqbQ4}pY*U{06dyW$E{nJ_I^GYTS{FY$)%m+?Sr5{ zf6CBr_E2Z!MdP;0q*L{2{+dJnS*@gKeUJ`lhnm!~XqHJ3-IVygFAp>+!D*4eFaIW# zA*hxk676LndN9u02cKMfGyegt_r5Yr%p93z8Y+rH^r~_{ysvp;T^=0!oWkbA&Z7^~ zM_qfA;NGm8x$H$~`3tZ7<=uY+=GnFvMYnV9Y`XZRdI$> zTWx6!o^G=pe`vm9_RV3}XEoUV`(P7}c-c=L0_gZ}wiqXNWCuwc76+EaC(rHnh!Xs{ zXoYMG##3&CpjKT{7Ps(jz|z{sEr)P53VVpP4clp9?P1o}?%cOcp^qni+A(l>)~dWY z$A~aN+3@@};K+7L_elL%Q|T<(kp%_qYIOTU+c$Mfd#`!`IOm%}mNUiUwJm6E2yIFL zq)=B%uL-xo1fsI*O;#JF6!Lk>S0qUbU1|Ny2AL$X z5eIcV5BHF4YrK=IYH{{U(5wz|^et_LyIPL>vB$*nLS znNWWH(~u#b8#c=RPOcwvcn#4KAFYr0ttSUxW>46K-SO>Hl6I3rOEA>1FL&K44hOQz zk-)T^0`p7R<}sPbZ$WAOlwy<%qd>7?fyCn`fVzINGCGCrzr^$MagLCR(uO>qRe|(hTA6dVJwUj~c56Olh4y)Tj`Q#=% zR8K}vraVd~uex_o{HHtB?nR_V=cwNl*+L+WA~6o$K;W@R#HpH}8X>hvQ|kjacU72E z_}b%)<9SsbV>ooDC%2PsDBoLnoOn(BVB3BgkjRW8l!c2HBn+c!P0P!n%2MR3(0P+*i}il&gwtsPG{Q>@Xe z+gO4^yd^{&rS_A|36EY?9~-taE`inFt-}S)oCb1SAg17yRM?Voz{XyOW&|-tLSQ@! zhEB-=gvLwGuf?LfXu^>ZmM}HmSEp|MBgV1Nt<2?ePCd!($Sm98w~@q)(*i&3wDhI5 zNW@)=;CS_HR^w2SlW#*3?dGagTO9;p_mkS zAFtFa1xs=gmmoQti=6KY%}gj*2uYe6ErbEo{vsD$zef&Q{2ki36c zWOd$s?!T{5))bHPT&*%D|jK_aV;v>zj>I-FCJ!!1%dg2|14<2 zDb&7=!-s2!dPv&-OKiw{d_sTxN>!nPj$b*vp&#nseFAs@z|Y;&<^P5zn;tz5jz^L` MkDg$U=lvD=p9Ju_?EnA( diff --git a/src/client/js/misc/statTranslations.js b/src/client/js/misc/statTranslations.js index 90f4c1d0..ba7d86c1 100644 --- a/src/client/js/misc/statTranslations.js +++ b/src/client/js/misc/statTranslations.js @@ -52,7 +52,7 @@ define([ attackSpeed: 'attack speed', castSpeed: 'cast speed', - lifeOnHit: 'life gained on hit', + lifeOnHit: 'life gained on dealing physical damage', auraReserveMultiplier: 'aura mana reservation multiplier', diff --git a/src/server/components/extensions/socialCommands.js b/src/server/components/extensions/socialCommands.js index 4b63d717..88f905c7 100644 --- a/src/server/components/extensions/socialCommands.js +++ b/src/server/components/extensions/socialCommands.js @@ -549,7 +549,7 @@ module.exports = { die: function () { this.obj.stats.takeDamage({ - amount: 99999 + amount: 20000000 }, 1, this.obj); }, diff --git a/src/server/components/spellbook.js b/src/server/components/spellbook.js index 41013c3c..4f15ea71 100644 --- a/src/server/components/spellbook.js +++ b/src/server/components/spellbook.js @@ -300,7 +300,7 @@ module.exports = { } } - if (spell.spellType === 'buff') { + if (spell.spellType === 'buff' || spell.spellType === 'heal') { if (this.obj.aggro.faction !== target.aggro.faction) return; } else if (target.aggro && !this.obj.aggro.canAttack(target)) { @@ -350,6 +350,7 @@ module.exports = { return false; action.target = this.getTarget(spell, action); + //If a target has become nonSelectable, we need to stop attacks that are queued/auto if (!action.target || action.target.nonSelectable) return false; diff --git a/src/server/components/stats.js b/src/server/components/stats.js index 9c0eb015..1b094f5f 100644 --- a/src/server/components/stats.js +++ b/src/server/components/stats.js @@ -629,7 +629,8 @@ module.exports = { source: source.id, heal: true, amount: amount, - crit: heal.crit + crit: heal.crit, + element: heal.element }, recipients); } @@ -776,6 +777,9 @@ module.exports = { }, afterDealDamage: function (damageEvent, target) { + if (damageEvent.element) + return; + const { obj, values: { lifeOnHit } } = this; if (target === obj || !lifeOnHit) diff --git a/src/server/config/spells.js b/src/server/config/spells.js index fb5e84f8..6a9be26d 100644 --- a/src/server/config/spells.js +++ b/src/server/config/spells.js @@ -212,6 +212,57 @@ let spells = [{ randomSpeed: true, chance: 0.02 } +}, { + name: 'Healing Touch', + description: 'Restore health to a friendly target.', + type: 'singleTargetHeal', + spellType: 'heal', + icon: [0, 3], + animation: 'raiseStaff', + particles: { + scale: { + start: { + min: 6, + max: 16 + }, + end: { + min: 0, + max: 4 + } + }, + speed: { + start: { + min: 2, + max: 12 + }, + end: { + min: 0, + max: 4 + } + }, + lifetime: { + min: 1, + max: 3 + }, + alpha: { + start: 0.45, + end: 0 + }, + color: { + start: ['ffeb38', 'fcfcfc'], + end: ['fcfcfc', 'faac45'] + }, + spawnType: 'circle', + spawnCircle: { + x: 0, + y: 0, + r: 12 + }, + randomScale: true, + randomColor: true, + randomSpeed: true, + chance: 0.02 + } }, { name: 'Holy Vengeance', description: 'Grants holy vengeance to a friendly target. For the duration of the effect, dealing damage will also heal the attacker.', diff --git a/src/server/config/spells/spellSingleTargetHeal.js b/src/server/config/spells/spellSingleTargetHeal.js new file mode 100644 index 00000000..939aeb94 --- /dev/null +++ b/src/server/config/spells/spellSingleTargetHeal.js @@ -0,0 +1,41 @@ +module.exports = { + type: 'singleTargetHeal', + + cdMax: 20, + manaCost: 0, + range: 9, + + healing: 1, + + needLos: true, + targetFriendly: true, + + spellType: 'heal', + particleDuration: 10, + + cast: function (action) { + const target = action.target; + const { x, y } = target; + + const amount = this.getDamage(target, true); + target.stats.getHp(amount, this.obj); + + const effect = { + x, + y, + components: [{ + type: 'particles', + //This ttl is in frames (each frame is roughly 1000 / 60 ms) + ttl: (1000 / 60) * this.particleDuration, + destroyObject: true, + blueprint: this.particles + }] + }; + + this.obj.instance.syncer.queue('onGetObject', effect, -1); + + this.sendBump(target); + + return true; + } +}; diff --git a/src/server/config/spellsConfig.js b/src/server/config/spellsConfig.js index 832a81ec..b7826478 100644 --- a/src/server/config/spellsConfig.js +++ b/src/server/config/spellsConfig.js @@ -76,9 +76,9 @@ let spells = { statType: 'int', statMult: 1, element: 'holy', - cdMax: 5, + cdMax: 15, castTimeMax: 4, - manaCost: 8, + manaCost: 12, range: 9, radius: 3, random: { @@ -87,6 +87,19 @@ let spells = { } }, + 'healing touch': { + statType: 'int', + statMult: 1, + element: 'holy', + cdMax: 5, + castTimeMax: 3, + manaCost: 8, + range: 9, + random: { + healing: [1, 3] + } + }, + slash: { statType: 'str', statMult: 1, @@ -167,11 +180,11 @@ let spells = { statMult: 1, manaCost: 14, needLos: true, - cdMax: 20, + cdMax: 15, castTimeMax: 0, range: 9, random: { - damage: [3, 16], + damage: [3, 18], i_delay: [1, 4] }, negativeStats: [ diff --git a/src/server/mods/class-necromancer/index.js b/src/server/mods/class-necromancer/index.js index 23509459..db4823e2 100644 --- a/src/server/mods/class-necromancer/index.js +++ b/src/server/mods/class-necromancer/index.js @@ -126,7 +126,7 @@ module.exports = { range: 1, random: { damage: [4, 14], - healPercent: [10, 30] + healPercent: [2, 15] } }; From d2a653f1b4de745e22744cc9639863329aab1cde Mon Sep 17 00:00:00 2001 From: Shaun Date: Sun, 28 Nov 2021 13:18:51 +0200 Subject: [PATCH 43/65] bug: Fixed an issue that caused effect sprites never to be removed if their ttl gets set to 0 externally --- src/server/components/effects.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/server/components/effects.js b/src/server/components/effects.js index 4c67fe6f..59656719 100644 --- a/src/server/components/effects.js +++ b/src/server/components/effects.js @@ -290,11 +290,10 @@ module.exports = { for (let i = 0; i < eLen; i++) { let e = effects[i]; - if (e.ttl > 0) { + if (e.ttl > 0) e.ttl--; - if (e.ttl === 0) - e.destroyed = true; - } + else if (e.ttl === 0) + e.destroyed = true; if (e.update) e.update(); From ef51733510e87d6ad89887a2ca6d97a6cbece0d8 Mon Sep 17 00:00:00 2001 From: Shaun Date: Tue, 30 Nov 2021 20:50:59 +0200 Subject: [PATCH 44/65] undo: test code --- src/server/objects/objects.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/server/objects/objects.js b/src/server/objects/objects.js index 4c713d1f..57b825b8 100644 --- a/src/server/objects/objects.js +++ b/src/server/objects/objects.js @@ -251,8 +251,15 @@ module.exports = { if (!storeEntry) { const playerObj = objects.find(o => o.id === toId); - if (!playerObj || playerObj.zoneName !== sourceZone) + if (!playerObj || playerObj.zoneName !== sourceZone) { + io.setAsync({ + key: new Date(), + table: 'error', + value: `ignoring ${e}` + }); + continue; + } store[toId] = { obj: playerObj, From dae9e24080bc790ab41b2e59ff9019d1608af949 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sun, 12 Dec 2021 10:19:34 +0200 Subject: [PATCH 45/65] wall mounted plants no longer flipping --- src/server/config/clientConfig.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/config/clientConfig.js b/src/server/config/clientConfig.js index 75020f0d..1652297c 100644 --- a/src/server/config/clientConfig.js +++ b/src/server/config/clientConfig.js @@ -147,7 +147,7 @@ const config = { //Table Sides 103, 110, 118, 126, //Wall-mounted plants - 120, 122, 140, + 120, 121, //Ship oars 140, 143, //Ship Cannons From 420230b76410c656d13ec22b3d1484d8854a50f9 Mon Sep 17 00:00:00 2001 From: Vildravn Date: Wed, 15 Dec 2021 21:19:46 +0100 Subject: [PATCH 46/65] bug #1877: Move the canBuy check from factionVendor.js to trade.js --- .../components/extensions/factionVendor.js | 19 ------------------- src/server/components/trade.js | 17 ++++++++++++++++- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/server/components/extensions/factionVendor.js b/src/server/components/extensions/factionVendor.js index 5e1d1c03..17c04c79 100644 --- a/src/server/components/extensions/factionVendor.js +++ b/src/server/components/extensions/factionVendor.js @@ -149,25 +149,6 @@ module.exports = { } }, - canBuy: function (itemId, requestedBy, action) { - let item = null; - if (action === 'buy') - item = this.findItem(itemId, requestedBy.name); - else if (action === 'buyback') - item = this.findBuyback(itemId, requestedBy.name); - - let result = true; - if (item.factions) - result = requestedBy.reputation.canEquipItem(item); - - if (!result) { - const message = 'your reputation is too low to buy that item'; - requestedBy.social.notifySelf({ message }); - } - - return result; - }, - findItem: function (itemId, sourceName) { let list = this.items[sourceName]; if (!list) diff --git a/src/server/components/trade.js b/src/server/components/trade.js index 4af96e40..3c72a179 100644 --- a/src/server/components/trade.js +++ b/src/server/components/trade.js @@ -341,7 +341,22 @@ module.exports = { }, canBuy: function (itemId, requestedBy, action) { - return true; + let item = null; + if (action === 'buy') + item = this.findItem(itemId, requestedBy.name); + else if (action === 'buyback') + item = this.findBuyback(itemId, requestedBy.name); + + let result = true; + if (item.factions) + result = requestedBy.reputation.canEquipItem(item); + + if (!result) { + const message = 'your reputation is too low to buy that item'; + requestedBy.social.notifySelf({ message }); + } + + return result; }, findItem: function (itemId, sourceName) { From 7de88f085477a01591dc539be4d194b34ca0bb49 Mon Sep 17 00:00:00 2001 From: Shaun Date: Thu, 27 Jan 2022 19:36:05 +0200 Subject: [PATCH 47/65] bug #1897 --- src/server/components/auth.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 43ad9d46..33033ae5 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -306,7 +306,8 @@ module.exports = { table: 'accountInfo', noDefault: true }) || { - loginStreak: 0 + loginStreak: 0, + level: 0 }; const msgAccountInfo = { @@ -395,7 +396,8 @@ module.exports = { }); this.accountInfo = { - loginStreak: 0 + loginStreak: 0, + level: 0 }; await io.setAsync({ From a2f67d7397a3dc32dc271c4e235dcdb9631287aa Mon Sep 17 00:00:00 2001 From: Shaun Date: Mon, 31 Jan 2022 20:42:37 +0200 Subject: [PATCH 48/65] feat #1756: Removed the notifyServerUisReady method and just made the client only send the ack to the instancer once UIs ARE ready instead --- src/client/js/system/client.js | 7 +- src/client/ui/factory.js | 11 +- src/server/components/player.js | 6 - src/server/package-lock.json | 2578 +++++++++++++++++++++- src/server/security/connections.js | 2 +- src/server/security/routerConfig.js | 3 +- src/server/world/instancer.js | 3 +- src/server/world/instancer/handshakes.js | 6 +- 8 files changed, 2587 insertions(+), 29 deletions(-) diff --git a/src/client/js/system/client.js b/src/client/js/system/client.js index 98b1a030..ed28c285 100644 --- a/src/client/js/system/client.js +++ b/src/client/js/system/client.js @@ -94,13 +94,8 @@ define([ }, getMap: function (eventName, msgs) { + events.emit('onBuildIngameUis'); events.emit('onGetMap', msgs[0]); - - client.request({ - threadModule: 'instancer', - method: 'clientAck', - data: {} - }); }, onGetObject: function (eventName, msgs) { diff --git a/src/client/ui/factory.js b/src/client/ui/factory.js index 282e066a..a83d2a33 100644 --- a/src/client/ui/factory.js +++ b/src/client/ui/factory.js @@ -19,7 +19,7 @@ define([ if (root) this.root = root + '/'; - events.on('onEnterGame', this.onEnterGame.bind(this)); + events.on('onBuildIngameUis', this.onEnterGame.bind(this)); events.on('onUiKeyDown', this.onUiKeyDown.bind(this)); events.on('onResize', this.onResize.bind(this)); @@ -58,12 +58,9 @@ define([ ); client.request({ - cpn: 'player', - method: 'performAction', - data: { - cpn: 'player', - method: 'notifyServerUiReady' - } + threadModule: 'instancer', + method: 'clientAck', + data: {} }); }, diff --git a/src/server/components/player.js b/src/server/components/player.js index 3caa4373..f5475a6c 100644 --- a/src/server/components/player.js +++ b/src/server/components/player.js @@ -276,11 +276,5 @@ module.exports = { msg.data.data.callbackId = atlas.registerCallback(msg.callback); atlas.performAction(this.obj, msg.data); - }, - - notifyServerUiReady: function () { - this.obj.instance.eventEmitter.emit('onPlayerUiReady', { - obj: this.obj - }); } }; diff --git a/src/server/package-lock.json b/src/server/package-lock.json index 0e099441..f4bb591a 100644 --- a/src/server/package-lock.json +++ b/src/server/package-lock.json @@ -1,8 +1,2578 @@ { "name": "isleward_server", "version": "0.10.5", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "isleward_server", + "version": "0.10.5", + "dependencies": { + "axios": "^0.22.0", + "bcrypt-nodejs": "0.0.3", + "compression": "^1.7.4", + "express": "^4.17.1", + "express-minify": "^1.0.0", + "image-size": "^1.0.0", + "rethinkdbdash": "^2.3.31", + "socket.io": "^4.2.0", + "universal-analytics": "^0.5.1" + }, + "devDependencies": { + "babel-eslint": "^10.1.0", + "eslint": "^7.32.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-requirejs": "^4.0.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.8.3" + } + }, + "node_modules/@babel/generator": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", + "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.9.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.8.3" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.8.3" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "dev": true + }, + "node_modules/@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "node_modules/@babel/traverse": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "node_modules/@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "node_modules/@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" + }, + "node_modules/@types/node": { + "version": "16.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.3.tgz", + "integrity": "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==" + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/axios": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.22.0.tgz", + "integrity": "sha512-Z0U3uhqQeg1oNcihswf4ZD57O3NrR1+ZXhxaROaWpDmsDTx7T2HNBV2ulBtie2hwJptu8UvgnJoK+BIqdzh/1w==", + "dependencies": { + "follow-redirects": "^1.14.4" + } + }, + "node_modules/babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": ">= 4.12.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/bcrypt-nodejs": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/bcrypt-nodejs/-/bcrypt-nodejs-0.0.3.tgz", + "integrity": "sha1-xgkX8m3CNWYVZsaBBhwwPCsohCs=", + "deprecated": "bcrypt-nodejs is no longer actively maintained. Please use bcrypt or bcryptjs. See https://github.com/kelektiv/node.bcrypt.js/wiki/bcrypt-vs-brypt.js to learn more about these two options" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.2.0.tgz", + "integrity": "sha512-d1DexkQx87IFr1FLuV+0f5kAm1Hk1uOVijLOb+D1sDO2QMb7YjE02VHtZtxo7xIXMgcWLb+vl3HRT0rI9tr4jQ==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.0", + "ws": "~7.4.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.3.tgz", + "integrity": "sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA==", + "dependencies": { + "base64-arraybuffer": "0.1.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-requirejs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-requirejs/-/eslint-plugin-requirejs-4.0.1.tgz", + "integrity": "sha512-7SCBeOZha5E1TGRxbfvNypG0/1Da3gonaT8IeWfNN9iUriamtnwXrGwYipEFr/yMHNCHRpua4LL/7DSov6aUEQ==", + "dev": true, + "dependencies": { + "ignore": "5.0.5" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": ">=3.0.0" + } + }, + "node_modules/eslint-plugin-requirejs/node_modules/ignore": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.0.5.tgz", + "integrity": "sha512-kOC8IUb8HSDMVcYrDVezCxpJkzSQWTAzf3olpKM6o9rM5zpojx23O0Fl8Wr4+qJ6ZbPEHqf1fdwev/DS7v7pmA==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/eslint/node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/eslint/node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/eslint/node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express-minify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/express-minify/-/express-minify-1.0.0.tgz", + "integrity": "sha512-04/iYxB79jGeNZBBkbAW7L7FMG4Wtu78F1SayXIKiJD6MfqYnOI3DD8no7QOntgedYCdYUpj+Skg8QWR/2WnMQ==", + "dependencies": { + "clean-css": "^4.1.7", + "on-headers": "^1.0.1", + "uglify-js": "^3.0.28" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz", + "integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dependencies": { + "mime-db": "1.43.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/rethinkdbdash": { + "version": "2.3.31", + "resolved": "https://registry.npmjs.org/rethinkdbdash/-/rethinkdbdash-2.3.31.tgz", + "integrity": "sha512-6nXrKFjdg2Ug0YpdmPWSvyD/2EisHnFNt4FWZ74dcXGK48ievSv+cNFTmVv+KjLi6I9CCf6w4CKZ6yCYTfMfdQ==", + "dependencies": { + "bluebird": ">= 3.0.1" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/socket.io": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.2.0.tgz", + "integrity": "sha512-sjlGfMmnaWvTRVxGRGWyhd9ctpg4APxWAxu85O/SxekkxHhfxmePWZbaYCkeX5QQX0z1YEnKOlNt6w82E4Nzug==", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~5.2.0", + "socket.io-adapter": "~2.3.2", + "socket.io-parser": "~4.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.2.tgz", + "integrity": "sha512-PBZpxUPYjmoogY0aoaTmo1643JelsaS1CiAwNjRVdrI0X9Seuc19Y2Wife8k88avW6haG8cznvwbubAZwH4Mtg==" + }, + "node_modules/socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dependencies": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", + "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uglify-js": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.1.tgz", + "integrity": "sha512-W7KxyzeaQmZvUFbGj4+YFshhVrMBGSg2IbcYAjGWGvx8DHvJMclbTDMpffdxFUGPBHjIytk7KJUR/KUXstUGDw==", + "dependencies": { + "commander": "~2.20.3", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/universal-analytics": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.5.1.tgz", + "integrity": "sha512-raLjYsNQmJbK0o8veSU9GXA5XG/YhfuZDzWCAB4SNDnPI4ozXLrbFSDZiRENdOFEIUqmdUTYcaQCOa0Y36EtsQ==", + "dependencies": { + "debug": "^4.1.1", + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=12.18.2" + } + }, + "node_modules/universal-analytics/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/universal-analytics/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + }, "dependencies": { "@babel/code-frame": { "version": "7.8.3", @@ -269,7 +2839,8 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} }, "ajv": { "version": "6.12.0", @@ -1949,7 +4520,8 @@ "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} }, "yallist": { "version": "4.0.0", diff --git a/src/server/security/connections.js b/src/server/security/connections.js index 6f1b0913..61ae3ee5 100644 --- a/src/server/security/connections.js +++ b/src/server/security/connections.js @@ -79,7 +79,7 @@ module.exports = { ( player.dead && !( - (msg.method === 'performAction' && ['respawn', 'notifyServerUiReady'].includes(msg.data.method)) || + (msg.method === 'performAction' && ['respawn'].includes(msg.data.method)) || (msg.method === 'clientAck') ) ) diff --git a/src/server/security/routerConfig.js b/src/server/security/routerConfig.js index f0f0fa86..966b6dee 100644 --- a/src/server/security/routerConfig.js +++ b/src/server/security/routerConfig.js @@ -18,8 +18,7 @@ const routerConfig = { wardrobe: ['open', 'apply'], stats: ['respawn'], passives: ['tickNode', 'untickNode'], - workbench: ['open', 'craft', 'getRecipe'], - player: ['notifyServerUiReady'] + workbench: ['open', 'craft', 'getRecipe'] }, globalAllowed: { clientConfig: ['getClientConfig'], diff --git a/src/server/world/instancer.js b/src/server/world/instancer.js index 742f160b..c99c5a29 100644 --- a/src/server/world/instancer.js +++ b/src/server/world/instancer.js @@ -230,10 +230,11 @@ module.exports = { }); }, + //This function fires when the player logs in the first time, not upon rezone onAddObject: function (obj) { if (obj.player) { obj.stats.onLogin(); - eventEmitter.emit('onAfterPlayerEnterZone', obj); + eventEmitter.emit('onAfterPlayerEnterZone', obj, { isTransfer: false }); } questBuilder.obtain(obj); diff --git a/src/server/world/instancer/handshakes.js b/src/server/world/instancer/handshakes.js index c082f502..c4c6a8ce 100644 --- a/src/server/world/instancer/handshakes.js +++ b/src/server/world/instancer/handshakes.js @@ -20,14 +20,14 @@ const stageZoneIn = msg => { const doZoneIn = function (staged) { const { onAddObject, instances: [ { objects, questBuilder, eventEmitter } ] } = instancer; - const { transfer, obj } = staged; + const { transfer: isTransfer, obj } = staged; - if (!transfer) + if (!isTransfer) objects.addObject(obj, onAddObject.bind(instancer)); else { let o = objects.transferObject(obj); questBuilder.obtain(o); - eventEmitter.emit('onAfterPlayerEnterZone', o); + eventEmitter.emit('onAfterPlayerEnterZone', o, { isTransfer }); } }; From 2361d8be9008955c707300548e06aefa4007aef6 Mon Sep 17 00:00:00 2001 From: Shaun Date: Mon, 31 Jan 2022 20:48:17 +0200 Subject: [PATCH 49/65] chore: Fixed npm audit issues --- src/server/package-lock.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/server/package-lock.json b/src/server/package-lock.json index f4bb591a..d16828ac 100644 --- a/src/server/package-lock.json +++ b/src/server/package-lock.json @@ -721,9 +721,9 @@ } }, "node_modules/engine.io": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.2.0.tgz", - "integrity": "sha512-d1DexkQx87IFr1FLuV+0f5kAm1Hk1uOVijLOb+D1sDO2QMb7YjE02VHtZtxo7xIXMgcWLb+vl3HRT0rI9tr4jQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.2.1.tgz", + "integrity": "sha512-hyNxjVgWp619QMfqi/+/6/LQF+ueOIWeVOza3TeyvxUGjeT9U/xPkkHW/NJNuhbStrxMujEoMadoc2EY7DDEnw==", "dependencies": { "accepts": "~1.3.4", "base64id": "2.0.0", @@ -1362,9 +1362,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", - "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==", "funding": [ { "type": "individual", @@ -3153,9 +3153,9 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "engine.io": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.2.0.tgz", - "integrity": "sha512-d1DexkQx87IFr1FLuV+0f5kAm1Hk1uOVijLOb+D1sDO2QMb7YjE02VHtZtxo7xIXMgcWLb+vl3HRT0rI9tr4jQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.2.1.tgz", + "integrity": "sha512-hyNxjVgWp619QMfqi/+/6/LQF+ueOIWeVOza3TeyvxUGjeT9U/xPkkHW/NJNuhbStrxMujEoMadoc2EY7DDEnw==", "requires": { "accepts": "~1.3.4", "base64id": "2.0.0", @@ -3640,9 +3640,9 @@ "dev": true }, "follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", - "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==" }, "forwarded": { "version": "0.1.2", From 405591e71e4cd2c692d9b2abc066f494f1159e91 Mon Sep 17 00:00:00 2001 From: Shaun Date: Tue, 1 Feb 2022 20:46:19 +0200 Subject: [PATCH 50/65] feat #1882 --- src/server/world/atlas.js | 9 +++++---- src/server/world/worker.js | 2 ++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/server/world/atlas.js b/src/server/world/atlas.js index 8d06d6df..9a0a7c7a 100644 --- a/src/server/world/atlas.js +++ b/src/server/world/atlas.js @@ -128,15 +128,16 @@ module.exports = { mapList.mapList.filter(m => !m.disabled).forEach(m => this.spawnMap(m)); }, spawnMap: function (map) { - let worker = childProcess.fork('./world/worker'); - let thread = { + const worker = childProcess.fork('./world/worker', [map.name]); + + const thread = { id: this.nextId++, name: map.name, path: map.path, - worker: worker + worker }; - let onMessage = this.onMessage.bind(this, thread); + const onMessage = this.onMessage.bind(this, thread); worker.on('message', function (m) { onMessage(m); }); diff --git a/src/server/world/worker.js b/src/server/world/worker.js index f3ab787d..360090c1 100644 --- a/src/server/world/worker.js +++ b/src/server/world/worker.js @@ -22,6 +22,8 @@ const itemEffects = require('../items/itemEffects'); const profanities = require('../misc/profanities'); const eventEmitter = require('../misc/events'); +instancer.mapName = process.argv[2]; + let onCpnsReady = async function () { factions.init(); skins.init(); From 0e5255fff38392fb54bcfc5f802f23ebc4891525 Mon Sep 17 00:00:00 2001 From: Shaun Date: Wed, 2 Feb 2022 06:55:28 +0200 Subject: [PATCH 51/65] chore: supporting changes for druid skin fix and reverted rezone role level to 10 --- src/server/components/extensions/socialCommands.js | 2 +- src/server/config/clientConfig.js | 3 ++- src/server/config/skins.js | 5 ----- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/server/components/extensions/socialCommands.js b/src/server/components/extensions/socialCommands.js index 88f905c7..5cef379d 100644 --- a/src/server/components/extensions/socialCommands.js +++ b/src/server/components/extensions/socialCommands.js @@ -39,7 +39,7 @@ let commandRoles = { setPassword: 10, giveSkin: 10, getMaterials: 10, - rezone: 0, + rezone: 10, startEvent: 10, stopEvent: 10, teleport: 10, diff --git a/src/server/config/clientConfig.js b/src/server/config/clientConfig.js index 1652297c..6b6a2d47 100644 --- a/src/server/config/clientConfig.js +++ b/src/server/config/clientConfig.js @@ -44,7 +44,8 @@ const config = { 'images/tiles.png': 8, 'images/walls.png': 8, 'images/objects.png': 8, - 'images/mobs.png': 8 + 'images/mobs.png': 8, + 'images/characters.png': 8 }, blockingTileIndices: [ 6, 7, 54, 55, 62, 63, 154, 189, 190, 192, 193, 194, 195, 196, 197 diff --git a/src/server/config/skins.js b/src/server/config/skins.js index a6025a13..b674330a 100644 --- a/src/server/config/skins.js +++ b/src/server/config/skins.js @@ -18,11 +18,6 @@ const config = { sprite: [2, 0], defaultSpirit: 'bear', default: true - }, - //Faction Skins - 'gaekatlan-druid': { - name: 'Gaekatlan Druid', - sprite: [0, 1] } }; From 9649f960ac34b853069f823e4e365b8460c06c63 Mon Sep 17 00:00:00 2001 From: Shaun Date: Wed, 2 Feb 2022 07:00:41 +0200 Subject: [PATCH 52/65] Removed gaekatlan druid sprite --- src/client/images/characters.png | Bin 368 -> 320 bytes src/client/images/characters.pyxel | Bin 2707 -> 2564 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/client/images/characters.png b/src/client/images/characters.png index 0c07522b1fbe6922ce667976fc8c60f028e75ea6..3c12b31269bc00c28805f4301bd4473460be4684 100644 GIT binary patch delta 293 zcmV+=0owlX0>A>0B!34AA2@j)EC<5qdK;9T!JaR(wg%%*U%w8W zKzKaM;6Dh1ViA`IK{0RNoBMxbl)?W~rTYIt0fHue z2!lL<%Y*j4Y5%>BIR4)lW$^!0ss4XZfFR3*#6V`i0%1r60DlO891M;{Xf{Ch0Lb$o z55tl_2qOmo$m6hpfdwWgwG62MxKQB$4ggqQMh_g2he0t5^CWUA0m;K+-_I}Re`Z$R z&`JRf%Fh31McMoZ(Xc>3E(1WG2PJ=4tRu5w02Dab*rQ++3^4#I3x2I}1t;M@Y2Qay zQU;aeAPfowY)*}xVGqizt>NteP(gRkdENgJ<#|}_gR%gq&L2^+4~lhIV+R!b*jj_b nI`4y00Lb&OR50RFz(@rEnouG_qR59S00000NkvXXu0mjfUAL0? diff --git a/src/client/images/characters.pyxel b/src/client/images/characters.pyxel index 0badcd8303d581ff7a71d8388cb1a097f856cba1..8e0267fbe8b552d141a65f945f0f2a660d0a30df 100644 GIT binary patch delta 1689 zcmZux2{hDe6#tK97RJ`28J>*g6+M%srl@#^@JbBTlqF@1gu;kamhrb#RAe#}O`a{K zUPa_t${;aG8fD6}q$v9`#y-Y)yqQzyb?SA``Q3BR_ucRJ`_8@RUb@;@RnTR(w2UeM zz~O+8nGLay45_*!4FJ6g0DuGl;0VRX*88Nl(XlW}Fel?x>N^9~SiaCuH>dRKM@acl zS5TQ=Syfv(cb4?$Q?xU7>t)}l7-HKJUmiW0!K7(zOLQU#k^Cu36B;Iyx8+fL-&-wF z|FO)Ql#Wc@PWP_n1h9N3Z@{1}unQYa%gXi>4JQf%o*b^I5OprCBUjLtCno1R);Oi! z3$nK)#$n$hcLgmxi$)LNI%OSKdu{^O9dJZp!>(_7NOlX!-b*SbuO?rL&+F)JEHY1w zW|QmGiskw*mdc_uHSl^(sQY;|T2ZB2ahm#V1@6>!wU7E7@Pgo_4ADi0Q2#poT;onw zfZi>#=7|R$x7}MpqWK;>>8?6PHf)VJLwnYSO&?FhU1&e&3AeyBh`29Qo$@2(YPiYk zcXW$Fxp$=0n2}!3i2JpTN2z&D$M@(>P~D5hpl!_Q*N2a84(3y>kKTM5kzhQ4ZRAxy zxapYFAgE!=fbRK^;{*eMi)vDomqDx?E>(HZ715fz7%M2;EPY`V@u7nJWFsyHJ|mAe zZ!xrq7TI-+?h@l{4);>!J@9djBUC%@8h;DyLV>1?2L-$Et3UchGt2l0?Nd1W>C!5P z$#-lPW%ReC88}KM+wP3kM|MQZ8@Rp-K~GcH;!`uIS0nacobD$>-I^ac_Xe}=bKwh3 zIlf9kmVAy+`4pDA^l7U|>Rf*^GG%(A&w|2V-TXFa!wH`_C$ z)a#bv%vD$)5w$-Z9F2OvCNW`R=pn0hzkB(<+aRXjEn@(8_aX7nSa#W#X9JZvSI3i? z3Qk5_mKwYDw4VKaNFgnP^#*kiRQI(~z}$M|P+1kvYw%B}>pIOevxWCz`>wdZ({&0? zJ7PA{KjiuRgFk1`zVE1yx5K<(6^Ec-JC;##WwIVRa=sdu6k2m|q^9tA5XHf0ZKQJW zZVVXM&5P^{K^3&VU3~mtET-8lAS%rEz9?0_1yxHuWqL}K>Xc%4{T--0zwJ|!POVM7%6&n*M*GT&*TE%BS{yKK4qp+@ z!1R>=s^%?Y%p`ZTcK%#Q(FJ4S&jUXxc-oWujS z(sk4T?ZyNtfH7+giN(UEko0P7%ysTVCbjx zhzkYmvLo0Q*^uJDttb7g?0Ff<#-uAkOFjqn(5lZtJgiPZay5f-NZ7vbpyY3# zjZ61Ls9Q*K?(r$oWbt8u7?Li3H7nUKJvTK93HJM5iC%)xkZO{pa}cQQ5*`-&hRHSY vV+jynNyJeM6aY>J1p5A%1|z3oZVCIGvGGSj|CQu_#8UJVa+*+oxJ2z=F8$Qu delta 1856 zcmZuy3pm?X6#u7Q@qRR_9&Knb^$5CnEy`H5EQ(eu)GD6K7*UUqG$KW-SjjYmc&t+z zYZTQYZHdR?(bcoFlxjUn(K4b+Q_n1>-@bM0z2CX_eD|L7JNKM>&b=2QG*yZRN=zIA z0AMgsUmAX5G)U5>TnqrlO?uX30&1GvY1shljYEZp8 zm>TbM(znFxCc;~B;>eag=lRiZRfabMdW zojCse4ftdliD%doojOTE-wgN5ya!gTkf_@GroKD1Q$pWQEm~(WL5Yt-`NC7C54|@; zFy*57T`rY+hKE<0uDm{Zz;u>e(ra`=XMya4V`=ahOZ|Q!syIH`A*8I0m|{9*+&Ryw zzTREbCTL>pI$iQ0i6WQ+wDl%N)pR|Qrj>u)2-68W1zl{)4fxsPNb5RX&O5b3F(45H z?j$;;@te{}nBuVhhq8^;Wh%P+%LS^xCq5>4FCMo6*N%EG@;pAz$s=MOYPZj2Tw2x3 z8E5}M9E;u3?mhSolCb9m@nYB8qH<-o14T!zk%YFqV+q8zJj&nWu>_|!H1d(oizRk7@QWiZkOQrL6iY(1__M`n>Z|~2YH!GMzGDEirgYFb2yK_C*&$3b-8^FtI zR?m%CTiBS=elnF((3NZ3V3090JzU$l<^SNOK~w%6gMu0htFT`(0<~gKysBqhvw(F> zM%jn*hFJ~$x~mpyth;AFBb73+K>=s*gEBpC6-|Yg+1ZQSk+1^R;RQFiS}@zrBcd5i z_v}@cXWy`bEl}b(QQd0H*0sh3!7xHo0@Rv|#$s71Gl=<6a=s5rP z@LpZlM^9pT&w?yW(|bAVCVmQ~gBmLJf)!<3d1a6jK`W`J-^W-gtSI! zzAcBHDLb8n61H;_)YeIpXE-u&_y9VkVxZ_C#Avfl?>_8ZnzsOoDC$e>A{(zh?{kcy z9&yH4v6(WQk(`D<3LCC{T-U^x4+F^{03e7+MpW0~0mP7KGuSzt1QtX9U8Ze`=~3)m zkPfE^!}D}b*e(a9PI4aHF$0_omNY%zb|Bg5>l!;VB}Ds@U(4Z4cYmFv#-vM`p;r&! zHBbl#37h;yU&igkl`4`L*Q9}cTS#S$xawz~bzbp-QR(Re#=ntiB7ZEt6M9o$XWmapA@gK zXt4$0#rGM}Q*v;k00S;gZpbP}|KyMFfp%OXRebxQr435d>@Zg(8+I6!RIB{E{s8SJ~CIOILTclKj%dz(=0og3n4b~-WbHn+-zG`3&q)=s7gFr$xEt_5fp$TZfd70BG&0y6x_!+5rqs66JMA&8 z2duv1(=1ryi#Ul7`DQN4H|*c2{{oF8H#TR9^r#||{s8b{lBC&5t0A^+HMU Date: Thu, 3 Feb 2022 18:38:26 +0200 Subject: [PATCH 53/65] balance #1883 --- src/server/config/spellsConfig.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/server/config/spellsConfig.js b/src/server/config/spellsConfig.js index b7826478..74e0edd2 100644 --- a/src/server/config/spellsConfig.js +++ b/src/server/config/spellsConfig.js @@ -143,7 +143,6 @@ let spells = { cdMax: 12, castTimeMax: 2, manaCost: 7, - noDrop: true, random: { i_range: [1, 2.5], damage: [4, 18] @@ -169,7 +168,6 @@ let spells = { castTimeMax: 3, range: 10, manaCost: 7, - noDrop: true, random: { damage: [8, 35], i_stunDuration: [4, 7] From 432f6d8ad1bc368ee7fa4fca1d8bd053f4117753 Mon Sep 17 00:00:00 2001 From: Shaun Date: Thu, 3 Feb 2022 18:44:13 +0200 Subject: [PATCH 54/65] #1735 --- src/server/config/spellsConfig.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/config/spellsConfig.js b/src/server/config/spellsConfig.js index 74e0edd2..a865fef4 100644 --- a/src/server/config/spellsConfig.js +++ b/src/server/config/spellsConfig.js @@ -181,6 +181,7 @@ let spells = { cdMax: 15, castTimeMax: 0, range: 9, + isAttack: true, random: { damage: [3, 18], i_delay: [1, 4] @@ -230,7 +231,7 @@ let spells = { auraRange: 9, effect: 'swiftness', random: { - chance: [5, 10] + chance: [8, 20] } } From 9bb27ba98cc7c9fc3cfe3f66e8c28a8d5f8fbf28 Mon Sep 17 00:00:00 2001 From: Shaun Date: Fri, 4 Feb 2022 07:55:51 +0200 Subject: [PATCH 55/65] bug #1886: Added new position args back for physics.removeObject --- src/server/objects/objBase.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/objects/objBase.js b/src/server/objects/objBase.js index 699c1caf..c5e193e5 100644 --- a/src/server/objects/objBase.js +++ b/src/server/objects/objBase.js @@ -313,7 +313,7 @@ module.exports = { this.y = yNew; if (physics.addObject(this, xNew, yNew)) - physics.removeObject(this, xOld, yOld); + physics.removeObject(this, xOld, yOld, xNew, yNew); else { this.x = xOld; this.y = yOld; From 15489e24ae4a0879fc540857a2f074452ae036a1 Mon Sep 17 00:00:00 2001 From: Shaun Date: Fri, 4 Feb 2022 07:57:01 +0200 Subject: [PATCH 56/65] feat #1885: Refactored stash and stash events --- src/client/ui/templates/stash/stash.js | 69 +++++++---- src/server/clientComponents/stash.js | 46 +------- src/server/components/auth.js | 1 - src/server/components/player.js | 4 +- src/server/components/stash.js | 156 ++++++++++++++----------- 5 files changed, 140 insertions(+), 136 deletions(-) diff --git a/src/client/ui/templates/stash/stash.js b/src/client/ui/templates/stash/stash.js index 04d856ed..f44a39f6 100644 --- a/src/client/ui/templates/stash/stash.js +++ b/src/client/ui/templates/stash/stash.js @@ -22,33 +22,38 @@ define([ hoverItem: null, items: [], + maxItems: null, modal: true, hasClose: true, postRender: function () { - this.onEvent('onGetStashItems', this.onGetStashItems.bind(this)); - this.onEvent('onDestroyStashItems', this.onDestroyStashItems.bind(this)); - this.onEvent('onKeyDown', this.onKeyDown.bind(this)); - this.onEvent('onKeyUp', this.onKeyUp.bind(this)); - this.onEvent('onOpenStash', this.toggle.bind(this)); + [ + 'onKeyUp', + 'onKeyDown', + 'onOpenStash', + 'onAddStashItems', + 'onRemoveStashItems' + ] + .forEach(e => { + this.onEvent(e, this[e].bind(this)); + }); }, build: function () { - this.el.removeClass('scrolls'); - if (window.player.stash.maxItems > 50) - this.el.addClass('scrolls'); + const { el, maxItems, items } = this; - let container = this.el.find('.grid') - .empty(); + el.removeClass('scrolls'); + if (maxItems > 50) + el.addClass('scrolls'); - let items = this.items; - let iLen = Math.max(items.length, window.player.stash.maxItems); + const container = this.el.find('.grid').empty(); - for (let i = 0; i < iLen; i++) { - let item = items[i]; + const renderItemCount = Math.max(items.length, maxItems); - let itemEl = renderItem(container, item); + for (let i = 0; i < renderItemCount; i++) { + const item = items[i]; + const itemEl = renderItem(container, item); if (!item) continue; @@ -126,14 +131,30 @@ define([ this.build(); }, - onDestroyStashItems: function (itemIds) { - itemIds.forEach(function (id) { - let item = this.items.find(i => i.id === id); + onAddStashItems: function (addItems) { + const { items } = this; + + addItems.forEach(newItem => { + const existIndex = items.findIndex(i => i.id === newItem.id); + if (existIndex !== -1) + items.splice(existIndex, 1, newItem); + else + items.push(newItem); + }); + }, + + onRemoveStashItems: function (removeItemIds) { + const { items } = this; + + console.log(removeItemIds); + + removeItemIds.forEach(id => { + const item = items.find(i => i.id === id); if (item === this.hoverItem) this.hideTooltip(); - this.items.spliceWhere(i => i.id === id); - }, this); + items.spliceWhere(i => i.id === id); + }); if (this.shown) this.build(); @@ -155,8 +176,12 @@ define([ events.emit('onHideContextMenu'); }, - onOpenStash: function () { - this.build(); + onOpenStash: function ({ items, maxItems }) { + this.maxItems = maxItems; + + this.show(); + + this.onGetStashItems(items); }, beforeDestroy: function () { diff --git a/src/server/clientComponents/stash.js b/src/server/clientComponents/stash.js index 7e51bf1a..0ae7e4ce 100644 --- a/src/server/clientComponents/stash.js +++ b/src/server/clientComponents/stash.js @@ -1,49 +1,7 @@ -define([ - 'js/system/events' -], function ( - events -) { +define([], function () { return { type: 'stash', - active: false, - - items: null, - - init: function () { - events.emit('onGetStashItems', this.items); - }, - - extend: function (blueprint) { - if (blueprint.has('active')) - this.active = blueprint.active; - - if (blueprint.getItems) { - let items = this.items; - let newItems = blueprint.getItems || []; - let nLen = newItems.length; - - for (let i = 0; i < nLen; i++) { - let nItem = newItems[i]; - let nId = nItem.id; - - let findItem = items.find(f => f.id === nId); - if (findItem) { - $.extend(true, findItem, nItem); - - newItems.splice(i, 1); - i--; - nLen--; - } - } - - this.items.push.apply(this.items, blueprint.getItems || []); - - events.emit('onGetStashItems', this.items); - } - - if (blueprint.destroyItems) - events.emit('onDestroyStashItems', blueprint.destroyItems); - } + init: function () {} }; }); diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 33033ae5..774afd5b 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -177,7 +177,6 @@ module.exports = { this.characters[charName] = character; await this.getCustomChannels(character); - await this.getStash(); await this.verifySkin(character); diff --git a/src/server/components/player.js b/src/server/components/player.js index f5475a6c..d5d04e32 100644 --- a/src/server/components/player.js +++ b/src/server/components/player.js @@ -70,9 +70,7 @@ module.exports = { faction: 'players' }); obj.addComponent('gatherer'); - obj.addComponent('stash', { - items: character.stash - }); + obj.addComponent('stash'); let blueprintEffects = character.components.find(c => c.type === 'effects') || {}; if (blueprintEffects.effects) { diff --git a/src/server/components/stash.js b/src/server/components/stash.js index 129294a9..e1da02ba 100644 --- a/src/server/components/stash.js +++ b/src/server/components/stash.js @@ -1,121 +1,129 @@ +//System +const eventEmitter = require('../misc/events'); + +//Helpers +const fixes = require('../fixes/fixes'); const cpnInventory = require('./inventory'); const { isItemStackable } = require('./inventory/helpers'); +//Config const maxItemsBase = 50; +//Component module.exports = { type: 'stash', active: false, - items: [], + items: null, changed: false, maxItems: maxItemsBase, - init: function (blueprint) { - let items = blueprint.items || []; - let iLen = items.length; - for (let i = 0; i < iLen; i++) - this.getItem(items[i]); + init: function (blueprint) {}, + + getItemsFromDb: async function () { + const { obj } = this; + + this.items = await io.getAsync({ + key: obj.account, + table: 'stash', + isArray: true, + clean: true + }); - delete blueprint.items; + fixes.fixStash(this.items); - this.blueprint = blueprint; + await eventEmitter.emit('onAfterGetStash', { + obj: obj, + stash: this.items + }); }, getItem: function (item) { - //Material? - let exists = false; + const { items } = this; + if (isItemStackable(item)) { - let existItem = this.items.find(i => i.name === item.name); + const existItem = items.find(i => i.name === item.name); if (existItem) { - exists = true; if (!existItem.quantity) existItem.quantity = 1; - existItem.quantity += (item.quantity || 1); + + existItem.quantity += (+item.quantity || 1); //We modify the old object because it gets sent to the client item.id = existItem.id; item.quantity = existItem.quantity; item = existItem; + + return; } } //Get next id - if (!exists) { - let id = 0; - let items = this.items; - let iLen = items.length; - for (let i = 0; i < iLen; i++) { - let fItem = items[i]; - if (fItem.id >= id) - id = fItem.id + 1; - } - item.id = id; - } + let id = 0; + items.forEach(i => { + if (i.id >= id) + id = i.id + 1; + }); + item.id = id; - if (!exists) - this.items.push(item); + items.push(item); }, deposit: function (item) { - if (!this.active) + const { active, items, maxItems, obj } = this; + + if (!active) return; - else if (this.items.length >= this.maxItems) { - let isStackable = this.items.some(stashedItem => item.name === stashedItem.name && (isItemStackable(stashedItem))); + + else if (items.length >= maxItems) { + const isStackable = items.some(stashedItem => item.name === stashedItem.name && isItemStackable(stashedItem)); if (!isStackable) { const message = 'You do not have room in your stash to deposit that item'; - this.obj.social.notifySelf({ message }); + obj.social.notifySelf({ message }); return; } } + this.getItem(item); - this.obj.syncer.setArray(true, 'stash', 'getItems', item); + const sendItem = cpnInventory.simplifyItem.call({ obj: {} }, item); + + obj.instance.syncer.queue('onAddStashItems', [sendItem], [obj.serverId]); this.changed = true; return true; }, - destroyItem: function (id) { - let item = this.items.find(i => i.id === id); - if (!item) - return; - - this.items.spliceWhere(i => i === item); - - this.obj.syncer.setArray(true, 'stash', 'destroyItems', id); - - this.changed = true; - }, - withdraw: function (id) { - if (!this.active) + const { active, items, obj } = this; + + if (!active) return; - let item = this.items.find(i => i.id === id); + let item = items.find(i => i.id === id); if (!item) return; - else if (!this.obj.inventory.hasSpace(item)) { + else if (!obj.inventory.hasSpace(item)) { const message = 'You do not have room in your inventory to withdraw that item'; - this.obj.social.notifySelf({ message }); + obj.social.notifySelf({ message }); return; } - this.obj.inventory.getItem(item); - this.items.spliceWhere(i => i === item); + obj.inventory.getItem(item); + items.spliceWhere(i => i === item); - this.obj.syncer.setArray(true, 'stash', 'destroyItems', id); + obj.instance.syncer.queue('onRemoveStashItems', [id], [obj.serverId]); this.changed = true; }, setActive: function (active) { - let obj = this.obj; + const { obj } = this; this.active = active; obj.syncer.set(true, 'stash', 'active', this.active); @@ -131,33 +139,49 @@ module.exports = { }); let msg = 'Press U to access your Shared Stash'; - this.obj.instance.syncer.queue('onGetAnnouncement', { - src: this.obj.id, + obj.instance.syncer.queue('onGetAnnouncement', { + src: obj.id, msg: msg }, [obj.serverId]); - - if (this.active && this.items.length > this.maxItems) { - const message = `You have more than ${this.maxItems} items in your stash. In the future, these items will be lost.`; - obj.social.notifySelf({ message }); - } }, - open: function () { - const { active, obj } = this; + open: async function () { + if (!this.items) + await this.getItemsFromDb(); + + const { obj, active, maxItems, items } = this; + + if (!active) + return; + + const sendItems = items.map(i => cpnInventory.simplifyItem.call({ obj: {} }, i)); + + const msg = { + maxItems, + items: sendItems + }; + + obj.instance.syncer.queue('onOpenStash', msg, [obj.serverId]); - if (active) - obj.instance.syncer.queue('onOpenStash', {}, [obj.serverId]); + if (items.length > maxItems) { + const message = `You have more than ${maxItems} items in your stash. In the future, these items will be lost.`; + obj.social.notifySelf({ message }); + } }, simplify: function (self) { if (!self) return null; + return { type: 'stash' }; + }, + + simplifyTransfer: function () { + const { type, items } = this; + return { - type: 'stash', - active: this.active, - items: this.items, - maxItems: this.maxItems + type, + items }; }, From a59e9e2a3cb6c1c235eba3cf93e387b192454497 Mon Sep 17 00:00:00 2001 From: Shaun Date: Fri, 4 Feb 2022 14:22:23 +0200 Subject: [PATCH 57/65] bug #1885: Fixed a crash --- src/server/components/auth.js | 9 +++++++-- src/server/components/stash.js | 8 ++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 774afd5b..1106b4e7 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -114,10 +114,15 @@ module.exports = { }, doSaveStash: async function () { + const { username, obj: { stash } } = this; + + if (!stash.changed) + return; + await io.setAsync({ - key: this.username, + key: username, table: 'stash', - value: this.obj.stash.serialize(), + value: stash.serialize(), clean: true, serialize: true }); diff --git a/src/server/components/stash.js b/src/server/components/stash.js index e1da02ba..d9918986 100644 --- a/src/server/components/stash.js +++ b/src/server/components/stash.js @@ -87,14 +87,14 @@ module.exports = { } } + this.changed = true; + this.getItem(item); const sendItem = cpnInventory.simplifyItem.call({ obj: {} }, item); obj.instance.syncer.queue('onAddStashItems', [sendItem], [obj.serverId]); - this.changed = true; - return true; }, @@ -114,12 +114,12 @@ module.exports = { return; } + this.changed = true; + obj.inventory.getItem(item); items.spliceWhere(i => i === item); obj.instance.syncer.queue('onRemoveStashItems', [id], [obj.serverId]); - - this.changed = true; }, setActive: function (active) { From 95c1ab57db54d892f37f922a981dd7b28ecfd727 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 5 Feb 2022 16:09:00 +0200 Subject: [PATCH 58/65] bug #1890: chat files will no longer replace existing chats in zonefiles --- src/server/world/map.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/server/world/map.js b/src/server/world/map.js index 07d250e8..776223e4 100644 --- a/src/server/world/map.js +++ b/src/server/world/map.js @@ -85,8 +85,13 @@ module.exports = { try { chats = require('../' + this.path + '/' + this.name + '/chats'); } catch (e) {} - if (chats) - this.zone.chats = chats; + + if (chats) { + if (this.zone.chats) + extend(this.zone.chats, chats); + else + this.zone.chats = chats; + } let dialogues = null; try { From e01d859d88a30cff87a320e414db82fa76fee944 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 5 Feb 2022 16:20:37 +0200 Subject: [PATCH 59/65] chore: updated version to 0.10.6 --- src/client/package.json | 2 +- src/client/ui/templates/login/template.html | 4 ++-- src/client/ui/templates/stash/stash.js | 2 -- src/server/config/serverConfig.js | 2 +- src/server/package.json | 2 +- 5 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/client/package.json b/src/client/package.json index 6d51d70b..ce64147b 100644 --- a/src/client/package.json +++ b/src/client/package.json @@ -1,6 +1,6 @@ { "name": "isleward_client", - "version": "0.10.5", + "version": "0.10.6", "description": "isleward", "dependencies": { }, diff --git a/src/client/ui/templates/login/template.html b/src/client/ui/templates/login/template.html index 4767c033..d62be9ef 100644 --- a/src/client/ui/templates/login/template.html +++ b/src/client/ui/templates/login/template.html @@ -11,11 +11,11 @@
-
[ Latest Release Notes ]
+
[ Latest Release Notes ]
Pledge on Patreon
Donate on Paypal
Access the Wiki
-
v0.10.5
+
v0.10.6
diff --git a/src/client/ui/templates/stash/stash.js b/src/client/ui/templates/stash/stash.js index f44a39f6..1f1cb5b2 100644 --- a/src/client/ui/templates/stash/stash.js +++ b/src/client/ui/templates/stash/stash.js @@ -146,8 +146,6 @@ define([ onRemoveStashItems: function (removeItemIds) { const { items } = this; - console.log(removeItemIds); - removeItemIds.forEach(id => { const item = items.find(i => i.id === id); if (item === this.hoverItem) diff --git a/src/server/config/serverConfig.js b/src/server/config/serverConfig.js index b04099c6..0ab213e6 100644 --- a/src/server/config/serverConfig.js +++ b/src/server/config/serverConfig.js @@ -1,5 +1,5 @@ module.exports = { - version: '0.10.5', + version: '0.10.6', port: 4000, startupMessage: 'Server: ready', defaultZone: 'fjolarok', diff --git a/src/server/package.json b/src/server/package.json index e14d5258..17c49a9a 100644 --- a/src/server/package.json +++ b/src/server/package.json @@ -1,6 +1,6 @@ { "name": "isleward_server", - "version": "0.10.5", + "version": "0.10.6", "description": "isleward", "dependencies": { "axios": "^0.22.0", From 82919c1f77f746e031bdeac88d6df0ca07c343ed Mon Sep 17 00:00:00 2001 From: Shaun Date: Mon, 7 Feb 2022 20:19:48 +0200 Subject: [PATCH 60/65] bug #1893 --- src/client/ui/templates/inventory/inventory.js | 18 +++++++++--------- src/server/clientComponents/serverActions.js | 4 ++++ src/server/components/stash.js | 10 ++++++++-- src/server/config/serverConfig.js | 2 +- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/client/ui/templates/inventory/inventory.js b/src/client/ui/templates/inventory/inventory.js index 1669071c..3427767c 100644 --- a/src/client/ui/templates/inventory/inventory.js +++ b/src/client/ui/templates/inventory/inventory.js @@ -328,17 +328,17 @@ define([ ctxConfig.push(menuItems.divider); } - if ((!item.eq) && (!item.active)) { - if (!item.quest) { - if ((window.player.stash.active) && (!item.noStash)) - ctxConfig.push(menuItems.stash); + if (!item.eq && !item.active && !item.quest) { + const isAtStash = window.player.serverActions.hasAction('openStash'); - if (!item.noDrop) - ctxConfig.push(menuItems.drop); + if (isAtStash && !item.noStash) + ctxConfig.push(menuItems.stash); - if ((!item.material) && (!item.noSalvage)) - ctxConfig.push(menuItems.salvage); - } + if (!item.noDrop) + ctxConfig.push(menuItems.drop); + + if (!item.material && !item.noSalvage) + ctxConfig.push(menuItems.salvage); } if (item.quantity > 1 && !item.quest) diff --git a/src/server/clientComponents/serverActions.js b/src/server/clientComponents/serverActions.js index b1bc09a5..2c7c2763 100644 --- a/src/server/clientComponents/serverActions.js +++ b/src/server/clientComponents/serverActions.js @@ -14,6 +14,10 @@ define([ this.hookEvent('onKeyUp', this.onKeyUp.bind(this)); }, + hasAction: function (actionId) { + return this.actions.some(a => a.id === actionId); + }, + onKeyUp: function (key) { this.actions.forEach(function (a) { if (a.key !== key) diff --git a/src/server/components/stash.js b/src/server/components/stash.js index d9918986..21fe119b 100644 --- a/src/server/components/stash.js +++ b/src/server/components/stash.js @@ -71,7 +71,10 @@ module.exports = { items.push(item); }, - deposit: function (item) { + deposit: async function (item) { + if (!this.items) + await this.getItemsFromDb(); + const { active, items, maxItems, obj } = this; if (!active) @@ -126,10 +129,10 @@ module.exports = { const { obj } = this; this.active = active; - obj.syncer.set(true, 'stash', 'active', this.active); const actionType = active ? 'addActions' : 'removeActions'; obj.syncer.setArray(true, 'serverActions', actionType, { + id: 'openStash', key: 'u', action: { targetId: obj.id, @@ -138,6 +141,9 @@ module.exports = { } }); + if (!this.active) + return; + let msg = 'Press U to access your Shared Stash'; obj.instance.syncer.queue('onGetAnnouncement', { src: obj.id, diff --git a/src/server/config/serverConfig.js b/src/server/config/serverConfig.js index 0ab213e6..1e643ddd 100644 --- a/src/server/config/serverConfig.js +++ b/src/server/config/serverConfig.js @@ -8,7 +8,7 @@ module.exports = { // sqlite // rethink //eslint-disable-next-line no-process-env - db: process.env.IWD_DB || 'sqlite', + db: process.env.IWD_DB || 'rethink', //eslint-disable-next-line no-process-env dbHost: process.env.IWD_DB_HOST || 'localhost', //eslint-disable-next-line no-process-env From 03fbbe7446beeb98c605d1f52c704321b1f774e2 Mon Sep 17 00:00:00 2001 From: Shaun Date: Mon, 7 Feb 2022 20:20:56 +0200 Subject: [PATCH 61/65] chore: fixed serverConfig --- src/server/config/serverConfig.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/config/serverConfig.js b/src/server/config/serverConfig.js index 1e643ddd..0ab213e6 100644 --- a/src/server/config/serverConfig.js +++ b/src/server/config/serverConfig.js @@ -8,7 +8,7 @@ module.exports = { // sqlite // rethink //eslint-disable-next-line no-process-env - db: process.env.IWD_DB || 'rethink', + db: process.env.IWD_DB || 'sqlite', //eslint-disable-next-line no-process-env dbHost: process.env.IWD_DB_HOST || 'localhost', //eslint-disable-next-line no-process-env From ce8970c068a0ce791ef8f4a1d64699cde81c1791 Mon Sep 17 00:00:00 2001 From: Shaun Date: Wed, 9 Feb 2022 20:12:09 +0200 Subject: [PATCH 62/65] bug #1891: fixed various identified bugs --- src/client/ui/factory.js | 4 ++-- src/client/ui/templates/characters/characters.js | 1 - .../ui/templates/createCharacter/createCharacter.js | 1 - src/server/components/inventory.js | 13 +++++-------- src/server/objects/objBase.js | 2 +- 5 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/client/ui/factory.js b/src/client/ui/factory.js index a83d2a33..e2b608e8 100644 --- a/src/client/ui/factory.js +++ b/src/client/ui/factory.js @@ -19,7 +19,7 @@ define([ if (root) this.root = root + '/'; - events.on('onBuildIngameUis', this.onEnterGame.bind(this)); + events.on('onBuildIngameUis', this.onBuildIngameUis.bind(this)); events.on('onUiKeyDown', this.onUiKeyDown.bind(this)); events.on('onResize', this.onResize.bind(this)); @@ -31,7 +31,7 @@ define([ }); }, - onEnterGame: async function () { + onBuildIngameUis: async function () { events.clearQueue(); await Promise.all( diff --git a/src/client/ui/templates/characters/characters.js b/src/client/ui/templates/characters/characters.js index 139c2c9f..cb236b13 100644 --- a/src/client/ui/templates/characters/characters.js +++ b/src/client/ui/templates/characters/characters.js @@ -97,7 +97,6 @@ define([ onPlay: function () { this.el.removeClass('disabled'); this.destroy(); - events.emit('onEnterGame'); }, onNewClick: function () { diff --git a/src/client/ui/templates/createCharacter/createCharacter.js b/src/client/ui/templates/createCharacter/createCharacter.js index 56a9508a..f91d6e64 100644 --- a/src/client/ui/templates/createCharacter/createCharacter.js +++ b/src/client/ui/templates/createCharacter/createCharacter.js @@ -151,7 +151,6 @@ define([ if (!result) { this.clear(); this.destroy(); - events.emit('onEnterGame'); } else this.el.find('.message').html(result); }, diff --git a/src/server/components/inventory.js b/src/server/components/inventory.js index 7c4a9abc..f1f3b8c4 100644 --- a/src/server/components/inventory.js +++ b/src/server/components/inventory.js @@ -272,19 +272,16 @@ module.exports = { this.obj.syncer.setArray(true, 'inventory', 'getItems', item); }, - stashItem: function (id) { - let item = this.findItem(id); + stashItem: async function (id) { + const item = this.findItem(id); if (!item || item.quest || item.noStash) return; delete item.pos; - let stash = this.obj.stash; - if (!stash.active) - return; - - let clonedItem = extend({}, item); - const success = stash.deposit(clonedItem); + const stash = this.obj.stash; + const clonedItem = extend({}, item); + const success = await stash.deposit(clonedItem); if (!success) return; diff --git a/src/server/objects/objBase.js b/src/server/objects/objBase.js index c5e193e5..a7726b3a 100644 --- a/src/server/objects/objBase.js +++ b/src/server/objects/objBase.js @@ -312,7 +312,7 @@ module.exports = { this.x = xNew; this.y = yNew; - if (physics.addObject(this, xNew, yNew)) + if (physics.addObject(this, xNew, yNew, xOld, yOld)) physics.removeObject(this, xOld, yOld, xNew, yNew); else { this.x = xOld; From 727fa7d1d7645a45c0d31c0419d9bac7b8430fc4 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sun, 13 Feb 2022 15:28:35 +0200 Subject: [PATCH 63/65] bug #1897: Ui's are now only built on initial zone-in --- src/client/ui/factory.js | 51 +++++++++++++------- src/client/ui/templates/mainMenu/mainMenu.js | 8 ++- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/src/client/ui/factory.js b/src/client/ui/factory.js index e2b608e8..9d02b76a 100644 --- a/src/client/ui/factory.js +++ b/src/client/ui/factory.js @@ -14,6 +14,7 @@ define([ return { uis: [], root: '', + ingameUisBuilt: false, init: function (root) { if (root) @@ -32,30 +33,34 @@ define([ }, onBuildIngameUis: async function () { - events.clearQueue(); + if (!this.ingameUisBuilt) { + events.clearQueue(); - await Promise.all( - globals.clientConfig.uiList.map(u => { - const uiType = u.path ? u.path.split('/').pop() : u; + await Promise.all( + globals.clientConfig.uiList.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; + } client.request({ threadModule: 'instancer', @@ -166,6 +171,16 @@ define([ } }, + exitGame: function () { + $('[class^="ui"]:not(.ui-container)').toArray().forEach(el => { + let ui = $(el).data('ui'); + if (ui && ui.destroy) + ui.destroy(); + }); + + this.ingameUisBuilt = false; + }, + getUi: function (type) { return this.uis.find(u => u.type === type); } diff --git a/src/client/ui/templates/mainMenu/mainMenu.js b/src/client/ui/templates/mainMenu/mainMenu.js index 42051cf4..a7ac296b 100644 --- a/src/client/ui/templates/mainMenu/mainMenu.js +++ b/src/client/ui/templates/mainMenu/mainMenu.js @@ -66,11 +66,9 @@ define([ sound.unload(); events.emit('onShowCharacterSelect'); - $('[class^="ui"]:not(.ui-container)').toArray().forEach(el => { - let ui = $(el).data('ui'); - if (ui && ui.destroy) - ui.destroy(); - }); + + factory.exitGame(); + factory.build('characters', {}); }, From cdea255e4f40f5c0f5928a1f75561cae014e46e6 Mon Sep 17 00:00:00 2001 From: Shaun Date: Mon, 14 Feb 2022 17:50:30 +0200 Subject: [PATCH 64/65] bug #1898 --- src/server/components/auth.js | 7 ++++++- src/server/components/social.js | 2 +- src/server/misc/messages.js | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 1106b4e7..bbe21089 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -348,8 +348,13 @@ module.exports = { register: async function (msg) { let credentials = msg.data; - if ((credentials.username === '') || (credentials.password === '')) { + if (credentials.username === '' || credentials.password === '') { msg.callback(messages.login.allFields); + + return; + } else if (credentials.username.length > 32) { + msg.callback(messages.login.maxUsernameLength); + return; } diff --git a/src/server/components/social.js b/src/server/components/social.js index c7c60da0..fc0692a7 100644 --- a/src/server/components/social.js +++ b/src/server/components/social.js @@ -86,7 +86,7 @@ module.exports = { return; let source = cons.players.find(c => c.id === sourceId); - if (!source) + if (!source || !source.social) return; source.social.sendMessage('invite sent', 'color-yellowB'); diff --git a/src/server/misc/messages.js b/src/server/misc/messages.js index 3dedcf04..21d08662 100644 --- a/src/server/misc/messages.js +++ b/src/server/misc/messages.js @@ -5,7 +5,8 @@ module.exports = { allFields: 'please complete all fields', illegal: 'illegal characters in username', incorrect: 'invalid username and password', - charExists: 'character name is taken' + charExists: 'character name is taken', + maxUsernameLength: 'username may not be longer than 32 characters' }, createCharacter: { nameLength: 'name must be between 3 and 12 characters' From 8ef0fea789f26cddddc2a470d178ea9128083673 Mon Sep 17 00:00:00 2001 From: Shaun Date: Mon, 14 Feb 2022 18:33:13 +0200 Subject: [PATCH 65/65] chore: fixed npm audit issue --- src/server/package-lock.json | 60 +++++++++++------------------------- 1 file changed, 18 insertions(+), 42 deletions(-) diff --git a/src/server/package-lock.json b/src/server/package-lock.json index d16828ac..90ba298e 100644 --- a/src/server/package-lock.json +++ b/src/server/package-lock.json @@ -1,12 +1,12 @@ { "name": "isleward_server", - "version": "0.10.5", + "version": "0.10.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "isleward_server", - "version": "0.10.5", + "version": "0.10.6", "dependencies": { "axios": "^0.22.0", "bcrypt-nodejs": "0.0.3", @@ -188,22 +188,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/@eslint/eslintrc/node_modules/debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -339,15 +323,19 @@ } }, "node_modules/ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/ansi-colors": { @@ -1362,9 +1350,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", - "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==", + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", "funding": [ { "type": "individual", @@ -2728,18 +2716,6 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, "debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -2843,9 +2819,9 @@ "requires": {} }, "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -3640,9 +3616,9 @@ "dev": true }, "follow-redirects": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", - "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==" + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==" }, "forwarded": { "version": "0.1.2",