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.
 
 
 

85 lines
1.9 KiB

  1. const takeDamage = (cpnStats, eventDamage) => {
  2. const { obj, values, syncer } = cpnStats;
  3. if (values.hp <= 0)
  4. return;
  5. if (!eventDamage.noEvents) {
  6. eventDamage.source.fireEvent('beforeDealDamage', eventDamage);
  7. obj.fireEvent('beforeTakeDamage', eventDamage);
  8. }
  9. const { source, damage, threatMult = 1 } = eventDamage;
  10. const { noEvents, failed, blocked, dodged, crit, element } = damage;
  11. if (failed || obj.destroyed)
  12. return;
  13. const amount = Math.min(values.hp, damage.amount);
  14. damage.dealt = amount;
  15. const msg = {
  16. id: obj.id,
  17. source: source.id,
  18. crit,
  19. amount,
  20. element
  21. };
  22. values.hp -= amount;
  23. const recipients = [];
  24. if (obj.serverId)
  25. recipients.push(obj.serverId);
  26. if (source.serverId)
  27. recipients.push(source.serverId);
  28. if (source.follower && source.follower.master.serverId) {
  29. recipients.push(source.follower.master.serverId);
  30. msg.masterSource = source.follower.master.id;
  31. }
  32. if (obj.follower && obj.follower.master.serverId) {
  33. recipients.push(obj.follower.master.serverId);
  34. msg.masterId = obj.follower.master.id;
  35. }
  36. if (recipients.length) {
  37. if (!blocked && !dodged)
  38. syncer.queue('onGetDamage', msg, recipients);
  39. else {
  40. syncer.queue('onGetDamage', {
  41. id: obj.id,
  42. source: source.id,
  43. event: true,
  44. text: blocked ? 'blocked' : 'dodged'
  45. }, recipients);
  46. }
  47. }
  48. obj.aggro.tryEngage(source, amount, threatMult);
  49. let died = (values.hp <= 0);
  50. if (died) {
  51. let death = {
  52. success: true
  53. };
  54. obj.instance.eventEmitter.emit('onBeforeActorDies', death, obj, source);
  55. obj.fireEvent('beforeDeath', death);
  56. if (death.success)
  57. cpnStats.preDeath(source);
  58. } else {
  59. source.aggro.tryEngage(obj, 0);
  60. obj.syncer.setObject(false, 'stats', 'values', 'hp', values.hp);
  61. }
  62. if (!noEvents) {
  63. source.fireEvent('afterDealDamage', eventDamage);
  64. obj.fireEvent('afterTakeDamage', eventDamage);
  65. }
  66. };
  67. module.exports = takeDamage;