You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

101 lines
2.5 KiB

  1. let generator = require('../../items/generator');
  2. module.exports = (cpnInv, ownerName, killSource) => {
  3. const { obj, blueprint } = cpnInv;
  4. if (!blueprint)
  5. return;
  6. const { stats, instance: { objects, eventEmitter } } = obj;
  7. //Only drop loot if this player is in the zone
  8. let playerObject = objects.find(o => o.player && o.name === ownerName);
  9. if (!playerObject)
  10. return;
  11. let items = cpnInv.items;
  12. let iLen = items.length;
  13. for (let i = 0; i < iLen; i++) {
  14. delete items[i].eq;
  15. delete items[i].pos;
  16. }
  17. let magicFind = (blueprint.magicFind || 0);
  18. let savedItems = extend([], cpnInv.items);
  19. cpnInv.items = [];
  20. let dropEvent = {
  21. chanceMultiplier: 1,
  22. source: obj
  23. };
  24. playerObject.fireEvent('beforeGenerateLoot', dropEvent);
  25. if ((!blueprint.noRandom) || (blueprint.alsoRandom)) {
  26. let bonusMagicFind = killSource.stats.values.magicFind;
  27. let rolls = blueprint.rolls;
  28. let itemQuantity = Math.min(200, killSource.stats.values.itemQuantity);
  29. rolls += ~~(itemQuantity / 100);
  30. if ((Math.random() * 100) < (itemQuantity % 100))
  31. rolls++;
  32. for (let i = 0; i < rolls; i++) {
  33. if (Math.random() * 100 >= (blueprint.chance || 35) * dropEvent.chanceMultiplier)
  34. continue;
  35. let itemBlueprint = {
  36. level: stats.values.level,
  37. magicFind: magicFind,
  38. bonusMagicFind: bonusMagicFind,
  39. noCurrency: i > 0
  40. };
  41. let useItem = generator.generate(itemBlueprint, playerObject.stats.values.level);
  42. cpnInv.getItem(useItem);
  43. }
  44. }
  45. if (blueprint.noRandom) {
  46. let blueprints = blueprint.blueprints;
  47. for (let i = 0; i < blueprints.length; i++) {
  48. let drop = blueprints[i];
  49. if ((drop.maxLevel) && (drop.maxLevel < killSource.stats.values.level))
  50. continue;
  51. else if ((drop.chance) && (~~(Math.random() * 100) >= drop.chance * dropEvent.chanceMultiplier))
  52. continue;
  53. drop.level = drop.level || stats.values.level;
  54. drop.magicFind = magicFind;
  55. let item = drop;
  56. if ((!item.quest) && (item.type !== 'key'))
  57. item = generator.generate(drop);
  58. if (!item.slot)
  59. delete item.level;
  60. cpnInv.getItem(item, true);
  61. }
  62. }
  63. playerObject.fireEvent('beforeTargetDeath', obj, cpnInv.items);
  64. //Deprecated
  65. eventEmitter.emit('onBeforeDropBag', obj, cpnInv.items, killSource);
  66. obj.fireEvent('onBeforeDropBag', cpnInv.items, killSource);
  67. //New
  68. const eventMsg = {
  69. objDropper: obj,
  70. objLooter: playerObject,
  71. objKillSource: killSource,
  72. items: cpnInv.items
  73. };
  74. eventEmitter.emit('beforeDropBag', eventMsg);
  75. if (cpnInv.items.length > 0)
  76. cpnInv.createBag(obj.x, obj.y, cpnInv.items, ownerName);
  77. cpnInv.items = savedItems;
  78. };