reldens
Version:
Reldens - MMORPG Platform
99 lines (91 loc) • 3.63 kB
JavaScript
/**
*
* Reldens - ItemsFactory
*
* Factory for creating item instances from database models.
* Handles item creation, modifier enrichment, and equipment status.
*
*/
const { ItemsConst } = require('@reldens/items-system');
const { ModifierConst, Modifier } = require('@reldens/modifiers');
const { sc } = require('@reldens/utils');
class ItemsFactory
{
/**
* @param {Array<Object>} itemsInventoryModels
* @param {Object} manager
* @returns {Promise<Object<string, Object>|boolean>}
*/
static async fromModelsList(itemsInventoryModels, manager)
{
if(!itemsInventoryModels.length){
return false;
}
let itemsInstances = {};
for(let itemInventoryModel of itemsInventoryModels){
let itemObj = await this.fromModel(itemInventoryModel, manager);
itemsInstances[itemObj.getInventoryId()] = itemObj;
}
return itemsInstances;
}
/**
* @param {Object} itemInventoryModel
* @param {Object} manager
* @returns {Promise<Object>}
*/
static async fromModel(itemInventoryModel, manager)
{
let itemClass = sc.get(
manager.itemClasses,
itemInventoryModel.related_items_item.key,
manager.types.classByTypeId(itemInventoryModel.related_items_item.type)
);
let itemProps = {
id: itemInventoryModel.id,
item_id: itemInventoryModel.related_items_item.id,
key: itemInventoryModel.related_items_item.key,
type: itemInventoryModel.related_items_item.type,
manager: manager,
label: itemInventoryModel.related_items_item.label,
description: itemInventoryModel.related_items_item.description,
qty: itemInventoryModel.qty,
remaining_uses: itemInventoryModel.remaining_uses,
is_active: itemInventoryModel.is_active,
group_id: itemInventoryModel.related_items_item.group_id,
qty_limit: itemInventoryModel.related_items_item.qty_limit,
uses_limit: itemInventoryModel.related_items_item.uses_limit,
useTimeOut: itemInventoryModel.related_items_item.useTimeOut,
execTimeOut: itemInventoryModel.related_items_item.execTimeOut,
customData: itemInventoryModel.related_items_item.customData
};
let itemObj = new itemClass(itemProps);
if(itemObj.isType(ItemsConst.TYPES.EQUIPMENT)){
itemObj.equipped = (1 === itemInventoryModel.is_active);
}
await this.enrichWithModifiers(itemInventoryModel, itemObj, manager);
return itemObj;
}
/**
* @param {Object} itemInventoryModel
* @param {Object} itemObj
* @param {Object} manager
* @returns {Promise<void>}
*/
static async enrichWithModifiers(itemInventoryModel, itemObj, manager)
{
let loadedModifiers = itemInventoryModel.related_items_item?.related_items_item_modifiers;
if(!loadedModifiers || 0 === loadedModifiers.length){
return;
}
let modifiers = {};
for(let modifierData of loadedModifiers){
if(modifierData.operation !== ModifierConst.OPS.SET){
modifierData.value = Number(modifierData.value);
}
modifierData.target = manager.owner;
modifiers[modifierData.id] = new Modifier(modifierData);
}
itemObj.modifiers = modifiers;
}
}
module.exports.ItemsFactory = ItemsFactory;