|
- let generator = require('../../items/generator');
-
- module.exports = (cpnInv, ownerName, killSource) => {
- const { obj, blueprint } = cpnInv;
-
- if (!blueprint)
- return;
-
- const { stats, instance: { objects, eventEmitter } } = obj;
-
- //Only drop loot if this player is in the zone
- let playerObject = objects.find(o => o.player && o.name === ownerName);
- if (!playerObject)
- return;
-
- let items = cpnInv.items;
- let iLen = items.length;
- for (let i = 0; i < iLen; i++) {
- delete items[i].eq;
- delete items[i].pos;
- }
-
- let magicFind = (blueprint.magicFind || 0);
-
- let savedItems = extend([], cpnInv.items);
- cpnInv.items = [];
-
- let dropEvent = {
- chanceMultiplier: 1,
- source: obj
- };
- playerObject.fireEvent('beforeGenerateLoot', dropEvent);
-
- if ((!blueprint.noRandom) || (blueprint.alsoRandom)) {
- let bonusMagicFind = killSource.stats.values.magicFind;
-
- let rolls = blueprint.rolls;
- let itemQuantity = Math.min(200, killSource.stats.values.itemQuantity);
- rolls += ~~(itemQuantity / 100);
- if ((Math.random() * 100) < (itemQuantity % 100))
- rolls++;
-
- for (let i = 0; i < rolls; i++) {
- if (Math.random() * 100 >= (blueprint.chance || 35) * dropEvent.chanceMultiplier)
- continue;
-
- let itemBlueprint = {
- level: stats.values.level,
- magicFind: magicFind,
- bonusMagicFind: bonusMagicFind,
- noCurrency: i > 0
- };
-
- let useItem = generator.generate(itemBlueprint, playerObject.stats.values.level);
- cpnInv.getItem(useItem);
- }
- }
-
- if (blueprint.noRandom) {
- let blueprints = blueprint.blueprints;
- for (let i = 0; i < blueprints.length; i++) {
- let drop = blueprints[i];
- if ((drop.maxLevel) && (drop.maxLevel < killSource.stats.values.level))
- continue;
- else if ((drop.chance) && (~~(Math.random() * 100) >= drop.chance * dropEvent.chanceMultiplier))
- continue;
-
- drop.level = drop.level || stats.values.level;
- drop.magicFind = magicFind;
-
- let item = drop;
- if ((!item.quest) && (item.type !== 'key'))
- item = generator.generate(drop);
-
- if (!item.slot)
- delete item.level;
-
- cpnInv.getItem(item, true);
- }
- }
-
- playerObject.fireEvent('beforeTargetDeath', obj, cpnInv.items);
-
- //Deprecated
- eventEmitter.emit('onBeforeDropBag', obj, cpnInv.items, killSource);
- obj.fireEvent('onBeforeDropBag', cpnInv.items, killSource);
- //New
- const eventMsg = {
- objDropper: obj,
- objLooter: playerObject,
- objKillSource: killSource,
- items: cpnInv.items
- };
- eventEmitter.emit('beforeDropBag', eventMsg);
-
- if (cpnInv.items.length > 0)
- cpnInv.createBag(obj.x, obj.y, cpnInv.items, ownerName);
-
- cpnInv.items = savedItems;
- };
|