define([ 'js/system/events' ], function ( events ) { return { type: 'inventory', items: [], init: function (blueprint) { events.emit('onGetItems', this.items); }, extend: function (blueprint) { let rerender = false; if (blueprint.destroyItems) { rerender = true; events.emit('onDestroyItems', blueprint.destroyItems, this.items); } if (blueprint.getItems) { let items = this.items; let newItems = blueprint.getItems || []; let nLen = newItems.length; for (let i = 0; i < nLen; i++) { let nItem = newItems[i]; let nId = nItem.id; let findItem = items.find(f => f.id === nId); if (findItem) { if (!rerender) { rerender = ( (findItem.pos !== nItem.pos) || (findItem.eq !== nItem.eq) || (findItem.active !== nItem.active) || (findItem.quickSlot !== nItem.quickSlot) || (findItem.quantity !== nItem.quantity) ); } for (let p in findItem) delete findItem[p]; $.extend(true, findItem, nItem); newItems.splice(i, 1); i--; nLen--; } else { rerender = true; nItem.isNew = true; } } this.items.push.apply(this.items, blueprint.getItems || []); events.emit('onGetItems', this.items, rerender); } }, equipItemErrors: function (item) { let errors = []; let stats = this.obj.stats.values; if (item.level > stats.level) errors.push('level'); if (item.requires && item.requires[0] && stats[item.requires[0].stat] < item.requires[0].value) errors.push('stats'); if (item.factions) { if (item.factions.some(f => f.noEquip)) errors.push('faction'); } return errors; }, canEquipItem: function (item) { return (this.equipItemErrors(item).length === 0); } }; });