diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 53b8d323..a57ac4b9 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -101,7 +101,7 @@ module.exports = { simple.components.spliceWhere(c => c.type === 'stash'); let stats = simple.components.find(c => c.type === 'stats'); - stats.values = extend(true, {}, stats.values); + stats.values = extend({}, stats.values); let social = simple.components.find(c => c.type === 'social'); delete social.party; @@ -140,7 +140,7 @@ module.exports = { delete extensionObj.callback; } - extend(true, simple, extensionObj); + extend(simple, extensionObj); io.set({ ent: this.charname, diff --git a/src/server/components/chatter.js b/src/server/components/chatter.js index 9880fd80..287d82c1 100644 --- a/src/server/components/chatter.js +++ b/src/server/components/chatter.js @@ -9,7 +9,7 @@ module.exports = { global: false, init: function (blueprint) { - this.chats = extend(true, [], blueprint.chats); + this.chats = extend([], blueprint.chats); this.cd = ~~(Math.random() * this.cdMax); for (let p in blueprint) { diff --git a/src/server/components/components.js b/src/server/components/components.js index 745cbcca..79d14cfe 100644 --- a/src/server/components/components.js +++ b/src/server/components/components.js @@ -33,7 +33,7 @@ module.exports = { }, onGetComponent: function (template) { - template = extend(true, {}, componentBase, template); + template = extend({}, componentBase, template); this.components[template.type] = template; } }; diff --git a/src/server/components/cpnAggro.js b/src/server/components/cpnAggro.js new file mode 100644 index 00000000..02d72bf2 --- /dev/null +++ b/src/server/components/cpnAggro.js @@ -0,0 +1,328 @@ +module.exports = class Aggro { + constructor () { + this.type = 'aggro'; + this.range = 7; + this.faction = null; + this.physics = null; + this.list = []; + this.ignoreList = []; + } + + init (blueprint) { + this.physics = this.obj.instance.physics; + + blueprint = blueprint || {}; + + if (blueprint.faction) + this.faction = blueprint.faction; + + //TODO: Why don't we move if faction is null? + if (!this.has('faction')) + return; + + if (this.physics.width > 0) + this.move(); + } + + simplify (self) { + return { + type: 'aggro', + faction: this.faction + }; + } + + move () { + if (this.obj.dead) + return; + + let result = { + success: true + }; + this.obj.fireEvent('beforeAggro', result); + if (!result.success) + return; + + let obj = this.obj; + + //If we're attacking something, don't try and look for more trouble. SAVE THE CPU! + // this only counts for mobs, players can have multiple attackers + let list = this.list; + if (obj.isMob) { + let lLen = list.length; + for (let i = 0; i < lLen; i++) { + let l = list[i]; + + let lThreat = l.obj.aggro.getHighest(); + if (lThreat) { + l.obj.aggro.list.forEach(function (a) { + a.obj.aggro.unIgnore(lThreat); + }); + } + + l.obj.aggro.unIgnore(obj); + if (l.threat > 0) + return; + } + } else { + let lLen = list.length; + for (let i = 0; i < lLen; i++) { + let targetAggro = list[i].obj.aggro; + //Maybe the aggro component has been removed? + if (targetAggro) + targetAggro.unIgnore(obj); + } + } + + let x = obj.x; + let y = obj.y; + + //find mobs in range + let range = this.range; + let inRange = this.physics.getArea(x - range, y - range, x + range, y + range, (c => (((!c.player) || (!obj.player)) && (!obj.dead) && (c.aggro) && (c.aggro.willAutoAttack(obj))))); + + if (inRange.length === 0) + return; + + let iLen = inRange.length; + for (let i = 0; i < iLen; i++) { + let enemy = inRange[i]; + + //The length could change + let lLen = list.length; + for (let j = 0; j < lLen; j++) { + //Set the enemy to null so we need we need to continue + if (list[j].obj === enemy) + enemy = null; + } + if (!enemy) + continue; + + //Do we have LoS? + if (!this.physics.hasLos(x, y, enemy.x, enemy.y)) + continue; + + if (enemy.aggro.tryEngage(obj)) + this.tryEngage(enemy, 0); + } + } + + canAttack (target) { + let obj = this.obj; + if (target === obj) + return false; + else if ((target.player) && (obj.player)) { + let hasButcher = (obj.prophecies.hasProphecy('butcher')) && (target.prophecies.hasProphecy('butcher')); + + if ((!target.social.party) || (!obj.social.party)) + return hasButcher; + else if (target.social.partyLeaderId !== obj.social.partyLeaderId) + return hasButcher; + return false; + } else if ((target.follower) && (target.follower.master.player) && (obj.player)) + return false; + else if (obj.player) + return true; + else if (target.aggro.faction !== obj.aggro.faction) + return true; + else if (!!target.player !== !!obj.player) + return true; + } + + willAutoAttack (target) { + if (this.obj === target) + return false; + + let faction = target.aggro.faction; + if (!faction || !this.faction) + return false; + + let rep = this.obj.reputation; + if (!rep) { + let targetRep = target.reputation; + if (!targetRep) + return false; + return (targetRep.getTier(this.faction) < 3); + } + + return (rep.getTier(faction) < 3); + } + + ignore (obj) { + this.ignoreList.spliceWhere(o => o === obj); + this.ignoreList.push(obj); + } + + unIgnore (obj) { + this.ignoreList.spliceWhere(o => o === obj); + } + + tryEngage (obj, amount, threatMult) { + //Don't aggro yourself, stupid + if (obj === this.obj) + return; + + let result = { + success: true + }; + this.obj.fireEvent('beforeAggro', result); + if (!result.success) + return false; + + //Mobs shouldn't aggro players that are too far from their home + let mob = this.obj.mob; + if (!mob) + mob = obj.mob; + if (mob) { + let notMob = (obj === mob) ? this.obj : obj; + if (!mob.canChase(notMob)) + return false; + } + + let oId = obj.id; + let list = this.list; + + amount = amount || 0; + threatMult = threatMult || 1; + + let exists = list.find(l => l.obj.id === oId); + if (exists) { + exists.damage += amount; + exists.threat += amount * threatMult; + } else { + let l = { + obj: obj, + damage: amount, + threat: amount * threatMult + }; + + list.push(l); + } + + //this.sortThreat(); + + return true; + } + + getFirstAttacker () { + let first = this.list.find(l => ((l.obj.player) && (l.damage > 0))); + if (first) + return first.obj; + return null; + } + + die () { + let list = this.list; + let lLen = list.length; + + for (let i = 0; i < lLen; i++) { + let l = list[i]; + if (!l) { + lLen--; + continue; + } + //Maybe the aggro component was removed? + let targetAggro = l.obj.aggro; + if (targetAggro) { + targetAggro.unAggro(this.obj); + i--; + lLen--; + } + } + + this.list = []; + } + + unAggro (obj, amount) { + let list = this.list; + let lLen = list.length; + + for (let i = 0; i < lLen; i++) { + let l = list[i]; + + if (l.obj !== obj) + continue; + + if (!amount) { + list.splice(i, 1); + obj.aggro.unAggro(this.obj); + break; + } else { + l.threat -= amount; + if (l.threat <= 0) { + list.splice(i, 1); + obj.aggro.unAggro(this.obj); + break; + } + } + } + + this.ignoreList.spliceWhere(o => o === obj); + + //Stuff like cocoons don't have spellbooks + if (this.obj.spellbook) + this.obj.spellbook.unregisterCallback(obj.id, true); + + if ((this.list.length === 0) && (this.obj.mob) && (!this.obj.follower)) + this.obj.stats.resetHp(); + } + + sortThreat () { + this.list.sort(function (a, b) { + return (b.threat - a.threat); + }); + } + + getHighest () { + if (this.list.length === 0) + return null; + + let list = this.list; + let lLen = list.length; + + let highest = null; + let closest = 99999; + + let thisObj = this.obj; + let x = thisObj.x; + let y = thisObj.y; + + for (let i = 0; i < lLen; i++) { + let l = list[i]; + let obj = l.obj; + + if (this.ignoreList.some(o => o === obj)) + continue; + + if (!highest || l.threat > highest.threat) { + highest = l; + closest = Math.max(Math.abs(x - obj.x), Math.abs(y - obj.y)); + } else if (l.threat === highest.threat) { + let distance = Math.max(Math.abs(x - obj.x), Math.abs(y - obj.y)); + if (distance < closest) { + highest = l; + closest = distance; + } + } + } + + if (highest) + return highest.obj; + + //We have aggro but can't reach our target. Don't let the mob run away as if not in combat! + return true; + } + + update () { + let list = this.list; + let lLen = list.length; + + for (let i = 0; i < lLen; i++) { + let l = list[i]; + if (l.obj.destroyed) { + this.unAggro(l.obj); + i--; + lLen--; + } + } + } +}; diff --git a/src/server/components/dialogue.js b/src/server/components/dialogue.js index 779004b8..2ea8019e 100644 --- a/src/server/components/dialogue.js +++ b/src/server/components/dialogue.js @@ -92,7 +92,7 @@ module.exports = { if (stateConfig.cpn) { let cpn = sourceObj[stateConfig.cpn]; - let newArgs = extend(true, [], stateConfig.args); + let newArgs = extend([], stateConfig.args); newArgs.push(this.obj); result = cpn[stateConfig.method].apply(cpn, newArgs); @@ -102,14 +102,14 @@ module.exports = { return this.getState(sourceObj, stateConfig.goto.failure); } if (result) { - useMsg = extend(true, [], useMsg); + useMsg = extend([], useMsg); useMsg[0].msg = result; } else return null; } else if (stateConfig.method) { let methodResult = stateConfig.method.call(this.obj, sourceObj); if (methodResult) { - useMsg = extend(true, [], useMsg); + useMsg = extend([], useMsg); useMsg[0].msg = methodResult; } @@ -191,7 +191,7 @@ module.exports = { teleport: function (msg) { this.obj.syncer.set(true, 'dialogue', 'state', null); - let portal = extend(true, {}, require('./portal'), msg); + let portal = extend({}, require('./portal'), msg); portal.collisionEnter(this.obj); }, diff --git a/src/server/components/effects.js b/src/server/components/effects.js index 4673fea3..164e2a2d 100644 --- a/src/server/components/effects.js +++ b/src/server/components/effects.js @@ -159,7 +159,7 @@ module.exports = { typeTemplate = require('../' + result.url); } - let builtEffect = extend(true, {}, effectTemplate, typeTemplate); + let builtEffect = extend({}, effectTemplate, typeTemplate); for (let p in options) builtEffect[p] = options[p]; diff --git a/src/server/components/equipment.js b/src/server/components/equipment.js index e9e512ed..78f5c56a 100644 --- a/src/server/components/equipment.js +++ b/src/server/components/equipment.js @@ -136,7 +136,7 @@ module.exports = { else { let result = item; if (item.effects) { - result = extend(true, {}, item); + result = extend({}, item); result.effects = result.effects.map(e => ({ factionId: e.factionId, text: e.text, @@ -204,7 +204,7 @@ module.exports = { } else if (!item.effects) this.obj.syncer.setArray(true, 'inventory', 'getItems', item); else { - let result = extend(true, {}, item); + let result = extend({}, item); result.effects = result.effects.map(e => ({ factionId: e.factionId, text: e.text, diff --git a/src/server/components/extensions/factionVendor.js b/src/server/components/extensions/factionVendor.js index 010ce761..8c54a3e9 100644 --- a/src/server/components/extensions/factionVendor.js +++ b/src/server/components/extensions/factionVendor.js @@ -39,7 +39,7 @@ module.exports = { let result = list.items .map(function (i) { - let item = extend(true, {}, i); + let item = extend({}, i); if (item.effects) { item.stats = { @@ -146,7 +146,7 @@ module.exports = { for (let i = 0; i < eLen; i++) { let e = extra[i]; - let item = extend(true, {}, e); + let item = extend({}, e); if (item.type === 'skin') { let skinBlueprint = skins.getBlueprint(item.id); diff --git a/src/server/components/extensions/socialCommands.js b/src/server/components/extensions/socialCommands.js index d7bc281d..000052ae 100644 --- a/src/server/components/extensions/socialCommands.js +++ b/src/server/components/extensions/socialCommands.js @@ -304,7 +304,7 @@ module.exports = { if (s === 'tool') return; - let newConfig = extend(true, {}, config, { + let newConfig = extend({}, config, { slot: s }); diff --git a/src/server/components/gatherer.js b/src/server/components/gatherer.js index 862ece62..01d845d9 100644 --- a/src/server/components/gatherer.js +++ b/src/server/components/gatherer.js @@ -93,7 +93,7 @@ module.exports = { } let resourceNode = gathering.resourceNode; - let gatherResult = extend(true, { + let gatherResult = extend({ obj: gathering }, { nodeType: resourceNode.nodeType, @@ -210,7 +210,7 @@ module.exports = { }, enter: function (node) { - let gatherResult = extend(true, { + let gatherResult = extend({ nodeName: node.name }); this.obj.instance.eventEmitter.emitNoSticky('beforeEnterPool', gatherResult, this.obj); diff --git a/src/server/components/inventory.js b/src/server/components/inventory.js index daa0c8b2..24a707a7 100644 --- a/src/server/components/inventory.js +++ b/src/server/components/inventory.js @@ -76,7 +76,7 @@ module.exports = { type: 'inventory', items: this.items .map(function (i) { - let item = extend(true, {}, i); + let item = extend({}, i); if (item.effects) { item.effects = item.effects.map(e => ({ @@ -237,7 +237,7 @@ module.exports = { else if ((!item.quantity) || (item.quantity <= msg.stackSize) || (msg.stackSize < 1)) return; - let newItem = extend(true, {}, item); + let newItem = extend({}, item); item.quantity -= msg.stackSize; newItem.quantity = msg.stackSize; @@ -372,7 +372,7 @@ module.exports = { if (!stash.active) return; - let clonedItem = extend(true, {}, item); + let clonedItem = extend({}, item); this.destroyItem(id, null, true); stash.deposit(clonedItem); }, @@ -501,7 +501,7 @@ module.exports = { return; } - this.obj.instance.mail.sendMail(msg.recipient, [extend(true, {}, item)]); + this.obj.instance.mail.sendMail(msg.recipient, [extend({}, item)]); this.destroyItem(item.id); @@ -675,7 +675,7 @@ module.exports = { ttl: this.obj.instance.instanced ? -1 : 1710 }, cpnInventory: { - items: extend(true, [], items) + items: extend([], items) } } }]); @@ -843,7 +843,7 @@ module.exports = { } else if (!item.effects) this.obj.syncer.setArray(true, 'inventory', 'getItems', item, true); else { - let result = extend(true, {}, item); + let result = extend({}, item); result.effects = result.effects.map(e => ({ factionId: e.factionId, text: e.text, @@ -913,7 +913,7 @@ module.exports = { let blueprint = this.blueprint; let magicFind = (blueprint.magicFind || 0); - let savedItems = extend(true, [], this.items); + let savedItems = extend([], this.items); this.items = []; let dropEvent = { diff --git a/src/server/components/player.js b/src/server/components/player.js index 836efd09..45dddbce 100644 --- a/src/server/components/player.js +++ b/src/server/components/player.js @@ -24,7 +24,7 @@ module.exports = { if (character.dead) obj.dead = true; - extend(true, obj, { + extend(obj, { layerName: 'mobs', cell: character.cell, sheetName: character.sheetName, @@ -44,7 +44,7 @@ module.exports = { roles.onBeforePlayerEnterGame(obj, character); let blueprintStats = character.components.find(c => c.type === 'stats') || {}; - extend(true, blueprintStats, classes.stats[obj.class]); + extend(blueprintStats, classes.stats[obj.class]); blueprintStats.values.hpMax = (blueprintStats.values.level || 1) * 32.7; if (!blueprintStats.values.hp) blueprintStats.values.hp = blueprintStats.values.hpMax; diff --git a/src/server/components/prophecies.js b/src/server/components/prophecies.js index 1bf38f04..fc4b1b0d 100644 --- a/src/server/components/prophecies.js +++ b/src/server/components/prophecies.js @@ -15,7 +15,7 @@ module.exports = { else if (this.list.some(l => (l.type === p))) return; - let prophecy = extend(true, {}, template); + let prophecy = extend({}, template); prophecy.obj = this.obj; prophecy.init(); diff --git a/src/server/components/reputation.js b/src/server/components/reputation.js index 27116f6a..6f58d78d 100644 --- a/src/server/components/reputation.js +++ b/src/server/components/reputation.js @@ -39,7 +39,7 @@ module.exports = { if (!factionBlueprint) return; - factionBlueprint = extend(true, {}, factionBase, factionBlueprint); + factionBlueprint = extend({}, factionBase, factionBlueprint); this.factions[factionBlueprint.id] = factionBlueprint; @@ -195,7 +195,7 @@ module.exports = { .map(function (l) { let result = {}; let blueprint = this.getBlueprint(l.id); - extend(true, result, l, blueprint); + extend(result, l, blueprint); return result; }, this); @@ -216,7 +216,7 @@ module.exports = { if (full) { let blueprint = this.getBlueprint(factionId); - extend(true, faction, l, blueprint); + extend(faction, l, blueprint); } this.obj.syncer.setArray(true, 'reputation', 'modifyRep', faction); diff --git a/src/server/components/spellbook.js b/src/server/components/spellbook.js index eaedc643..a9abb95c 100644 --- a/src/server/components/spellbook.js +++ b/src/server/components/spellbook.js @@ -86,7 +86,7 @@ module.exports = { if (!typeTemplate.template) typeTemplate.template = require('../config/spells/spell' + type); - let builtSpell = extend(true, {}, spellTemplate, typeTemplate.template, options); + let builtSpell = extend({}, spellTemplate, typeTemplate.template, options); builtSpell.obj = this.obj; builtSpell.baseDamage = builtSpell.damage; builtSpell.damage += (options.damageAdd || 0); @@ -108,7 +108,7 @@ module.exports = { animation = animations.classes; if ((animation) && (animation[this.obj.cell]) && (animation[this.obj.cell][animationName])) { - builtSpell.animation = extend(true, {}, animation[this.obj.cell][animationName]); + builtSpell.animation = extend({}, animation[this.obj.cell][animationName]); builtSpell.animation.name = animationName; } else builtSpell.animation = null; @@ -155,7 +155,7 @@ module.exports = { runeSpell.values = {}; - let builtSpell = extend(true, { + let builtSpell = extend({ type: runeSpell.type, values: {} }, playerSpell, playerSpellConfig, runeSpell); diff --git a/src/server/components/stats.js b/src/server/components/stats.js index 50dd340d..acf76c4b 100644 --- a/src/server/components/stats.js +++ b/src/server/components/stats.js @@ -640,7 +640,7 @@ module.exports = { delete this.sessionDuration; } - let values = extend(true, {}, this.values); + let values = extend({}, this.values); values.hp = this.values.hp; values.mana = this.values.mana; diff --git a/src/server/components/trade.js b/src/server/components/trade.js index 683edc06..0b77d4de 100644 --- a/src/server/components/trade.js +++ b/src/server/components/trade.js @@ -23,7 +23,7 @@ module.exports = { this.gold = blueprint.gold; (blueprint.forceItems || []).forEach(function (f, i) { - let item = extend(true, {}, f); + let item = extend({}, f); let id = 0; this.items.forEach(function (checkItem) { @@ -201,7 +201,7 @@ module.exports = { if (!item.infinite) this.obj.syncer.setArray(true, 'trade', 'removeItems', item.id); - let clonedItem = extend(true, {}, item); + let clonedItem = extend({}, item); if (item.worth.currency) clonedItem.worth = 0; if ((item.stats) && (item.stats.stats)) { @@ -295,7 +295,7 @@ module.exports = { let itemList = this.obj.inventory.items .filter(i => ((i.worth > 0) && (!i.eq))); - itemList = extend(true, [], itemList); + itemList = extend([], itemList); this.obj.syncer.set(true, 'trade', 'sellList', { markup: target.trade.markup.buy, @@ -341,7 +341,7 @@ module.exports = { let reputation = requestedBy.reputation; let items = this.items.map(function (i) { - let item = extend(true, {}, i); + let item = extend({}, i); if (item.factions) { item.factions = item.factions.map(function (f) { diff --git a/src/server/components/workbench.js b/src/server/components/workbench.js index 9d6ca173..66a611dc 100644 --- a/src/server/components/workbench.js +++ b/src/server/components/workbench.js @@ -97,7 +97,7 @@ module.exports = { const items = crafter.inventory.items; - let sendRecipe = extend(true, {}, recipe); + let sendRecipe = extend({}, recipe); (sendRecipe.materials || []).forEach(function (m) { m.need = !items.some(i => ( ( @@ -156,7 +156,7 @@ module.exports = { obj.inventory.destroyItem(findItem.id, m.quantity); }); - let item = extend(true, {}, recipe.item); + let item = extend({}, recipe.item); item.description += `

(Crafted by ${obj.name})`; obj.inventory.getItem(item); diff --git a/src/server/config/eventPhases/phaseKillMob.js b/src/server/config/eventPhases/phaseKillMob.js index c8d7bdd8..8a2d5160 100644 --- a/src/server/config/eventPhases/phaseKillMob.js +++ b/src/server/config/eventPhases/phaseKillMob.js @@ -34,7 +34,7 @@ module.exports = { continue; if (percentage) { - let cpn = extend(true, cpnDeathStopper, { + let cpn = extend(cpnDeathStopper, { percentage: percentage }); o.components.push(cpn); diff --git a/src/server/config/eventPhases/phaseModifyDialogue.js b/src/server/config/eventPhases/phaseModifyDialogue.js index 44a69766..3384553e 100644 --- a/src/server/config/eventPhases/phaseModifyDialogue.js +++ b/src/server/config/eventPhases/phaseModifyDialogue.js @@ -9,7 +9,7 @@ module.exports = { addStates: function (dialogue, states) { for (let s in states) { - let source = extend(true, {}, states[s]); + let source = extend({}, states[s]); let target = dialogue[s]; if (!target) { dialogue[s] = source; diff --git a/src/server/config/factions/anglers.js b/src/server/config/factions/anglers.js index da64b888..7d92d8e9 100644 --- a/src/server/config/factions/anglers.js +++ b/src/server/config/factions/anglers.js @@ -49,7 +49,7 @@ module.exports = { return; let pick = gatherResult.items[~~(Math.random() * gatherResult.items.length)]; - gatherResult.items.push(extend(true, {}, pick)); + gatherResult.items.push(extend({}, pick)); } } }, diff --git a/src/server/config/loginRewards.js b/src/server/config/loginRewards.js index 7d80c4f1..d10b97c3 100644 --- a/src/server/config/loginRewards.js +++ b/src/server/config/loginRewards.js @@ -56,7 +56,7 @@ module.exports = { let item = items.find(f => (f.name === pick.name)); if (!item) { - item = extend(true, { + item = extend({ material: true, quality: p }, pick); diff --git a/src/server/config/maps/fjolarok/events/fishingTournament.js b/src/server/config/maps/fjolarok/events/fishingTournament.js index b3682565..09cbafb5 100644 --- a/src/server/config/maps/fjolarok/events/fishingTournament.js +++ b/src/server/config/maps/fjolarok/events/fishingTournament.js @@ -104,7 +104,7 @@ module.exports = { let rewardQty = rewardCounts[rank] || consolationQty; - event.rewards[f.owner] = [extend(true, { + event.rewards[f.owner] = [extend({ quantity: rewardQty }, tpl)]; } @@ -149,7 +149,7 @@ module.exports = { .forEach(function (f, i) { if (i === 0) { f.owner = source.name; - tgtInventory.getItem(extend(true, {}, f)); + tgtInventory.getItem(extend({}, f)); } srcInventory.destroyItem(f.id); @@ -348,7 +348,7 @@ module.exports = { return; gatherResult.items.forEach(function (g) { - extend(true, g, { + extend(g, { name: 'Ancient Carp', sprite: [11, 4], noDrop: true diff --git a/src/server/config/quests/questBuilder.js b/src/server/config/quests/questBuilder.js index 9bcbc5d9..bf4eb165 100644 --- a/src/server/config/quests/questBuilder.js +++ b/src/server/config/quests/questBuilder.js @@ -24,7 +24,7 @@ module.exports = { if (!zoneTemplate) zoneTemplate = globalQuests; - let config = extend(true, {}, zoneTemplate); + let config = extend({}, zoneTemplate); this.instance.eventEmitter.emit('onBeforeGetQuests', config); if (config.infini.length === 0) return; @@ -38,7 +38,7 @@ module.exports = { let pickType = pickQuest.type[0].toUpperCase() + pickQuest.type.substr(1); let questClass = require('../../config/quests/templates/quest' + pickType); - let quest = extend(true, {}, pickQuest, questTemplate, questClass, template); + let quest = extend({}, pickQuest, questTemplate, questClass, template); if (template) quest.xp = template.xp; diff --git a/src/server/config/recipes/cooking.js b/src/server/config/recipes/cooking.js index bdecc849..2013210c 100644 --- a/src/server/config/recipes/cooking.js +++ b/src/server/config/recipes/cooking.js @@ -26,7 +26,7 @@ const baseRecipes = { }; const buildRecipe = function (recipeName, itemName, effectAmount, materialName) { - return extend(true, {}, baseRecipes[recipeName], { + return extend({}, baseRecipes[recipeName], { item: { name: itemName, effects: [{ diff --git a/src/server/config/skins.js b/src/server/config/skins.js index e350bfce..abf5b6ce 100644 --- a/src/server/config/skins.js +++ b/src/server/config/skins.js @@ -120,7 +120,7 @@ module.exports = { return ((config[s].default) || (skins.some(f => ((f === s) || (f === '*'))))); }) .map(function (s) { - let res = extend(true, {}, config[s]); + let res = extend({}, config[s]); res.id = s; return res; }); diff --git a/src/server/events/events.js b/src/server/events/events.js index 75947aa5..157c1ea3 100644 --- a/src/server/events/events.js +++ b/src/server/events/events.js @@ -20,7 +20,7 @@ module.exports = { files.forEach(function (f) { let e = require(f); if (!e.disabled) - this.configs.push(extend(true, {}, e)); + this.configs.push(extend({}, e)); }, this); }, @@ -95,7 +95,7 @@ module.exports = { let event = { id: this.nextId++, - config: extend(true, {}, config), + config: extend({}, config), phases: [], participators: [], objects: [], @@ -237,7 +237,7 @@ module.exports = { let phaseFile = 'phase' + p.type[0].toUpperCase() + p.type.substr(1); let typeTemplate = require('../config/eventPhases/' + phaseFile); - let phase = extend(true, { + let phase = extend({ instance: this.instance, event: event }, phaseTemplate, typeTemplate, p); diff --git a/src/server/globals.js b/src/server/globals.js index 912c642b..8ce5ebb0 100644 --- a/src/server/globals.js +++ b/src/server/globals.js @@ -1,7 +1,7 @@ /* global io, extend, cons, _, atlas, leaderboard, clientConfig */ global.io = require('./security/io'); -global.extend = require('extend'); +global.extend = require('./misc/clone'); global.cons = require('./security/connections'); global._ = require('./misc/helpers'); global.atlas = require('./world/atlas'); diff --git a/src/server/items/config/currencies.js b/src/server/items/config/currencies.js index 22825746..35ff028c 100644 --- a/src/server/items/config/currencies.js +++ b/src/server/items/config/currencies.js @@ -54,7 +54,7 @@ module.exports = { let currencies = this.currencies; let pick = Object.keys(currencies).find(o => (currencies[o].action === action)); - return extend(true, { + return extend({ name: pick }, currencies[pick]); } diff --git a/src/server/items/enchanter.js b/src/server/items/enchanter.js index 7d141d6a..d3935c14 100644 --- a/src/server/items/enchanter.js +++ b/src/server/items/enchanter.js @@ -122,7 +122,7 @@ module.exports = { } newItem.enchantedStats = enchantedStats; - extend(true, item, newItem); + extend(item, newItem); } else if (msg.action === 'reforge') { if (!item.spell) return; @@ -134,7 +134,7 @@ module.exports = { generatorSpells.generate(item, { spellName: spellName }); - item.spell = extend(true, oldSpell, item.spell); + item.spell = extend(oldSpell, item.spell); } else if (msg.action === 'scour') { if (!item.power) return; diff --git a/src/server/items/generator.js b/src/server/items/generator.js index 56f2db3b..a878df77 100644 --- a/src/server/items/generator.js +++ b/src/server/items/generator.js @@ -58,7 +58,7 @@ module.exports = { item.noDestroy = blueprint.noDestroy; materialGenerators.forEach(g => g.generate(item, blueprint)); } else if (blueprint.type === 'mtx') { - item = extend(true, {}, blueprint); + item = extend({}, blueprint); delete item.chance; } else { generators.forEach(g => g.generate(item, blueprint)); diff --git a/src/server/items/generators/currency.js b/src/server/items/generators/currency.js index b4ea5760..373298cd 100644 --- a/src/server/items/generators/currency.js +++ b/src/server/items/generators/currency.js @@ -17,6 +17,6 @@ module.exports = { pick = Object.keys(configCurrencies.currencies).find(c => (c.toLowerCase().indexOf(blueprint.name.toLowerCase()) > -1)); item.name = pick; - extend(true, item, configCurrencies.currencies[pick]); + extend(item, configCurrencies.currencies[pick]); } }; diff --git a/src/server/items/generators/oldSlots.js b/src/server/items/generators/oldSlots.js index 335c2db0..c64509b2 100644 --- a/src/server/items/generators/oldSlots.js +++ b/src/server/items/generators/oldSlots.js @@ -44,7 +44,7 @@ module.exports = { let extraStats = this.slots[item.slot].extraStats; if (extraStats) { - extraStats = extend(true, {}, extraStats); + extraStats = extend({}, extraStats); if (!(extraStats instanceof Array)) extraStats = [extraStats]; diff --git a/src/server/items/generators/quality.js b/src/server/items/generators/quality.js index 0d7d4164..0f9cceba 100644 --- a/src/server/items/generators/quality.js +++ b/src/server/items/generators/quality.js @@ -15,13 +15,13 @@ module.exports = { return; } - let qualities = extend(true, [], this.qualities); + let qualities = extend([], this.qualities); let magicFind = (blueprint.magicFind || 0); if (!(magicFind instanceof Array)) magicFind = [magicFind]; else - magicFind = extend(true, [], magicFind); + magicFind = extend([], magicFind); let bonusMagicFind = blueprint.bonusMagicFind || 0; diff --git a/src/server/items/generators/spellbook.js b/src/server/items/generators/spellbook.js index 90f760fc..f40aadf0 100644 --- a/src/server/items/generators/spellbook.js +++ b/src/server/items/generators/spellbook.js @@ -37,7 +37,7 @@ module.exports = { item.stats = {}; if (blueprint.spellConfig) - spellAesthetic = extend(true, {}, spellAesthetic, blueprint.spellConfig); + spellAesthetic = extend({}, spellAesthetic, blueprint.spellConfig); item.spell = { name: spellAesthetic.name || 'Weapon Damage', @@ -47,12 +47,12 @@ module.exports = { }; if (blueprint.spellConfig) - extend(true, item.spell, blueprint.spellConfig); + extend(item.spell, blueprint.spellConfig); if (item.type) { let typeConfig = configTypes.types[item.slot][item.type]; if (typeConfig) - spell = extend(true, {}, spell, typeConfig.spellConfig); + spell = extend({}, spell, typeConfig.spellConfig); } let propertyPerfection = []; diff --git a/src/server/items/generators/stats.js b/src/server/items/generators/stats.js index bfce401c..adb4378a 100644 --- a/src/server/items/generators/stats.js +++ b/src/server/items/generators/stats.js @@ -499,7 +499,7 @@ module.exports = { } if (blueprint.stats) { - let useStats = extend(true, [], blueprint.stats); + let useStats = extend([], blueprint.stats); let addStats = Math.min(statCount, blueprint.stats.length); for (let i = 0; i < addStats; i++) { let choice = useStats[~~(Math.random() * useStats.length)]; @@ -521,7 +521,7 @@ module.exports = { buildStat: function (item, blueprint, stat, result, isImplicit) { let slotStats = this.slots[item.slot] || {}; - let statOptions = extend(true, {}, this.stats, slotStats || {}); + let statOptions = extend({}, this.stats, slotStats || {}); for (let p in statOptions) { if ((!slotStats[p]) || (slotStats[p].ignore)) @@ -595,7 +595,7 @@ module.exports = { rescale: function (item, level) { let stats = item.stats; - let nStats = extend(true, {}, stats); + let nStats = extend({}, stats); let bpt = { statMult: {} }; diff --git a/src/server/items/generators/types.js b/src/server/items/generators/types.js index 48e878ac..43c3ac99 100644 --- a/src/server/items/generators/types.js +++ b/src/server/items/generators/types.js @@ -10,7 +10,7 @@ module.exports = { return; item.type = type; - item.sprite = extend(true, [], blueprint.sprite || typeBlueprint.sprite); + item.sprite = extend([], blueprint.sprite || typeBlueprint.sprite); if (typeBlueprint.spritesheet) item.spritesheet = typeBlueprint.spritesheet; diff --git a/src/server/items/salvager.js b/src/server/items/salvager.js index 5a642f1b..bc0b2233 100644 --- a/src/server/items/salvager.js +++ b/src/server/items/salvager.js @@ -119,7 +119,7 @@ module.exports = { exists.quantity = Math.max(exists.quantity, m.quantity); exists.qualityMult = Math.max(exists.qualityMult, m.qualityMult); } else - materials.push(extend(true, {}, m)); + materials.push(extend({}, m)); }); }); diff --git a/src/server/misc/clone.js b/src/server/misc/clone.js new file mode 100644 index 00000000..31e61507 --- /dev/null +++ b/src/server/misc/clone.js @@ -0,0 +1,48 @@ +const oArray = '[object Array]'; + +let cloneRecursive = function (o, newO) { + let i; + + if (typeof o !== 'object') + return o; + + if (!o) + return o; + + if (Object.prototype.toString.apply(o) === oArray) { + if (!newO) + newO = []; + + let oLen = o.length; + for (i = 0; i < oLen; i++) { + if (newO[i] === undefined) + newO[i] = cloneRecursive(o[i]); + else + cloneRecursive(o[i], newO[i]); + } + + return newO; + } + + if (!newO) + newO = {}; + for (i in o) { + if (o.hasOwnProperty(i)) { + if (newO[i] === undefined) + newO[i] = cloneRecursive(o[i]); + else + newO[i] = cloneRecursive(o[i], newO[i]); + } + } + return newO; +}; + +let clone = function (o) { + let aLen = arguments.length; + for (let i = 1; i < aLen; i++) + cloneRecursive(arguments[i], o); + + return o; +}; + +module.exports = clone; diff --git a/src/server/misc/mail.js b/src/server/misc/mail.js index f97ea00e..4b6a25ed 100644 --- a/src/server/misc/mail.js +++ b/src/server/misc/mail.js @@ -108,7 +108,7 @@ module.exports = { queue = this.queue[playerName] = []; items.forEach(function (i) { - queue.push(extend(true, {}, i)); + queue.push(extend({}, i)); }); return; diff --git a/src/server/misc/random.js b/src/server/misc/random.js index d05a5db0..ecde64a9 100644 --- a/src/server/misc/random.js +++ b/src/server/misc/random.js @@ -11,7 +11,7 @@ a-1))break}else if(d<=Math.exp(-h))break;return h*c}};Random.prototype.normal=fu Random.prototype.triangular=function(a,c,b){var f=(b-a)/(c-a),e=this.random();return e<=f?a+Math.sqrt(e*(c-a)*(b-a)):c-Math.sqrt((1-e)*(c-a)*(c-b))};Random.prototype.uniform=function(a,c){return a+this.random()*(c-a)};Random.prototype.weibull=function(a,c){var b=1-this.random();return a*Math.pow(-Math.log(b),1/c)}; global.random = new Random(); -extend(true, random, { +extend(random, { norm: function(low, high) { var mid = low + ((high - low) / 2); var range = mid - low; diff --git a/src/server/mods/event-halloween/index.js b/src/server/mods/event-halloween/index.js index 68cc5b8d..82f5e7f9 100644 --- a/src/server/mods/event-halloween/index.js +++ b/src/server/mods/event-halloween/index.js @@ -92,7 +92,7 @@ module.exports = { }, onBeforeGetFactions: function (mappings) { - extend(true, mappings, { + extend(mappings, { pumpkinSailor: './factions/pumpkinSailor' }); }, @@ -106,7 +106,7 @@ module.exports = { }, onBeforeGetHerbConfig: function (herbs) { - extend(true, herbs, { + extend(herbs, { 'Tiny Pumpkin': { sheetName: 'objects', cell: 167, @@ -189,7 +189,7 @@ module.exports = { let mapScale = this.mapFile.tilesets[0].tileheight; layer.objects.forEach(function (l) { - let newO = extend(true, {}, l); + let newO = extend({}, l); newO.x += (offset.x * mapScale); newO.y += (offset.y * mapScale); @@ -227,7 +227,7 @@ module.exports = { onAfterGetZone: function (zone, config) { try { let modZone = require('./maps/' + zone + '/zone.js'); - extend(true, config, modZone); + extend(config, modZone); } catch (e) { } @@ -236,7 +236,7 @@ module.exports = { onBeforeGetDialogue: function (zone, config) { try { let modDialogue = require('./maps/' + zone + '/dialogues.js'); - extend(true, config, modDialogue); + extend(config, modDialogue); } catch (e) { } diff --git a/src/server/mods/event-xmas/index.js b/src/server/mods/event-xmas/index.js index b722ca74..b8a7712d 100644 --- a/src/server/mods/event-xmas/index.js +++ b/src/server/mods/event-xmas/index.js @@ -31,7 +31,7 @@ module.exports = { }, onBeforeGetCardsConfig: function (config) { - extend(true, config, { + extend(config, { 'Cheer and Spear': { chance: 40, reward: 'Rare Festive Spear', @@ -202,7 +202,7 @@ module.exports = { }, onBeforeGetFactions: function (mappings) { - extend(true, mappings, { + extend(mappings, { theWinterMan: `${this.relativeFolderName}/factions/theWinterMan` }); }, @@ -217,7 +217,7 @@ module.exports = { let mapScale = this.mapFile.tilesets[0].tileheight; layer.objects.forEach(function (l) { - let newO = extend(true, {}, l); + let newO = extend({}, l); newO.x += (offset.x * mapScale); newO.y += (offset.y * mapScale); @@ -250,14 +250,14 @@ module.exports = { onAfterGetZone: function (zone, config) { try { let modZone = require('./maps/' + zone + '/zone.js'); - extend(true, config, modZone); + extend(config, modZone); } catch (e) { } }, onBeforeGetHerbConfig: function (herbs) { - extend(true, herbs, { + extend(herbs, { 'Festive Gift': { sheetName: 'objects', cell: 166, @@ -332,7 +332,7 @@ module.exports = { onBeforeGetDialogue: function (zone, config) { try { let modDialogue = require('./maps/' + zone + '/dialogues.js'); - extend(true, config, modDialogue); + extend(config, modDialogue); } catch (e) { } diff --git a/src/server/mods/event-xmas/maps/fjolarok/events/xmas.js b/src/server/mods/event-xmas/maps/fjolarok/events/xmas.js index e38d79a2..05b5f2d1 100644 --- a/src/server/mods/event-xmas/maps/fjolarok/events/xmas.js +++ b/src/server/mods/event-xmas/maps/fjolarok/events/xmas.js @@ -152,7 +152,7 @@ module.exports = { let pick = pool[~~(Math.random() * pool.length)]; let blueprint = rewards.find(r => (r.name === pick)); - inventory.getItem(extend(true, {}, blueprint)); + inventory.getItem(extend({}, blueprint)); inventory.destroyItem(snowflakes.id, 15); } @@ -242,7 +242,7 @@ module.exports = { let zoneFile = require('../../' + zone + '/zone.js'); let override = _.getDeepProperty(zoneFile, ['mobs', mobName]); if (override) - extend(true, blueprint, override); + extend(blueprint, override); } catch (e) {} }, diff --git a/src/server/mods/feature-cards/cards.js b/src/server/mods/feature-cards/cards.js index 9cec85c5..eef6eff7 100644 --- a/src/server/mods/feature-cards/cards.js +++ b/src/server/mods/feature-cards/cards.js @@ -56,7 +56,7 @@ module.exports = { let mobLevel = mob.stats.values.level; - let configs = extend(true, {}, config); + let configs = extend({}, config); looter.instance.eventEmitter.emit('onBeforeGetCardsConfig', configs); Object.keys(configs).forEach(function (c) { @@ -110,7 +110,7 @@ module.exports = { }, getReward: function (looter, set) { - let configs = extend(true, {}, config); + let configs = extend({}, config); looter.instance.eventEmitter.emit('onBeforeGetCardsConfig', configs); let reward = configs[set].reward; diff --git a/src/server/objects/objBase.js b/src/server/objects/objBase.js index 075e3e43..f7117070 100644 --- a/src/server/objects/objBase.js +++ b/src/server/objects/objBase.js @@ -10,12 +10,12 @@ module.exports = { if (!cpn) { let template = components.components[type]; if (!template) { - template = extend(true, { + template = extend({ type: type }, blueprint || {}); } - cpn = extend(true, {}, template); + cpn = extend({}, template); cpn.obj = this; this.components.push(cpn); @@ -44,7 +44,7 @@ module.exports = { let template = require('../components/extensions/' + type); let cpn = this[ext]; - extend(true, cpn, template); + extend(cpn, template); if (template.init) cpn.init(blueprint); diff --git a/src/server/objects/objects.js b/src/server/objects/objects.js index 4ae0694f..0c01224e 100644 --- a/src/server/objects/objects.js +++ b/src/server/objects/objects.js @@ -15,7 +15,7 @@ module.exports = { }, build: function (skipPush, clientObj) { - let o = extend(true, {}, objBase); + let o = extend({}, objBase); if (clientObj) o.update = null; @@ -81,7 +81,7 @@ module.exports = { //Add components (certain ones need to happen first) //TODO: Clean this part up - let properties = extend(true, {}, l.properties); + let properties = extend({}, l.properties); ['cpnMob'].forEach(function (c) { let blueprint = properties[c] || null; if ((blueprint) && (typeof (blueprint) === 'string')) diff --git a/src/server/package.json b/src/server/package.json index a5abd33f..77e10aa2 100644 --- a/src/server/package.json +++ b/src/server/package.json @@ -5,7 +5,6 @@ "dependencies": { "bcrypt-nodejs": "0.0.3", "express": "^4.13.1", - "extend": "^3.0.0", "google-spreadsheet": "^2.0.4", "less-middleware": "^2.0.1", "mysql": "^2.13.0", diff --git a/src/server/world/instancer.js b/src/server/world/instancer.js index e71a5fed..ec0e22e9 100644 --- a/src/server/world/instancer.js +++ b/src/server/world/instancer.js @@ -451,33 +451,33 @@ module.exports = { createInstance: function (objToAdd, transfer) { let newMap = { name: map.name, - spawn: extend(true, [], map.spawn), - clientMap: extend(true, {}, map.clientMap) + spawn: extend([], map.spawn), + clientMap: extend({}, map.clientMap) }; newMap.getSpawnPos = map.getSpawnPos.bind(newMap); //Hack: We need to actually just always use the instanced eventEmitter let eventQueue = eventEmitter.queue; delete eventEmitter.queue; - let newEventEmitter = extend(true, { + let newEventEmitter = extend({ queue: [] }, eventEmitter); eventEmitter.queue = eventQueue; let instance = { id: objToAdd.name + '_' + (+new Date()), - objects: extend(true, {}, objects), - spawners: extend(true, {}, spawners), - syncer: extend(true, {}, syncer), - physics: extend(true, {}, physics), - resourceSpawner: extend(true, {}, resourceSpawner), + objects: extend({}, objects), + spawners: extend({}, spawners), + syncer: extend({}, syncer), + physics: extend({}, physics), + resourceSpawner: extend({}, resourceSpawner), zoneId: this.zoneId, zone: map.zone, closeTtl: null, - questBuilder: extend(true, {}, questBuilder), - events: extend(true, {}, events), - scheduler: extend(true, {}, scheduler), - mail: extend(true, {}, mail), + questBuilder: extend({}, questBuilder), + events: extend({}, events), + scheduler: extend({}, scheduler), + mail: extend({}, mail), map: newMap, eventEmitter: newEventEmitter, instanced: true @@ -490,7 +490,7 @@ module.exports = { let onDone = this.instanced.onCreateInstance.bind(this, instance, objToAdd, transfer); if (map.custom) { - instance.customMap = extend(true, {}, customMap); + instance.customMap = extend({}, customMap); instance.customMap.load(instance, objToAdd, onDone); } else onDone(); diff --git a/src/server/world/map.js b/src/server/world/map.js index b8287a29..5d95a666 100644 --- a/src/server/world/map.js +++ b/src/server/world/map.js @@ -10,6 +10,8 @@ let mapFile = null; let mapScale = null; let padding = null; +let ex = require('extend'); + module.exports = { name: null, layers: [], @@ -73,7 +75,7 @@ module.exports = { if (dialogues) this.zone.dialogues = dialogues; - this.zone = extend(true, {}, globalZone, this.zone); + this.zone = extend({}, globalZone, this.zone); let resources = this.zone.resources || {}; for (let r in resources) @@ -112,9 +114,9 @@ module.exports = { getMapFile: function () { this.build(); - randomMap = extend(true, {}, randomMap); + randomMap = extend({}, randomMap); this.oldMap = this.layers; - randomMap.templates = extend(true, [], this.rooms); + randomMap.templates = extend([], this.rooms); randomMap.generateMappings(this); for (let i = 0; i < this.size.w; i++) { @@ -333,9 +335,9 @@ module.exports = { if (this.zone) { if ((this.zone.objects) && (this.zone.objects[objZoneName.toLowerCase()])) - extend(true, blueprint, this.zone.objects[objZoneName.toLowerCase()]); + extend(blueprint, this.zone.objects[objZoneName.toLowerCase()]); else if ((this.zone.objects) && (this.zone.mobs[objZoneName.toLowerCase()])) - extend(true, blueprint, this.zone.mobs[objZoneName.toLowerCase()]); + extend(blueprint, this.zone.mobs[objZoneName.toLowerCase()]); } if (blueprint.blocking) diff --git a/src/server/world/mobBuilder.js b/src/server/world/mobBuilder.js index c367343b..777b5d7a 100644 --- a/src/server/world/mobBuilder.js +++ b/src/server/world/mobBuilder.js @@ -42,7 +42,7 @@ module.exports = { }); let cpnMob = mob.addComponent('mob'); - extend(true, cpnMob, { + extend(cpnMob, { walkDistance: blueprint.walkDistance, hpMult: blueprint.hpMult || typeDefinition.hpMult, dmgMult: blueprint.dmgMult || typeDefinition.dmgMult, @@ -50,7 +50,7 @@ module.exports = { deathRep: blueprint.deathRep }); - let spells = extend(true, [], blueprint.spells); + let spells = extend([], blueprint.spells); spells.forEach(function (s) { if (!s.animation) { if ((mob.sheetName === 'mobs') && (animations.mobs[mob.cell])) @@ -143,7 +143,7 @@ module.exports = { } else { //TODO: Don't give the mob these items: he'll drop them anyway drops.blueprints.forEach(function (d) { - let drop = extend(true, {}, d); + let drop = extend({}, d); d.level = level; if (drop.type === 'key') return; diff --git a/src/server/world/randomMap.js b/src/server/world/randomMap.js index a1a1c525..fffa1860 100644 --- a/src/server/world/randomMap.js +++ b/src/server/world/randomMap.js @@ -15,7 +15,7 @@ module.exports = { this.exitAreas = []; this.tileMappings = {}; this.bounds = [0, 0, 0, 0]; - this.templates = extend(true, [], instance.map.rooms); + this.templates = extend([], instance.map.rooms); this.setupTemplates(instance.map); this.generateMappings(instance.map); @@ -66,7 +66,7 @@ module.exports = { if (i + j + k === 0) continue; - let flipped = extend(true, { + let flipped = extend({ flipX: !!i, flipY: !!j, rotate: !!k @@ -128,7 +128,7 @@ module.exports = { r.map = _.get2dArray(r.width, r.height); r.tiles = _.get2dArray(r.width, r.height); r.collisionMap = _.get2dArray(r.width, r.height); - r.oldExits = extend(true, [], r.exits); + r.oldExits = extend([], r.exits); for (let i = 0; i < w; i++) { for (let j = 0; j < h; j++) { @@ -352,7 +352,7 @@ module.exports = { y: 0, distance: 0, isHallway: isHallway, - template: extend(true, {}, template), + template: extend({}, template), connections: [] }; @@ -442,7 +442,7 @@ module.exports = { return false; } - let template = extend(true, {}, templates[this.randInt(0, templates.length)]); + let template = extend({}, templates[this.randInt(0, templates.length)]); let templateExit = template.exits.filter(function (e) { let direction = JSON.parse(e.properties.exit); diff --git a/src/server/world/resourceSpawner.js b/src/server/world/resourceSpawner.js index 2ce9c544..c78a1177 100644 --- a/src/server/world/resourceSpawner.js +++ b/src/server/world/resourceSpawner.js @@ -42,7 +42,7 @@ module.exports = { return; } - blueprint = extend(true, {}, blueprint, herbs[name], { + blueprint = extend({}, blueprint, herbs[name], { name: name }); @@ -109,13 +109,13 @@ module.exports = { if (blueprint.quantity) quantity = blueprint.quantity[0] + ~~(Math.random() * (blueprint.quantity[1] - blueprint.quantity[0])); - let objBlueprint = extend(true, {}, blueprint, position); + let objBlueprint = extend({}, blueprint, position); objBlueprint.properties = { cpnResourceNode: { nodeType: blueprint.type, ttl: blueprint.ttl, xp: this.zone.level * this.zone.level, - blueprint: extend(true, {}, blueprint), + blueprint: extend({}, blueprint), quantity: quantity } }; diff --git a/src/server/world/spawners.js b/src/server/world/spawners.js index f15187df..cca8e3e7 100644 --- a/src/server/world/spawners.js +++ b/src/server/world/spawners.js @@ -10,7 +10,7 @@ module.exports = { this.objects = msg.objects; this.syncer = msg.syncer; this.zone = msg.zone; - this.mobBuilder = extend(true, { + this.mobBuilder = extend({ zone: this.zone }, mobBuilder); }, @@ -21,7 +21,7 @@ module.exports = { }, register: function (blueprint, cdMax) { - let spawner = extend(true, { + let spawner = extend({ cdMax: cdMax || 171, cron: blueprint.cron, lifetime: blueprint.lifetime, @@ -40,7 +40,7 @@ module.exports = { else this.mobTypes[name]++; - spawner.zonePrint = extend(true, {}, this.zone.mobs.default, this.zone.mobs[name] || {}); + spawner.zonePrint = extend({}, this.zone.mobs.default, this.zone.mobs[name] || {}); }, spawn: function (spawner) { @@ -152,7 +152,7 @@ module.exports = { if ((l.blueprint.sheetName === 'mobs') || (l.blueprint.sheetName === 'bosses')) this.setupMob(mob, l.zonePrint, l.blueprint.scaleDrops); else { - let blueprint = extend(true, {}, this.zone.objects.default, this.zone.objects[name] || {}); + let blueprint = extend({}, this.zone.objects.default, this.zone.objects[name] || {}); this.setupObj(mob, blueprint); } diff --git a/src/server/world/worker.js b/src/server/world/worker.js index b76d1c86..6640eec3 100644 --- a/src/server/world/worker.js +++ b/src/server/world/worker.js @@ -1,4 +1,4 @@ -global.extend = require('extend'); +global.extend = require('../misc/clone'); global.io = require('../security/io'); global._ = require('../misc/helpers'); global.instancer = require('./instancer');