Browse Source

fixes #760

tags/v0.2.1^2
big bad waffle 5 years ago
parent
commit
cae77a1ecf
11 changed files with 587 additions and 804 deletions
  1. +14
    -17
      src/client/js/components/inventory.js
  2. +43
    -49
      src/client/ui/templates/equipment/equipment.js
  3. +7
    -11
      src/client/ui/templates/hud/hud.js
  4. +45
    -50
      src/client/ui/templates/inventory/inventory.js
  5. +64
    -109
      src/server/components/equipment.js
  6. +172
    -180
      src/server/components/inventory.js
  7. +92
    -194
      src/server/components/stats.js
  8. +6
    -24
      src/server/config/prophecies/titangrip.js
  9. +63
    -69
      src/server/objects/objects.js
  10. +12
    -12
      src/server/package-lock.json
  11. +69
    -89
      src/server/world/instancer.js

+ 14
- 17
src/client/js/components/inventory.js View File

@@ -12,7 +12,7 @@ define([
events.emit('onGetItems', this.items);
},
extend: function (blueprint) {
var rerender = false;
let rerender = false;

if (blueprint.destroyItems) {
rerender = true;
@@ -20,15 +20,15 @@ define([
}

if (blueprint.getItems) {
var items = this.items;
var newItems = blueprint.getItems || [];
var nLen = newItems.length;
let items = this.items;
let newItems = blueprint.getItems || [];
let nLen = newItems.length;

for (var i = 0; i < nLen; i++) {
var nItem = newItems[i];
for (let i = 0; i < nLen; i++) {
let nItem = newItems[i];
var nId = nItem.id;

var findItem = items.find(function (item) {
let findItem = items.find(function (item) {
return (item.id == nId);
});
if (findItem) {
@@ -40,9 +40,8 @@ define([
);
}

for (var p in findItem) {
for (let p in findItem)
delete findItem[p];
}

$.extend(true, findItem, nItem);

@@ -62,21 +61,19 @@ define([
},

equipItemErrors: function (item) {
var errors = [];
var stats = this.obj.stats.values;
var originalValues = this.obj.stats.originalValues || this.obj.stats.values;
let errors = [];
let stats = this.obj.stats.values;

var playerLevel = (stats.originalLevel || stats.level);
if (item.level > playerLevel)
if (item.level > stats.level)
errors.push('level');

if ((item.requires) && (originalValues[item.requires[0].stat] < item.requires[0].value))
if ((item.requires) && (stats[item.requires[0].stat] < item.requires[0].value))
errors.push('stats');

if (item.factions) {
if (item.factions.some(function (f) {
return f.noEquip;
}))
return f.noEquip;
}))
errors.push('faction');
}



+ 43
- 49
src/client/ui/templates/equipment/equipment.js View File

@@ -86,7 +86,7 @@ define([

this.find('.slot').addClass('empty');

var skipSpellId = 0;
let skipSpellId = 0;

this.find('[slot]')
.removeData('item')
@@ -102,9 +102,9 @@ define([

this.find('[slot]').toArray().forEach(function (el) {
el = $(el);
var slot = el.attr('slot');
var newItems = window.player.inventory.items.some(function (i) {
var checkSlot = slot;
let slot = el.attr('slot');
let newItems = window.player.inventory.items.some(function (i) {
let checkSlot = slot;
if (slot.indexOf('finger') == 0)
slot = 'finger';
else if (slot == 'oneHanded')
@@ -119,29 +119,29 @@ define([

items
.filter(function (item) {
var runeSlot = item.runeSlot;
let runeSlot = item.runeSlot;
if ((runeSlot != null) && (item.slot))
skipSpellId = runeSlot;

return ((item.eq) && ((item.slot) || (item.runeSlot != null)));
}, this)
.forEach(function (item) {
var imgX = -item.sprite[0] * 64;
var imgY = -item.sprite[1] * 64;
let imgX = -item.sprite[0] * 64;
let imgY = -item.sprite[1] * 64;

var slot = item.slot;
let slot = item.slot;
if (!slot) {
var runeSlot = item.runeSlot;
let runeSlot = item.runeSlot;
if (runeSlot > skipSpellId)
runeSlot--;
slot = 'rune-' + runeSlot;
}

var spritesheet = item.spritesheet || '../../../images/items.png';
let spritesheet = item.spritesheet || '../../../images/items.png';

slot = item.equipSlot || slot;

var elSlot = this.find('[slot="' + slot + '"]');
let elSlot = this.find('[slot="' + slot + '"]');
elSlot
.data('item', item)
.removeClass('empty show-default-icon')
@@ -158,26 +158,25 @@ define([
if (el.currentTarget)
el = $(el.currentTarget).parent();

var slot = el.attr('slot');
var isRune = (slot.indexOf('rune') == 0);
let slot = el.attr('slot');
let isRune = (slot.indexOf('rune') == 0);

var container = this.find('.itemList')
let container = this.find('.itemList')
.empty()
.show();

this.hoverCompare = el.data('item');

var items = this.items
let items = this.items
.filter(function (item) {
if (isRune)
return ((!item.slot) && (item.spell) && (!item.eq));
else {
var checkSlot = (slot.indexOf('finger') == 0) ? 'finger' : slot;
if (slot == 'oneHanded')
return ((!item.eq) && ((item.slot == 'oneHanded') || (item.slot == 'twoHanded')));
let checkSlot = (slot.indexOf('finger') == 0) ? 'finger' : slot;
if (slot == 'oneHanded')
return ((!item.eq) && ((item.slot == 'oneHanded') || (item.slot == 'twoHanded')));

return ((item.slot == checkSlot) && (!item.eq));
}
return ((item.slot == checkSlot) && (!item.eq));
}, this);
items.splice(0, 0, {
name: 'None',
@@ -190,13 +189,13 @@ define([

items
.forEach(function (item) {
var sprite = item.sprite || [7, 0];
let sprite = item.sprite || [7, 0];

var spriteSheet = item.empty ? '../../../images/uiIcons.png' : item.spritesheet || '../../../images/items.png';
var imgX = -sprite[0] * 64;
var imgY = -sprite[1] * 64;
let spriteSheet = item.empty ? '../../../images/uiIcons.png' : item.spritesheet || '../../../images/items.png';
let imgX = -sprite[0] * 64;
let imgY = -sprite[1] * 64;

var el = $('<div class="slot"><div class="icon"></div></div>')
let el = $('<div class="slot"><div class="icon"></div></div>')
.appendTo(container);

el
@@ -217,7 +216,7 @@ define([
},

equipItem: function (item, slot) {
var isNew = window.player.inventory.items.some(function (i) {
let isNew = window.player.inventory.items.some(function (i) {
return ((i.equipSlot == slot) && (i.isNew));
});
if (!isNew)
@@ -228,9 +227,9 @@ define([
return;
}

var cpn = 'equipment';
var method = 'equip';
var data = item.id;
let cpn = 'equipment';
let method = 'equip';
let data = item.id;

if (item.empty)
method = 'unequip';
@@ -247,10 +246,9 @@ define([
if (!this.hoverCompare) {
this.find('.itemList').hide();
return;
} else {
method = 'unlearnAbility';
data.itemId = this.hoverCompare.id;
}
}
method = 'unlearnAbility';
data.itemId = this.hoverCompare.id;
}
} else if (item.slot == 'finger') {
data = {
@@ -282,7 +280,7 @@ define([
el.find('.icon').removeClass('new');
}

var ttPos = null;
let ttPos = null;
if (e) {
ttPos = {
x: ~~(e.clientX + 32),
@@ -306,21 +304,17 @@ define([
if (!this.shown)
return;

var container = this.el.find('.stats');
let container = this.el.find('.stats');

container
.children('*:not(.tabs)')
.remove();

var xpRemaining = (stats.xpMax - stats.xp).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');

var level = stats.level;
if (stats.originalLevel)
level = stats.originalLevel + ' (' + stats.level + ')';
let xpRemaining = (stats.xpMax - stats.xp).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');

var newStats = {
let newStats = {
basic: {
level: level,
level: stats.level,
'next level': xpRemaining + 'xp',
gap1: '',
gold: window.player.trade.gold,
@@ -353,7 +347,7 @@ define([
'spell increase': stats.spellPercent + '%',
gap3: '',
'attack speed': (100 + stats.attackSpeed) + '%',
'cast speed': (100 + stats.castSpeed) + '%',
'cast speed': (100 + stats.castSpeed) + '%'
},
defense: {
armor: stats.armor,
@@ -381,18 +375,18 @@ define([
}
}[this.find('.tab.selected').html()];

for (var s in newStats) {
var label = s + ': ';
var value = newStats[s];
for (let s in newStats) {
let label = s + ': ';
let value = newStats[s];

var isGap = false;
let isGap = false;
if (label.indexOf('gap') == 0) {
isGap = true;
label = '';
value = '';
}

var row = $('<div class="stat"><font class="q0">' + label + '</font><font color="#999">' + value + '</font></div>')
let row = $('<div class="stat"><font class="q0">' + label + '</font><font color="#999">' + value + '</font></div>')
.appendTo(container);

if (s == 'gold')


+ 7
- 11
src/client/ui/templates/hud/hud.js View File

@@ -23,10 +23,10 @@ define([
},

onGetPortrait: function (portrait) {
var spritesheet = portrait.spritesheet || '../../../images/portraitIcons.png';
let spritesheet = portrait.spritesheet || '../../../images/portraitIcons.png';

var x = portrait.x * -64;
var y = portrait.y * -64;
let x = portrait.x * -64;
let y = portrait.y * -64;

this.find('.portrait')
.css({
@@ -36,9 +36,9 @@ define([
},

build: function () {
var stats = this.stats;
let stats = this.stats;

var boxes = this.find('.statBox');
let boxes = this.find('.statBox');

[
stats.hp / stats.hpMax,
@@ -53,11 +53,7 @@ define([
boxes.eq(0).find('.text').html(Math.floor(stats.hp) + '/' + ~~stats.hpMax);
boxes.eq(1).find('.text').html(Math.floor(stats.mana) + '/' + ~~stats.manaMax);

var level = stats.level;
if ((stats.originalLevel) && (stats.originalLevel != level))
level = stats.originalLevel + ' (' + stats.level + ')';

boxes.eq(2).find('.text').html('level: ' + level);
boxes.eq(2).find('.text').html('level: ' + stats.level);
}
}
};
});

+ 45
- 50
src/client/ui/templates/inventory/inventory.js View File

@@ -15,7 +15,7 @@ define([
tplTooltip,
input
) {
var qualityColors = [{
let qualityColors = [{
r: 252,
g: 252,
b: 252
@@ -77,20 +77,20 @@ define([
},

build: function () {
var container = this.el.find('.grid')
let container = this.el.find('.grid')
.empty();

var items = this.items
let items = this.items
.filter(function (item) {
return !item.eq;
});

var iLen = Math.max(items.length, 50);
let iLen = Math.max(items.length, 50);

var rendered = [];
let rendered = [];

for (var i = 0; i < iLen; i++) {
var item = items.find(function (item) {
let item = items.find(function (item) {
return ((item.pos != null) && (item.pos == i));
});

@@ -106,17 +106,16 @@ define([
.remove();

continue;
} else {
} else
rendered.push(item);
}

var imgX = -item.sprite[0] * 64;
var imgY = -item.sprite[1] * 64;
let imgX = -item.sprite[0] * 64;
let imgY = -item.sprite[1] * 64;

var itemEl = $(tplItem)
.appendTo(container);

var spritesheet = item.spritesheet || '../../../images/items.png';
let spritesheet = item.spritesheet || '../../../images/items.png';
if (!item.spritesheet) {
if (item.material)
spritesheet = '../../../images/materials.png';
@@ -152,7 +151,7 @@ define([
},

onClick: function (item) {
var msg = {
let msg = {
item: item,
success: true
};
@@ -190,26 +189,26 @@ define([
events.emit('onHideItemTooltip', this.hoverItem);
this.hoverItem = null;
} else if (this.dragItem) {
var method = 'moveItem';
let method = 'moveItem';

if ((this.hoverCell) && (this.hoverCell[0] != this.dragItem[0])) {
var placeholder = $('<div></div>')
let placeholder = $('<div></div>')
.insertAfter(this.dragItem);

this.dragItem.insertBefore(this.hoverCell);
this.hoverCell.insertBefore(placeholder);
placeholder.remove();

var msgs = [{
let msgs = [{
id: this.dragItem.data('item').id,
pos: this.dragItem.index()
}];

this.items.find(function (i) {
return (i.id == this.dragItem.data('item').id)
return (i.id == this.dragItem.data('item').id);
}, this).pos = this.dragItem.index();

var hoverCellItem = this.hoverCell.data('item');
let hoverCellItem = this.hoverCell.data('item');
if (hoverCellItem) {
if ((hoverCellItem.name != this.dragItem.data('item').name) || (!hoverCellItem.quantity)) {
msgs.push({
@@ -218,13 +217,13 @@ define([
});

this.items.find(function (i) {
return (i.id == hoverCellItem.id)
return (i.id == hoverCellItem.id);
}, this).pos = this.hoverCell.index();
} else {
method = 'combineStacks';
msgs = {
fromId: this.dragItem.data('item').id,
toId: hoverCellItem.id,
toId: hoverCellItem.id
};
}
}
@@ -254,7 +253,7 @@ define([
if (!this.dragEl)
return;

var offset = this.find('.grid').offset();
let offset = this.find('.grid').offset();

this.dragEl.css({
left: e.clientX - offset.left - 40,
@@ -264,7 +263,7 @@ define([
},

showContext: function (item, e) {
var menuItems = {
let menuItems = {
drop: {
text: 'drop',
callback: this.performItemAction.bind(this, item, 'dropItem')
@@ -320,7 +319,7 @@ define([
if (item.active)
menuItems.activate.text = 'deactivate';

var config = [];
let config = [];

if (item.ability)
config.push(menuItems.learn);
@@ -369,7 +368,7 @@ define([
},

splitStackStart: function (item) {
var box = this.find('.split-box').show();
let box = this.find('.split-box').show();
box.data('item', item);

box.find('.amount')
@@ -378,7 +377,7 @@ define([
},

splitStackEnd: function (cancel, e) {
var box = this.find('.split-box');
let box = this.find('.split-box');

if ((cancel) || (!e) || (e.target != box.find('.btnSplit')[0])) {
if ((cancel) && (!$(e.target).hasClass('button')))
@@ -404,8 +403,8 @@ define([
},

onChangeStackAmount: function (e, amount) {
var item = this.find('.split-box').data('item');
var delta = e ? ((e.originalEvent.deltaY > 0) ? -1 : 1) : amount;
let item = this.find('.split-box').data('item');
let delta = e ? ((e.originalEvent.deltaY > 0) ? -1 : 1) : amount;
if (this.shiftDown)
delta *= 10;
var amount = this.find('.split-box .amount');
@@ -414,12 +413,12 @@ define([
},

onEnterStackAmount: function (e) {
var el = this.find('.split-box .amount');
var val = el.val();
let el = this.find('.split-box .amount');
let val = el.val();
if (val != ~~val)
el.val('');
else if (val) {
var item = this.find('.split-box').data('item');
let item = this.find('.split-box').data('item');
if (val < 0)
val = '';
else if (val > item.quantity - 1)
@@ -454,7 +453,7 @@ define([
if (!item)
return;

var ttPos = null;
let ttPos = null;

if (el) {
if (el.hasClass('new')) {
@@ -463,14 +462,14 @@ define([
delete item.isNew;
}

var elOffset = el.offset();
let elOffset = el.offset();
ttPos = {
x: ~~(e.clientX + 32),
y: ~~(e.clientY)
};
}

var compare = null;
let compare = null;
if (item.slot) {
compare = this.items.find(function (i) {
return ((i.eq) && (i.slot == item.slot));
@@ -478,51 +477,50 @@ define([

// check special cases for mismatched weapon/offhand scenarios (only valid when comparing)
if ((!compare) && (this.shiftDown)) {
var equippedTwoHanded = this.items.find(function (i) {
let equippedTwoHanded = this.items.find(function (i) {
return ((i.eq) && (i.slot == 'twoHanded'));
});

var equippedOneHanded = this.items.find(function (i) {
let equippedOneHanded = this.items.find(function (i) {
return ((i.eq) && (i.slot == 'oneHanded'));
});

var equippedOffhand = this.items.find(function (i) {
let equippedOffhand = this.items.find(function (i) {
return ((i.eq) && (i.slot == 'offHand'));
});

if (item.slot == 'twoHanded') {
if (!equippedOneHanded) {
if (!equippedOneHanded)
compare = equippedOffhand;
} else if (!equippedOffhand) {
else if (!equippedOffhand)
compare = equippedOneHanded;
} else {
else {
// compare against oneHanded and offHand combined by creating a virtual item that is the sum of the two
compare = $.extend(true, {}, equippedOneHanded);
compare.refItem = equippedOneHanded;

for (var s in equippedOffhand.stats) {
for (let s in equippedOffhand.stats) {
if (!compare.stats[s])
compare.stats[s] = 0;

compare.stats[s] += equippedOffhand.stats[s]
compare.stats[s] += equippedOffhand.stats[s];
}
}
}

if (item.slot == 'oneHanded') {
if (item.slot == 'oneHanded')
compare = equippedTwoHanded;
}

// this case is kind of ugly, but we don't want to go in when comparing an offHand to (oneHanded + empty offHand) - that should just use the normal compare which is offHand to empty
if ((item.slot == 'offHand') && (equippedTwoHanded)) {
// since we're comparing an offhand to an equipped Twohander, we need to clone the 'spell' values over (setting damage to zero) so that we can properly display how much damage
// the player would lose by switching to the offhand (which would remove the twoHander)
// keep a reference to the original item for use in onHideToolTip
var spellClone = $.extend(true, {}, equippedTwoHanded.spell);
let spellClone = $.extend(true, {}, equippedTwoHanded.spell);
spellClone.name = '';
spellClone.values['damage'] = 0;
spellClone.values.damage = 0;

var clone = $.extend(true, {}, item, {
let clone = $.extend(true, {}, item, {
spell: spellClone
});
clone.refItem = item;
@@ -544,7 +542,7 @@ define([
},
onDestroyItems: function (itemIds) {
itemIds.forEach(function (id) {
var item = this.items.find(i => i.id == id);
let item = this.items.find(i => i.id == id);
if (item == this.hoverItem)
this.hideTooltip();

@@ -584,9 +582,6 @@ define([
},

performItemAction: function (item, action) {
var stats = window.player.stats.values;
var playerLevel = stats.originalLevel || stats.level;

if (!item)
return;
else if ((action == 'equip') && ((item.material) || (item.quest) || (item.type == 'mtx') || (!window.player.inventory.canEquipItem(item))))
@@ -596,7 +591,7 @@ define([
else if ((action == 'activateMtx') && (item.type != 'mtx'))
return;

var cpn = 'inventory';
let cpn = 'inventory';
if (action == 'equip')
cpn = 'equipment';



+ 64
- 109
src/server/components/equipment.js View File

@@ -32,9 +32,9 @@ define([
if (!this.doAutoEq)
return;

var stats = this.obj.stats.values;
let stats = this.obj.stats.values;

var item = this.obj.inventory.findItem(itemId);
let item = this.obj.inventory.findItem(itemId);
if (!item)
return;
else if ((!item.slot) || (item.material) || (item.quest) || (item.ability) || (!this.obj.inventory.canEquipItem(item))) {
@@ -42,7 +42,7 @@ define([
return;
}

var currentEqId = this.eq[item.slot];
let currentEqId = this.eq[item.slot];
if (currentEqId == null) {
this.equip(itemId);
return true;
@@ -50,13 +50,13 @@ define([
},

equip: function (itemId) {
var slot = null;
let slot = null;
if (typeof (itemId) == 'object') {
slot = itemId.slot;
itemId = itemId.itemId;
}

var item = this.obj.inventory.findItem(itemId);
let item = this.obj.inventory.findItem(itemId);
if (!item)
return;
else if ((!item.slot) || (item.material) || (item.quest) || (item.ability) || (!this.obj.inventory.canEquipItem(item))) {
@@ -81,7 +81,7 @@ define([
}
}

var equipMsg = {
let equipMsg = {
success: true,
item: item
};
@@ -103,8 +103,8 @@ define([
this.obj.syncer.setArray(true, 'inventory', 'getItems', item);

if (slot == 'finger') {
var f1 = (this.eq['finger-1'] != null);
var f2 = (this.eq['finger-2'] != null);
let f1 = (this.eq['finger-1'] != null);
let f2 = (this.eq['finger-2'] != null);

if ((f1) && (f2))
slot = 'finger-1';
@@ -114,7 +114,7 @@ define([
slot = 'finger-2';
}

var spellId = null;
let spellId = null;
var currentEqId = this.eq[slot];
var currentEq = this.obj.inventory.findItem(currentEqId);
if (currentEq == item)
@@ -124,15 +124,9 @@ define([
this.unequip(currentEqId);
}

var stats = item.stats;
if (this.obj.player) {
var maxLevel = this.obj.instance.zone.level[1];
if (maxLevel < item.level)
stats = generatorStats.rescale(item, maxLevel);
}

for (var s in stats) {
var val = stats[s];
let stats = item.stats;
for (let s in stats) {
let val = stats[s];

this.obj.stats.addStat(s, val);
}
@@ -151,7 +145,7 @@ define([
if (item.spell)
this.obj.inventory.learnAbility(itemId, item.runeSlot);
else {
var result = item;
let result = item;
if (item.effects) {
result = extend(true, {}, item);
result.effects = result.effects.map(e => ({
@@ -159,14 +153,14 @@ define([
text: e.text,
properties: e.properties
}));
var reputation = this.obj.reputation;
let reputation = this.obj.reputation;

if (result.factions) {
result.factions = result.factions.map(function (f) {
var faction = reputation.getBlueprint(f.id);
var factionTier = reputation.getTier(f.id);
let faction = reputation.getBlueprint(f.id);
let factionTier = reputation.getTier(f.id);

var noEquip = null;
let noEquip = null;
if (factionTier < f.tier)
noEquip = true;

@@ -187,8 +181,8 @@ define([
this.obj.fireEvent('afterEquipItem', item);
},
unequip: function (itemId) {
var item = itemId;
var slot = null;
let item = itemId;
let slot = null;
if (typeof (itemId) == 'object') {
slot = itemId.slot;
itemId = itemId.itemId;
@@ -200,19 +194,14 @@ define([
if (!item)
return;

var stats = item.stats;
if (this.obj.player) {
var maxLevel = this.obj.instance.zone.level[1];
if (maxLevel < item.level)
stats = generatorStats.rescale(item, maxLevel);
}
let stats = item.stats;

delete item.eq;
delete this.eq[item.equipSlot];
delete item.equipSlot;

for (var s in stats) {
var val = stats[s];
for (let s in stats) {
let val = stats[s];

this.obj.stats.addStat(s, -val);
}
@@ -226,38 +215,36 @@ define([
if (item.spell) {
item.eq = true;
this.obj.inventory.unlearnAbility(itemId, item.runeSlot);
} else {
if (!item.effects)
this.obj.syncer.setArray(true, 'inventory', 'getItems', item);
else {
var result = extend(true, {}, item);
result.effects = result.effects.map(e => ({
factionId: e.factionId,
text: e.text,
properties: e.properties
}));
var reputation = this.obj.reputation;

if (result.factions) {
result.factions = result.factions.map(function (f) {
var faction = reputation.getBlueprint(f.id);
var factionTier = reputation.getTier(f.id);

var noEquip = null;
if (factionTier < f.tier)
noEquip = true;

return {
name: faction.name,
tier: f.tier,
tierName: ['Hated', 'Hostile', 'Unfriendly', 'Neutral', 'Friendly', 'Honored', 'Revered', 'Exalted'][f.tier],
noEquip: noEquip
};
}, this);
}

this.obj.syncer.setArray(true, 'inventory', 'getItems', result);
} else if (!item.effects)
this.obj.syncer.setArray(true, 'inventory', 'getItems', item);
else {
let result = extend(true, {}, item);
result.effects = result.effects.map(e => ({
factionId: e.factionId,
text: e.text,
properties: e.properties
}));
let reputation = this.obj.reputation;

if (result.factions) {
result.factions = result.factions.map(function (f) {
let faction = reputation.getBlueprint(f.id);
let factionTier = reputation.getTier(f.id);

let noEquip = null;
if (factionTier < f.tier)
noEquip = true;

return {
name: faction.name,
tier: f.tier,
tierName: ['Hated', 'Hostile', 'Unfriendly', 'Neutral', 'Friendly', 'Honored', 'Revered', 'Exalted'][f.tier],
noEquip: noEquip
};
}, this);
}

this.obj.syncer.setArray(true, 'inventory', 'getItems', result);
}

this.obj.spellbook.calcDps();
@@ -265,27 +252,27 @@ define([
this.obj.fireEvent('afterUnequipItem', item);
},
unequipAll: function () {
var eq = this.eq;
let eq = this.eq;
Object.keys(this.eq).forEach(function (slot) {
this.unequip(eq[slot]);
}, this);
},

unequipAttrRqrGear: function () {
var inventory = this.obj.inventory;
let inventory = this.obj.inventory;

var eq = this.eq;
let eq = this.eq;
Object.keys(this.eq).forEach(function (slot) {
var itemId = eq[slot];
var item = inventory.findItem(itemId);
let itemId = eq[slot];
let item = inventory.findItem(itemId);
if (!item)
return;

var errors = inventory.equipItemErrors(item);
let errors = inventory.equipItemErrors(item);
if (errors.length > 0) {
this.unequip(itemId);

var message = ({
let message = ({
int: `You suddenly feel too stupid to wear your ${item.name}`,
str: `Your weak body can no longer equip your ${item.name}`,
dex: `Your sluggish physique cannot possibly equip your ${item.name}`
@@ -304,18 +291,18 @@ define([
},

unequipFactionGear: function (factionId, tier) {
var inventory = this.obj.inventory;
let inventory = this.obj.inventory;

var eq = this.eq;
let eq = this.eq;
Object.keys(this.eq).forEach(function (slot) {
var itemId = eq[slot];
var item = inventory.findItem(itemId);
let itemId = eq[slot];
let item = inventory.findItem(itemId);

var factions = item.factions;
let factions = item.factions;
if (!factions)
return;

var findFaction = factions.find(f => f.id == factionId);
let findFaction = factions.find(f => f.id == factionId);
if (!findFaction)
return;

@@ -332,38 +319,6 @@ define([
}, [this.obj.serverId]);
}
}, this);
},

rescale: function (level) {
var items = this.obj.inventory.items;

var stats = {};

var eq = this.eq;
for (var p in eq) {
var item = items.find(i => (i.id == eq[p]));
if ((!item.slot) || (item.slot == 'tool')) {
continue;
}

var item = items.find(i => (i.id == eq[p]));
var nItemStats = item.stats;
if (item.level > level)
nItemStats = generatorStats.rescale(item, level);

var tempItem = extend(true, {}, item);
tempItem.stats = extend(true, {}, nItemStats);
this.obj.fireEvent('afterRescaleItemStats', tempItem);

for (var s in tempItem.stats) {
if (!stats[s])
stats[s] = 0;

stats[s] += tempItem.stats[s];
}
}

return stats;
}
};
});

+ 172
- 180
src/server/components/inventory.js View File

@@ -29,13 +29,13 @@ define([
//Base Methods

init: function (blueprint, isTransfer) {
var items = blueprint.items || [];
var iLen = items.length;
let items = blueprint.items || [];
let iLen = items.length;

//Spells should be sorted so they're EQ'd in the right order
items.sort(function (a, b) {
var aId = (a.spellId != null) ? ~~a.spellId : 9999;
var bId = (b.spellId != null) ? ~~b.spellId : 9999;
let aId = (a.spellId != null) ? ~~a.spellId : 9999;
let bId = (b.spellId != null) ? ~~b.spellId : 9999;
return (aId - bId);
});

@@ -44,18 +44,17 @@ define([
if ((item.pos >= this.inventorySize) || (item.eq))
delete item.pos;

while (item.name.indexOf(`''`) > -1) {
item.name = item.name.replace(`''`, `'`);
}
while (item.name.indexOf('\'\'') > -1)
item.name = item.name.replace('\'\'', '\'');
}

this.hookItemEvents(items);

for (var i = 0; i < iLen; i++) {
var item = items[i];
var pos = item.pos;
let pos = item.pos;

var newItem = this.getItem(item, true, true);
let newItem = this.getItem(item, true, true);
newItem.pos = pos;
}

@@ -82,13 +81,13 @@ define([
if (!self)
return null;

var reputation = this.obj.reputation;
let reputation = this.obj.reputation;

return {
type: 'inventory',
items: this.items
.map(function (i) {
var item = extend(true, {}, i);
let item = extend(true, {}, i);

if (item.effects) {
item.effects = item.effects.map(e => ({
@@ -103,10 +102,10 @@ define([

if (item.factions) {
item.factions = item.factions.map(function (f) {
var faction = reputation.getBlueprint(f.id);
var factionTier = reputation.getTier(f.id);
let faction = reputation.getBlueprint(f.id);
let factionTier = reputation.getTier(f.id);

var noEquip = null;
let noEquip = null;
if (factionTier < f.tier)
noEquip = true;

@@ -129,10 +128,10 @@ define([
},

update: function () {
var items = this.items;
var iLen = items.length;
for (var i = 0; i < iLen; i++) {
var item = items[i];
let items = this.items;
let iLen = items.length;
for (let i = 0; i < iLen; i++) {
let item = items[i];
if (!item.cd)
continue;

@@ -145,7 +144,7 @@ define([
//Client Actions

enchantItem: function (msg) {
var item = this.findItem(msg.itemId);
let item = this.findItem(msg.itemId);
if ((!item) || (!item.slot) || (item.eq) || (item.noAugment) || ((msg.action == 'scour') && (item.power == 0))) {
this.resolveCallback(msg);
return;
@@ -155,8 +154,8 @@ define([
},

getEnchantMaterials: function (msg) {
var result = [];
var item = this.findItem(msg.itemId);
let result = [];
let item = this.findItem(msg.itemId);
if ((item) && (item.slot))
result = enchanter.getEnchantMaterials(item, msg.action);

@@ -165,24 +164,24 @@ define([

learnAbility: function (itemId, runeSlot) {
if (itemId.itemId != null) {
var msg = itemId;
let msg = itemId;
itemId = msg.itemId;
runeSlot = msg.slot;
}

var item = this.findItem(itemId);
var statValues = this.obj.stats.values;
let item = this.findItem(itemId);
let statValues = this.obj.stats.values;
if (!item)
return;
else if (!item.spell) {
item.eq = false;
return;
} else if (item.level > (statValues.originalLevel || statValues.level)) {
} else if (item.level > statValues.level) {
item.eq = false;
return;
}

var learnMsg = {
let learnMsg = {
success: true,
item: item
};
@@ -200,7 +199,7 @@ define([
return;
}

var spellbook = this.obj.spellbook;
let spellbook = this.obj.spellbook;

if ((item.slot == 'twoHanded') || (item.slot == 'oneHanded'))
runeSlot = 0;
@@ -214,7 +213,7 @@ define([
}
}

var currentEq = this.items.find(i => (i.runeSlot == runeSlot));
let currentEq = this.items.find(i => (i.runeSlot == runeSlot));
if (currentEq) {
spellbook.removeSpellById(runeSlot);
delete currentEq.eq;
@@ -232,7 +231,7 @@ define([
},

activateMtx: function (itemId) {
var item = this.findItem(itemId);
let item = this.findItem(itemId);
if (!item)
return;
else if (item.type != 'mtx') {
@@ -246,13 +245,13 @@ define([
},

splitStack: function (msg) {
var item = this.findItem(msg.itemId);
let item = this.findItem(msg.itemId);
if (!item)
return;
else if ((!item.quantity) || (item.quantity <= msg.stackSize) || (msg.stackSize < 1))
return;

var newItem = extend(true, {}, item);
let newItem = extend(true, {}, item);
item.quantity -= msg.stackSize;
newItem.quantity = msg.stackSize;

@@ -262,8 +261,8 @@ define([
},

combineStacks: function (msg) {
var fromItem = this.findItem(msg.fromId);
var toItem = this.findItem(msg.toId);
let fromItem = this.findItem(msg.fromId);
let toItem = this.findItem(msg.toId);

if ((!fromItem) || (!toItem))
return;
@@ -276,7 +275,7 @@ define([
},

useItem: function (itemId) {
var item = this.findItem(itemId);
let item = this.findItem(itemId);
if (!item)
return;

@@ -285,7 +284,7 @@ define([
process.send({
method: 'events',
data: {
'onGetAnnouncement': [{
onGetAnnouncement: [{
obj: {
msg: 'That item is on cooldown'
},
@@ -306,7 +305,7 @@ define([
});
}

var result = {};
let result = {};
this.obj.instance.eventEmitter.emit('onBeforeUseItem', this.obj, item, result);

if (item.type == 'consumable') {
@@ -323,7 +322,7 @@ define([
if (itemId.itemId != null)
itemId = itemId.itemId;

var item = this.findItem(itemId);
let item = this.findItem(itemId);
if (!item)
return;
else if (!item.spell) {
@@ -331,7 +330,7 @@ define([
return;
}

var spellbook = this.obj.spellbook;
let spellbook = this.obj.spellbook;
spellbook.removeSpellById(item.runeSlot);
delete item.eq;
delete item.runeSlot;
@@ -341,36 +340,36 @@ define([
},

stashItem: function (id) {
var item = this.findItem(id);
let item = this.findItem(id);
if ((!item) || (item.quest) || (item.noStash))
return;

delete item.pos;

var stash = this.obj.stash;
let stash = this.obj.stash;
if (!stash.active)
return;

var clonedItem = extend(true, {}, item);
let clonedItem = extend(true, {}, item);
this.destroyItem(id, null, true);
stash.deposit(clonedItem);
},

salvageItem: function (id) {
var item = this.findItem(id);
let item = this.findItem(id);
if ((!item) || (item.material) || (item.quest) || (item.noSalvage) || (item.eq))
return;

var messages = [];
let messages = [];

var items = salvager.salvage(item);
var iLen = items.length;
let items = salvager.salvage(item);
let iLen = items.length;

if (!iLen)
return;

for (var i = 0; i < iLen; i++) {
var material = items[i];
for (let i = 0; i < iLen; i++) {
let material = items[i];

this.getItem(material, true);

@@ -389,7 +388,7 @@ define([
},

destroyItem: function (id, amount, force) {
var item = this.findItem(id);
let item = this.findItem(id);
if ((!item) || ((item.noDestroy) && (!force)))
return;

@@ -416,16 +415,16 @@ define([
},

dropItem: function (id) {
var item = this.findItem(id);
let item = this.findItem(id);
if ((!item) || (item.noDrop) || (item.quest))
return;

delete item.pos;

//Find close open position
var x = this.obj.x;
var y = this.obj.y;
var dropCell = this.obj.instance.physics.getOpenCellInArea(x - 1, y - 1, x + 1, y + 1);
let x = this.obj.x;
let y = this.obj.y;
let dropCell = this.obj.instance.physics.getOpenCellInArea(x - 1, y - 1, x + 1, y + 1);
if (!dropCell)
return;

@@ -441,7 +440,7 @@ define([

moveItem: function (msgs) {
msgs.forEach(function (m) {
var item = this.findItem(m.id);
let item = this.findItem(m.id);
if (!item)
return;

@@ -450,7 +449,7 @@ define([
},

mailItem: function (msg) {
var item = this.findItem(msg.itemId);
let item = this.findItem(msg.itemId);
if ((!item) || (item.noDrop) || (item.quest)) {
this.resolveCallback(msg);
return;
@@ -458,7 +457,7 @@ define([

delete item.pos;

var io = require('security/io');
let io = require('security/io');
io.get({
ent: msg.recipient,
field: 'character',
@@ -483,24 +482,24 @@ define([

hookItemEvents: function (items) {
var items = items || this.items;
var iLen = items.length;
for (var i = 0; i < iLen; i++) {
let iLen = items.length;
for (let i = 0; i < iLen; i++) {
var item = items[i];

if (item.effects) {
item.effects.forEach(function (e) {
if (e.mtx) {
var mtxUrl = mtx.get(e.mtx);
var mtxModule = require(mtxUrl);
let mtxUrl = mtx.get(e.mtx);
let mtxModule = require(mtxUrl);

e.events = mtxModule.events;
} else if (e.factionId) {
var faction = factions.getFaction(e.factionId);
var statGenerator = faction.uniqueStat;
let faction = factions.getFaction(e.factionId);
let statGenerator = faction.uniqueStat;
statGenerator.generate(item);
} else {
var effectUrl = itemEffects.get(e.type);
var effectModule = require(effectUrl);
let effectUrl = itemEffects.get(e.type);
let effectModule = require(effectUrl);

e.events = effectModule.events;
}
@@ -530,11 +529,11 @@ define([
},

setItemPosition: function (id) {
var item = this.findItem(id);
let item = this.findItem(id);
if (!item)
return;

var iSize = this.inventorySize;
let iSize = this.inventorySize;
for (var i = 0; i < iSize; i++) {
if (!this.items.some(j => (j.pos == i))) {
item.pos = i;
@@ -544,7 +543,7 @@ define([
},

resolveCallback: function (msg, result) {
var callbackId = (msg.callbackId != null) ? msg.callbackId : msg;
let callbackId = (msg.callbackId != null) ? msg.callbackId : msg;
result = result || [];

if (callbackId == null)
@@ -568,7 +567,7 @@ define([
},

getDefaultAbilities: function () {
var hasWeapon = this.items.some(function (i) {
let hasWeapon = this.items.some(function (i) {
return (
(i.spell) &&
(i.spell.rolls) &&
@@ -578,7 +577,7 @@ define([
});

if (!hasWeapon) {
var item = generator.generate({
let item = generator.generate({
type: classes.weapons[this.obj.class],
quality: 0,
spellQuality: 'basic'
@@ -589,7 +588,7 @@ define([
}

classes.spells[this.obj.class].forEach(function (spellName) {
var hasSpell = this.items.some(function (i) {
let hasSpell = this.items.some(function (i) {
return (
(i.spell) &&
(i.spell.name.toLowerCase() == spellName)
@@ -597,7 +596,7 @@ define([
});

if (!hasSpell) {
var item = generator.generate({
let item = generator.generate({
spell: true,
spellQuality: 'basic',
spellName: spellName
@@ -613,12 +612,12 @@ define([
if (ownerId == null)
ownerId = -1;

var bagCell = 50;
let bagCell = 50;

var topQuality = 0;
var iLen = items.length;
for (var i = 0; i < iLen; i++) {
var quality = items[i].quality;
let topQuality = 0;
let iLen = items.length;
for (let i = 0; i < iLen; i++) {
let quality = items[i].quality;
items[i].fromMob = !!this.obj.mob;
if (quality > topQuality)
topQuality = quality;
@@ -635,7 +634,7 @@ define([
else
bagCell = 53;

var obj = this.obj.instance.objects.buildObjects([{
let obj = this.obj.instance.objects.buildObjects([{
sheetName: 'objects',
cell: bagCell,
x: x,
@@ -656,17 +655,16 @@ define([

hasSpace: function () {
if (this.inventorySize != -1) {
var nonEqItems = this.items.filter(f => !f.eq).length;
let nonEqItems = this.items.filter(f => !f.eq).length;
return (nonEqItems < this.inventorySize);
} else
return true;
} return true;
},

getItem: function (item, hideMessage, noStack) {
this.obj.instance.eventEmitter.emit('onBeforeGetItem', item, this.obj);

//We need to know if a mob dropped it for quest purposes
var fromMob = item.fromMob;
let fromMob = item.fromMob;

if (item.quality == null)
item.quality = 0;
@@ -676,11 +674,11 @@ define([
delete item.fromMob;

//Store the quantity to send to the player
var quantity = item.quantity;
let quantity = item.quantity;

var exists = false;
let exists = false;
if (((item.material) || (item.quest) || (item.quantity)) && (!item.noStack) && (!item.uses) && (!noStack)) {
var existItem = this.items.find(i => (i.name == item.name));
let existItem = this.items.find(i => (i.name == item.name));
if (existItem) {
exists = true;
if (!existItem.quantity)
@@ -696,9 +694,9 @@ define([

//Get next id
if (!exists) {
var id = 0;
var items = this.items;
var iLen = items.length;
let id = 0;
let items = this.items;
let iLen = items.length;

if (!this.hasSpace()) {
if (!hideMessage) {
@@ -716,10 +714,9 @@ define([
}

for (var i = 0; i < iLen; i++) {
var fItem = items[i];
if (fItem.id >= id) {
let fItem = items[i];
if (fItem.id >= id)
id = fItem.id + 1;
}
}
item.id = id;

@@ -727,7 +724,7 @@ define([
delete item.pos;

if ((item.pos == null) && (!item.eq)) {
var pos = iLen;
let pos = iLen;
for (var i = 0; i < iLen; i++) {
if (!items.some(fi => (fi.pos == i))) {
pos = i;
@@ -739,9 +736,9 @@ define([
}

if ((this.obj.player) && (!hideMessage)) {
var messages = [];
let messages = [];

var msg = item.name;
let msg = item.name;
if (quantity)
msg += ' x' + quantity;
else if ((item.stats) && (item.stats.weight))
@@ -767,11 +764,11 @@ define([

//TODO: Remove later, just for test
if (item.stats) {
var stats = Object.keys(item.stats);
var sLen = stats.length
let stats = Object.keys(item.stats);
let sLen = stats.length;
for (var i = 0; i < sLen; i++) {
var s = stats[i];
var val = item.stats[s];
let s = stats[i];
let val = item.stats[s];
if (s == 'maxHp') {
delete item.stats[s];
item.stats.hpMax = val;
@@ -785,13 +782,13 @@ define([
if (item.effects) {
item.effects.forEach(function (e) {
if (e.mtx) {
var mtxUrl = mtx.get(e.mtx);
var mtxModule = require(mtxUrl);
let mtxUrl = mtx.get(e.mtx);
let mtxModule = require(mtxUrl);

e.events = mtxModule.events;
} else if (e.type) {
var effectUrl = itemEffects.get(e.type);
var effectModule = require(effectUrl);
let effectUrl = itemEffects.get(e.type);
let effectModule = require(effectUrl);

e.text = effectModule.events.onGetText(item);

@@ -808,40 +805,38 @@ define([
this.learnAbility(item.id, item.runeSlot);
else
this.obj.equipment.equip(item.id);
} else {
if (!item.effects)
this.obj.syncer.setArray(true, 'inventory', 'getItems', item, true);
else {
var result = extend(true, {}, item);
result.effects = result.effects.map(e => ({
factionId: e.factionId,
text: e.text,
properties: e.properties
}));

var reputation = this.obj.reputation;

//Don't do this check if we don't have a reputation cpn. That means this is most likely a bag
if ((reputation) && (result.factions)) {
result.factions = result.factions.map(function (f) {
var faction = reputation.getBlueprint(f.id);
var factionTier = reputation.getTier(f.id);

var noEquip = null;
if (factionTier < f.tier)
noEquip = true;

return {
name: faction.name,
tier: f.tier,
tierName: ['Hated', 'Hostile', 'Unfriendly', 'Neutral', 'Friendly', 'Honored', 'Revered', 'Exalted'][f.tier],
noEquip: noEquip
};
}, this);
}

this.obj.syncer.setArray(true, 'inventory', 'getItems', result, true);
} else if (!item.effects)
this.obj.syncer.setArray(true, 'inventory', 'getItems', item, true);
else {
let result = extend(true, {}, item);
result.effects = result.effects.map(e => ({
factionId: e.factionId,
text: e.text,
properties: e.properties
}));

let reputation = this.obj.reputation;

//Don't do this check if we don't have a reputation cpn. That means this is most likely a bag
if ((reputation) && (result.factions)) {
result.factions = result.factions.map(function (f) {
let faction = reputation.getBlueprint(f.id);
let factionTier = reputation.getTier(f.id);

let noEquip = null;
if (factionTier < f.tier)
noEquip = true;

return {
name: faction.name,
tier: f.tier,
tierName: ['Hated', 'Hostile', 'Unfriendly', 'Neutral', 'Friendly', 'Honored', 'Revered', 'Exalted'][f.tier],
noEquip: noEquip
};
}, this);
}

this.obj.syncer.setArray(true, 'inventory', 'getItems', result, true);
}

if (!hideMessage) {
@@ -857,14 +852,14 @@ define([
return;

//Only drop loot if this player is in the zone
var playerObject = this.obj.instance.objects.find(o => o.serverId == ownerId);
let playerObject = this.obj.instance.objects.find(o => o.serverId == ownerId);
if (!playerObject)
return;

//Get player's spells' statTypes
var stats = [];
let stats = [];
playerObject.spellbook.spells.forEach(function (s) {
var spellStatType = s.statType;
let spellStatType = s.statType;
if (!(spellStatType instanceof Array))
spellStatType = [spellStatType];
spellStatType.forEach(function (ss) {
@@ -873,20 +868,20 @@ define([
});
});

var items = this.items;
var iLen = items.length;
let items = this.items;
let iLen = items.length;
for (var i = 0; i < iLen; i++) {
delete items[i].eq;
delete items[i].pos;
}

var blueprint = this.blueprint;
let blueprint = this.blueprint;

var savedItems = extend(true, [], this.items);
var instancedItems = extend(true, [], this.items);
let savedItems = extend(true, [], this.items);
let instancedItems = extend(true, [], this.items);
this.items = [];

var dropEvent = {
let dropEvent = {
chanceMultiplier: 1,
source: this.obj
};
@@ -894,10 +889,10 @@ define([

if ((!blueprint.noRandom) || (blueprint.alsoRandom)) {
var magicFind = (blueprint.magicFind || 0);
var bonusMagicFind = killSource.stats.values.magicFind;
let bonusMagicFind = killSource.stats.values.magicFind;

var rolls = blueprint.rolls;
var itemQuantity = killSource.stats.values.itemQuantity;
let rolls = blueprint.rolls;
let itemQuantity = killSource.stats.values.itemQuantity;
rolls += ~~(itemQuantity / 100);
if ((Math.random() * 100) < (itemQuantity % 100))
rolls++;
@@ -906,35 +901,34 @@ define([
if (Math.random() * 100 >= (blueprint.chance || 35) * dropEvent.chanceMultiplier)
continue;

var itemBlueprint = {
let itemBlueprint = {
level: this.obj.stats.values.level,
magicFind: magicFind,
bonusMagicFind: bonusMagicFind
};

var statValues = this.obj.stats.values;
useItem = generator.generate(itemBlueprint, statValues.originalLevel || statValues.level);
let statValues = this.obj.stats.values;
useItem = generator.generate(itemBlueprint, statValues.level);

this.getItem(useItem);
}
}

if (blueprint.noRandom) {
var blueprints = blueprint.blueprints;
let blueprints = blueprint.blueprints;
for (var i = 0; i < blueprints.length; i++) {
var drop = blueprints[i];
let drop = blueprints[i];
if ((blueprint.chance) && (~~(Math.random() * 100) >= blueprint.chance * dropEvent.chanceMultiplier))
continue;
else if ((drop.maxLevel) && (drop.maxLevel < killSource.stats.values.level))
continue;
else if ((drop.chance) && (~~(Math.random() * 100) >= drop.chance * dropEvent.chanceMultiplier)) {
else if ((drop.chance) && (~~(Math.random() * 100) >= drop.chance * dropEvent.chanceMultiplier))
continue;
}

drop.level = drop.level || this.obj.stats.values.level;
drop.magicFind = magicFind;

var item = drop;
let item = drop;
if ((!item.quest) && (item.type != 'key'))
item = generator.generate(drop);

@@ -955,14 +949,14 @@ define([
},

giveItems: function (obj, hideMessage) {
var objInventory = obj.inventory;
let objInventory = obj.inventory;

var messages = [];
let messages = [];

var items = this.items;
var iLen = items.length;
for (var i = 0; i < iLen; i++) {
var item = items[i];
let items = this.items;
let iLen = items.length;
for (let i = 0; i < iLen; i++) {
let item = items[i];

if (objInventory.getItem(item, hideMessage)) {
items.splice(i, 1);
@@ -976,10 +970,10 @@ define([
},

rollItems: function (party) {
var items = this.items;
var iLen = items.length;
for (var i = 0; i < iLen; i++) {
var item = items[i];
let items = this.items;
let iLen = items.length;
for (let i = 0; i < iLen; i++) {
let item = items[i];

this.obj.instance.syncer.queue('serverModule', {
module: 'lootRoller',
@@ -995,23 +989,23 @@ define([
},

fireEvent: function (event, args) {
var items = this.items;
var iLen = items.length;
for (var i = 0; i < iLen; i++) {
var item = items[i];
let items = this.items;
let iLen = items.length;
for (let i = 0; i < iLen; i++) {
let item = items[i];

if ((!item.eq) && (!item.active))
continue;

var effects = item.effects;
let effects = item.effects;
if (!effects)
continue;

var eLen = effects.length;
for (var j = 0; j < eLen; j++) {
var effect = effects[j];
let eLen = effects.length;
for (let j = 0; j < eLen; j++) {
let effect = effects[j];

var effectEvent = effect.events[event];
let effectEvent = effect.events[event];
if (!effectEvent)
continue;

@@ -1026,25 +1020,23 @@ define([
},

equipItemErrors: function (item) {
var errors = [];
let errors = [];

if (!this.obj.player)
return [];

var stats = this.obj.stats.values;
var originalValues = this.obj.stats.originalValues || this.obj.stats.values;
let stats = this.obj.stats.values;

var playerLevel = (stats.originalLevel || stats.level);
if (item.level > playerLevel)
if (item.level > stats.level)
errors.push('level');

if ((item.requires) && (originalValues[item.requires[0].stat] < item.requires[0].value))
if ((item.requires) && (stats[item.requires[0].stat] < item.requires[0].value))
errors.push(item.requires[0].stat);

if (item.factions) {
if (item.factions.some(function (f) {
return f.noEquip;
}))
return f.noEquip;
}))
errors.push('faction');
}



+ 92
- 194
src/server/components/stats.js View File

@@ -7,7 +7,7 @@ define([
classes,
scheduler
) {
var baseStats = {
let baseStats = {
mana: 20,
manaMax: 20,

@@ -86,7 +86,6 @@ define([
type: 'stats',

values: baseStats,
originalValues: null,

statScales: {
vitToHp: 10,
@@ -111,15 +110,13 @@ define([
init: function (blueprint, isTransfer) {
this.syncer = this.obj.instance.syncer;

var values = (blueprint || {}).values || {};
for (var v in values) {
let values = (blueprint || {}).values || {};
for (var v in values)
this.values[v] = values[v];
}

var stats = (blueprint || {}).stats || {};
for (var v in stats) {
let stats = (blueprint || {}).stats || {};
for (var v in stats)
this.stats[v] = stats[v];
}

this.calcXpMax();

@@ -128,7 +125,7 @@ define([
},

resetHp: function () {
var values = this.values;
let values = this.values;
values.hp = values.hpMax;

this.obj.syncer.setObject(false, 'stats', 'values', 'hp', values.hp);
@@ -138,27 +135,27 @@ define([
if (((this.obj.mob) && (!this.obj.follower)) || (this.obj.dead))
return;

var values = this.values;
let values = this.values;

var manaMax = values.manaMax;
let manaMax = values.manaMax;
manaMax -= (manaMax * values.manaReservePercent);

var regen = {
let regen = {
success: true
};
this.obj.fireEvent('beforeRegen', regen);
if (!regen.success)
return;

var isInCombat = (this.obj.aggro.list.length > 0);
let isInCombat = (this.obj.aggro.list.length > 0);
if (this.obj.follower) {
isInCombat = (this.obj.follower.master.aggro.list.length > 0);
if (isInCombat)
return;
}

var regenHp = 0;
var regenMana = 0;
let regenHp = 0;
let regenMana = 0;

regenMana = values.regenMana / 50;

@@ -195,12 +192,12 @@ define([
},

addStat: function (stat, value) {
var values = this.values;
let values = this.values;

if (['lvlRequire', 'allAttributes'].indexOf(stat) == -1)
values[stat] += value;

var sendOnlyToSelf = (['hp', 'hpMax', 'mana', 'manaMax', 'vit'].indexOf(stat) == -1);
let sendOnlyToSelf = (['hp', 'hpMax', 'mana', 'manaMax', 'vit'].indexOf(stat) == -1);

this.obj.syncer.setObject(sendOnlyToSelf, 'stats', 'values', stat, values[stat]);
if (sendOnlyToSelf)
@@ -214,20 +211,20 @@ define([
var morphStat = stat.substr(3);
morphStat = morphStat[0].toLowerCase() + morphStat.substr(1);
this.addStat(morphStat, value);
} else if (stat == 'vit') {
} else if (stat == 'vit')
this.addStat('hpMax', (value * this.statScales.vitToHp));
} else if (stat == 'allAttributes') {
else if (stat == 'allAttributes') {
['int', 'str', 'dex'].forEach(function (s) {
this.addStat(s, value)
this.addStat(s, value);
}, this);
} else if (stat == 'elementAllResist') {
['arcane', 'frost', 'fire', 'holy', 'poison'].forEach(function (s) {
var element = 'element' + (s[0].toUpperCase() + s.substr(1)) + 'Resist';
let element = 'element' + (s[0].toUpperCase() + s.substr(1)) + 'Resist';
this.addStat(element, value);
}, this);
} else if (stat == 'elementPercent') {
['arcane', 'frost', 'fire', 'holy', 'poison'].forEach(function (s) {
var element = 'element' + (s[0].toUpperCase() + s.substr(1)) + 'Percent';
let element = 'element' + (s[0].toUpperCase() + s.substr(1)) + 'Percent';
this.addStat(element, value);
}, this);
} else if (stat == 'str')
@@ -241,7 +238,7 @@ define([
},

calcXpMax: function () {
var level = (this.originalValues || this.values).level;
let level = this.values.level;
this.values.xpMax = (level * 5) + ~~(level * 10 * Math.pow(level, 2.2));

this.obj.syncer.setObject(true, 'stats', 'values', 'xpMax', this.values.xpMax);
@@ -250,13 +247,13 @@ define([
//Source is the object that caused you to gain xp (mostly yourself)
//Target is the source of the xp (a mob or quest)
getXp: function (amount, source, target) {
var obj = this.obj;
var values = this.values;
let obj = this.obj;
let values = this.values;

if ((this.originalValues || this.values).level == 20)
if (values.level == 20)
return;

var xpEvent = {
let xpEvent = {
source: source,
target: target,
amount: amount
@@ -279,32 +276,26 @@ define([
text: '+' + amount + ' xp'
});

var syncO = {};
var didLevelUp = false;
let syncO = {};
let didLevelUp = false;

while (values.xp >= values.xpMax) {
didLevelUp = true;
values.xp -= values.xpMax;
this.obj.syncer.setObject(true, 'stats', 'values', 'xp', values.xp);
if (this.originalValues) {
this.originalValues.level++;
}

if (values.originalLevel)
values.originalLevel++;
values.level++;

this.obj.fireEvent('onLevelUp', (this.originalValues || this.values).level);
this.obj.fireEvent('onLevelUp', this.values.level);

if ((this.originalValues || this.values).level == 20)
if (values.level == 20)
values.xp = 0;

values.hpMax = values.level * 32.7;

var gainStats = classes.stats[this.obj.class].gainStats;
for (var s in gainStats) {
let gainStats = classes.stats[this.obj.class].gainStats;
for (let s in gainStats)
this.addStat(s, gainStats[s]);
}

this.obj.spellbook.calcDps();

@@ -314,13 +305,13 @@ define([
text: 'level up'
});

syncO.level = (this.originalValues || this.values).level;
syncO.level = values.level;

this.calcXpMax();
}

if (didLevelUp) {
var cellContents = obj.instance.physics.getCell(obj.x, obj.y);
let cellContents = obj.instance.physics.getCell(obj.x, obj.y);
cellContents.forEach(function (c) {
c.fireEvent('onCellPlayerLevelUp', obj);
});
@@ -335,24 +326,10 @@ define([
});

if (didLevelUp) {
var maxLevel = this.obj.instance.zone.level[1]
if (maxLevel < (this.originalValues || values).level) {
this.rescale(maxLevel, false);
} else {
this.obj.syncer.setObject(true, 'stats', 'values', 'hpMax', values.hpMax);
this.obj.syncer.setObject(true, 'stats', 'values', 'level', this.values.level);
this.obj.syncer.setObject(true, 'stats', 'values', 'originalLevel', this.values.originalLevel);
this.obj.syncer.setObject(false, 'stats', 'values', 'hpMax', values.hpMax);
this.obj.syncer.setObject(false, 'stats', 'values', 'level', this.values.level);
this.obj.syncer.setObject(true, 'stats', 'values', 'originalLevel', this.values.originalLevel);
}
}

var originalValues = this.originalValues;
if (originalValues) {
originalValues.xp = values.xp;
originalValues.xpMax = values.xpMax;
originalValues.xpTotal = values.xpTotal;
this.obj.syncer.setObject(true, 'stats', 'values', 'hpMax', values.hpMax);
this.obj.syncer.setObject(true, 'stats', 'values', 'level', values.level);
this.obj.syncer.setObject(false, 'stats', 'values', 'hpMax', values.hpMax);
this.obj.syncer.setObject(false, 'stats', 'values', 'level', values.level);
}
},

@@ -360,29 +337,29 @@ define([
if (target.player)
return;

var level = target.stats.values.level;
var mobDiffMult = 1;
let level = target.stats.values.level;
let mobDiffMult = 1;
if (target.isRare)
mobDiffMult = 2;
else if (target.isChampion)
mobDiffMult = 5;

//Who should get xp?
var aggroList = target.aggro.list;
var hpMax = target.stats.values.hpMax;
var aLen = aggroList.length;
for (var i = 0; i < aLen; i++) {
let aggroList = target.aggro.list;
let hpMax = target.stats.values.hpMax;
let aLen = aggroList.length;
for (let i = 0; i < aLen; i++) {
var a = aggroList[i];
var dmg = a.damage;
let dmg = a.damage;
if (dmg <= 0)
continue;

var mult = 1;
let mult = 1;
//How many party members contributed
// Remember, maybe one of the aggro-ees might be a mob too
var party = a.obj.social ? a.obj.social.party : null;
if (party) {
var partySize = aggroList.filter(function (f) {
let partySize = aggroList.filter(function (f) {
return ((a.damage > 0) && (party.indexOf(f.obj.serverId) > -1));
}).length;
partySize--;
@@ -393,10 +370,10 @@ define([
//Scale xp by source level so you can't just farm low level mobs (or get boosted on high level mobs).
//Mobs that are farther then 10 levels from you, give no xp
//We don't currently do this for quests/herb gathering
var sourceLevel = a.obj.stats.values.level;
var levelDelta = level - sourceLevel;
let sourceLevel = a.obj.stats.values.level;
let levelDelta = level - sourceLevel;

var amount = null;
let amount = null;
if (Math.abs(levelDelta) <= 10)
amount = ~~(((sourceLevel + levelDelta) * 10) * Math.pow(1 - (Math.abs(levelDelta) / 10), 2) * mult * mobDiffMult);
else
@@ -411,7 +388,7 @@ define([

die: function (source) {
var obj = this.obj;
var values = this.values;
let values = this.values;

this.syncer.queue('onGetDamage', {
id: obj.id,
@@ -422,14 +399,14 @@ define([
obj.syncer.set(true, null, 'dead', true);

var obj = obj;
var syncO = obj.syncer.o;
let syncO = obj.syncer.o;

obj.hidden = true;
obj.nonSelectable = true;
syncO.hidden = true;
syncO.nonSelectable = true;

var xpLoss = ~~Math.min(values.xp, values.xpMax / 10);
let xpLoss = ~~Math.min(values.xp, values.xpMax / 10);

values.xp -= xpLoss;
obj.syncer.setObject(true, 'stats', 'values', 'xp', values.xp);
@@ -453,11 +430,11 @@ define([
respawn: function () {
this.obj.syncer.set(true, null, 'dead', false);

var obj = this.obj;
var syncO = obj.syncer.o;
let obj = this.obj;
let syncO = obj.syncer.o;

this.obj.dead = false;
var values = this.values;
let values = this.values;

values.hp = values.hpMax;
values.mana = values.manaMax;
@@ -503,7 +480,7 @@ define([
if (this.obj.destroyed)
return;

var amount = damage.amount;
let amount = damage.amount;

if (amount > this.values.hp)
amount = this.values.hp;
@@ -511,7 +488,7 @@ define([
damage.dealt = amount;

this.values.hp -= amount;
var recipients = [];
let recipients = [];
if (this.obj.serverId != null)
recipients.push(this.obj.serverId);
if (source.serverId != null)
@@ -541,18 +518,18 @@ define([

this.obj.aggro.tryEngage(source, amount, threatMult);

var died = (this.values.hp <= 0);
let died = (this.values.hp <= 0);

if (died) {
var death = {
let death = {
success: true
};
this.obj.fireEvent('beforeDeath', death);

if (death.success) {
var deathEvent = {};
let deathEvent = {};

var killSource = source;
let killSource = source;

if (source.follower)
killSource = source.follower.master;
@@ -587,7 +564,7 @@ define([
this.obj.spellbook.die();
this.obj.destroyed = true;

var deathAnimation = _.getDeepProperty(animations, ['mobs', this.obj.sheetName, this.obj.cell, 'death']);
let deathAnimation = _.getDeepProperty(animations, ['mobs', this.obj.sheetName, this.obj.cell, 'death']);
if (deathAnimation) {
this.obj.instance.syncer.queue('onGetObject', {
x: this.obj.x,
@@ -597,10 +574,10 @@ define([
}

if (this.obj.inventory) {
var aggroList = this.obj.aggro.list;
var aLen = aggroList.length;
for (var i = 0; i < aLen; i++) {
var a = aggroList[i];
let aggroList = this.obj.aggro.list;
let aLen = aggroList.length;
for (let i = 0; i < aLen; i++) {
let a = aggroList[i];

if ((!a.threat) || (a.obj.serverId == null))
continue;
@@ -620,16 +597,16 @@ define([
},

getHp: function (heal, source) {
var amount = heal.amount;
let amount = heal.amount;
if (amount == 0)
return;

var threatMult = heal.threatMult;
let threatMult = heal.threatMult;
if (!heal.hasOwnProperty('threatMult'))
threatMult = 1;

var values = this.values;
var hpMax = values.hpMax;
let values = this.values;
let hpMax = values.hpMax;

if (values.hp >= hpMax)
return;
@@ -641,7 +618,7 @@ define([
if (values.hp > hpMax)
values.hp = hpMax;

var recipients = [];
let recipients = [];
if (this.obj.serverId != null)
recipients.push(this.obj.serverId);
if (source.serverId != null)
@@ -657,11 +634,11 @@ define([
}

//Add aggro to all our attackers
var threat = amount * 0.4 * threatMult;
var aggroList = this.obj.aggro.list;
var aLen = aggroList.length;
for (var i = 0; i < aLen; i++) {
var a = aggroList[i].obj;
let threat = amount * 0.4 * threatMult;
let aggroList = this.obj.aggro.list;
let aLen = aggroList.length;
for (let i = 0; i < aLen; i++) {
let a = aggroList[i].obj;
a.aggro.tryEngage(source, threat);
}

@@ -674,7 +651,7 @@ define([
delete this.sessionDuration;
}

var values = extend(true, {}, this.originalValues || this.values);
let values = extend(true, {}, this.values);
values.hp = this.values.hp;
values.mana = this.values.mana;

@@ -686,10 +663,10 @@ define([
},

simplify: function (self) {
var values = this.values;
let values = this.values;

if (!self) {
var result = {
let result = {
type: 'stats',
values: {
hp: values.hp,
@@ -700,127 +677,48 @@ define([
}
};

return result
return result;
}

return {
type: 'stats',
values: values,
originalValues: this.originalValues,
stats: this.stats,
vitScale: this.vitScale
};
},

onLogin: function () {
var stats = this.stats;
var time = scheduler.getTime();
let stats = this.stats;
let time = scheduler.getTime();
stats.lastLogin = time;

this.obj.instance.mail.getMail(this.obj.name);
},

rescale: function (level, isMob) {
if (level > this.values.level)
level = this.values.level;

var sync = this.obj.syncer.setObject.bind(this.obj.syncer);

var oldHp = this.values.hp;
var oldXp = this.values.xp;
var oldXpTotal = this.values.xpTotal;
var oldXpMax = this.values.xpMax;

if (!this.originalValues)
this.originalValues = extend(true, {}, this.values);

var oldValues = this.values;
var newValues = extend(true, {}, baseStats);
newValues.level = level;
newValues.originalLevel = (this.originalValues || oldValues).level;

this.values = newValues;

var gainStats = classes.stats[this.obj.class].gainStats;
for (var s in gainStats) {
this.addStat(s, (gainStats[s] * level));
}

newValues.hpMax = level * 32.7;
if (isMob)
newValues.hpMax = ~~(newValues.hpMax * (level / 10));

newValues.hp = oldHp;
var resetHp = false;
if (newValues.hp > newValues.hpMax) {
resetHp = true;
newValues.hp = newValues.hpMax;
}

newValues.xp = oldXp;
newValues.xpMax = oldXpMax;
newValues.xpTotal = oldXpTotal;

var addStats = this.obj.equipment.rescale(level);
for (var p in addStats) {
var statName = p;

this.addStat(statName, addStats[p]);
}

this.obj.passives.applyPassives();

if (resetHp)
newValues.hp = newValues.hpMax;

this.obj.spellbook.calcDps();

var publicStats = [
'hp',
'hpMax',
'mana',
'manaMax',
'level'
];

for (var p in newValues) {
sync(true, 'stats', 'values', p, newValues[p]);
if (publicStats.indexOf(p) > -1)
sync(false, 'stats', 'values', p, newValues[p]);
}
},

getKillStreakCoefficient: function (mobName) {
var killStreak = this.stats.mobKillStreaks[mobName];
let killStreak = this.stats.mobKillStreaks[mobName];
if (!killStreak)
return 1;
else
return Math.max(0, (10000 - Math.pow(killStreak, 2)) / 10000);
return Math.max(0, (10000 - Math.pow(killStreak, 2)) / 10000);
},

canGetMobLoot: function (mob) {
if (!mob.inventory.dailyDrops)
return true;

var lootStats = this.stats.lootStats[mob.name];
var time = scheduler.getTime();
if (!lootStats) {
let lootStats = this.stats.lootStats[mob.name];
let time = scheduler.getTime();
if (!lootStats)
this.stats.lootStats[mob.name] = time;
} else
else
return ((lootStats.day != time.day), (lootStats.month != time.month));
},

events: {
transferComplete: function () {
var maxLevel = this.obj.instance.zone.level[1];
if (maxLevel > this.obj.stats.values.level)
maxLevel = this.obj.stats.values.level;
this.obj.stats.rescale(maxLevel);
},

afterKillMob: function (mob) {
var mobKillStreaks = this.stats.mobKillStreaks;
var mobName = mob.name;
let mobKillStreaks = this.stats.mobKillStreaks;
let mobName = mob.name;

if (!mobKillStreaks[mobName])
mobKillStreaks.mobName = 0;
@@ -828,7 +726,7 @@ define([
if (mobKillStreaks[mobName] < 100)
mobKillStreaks[mobName]++;

for (var p in mobKillStreaks) {
for (let p in mobKillStreaks) {
if (p == mobName)
continue;

@@ -856,9 +754,9 @@ define([
},

afterMove: function (event) {
var mobKillStreaks = this.stats.mobKillStreaks;
let mobKillStreaks = this.stats.mobKillStreaks;

for (var p in mobKillStreaks) {
for (let p in mobKillStreaks) {
mobKillStreaks[p] -= 0.085;
if (mobKillStreaks[p] <= 0)
delete mobKillStreaks[p];


+ 6
- 24
src/server/config/prophecies/titangrip.js View File

@@ -19,13 +19,9 @@ define([
if (['oneHanded', 'twoHanded'].indexOf(item.slot) == -1)
return;

var stats = item.stats;
var maxLevel = this.obj.instance.zone.level[1];
if (maxLevel < item.level)
stats = generatorStats.rescale(item, maxLevel);

for (var s in stats) {
var val = stats[s];
let stats = item.stats;
for (let s in stats) {
let val = stats[s];

this.obj.stats.addStat(s, val);
}
@@ -34,26 +30,12 @@ define([
if (['oneHanded', 'twoHanded'].indexOf(item.slot) == -1)
return;

var stats = item.stats;
var maxLevel = this.obj.instance.zone.level[1];
if (maxLevel < item.level)
stats = generatorStats.rescale(item, maxLevel);

for (var s in stats) {
var val = stats[s];
let stats = item.stats;
for (let s in stats) {
let val = stats[s];

this.obj.stats.addStat(s, -val);
}
},

afterRescaleItemStats: function (item) {
if (['oneHanded', 'twoHanded'].indexOf(item.slot) == -1)
return;

var stats = item.stats;
for (var s in stats) {
stats[s] *= 2;
}
}
}
};


+ 63
- 69
src/server/objects/objects.js View File

@@ -20,7 +20,7 @@ define([
},

build: function (skipPush, clientObj) {
var o = extend(true, {}, objBase);
let o = extend(true, {}, objBase);

if (clientObj)
o.update = null;
@@ -37,39 +37,35 @@ define([
},

transferObject: function (o) {
var obj = this.build();
let obj = this.build();

var components = o.components;
let components = o.components;
delete o.components;
delete o.id;

for (var p in o) {
for (var p in o)
obj[p] = o[p];
}

var cLen = components.length;
for (var i = 0; i < cLen; i++) {
var c = components[i];
let cLen = components.length;
for (let i = 0; i < cLen; i++) {
let c = components[i];

var cpn = obj.addComponent(c.type, null, true);
let cpn = obj.addComponent(c.type, null, true);

for (var p in c) {
for (var p in c)
cpn[p] = c[p];
}

if (cpn.transfer)
cpn.transfer();
}

obj.fireEvent('transferComplete');

return obj;
},

buildObjects: function (list, skipPush) {
var lLen = list.length;
for (var i = 0; i < lLen; i++) {
var l = list[i];
let lLen = list.length;
for (let i = 0; i < lLen; i++) {
let l = list[i];

var obj = this.build(skipPush, l.clientObj);

@@ -92,7 +88,7 @@ define([
//TODO: Clean this part up
var properties = extend(true, {}, l.properties);
['cpnMob'].forEach(function (c) {
var blueprint = properties[c] || null;
let blueprint = properties[c] || null;
if ((blueprint) && (typeof (blueprint) == 'string'))
blueprint = JSON.parse(blueprint);

@@ -101,7 +97,7 @@ define([

delete properties[c];

var type = c.replace('cpn', '').toLowerCase();
let type = c.replace('cpn', '').toLowerCase();

obj.addComponent(type, blueprint);
}, this);
@@ -112,29 +108,29 @@ define([
continue;
}

var type = p.replace('cpn', '');
let type = p.replace('cpn', '');
type = type[0].toLowerCase() + type.substr(1);
var blueprint = properties[p] || null;
let blueprint = properties[p] || null;
if ((blueprint) && (typeof (blueprint) == 'string'))
blueprint = JSON.parse(blueprint);

obj.addComponent(type, blueprint);
}

var extraProperties = l.extraProperties || {};
let extraProperties = l.extraProperties || {};
for (var p in extraProperties) {
var cpn = obj[p];
var e = extraProperties[p];
for (var pp in e) {
let cpn = obj[p];
let e = extraProperties[p];
for (let pp in e)
cpn[pp] = e[pp];
}
if (cpn.init)
cpn.init();
}

if ((this.physics) && (!obj.dead)) {
if (!obj.width)
this.physics.addObject(obj, obj.x, obj.y);
this.physics.addObject(obj, obj.x, obj.y);
else
this.physics.addRegion(obj);
}
@@ -152,14 +148,14 @@ define([
},

removeObject: function (obj, callback, useServerId) {
var objects = this.objects;
var oLen = objects.length
var found = null;
for (var i = 0; i < oLen; i++) {
var o = objects[i];
var match = false;
let objects = this.objects;
let oLen = objects.length;
let found = null;
for (let i = 0; i < oLen; i++) {
let o = objects[i];
let match = false;
if (useServerId)
match = (o.serverId == obj.id)
match = (o.serverId == obj.id);
else
match = (o.id == obj.id);

@@ -171,7 +167,7 @@ define([
}
}

var physics = this.physics;
let physics = this.physics;
if (physics) {
if (!found.width)
physics.removeObject(found, found.x, found.y);
@@ -183,26 +179,24 @@ define([
},

addObject: function (o, callback) {
var newO = this.build(true);
let newO = this.build(true);

var components = o.components;
let components = o.components;

delete o.components;

for (var p in o) {
for (var p in o)
newO[p] = o[p];
}

var len = components.length;
for (var i = 0; i < len; i++) {
var c = components[i];
let len = components.length;
for (let i = 0; i < len; i++) {
let c = components[i];

newO.addComponent(c.type, c);

var newC = newO[c.type];
for (var p in c) {
let newC = newO[c.type];
for (var p in c)
newC[p] = c[p];
}
}

this.objects.push(newO);
@@ -214,7 +208,7 @@ define([
return newO;
},
sendEvent: function (msg) {
var player = this.objects.find(p => p.id == msg.id);
let player = this.objects.find(p => p.id == msg.id);
if (!player)
return;

@@ -224,38 +218,39 @@ define([
});
},
sendEvents: function (msg) {
var players = {};
var objects = this.objects;
let players = {};
let objects = this.objects;

var data = msg.data;
for (var e in data) {
var event = data[e];
var eLen = event.length;
let data = msg.data;
for (let e in data) {
let event = data[e];
let eLen = event.length;

for (var j = 0; j < eLen; j++) {
var eventEntry = event[j];
for (let j = 0; j < eLen; j++) {
let eventEntry = event[j];

var obj = eventEntry.obj;
let obj = eventEntry.obj;

if (e != 'serverModule') {
var to = eventEntry.to;
var toLen = to.length;
for (var i = 0; i < toLen; i++) {
let to = eventEntry.to;
let toLen = to.length;
for (let i = 0; i < toLen; i++) {
var toId = to[i];

var player = players[toId];
if (!player) {
var findPlayer = objects.find(o => o.id == toId);
let findPlayer = objects.find(o => o.id == toId);
if (!findPlayer)
continue;
else
else {
player = (players[toId] = {
socket: findPlayer.socket,
events: {}
});
}
}

var eventList = player.events[e] || (player.events[e] = []);
let eventList = player.events[e] || (player.events[e] = []);
eventList.push(obj);
}
} else
@@ -263,20 +258,19 @@ define([
}
}

for (var p in players) {
for (let p in players) {
var player = players[p];
player.socket.emit('events', player.events);
}
},
updateObject: function (msg) {
var player = this.objects.find(p => p.id == msg.serverId);
let player = this.objects.find(p => p.id == msg.serverId);
if (!player)
return;

var obj = msg.obj;
for (var p in obj) {
let obj = msg.obj;
for (let p in obj)
player[p] = obj[p];
}

if (obj.dead)
leaderboard.killCharacter(player.name);
@@ -309,11 +303,11 @@ define([
},

update: function () {
var objects = this.objects;
var len = objects.length;
let objects = this.objects;
let len = objects.length;

for (var i = 0; i < len; i++) {
var o = objects[i];
for (let i = 0; i < len; i++) {
let o = objects[i];

//Don't remove it from the list if it's destroyed, but don't update it either
//That's syncer's job


+ 12
- 12
src/server/package-lock.json View File

@@ -2248,13 +2248,6 @@
}
}
},
"string_decoder": {
"version": "1.0.3",
"bundled": true,
"requires": {
"safe-buffer": "5.1.1"
}
},
"string-width": {
"version": "1.0.2",
"bundled": true,
@@ -2264,6 +2257,13 @@
"strip-ansi": "3.0.1"
}
},
"string_decoder": {
"version": "1.0.3",
"bundled": true,
"requires": {
"safe-buffer": "5.1.1"
}
},
"stringstream": {
"version": "0.0.5",
"bundled": true
@@ -2386,6 +2386,11 @@
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
"integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
},
"string-template": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz",
"integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0="
},
"string_decoder": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
@@ -2394,11 +2399,6 @@
"safe-buffer": "5.1.1"
}
},
"string-template": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz",
"integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0="
},
"stringstream": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",


+ 69
- 89
src/server/world/instancer.js View File

@@ -46,7 +46,7 @@ define([
map.init(args);

if (!map.instanced) {
var fakeInstance = {
let fakeInstance = {
objects: objects,
syncer: syncer,
physics: physics,
@@ -119,14 +119,14 @@ define([
},

addObject: function (msg) {
var obj = msg.obj;
let obj = msg.obj;
obj.serverId = obj.id;
delete obj.id;

if ((msg.keepPos) && (!physics.isValid(obj.x, obj.y)))
msg.keepPos = false;

var spawnPos = map.getSpawnPos(obj);
let spawnPos = map.getSpawnPos(obj);

if ((!msg.keepPos) || (obj.x == null)) {
obj.x = spawnPos.x;
@@ -140,22 +140,14 @@ define([
if (!msg.transfer)
objects.addObject(obj, this.onAddObject.bind(this));
else {
var o = objects.transferObject(obj);
let o = objects.transferObject(obj);
questBuilder.obtain(o);

var maxLevel = o.instance.zone.level[1];
if (maxLevel < o.stats.values.level)
o.stats.rescale(maxLevel);
}
},
onAddObject: function (obj) {
if (obj.player)
obj.stats.onLogin();

var maxLevel = obj.instance.zone.level[1];
if (maxLevel < obj.stats.values.level)
obj.stats.rescale(maxLevel);

questBuilder.obtain(obj);
obj.fireEvent('afterMove');

@@ -167,35 +159,33 @@ define([
}
},
updateObject: function (msg) {
var obj = objects.find(o => o.serverId == msg.id);
let obj = objects.find(o => o.serverId == msg.id);
if (!obj)
return;

var msgObj = msg.obj;
let msgObj = msg.obj;

var components = msgObj.components || [];
let components = msgObj.components || [];
delete msgObj.components;

for (var p in msgObj) {
for (var p in msgObj)
obj[p] = msgObj[p];
}

var cLen = components.length;
for (var i = 0; i < cLen; i++) {
var c = components[i];
var component = obj[c.type];
for (var p in c) {
let cLen = components.length;
for (let i = 0; i < cLen; i++) {
let c = components[i];
let component = obj[c.type];
for (var p in c)
component[p] = c[p];
}
}
},

queueAction: function (msg) {
var obj = objects.find(o => o.serverId == msg.id);
let obj = objects.find(o => o.serverId == msg.id);
if (!obj)
return;
else if (msg.action.action == 'move') {
var moveEntries = obj.actionQueue.filter(q => (q.action == 'move')).length;
let moveEntries = obj.actionQueue.filter(q => (q.action == 'move')).length;
if (moveEntries >= 50)
return;
}
@@ -204,14 +194,14 @@ define([
},

performAction: function (msg) {
var obj = null;
var targetId = msg.action.targetId;
let obj = null;
let targetId = msg.action.targetId;
if (!targetId)
obj = objects.find(o => o.serverId == msg.id);
else {
obj = objects.find(o => o.id == targetId);
if (obj) {
var action = msg.action;
let action = msg.action;
if (!action.data)
action.data = {};
action.data.sourceId = msg.id;
@@ -225,7 +215,7 @@ define([
},

removeObject: function (msg) {
var obj = msg.obj;
let obj = msg.obj;
obj = objects.find(o => o.serverId == obj.id);
if (!obj) {
//We should probably never reach this
@@ -266,10 +256,10 @@ define([
this.ttlGen--;
}

var instances = this.instances;
var iLen = instances.length;
for (var i = 0; i < iLen; i++) {
var instance = instances[i];
let instances = this.instances;
let iLen = instances.length;
for (let i = 0; i < iLen; i++) {
let instance = instances[i];

instance.objects.update();
instance.spawners.update();
@@ -279,7 +269,7 @@ define([
instance.syncer.update();

if (instance.closeTtl != null) {
var hasPlayers = instance.objects.objects.some(o => o.player);
let hasPlayers = instance.objects.objects.some(o => o.player);
if (hasPlayers) {
delete instance.closeTtl;
continue;
@@ -292,7 +282,7 @@ define([
iLen--;
}
} else {
var isEmpty = !instance.objects.objects.some(o => o.player);
let isEmpty = !instance.objects.objects.some(o => o.player);
if (isEmpty) {
//Zones reset after being empty for 10 minutes
instance.closeTtl = 2;
@@ -304,19 +294,19 @@ define([
},

addObject: function (msg) {
var obj = msg.obj;
var instanceId = msg.instanceId;
let obj = msg.obj;
let instanceId = msg.instanceId;

//Maybe a party member is in here already?
var social = obj.components.find(c => c.type == 'social');
let social = obj.components.find(c => c.type == 'social');
if ((social) && (social.party)) {
var party = social.party;
var instances = this.instances;
var iLen = instances.length;
for (var i = 0; i < iLen; i++) {
var instance = instances[i];
let party = social.party;
let instances = this.instances;
let iLen = instances.length;
for (let i = 0; i < iLen; i++) {
let instance = instances[i];

var partyInside = instance.objects.objects.some(o => party.indexOf(o.serverId) > -1);
let partyInside = instance.objects.objects.some(o => party.indexOf(o.serverId) > -1);
if (partyInside) {
if (instance.id != obj.instanceId)
msg.keepPos = false;
@@ -331,7 +321,7 @@ define([
if (msg.transfer)
msg.keepPos = false;

var exists = this.instances.find(i => i.id == instanceId);
let exists = this.instances.find(i => i.id == instanceId);

if (exists) {
if ((msg.keepPos) && (!exists.physics.isValid(obj.x, obj.y)))
@@ -364,7 +354,7 @@ define([
if (!msg.transfer)
exists.objects.addObject(obj, this.onAddObject.bind(this, msg.keepPos));
else {
var newObj = exists.objects.transferObject(obj);
let newObj = exists.objects.transferObject(obj);
this.onAddObject(false, newObj);
}

@@ -380,7 +370,7 @@ define([
},
onAddObject: function (keepPos, obj) {
if (!keepPos) {
var spawnPos = obj.instance.map.getSpawnPos(obj);
let spawnPos = obj.instance.map.getSpawnPos(obj);

obj.x = spawnPos.x;
obj.y = spawnPos.y;
@@ -391,10 +381,6 @@ define([
if (obj.player)
obj.stats.onLogin();

var maxLevel = obj.instance.zone.level[1];
if (maxLevel < obj.stats.values.level)
obj.stats.rescale(maxLevel);

obj.fireEvent('afterMove');

if (obj.dead) {
@@ -405,45 +391,43 @@ define([
}
},
updateObject: function (msg) {
var id = msg.id;
var instanceId = msg.instanceId;
let id = msg.id;
let instanceId = msg.instanceId;

var exists = this.instances.find(i => i.id == instanceId);
let exists = this.instances.find(i => i.id == instanceId);
if (!exists)
return;

var obj = exists.objects.find(o => o.serverId == id);
let obj = exists.objects.find(o => o.serverId == id);
if (!obj)
return;

var msgObj = msg.obj;
let msgObj = msg.obj;

var components = msgObj.components || [];
let components = msgObj.components || [];
delete msgObj.components;

for (var p in msgObj) {
for (var p in msgObj)
obj[p] = msgObj[p];
}

var cLen = components.length;
for (var i = 0; i < cLen; i++) {
var c = components[i];
var component = obj[c.type];
for (var p in c) {
let cLen = components.length;
for (let i = 0; i < cLen; i++) {
let c = components[i];
let component = obj[c.type];
for (var p in c)
component[p] = c[p];
}
}
},

performAction: function (msg) {
var id = msg.id;
var instanceId = msg.instanceId;
let id = msg.id;
let instanceId = msg.instanceId;

var exists = this.instances.find(i => i.id == instanceId);
let exists = this.instances.find(i => i.id == instanceId);
if (!exists)
return;

var obj = exists.objects.find(o => o.serverId == id);
let obj = exists.objects.find(o => o.serverId == id);
if (!obj)
return;

@@ -451,17 +435,17 @@ define([
},

queueAction: function (msg) {
var id = msg.id;
var instanceId = msg.instanceId;
let id = msg.id;
let instanceId = msg.instanceId;

var exists = this.instances.find(i => i.id == instanceId);
let exists = this.instances.find(i => i.id == instanceId);
if (!exists)
return;

var obj = exists.objects.find(o => o.serverId == id);
let obj = exists.objects.find(o => o.serverId == id);
if (obj) {
if (msg.action.action == 'move') {
var moveEntries = obj.actionQueue.filter(q => (q.action == 'move')).length;
let moveEntries = obj.actionQueue.filter(q => (q.action == 'move')).length;
if (moveEntries >= 50)
return;
}
@@ -472,9 +456,9 @@ define([

removeObject: function (msg) {
var obj = msg.obj;
var instanceId = msg.instanceId;
let instanceId = msg.instanceId;

var exists = this.instances.find(i => i.id == instanceId);
let exists = this.instances.find(i => i.id == instanceId);
if (!exists)
return;

@@ -494,7 +478,7 @@ define([
},

createInstance: function (objToAdd, transfer) {
var newMap = {
let newMap = {
name: map.name,
spawn: extend(true, [], map.spawn),
clientMap: extend(true, {}, map.clientMap)
@@ -502,15 +486,15 @@ define([
newMap.getSpawnPos = map.getSpawnPos.bind(newMap);

//Hack: We need to actually just always use the instanced eventEmitter
var eventQueue = eventEmitter.queue;
let eventQueue = eventEmitter.queue;
delete eventEmitter.queue;
var newEventEmitter = extend(true, {
let newEventEmitter = extend(true, {
queue: []
}, eventEmitter);
eventEmitter.queue = eventQueue;

var instance = {
id: objToAdd.name + '_' + (+new Date),
let instance = {
id: objToAdd.name + '_' + (+new Date()),
objects: extend(true, {}, objects),
spawners: extend(true, {}, spawners),
syncer: extend(true, {}, syncer),
@@ -532,7 +516,7 @@ define([

this.instances.push(instance);

var onDone = this.instanced.onCreateInstance.bind(this, instance, objToAdd, transfer);
let onDone = this.instanced.onCreateInstance.bind(this, instance, objToAdd, transfer);

if (map.custom) {
instance.customMap = extend(true, {}, customMap);
@@ -548,7 +532,7 @@ define([
objToAdd.serverId = objToAdd.id;
delete objToAdd.id;

var obj = null;
let obj = null;

instance.syncer.queue('onGetMap', instance.map.clientMap, [objToAdd.serverId]);

@@ -557,7 +541,7 @@ define([
else {
obj = instance.objects.transferObject(objToAdd);

var spawnPos = instance.map.getSpawnPos(obj);
let spawnPos = instance.map.getSpawnPos(obj);

obj.x = spawnPos.x;
obj.y = spawnPos.y;
@@ -565,10 +549,6 @@ define([
instance.questBuilder.obtain(obj);
}

var maxLevel = obj.instance.zone.level[1];
if (maxLevel < obj.stats.values.level)
obj.stats.rescale(maxLevel);

process.send({
method: 'object',
serverId: obj.serverId,
@@ -586,6 +566,6 @@ define([

return obj;
}
},
}
};
});

Loading…
Cancel
Save