|
- const learnRecipe = require('./learnRecipe');
-
- const isOnCooldown = (obj, cpnInv, { item, cd }) => {
- if (item.cdMax) {
- if (cd) {
- process.send({
- method: 'events',
- data: {
- onGetAnnouncement: [{
- obj: {
- msg: 'That item is on cooldown'
- },
- to: [obj.serverId]
- }]
- }
- });
-
- return true;
- }
-
- return false;
- }
-
- return false;
- };
-
- const placeItemOnCooldown = (obj, cpnInv, item, { cdMax }) => {
- item.cd = cdMax;
-
- //Find similar items and put them on cooldown too
- cpnInv.items.forEach(function (i) {
- if (i.name === item.name && i.cdMax === item.cdMax)
- i.cd = cdMax;
- });
- };
-
- module.exports = async (cpnInv, itemId) => {
- let item = cpnInv.findItem(itemId);
- if (!item)
- return;
-
- let obj = cpnInv.obj;
-
- const beforeGetCooldownMessage = {
- obj,
- item,
- cd: item.cd
- };
- obj.instance.eventEmitter.emit('onBeforeGetItemCd', beforeGetCooldownMessage);
- obj.fireEvent('onBeforeGetItemCd', beforeGetCooldownMessage);
-
- if (isOnCooldown(obj, cpnInv, beforeGetCooldownMessage))
- return;
-
- let result = {
- success: true,
- cdMax: item.cdMax
- };
- //Deprecated
- obj.instance.eventEmitter.emit('onBeforeUseItem', obj, item, result);
- obj.fireEvent('onBeforeUseItem', item, result);
- //New
- const eventMsg = {
- obj,
- item,
- cdMax: item.cdMax,
- success: true
- };
- obj.instance.eventEmitter.emit('beforeUseItem', eventMsg);
-
- if (!result.success || !eventMsg.success)
- return;
-
- placeItemOnCooldown(obj, cpnInv, item, result);
-
- if (item.recipe) {
- const didLearn = await learnRecipe(obj, item);
- if (didLearn)
- cpnInv.destroyItem({ itemId }, 1);
-
- return;
- }
-
- let effects = (item.effects || []);
- let eLen = effects.length;
- for (let j = 0; j < eLen; j++) {
- let effect = effects[j];
- if (!effect.events)
- continue;
-
- let effectEvent = effect.events.onConsumeItem;
- if (!effectEvent)
- continue;
-
- let effectResult = {
- success: true,
- errorMessage: null
- };
-
- effectEvent.call(obj, effectResult, item, effect);
-
- if (!effectResult.success) {
- obj.social.notifySelf({ message: effectResult.errorMessage });
-
- return;
- }
- }
-
- if (item.type === 'consumable') {
- if (item.uses) {
- item.uses--;
-
- if (item.uses) {
- obj.syncer.setArray(true, 'inventory', 'getItems', item);
- return;
- }
- }
-
- cpnInv.destroyItem({ itemId }, 1);
- if (item.has('quickSlot'))
- cpnInv.obj.equipment.replaceQuickSlot(item);
- }
- };
|