diff --git a/src/server/components/extensions/socialCommands.js b/src/server/components/extensions/socialCommands.js index d858bf7d..35a9bf8a 100644 --- a/src/server/components/extensions/socialCommands.js +++ b/src/server/components/extensions/socialCommands.js @@ -465,8 +465,10 @@ module.exports = { die: function () { this.obj.stats.takeDamage({ - amount: 20000000 - }, 1, this.obj); + damage: { amount: 20000000 }, + source: this.obj, + target: this.obj + }); }, setPassword: async function (config) { diff --git a/src/server/components/gatherer.js b/src/server/components/gatherer.js index 66d0d4c1..4c0d54b4 100644 --- a/src/server/components/gatherer.js +++ b/src/server/components/gatherer.js @@ -311,7 +311,7 @@ module.exports = { this.events.beforeMove.call(this); }, - beforeTakeDamage: function () { + beforeTakeDamage: function (damageEvent) { this.events.beforeMove.call(this); }, diff --git a/src/server/components/mob.js b/src/server/components/mob.js index 3460a8e1..b84c797c 100644 --- a/src/server/components/mob.js +++ b/src/server/components/mob.js @@ -365,9 +365,9 @@ module.exports = { }, events: { - beforeTakeDamage: function (msg) { + beforeTakeDamage: function ({ damage }) { if (this.goHome) - msg.failed = true; + damage.failed = true; } } }; diff --git a/src/server/components/stats.js b/src/server/components/stats.js index fe38d974..c7cb86a1 100644 --- a/src/server/components/stats.js +++ b/src/server/components/stats.js @@ -1,10 +1,13 @@ +//Imports +const animations = require('../config/animations'); +const spirits = require('../config/spirits'); +const scheduler = require('../misc/scheduler'); + //Methods const die = require('./stats/die'); +const takeDamage = require('./stats/takeDamage'); -let animations = require('../config/animations'); -let spirits = require('../config/spirits'); -let scheduler = require('../misc/scheduler'); - +//Internals let baseStats = { mana: 20, manaMax: 20, @@ -82,6 +85,7 @@ let baseStats = { fishItems: 0 }; +//Exports module.exports = { type: 'stats', @@ -518,82 +522,8 @@ module.exports = { this.addStat(s, gainStats[s] * count); }, - takeDamage: function (damage, threatMult, source) { - if (this.values.hp <= 0) - return; - - let obj = this.obj; - - if (!damage.noEvents) { - source.fireEvent('beforeDealDamage', damage, obj); - obj.fireEvent('beforeTakeDamage', damage, source); - } - - if (damage.failed || obj.destroyed) - return; - - let amount = Math.min(this.values.hp, damage.amount); - - damage.dealt = amount; - - let msg = { - id: obj.id, - source: source.id, - crit: damage.crit, - amount: amount, - element: damage.element - }; - - this.values.hp -= amount; - let recipients = []; - if (obj.serverId) - recipients.push(obj.serverId); - if (source.serverId) - recipients.push(source.serverId); - - if (source.follower && source.follower.master.serverId) { - recipients.push(source.follower.master.serverId); - msg.masterSource = source.follower.master.id; - } - - if (obj.follower && obj.follower.master.serverId) { - recipients.push(obj.follower.master.serverId); - msg.masterId = obj.follower.master.id; - } - - if (recipients.length) { - if (!damage.blocked && !damage.dodged) - this.syncer.queue('onGetDamage', msg, recipients); - else { - this.syncer.queue('onGetDamage', { - id: obj.id, - source: source.id, - event: true, - text: damage.blocked ? 'blocked' : 'dodged' - }, recipients); - } - } - - obj.aggro.tryEngage(source, amount, threatMult); - - let died = (this.values.hp <= 0); - - if (died) { - let death = { - success: true - }; - obj.instance.eventEmitter.emit('onBeforeActorDies', death, obj, source); - obj.fireEvent('beforeDeath', death); - - if (death.success) - this.preDeath(source); - } else { - source.aggro.tryEngage(obj, 0); - obj.syncer.setObject(false, 'stats', 'values', 'hp', this.values.hp); - } - - if (!damage.noEvents) - source.fireEvent('afterDealDamage', damage, obj); + takeDamage: function (eventDamage) { + takeDamage(this, eventDamage); }, /* @@ -791,8 +721,8 @@ module.exports = { } }, - afterDealDamage: function (damageEvent, target) { - if (damageEvent.element) + afterDealDamage: function ({ damage, target }) { + if (damage.element) return; const { obj, values: { lifeOnHit } } = this; diff --git a/src/server/components/stats/takeDamage.js b/src/server/components/stats/takeDamage.js new file mode 100644 index 00000000..e96b5110 --- /dev/null +++ b/src/server/components/stats/takeDamage.js @@ -0,0 +1,84 @@ +const takeDamage = (cpnStats, eventDamage) => { + const { obj, values, syncer } = cpnStats; + + if (values.hp <= 0) + return; + + if (!eventDamage.noEvents) { + eventDamage.source.fireEvent('beforeDealDamage', eventDamage); + obj.fireEvent('beforeTakeDamage', eventDamage); + } + + const { source, damage, threatMult = 1 } = eventDamage; + const { noEvents, failed, blocked, dodged, crit, element } = damage; + + if (failed || obj.destroyed) + return; + + const amount = Math.min(values.hp, damage.amount); + + damage.dealt = amount; + + const msg = { + id: obj.id, + source: source.id, + crit, + amount, + element + }; + + values.hp -= amount; + const recipients = []; + if (obj.serverId) + recipients.push(obj.serverId); + if (source.serverId) + recipients.push(source.serverId); + + if (source.follower && source.follower.master.serverId) { + recipients.push(source.follower.master.serverId); + msg.masterSource = source.follower.master.id; + } + + if (obj.follower && obj.follower.master.serverId) { + recipients.push(obj.follower.master.serverId); + msg.masterId = obj.follower.master.id; + } + + if (recipients.length) { + if (!blocked && !dodged) + syncer.queue('onGetDamage', msg, recipients); + else { + syncer.queue('onGetDamage', { + id: obj.id, + source: source.id, + event: true, + text: blocked ? 'blocked' : 'dodged' + }, recipients); + } + } + + obj.aggro.tryEngage(source, amount, threatMult); + + let died = (values.hp <= 0); + + if (died) { + let death = { + success: true + }; + obj.instance.eventEmitter.emit('onBeforeActorDies', death, obj, source); + obj.fireEvent('beforeDeath', death); + + if (death.success) + cpnStats.preDeath(source); + } else { + source.aggro.tryEngage(obj, 0); + obj.syncer.setObject(false, 'stats', 'values', 'hp', values.hp); + } + + if (!noEvents) { + source.fireEvent('afterDealDamage', eventDamage); + obj.fireEvent('afterTakeDamage', eventDamage); + } +}; + +module.exports = takeDamage; diff --git a/src/server/config/effects/effectCocoon.js b/src/server/config/effects/effectCocoon.js index ce49991c..0b72a835 100644 --- a/src/server/config/effects/effectCocoon.js +++ b/src/server/config/effects/effectCocoon.js @@ -71,7 +71,7 @@ module.exports = { targetPos.y = obj.y; }, - beforeDealDamage: function (damage) { + beforeDealDamage: function ({ damage }) { if (damage) damage.failed = true; }, diff --git a/src/server/config/effects/effectHolyVengeance.js b/src/server/config/effects/effectHolyVengeance.js index 17674fa6..0f68395d 100644 --- a/src/server/config/effects/effectHolyVengeance.js +++ b/src/server/config/effects/effectHolyVengeance.js @@ -4,7 +4,7 @@ module.exports = { persist: true, events: { - afterDealDamage: function (damage, target) { + afterDealDamage: function ({ damage, target }) { damage.dealt *= 0.5; this.obj.stats.getHp(damage, this.obj); } diff --git a/src/server/config/effects/effectInvulnerability.js b/src/server/config/effects/effectInvulnerability.js index cec75511..8ccbe972 100644 --- a/src/server/config/effects/effectInvulnerability.js +++ b/src/server/config/effects/effectInvulnerability.js @@ -2,12 +2,12 @@ module.exports = { type: 'invulnerability', events: { - beforeDealDamage: function (damage) { + beforeDealDamage: function ({ damage }) { if (damage) damage.amount = 0; }, - beforeTakeDamage: function (damage, source) { + beforeTakeDamage: function ({ damage }) { damage.amount = 0; } } diff --git a/src/server/config/effects/effectLifeDrain.js b/src/server/config/effects/effectLifeDrain.js index 0fdeb7c4..b8868878 100644 --- a/src/server/config/effects/effectLifeDrain.js +++ b/src/server/config/effects/effectLifeDrain.js @@ -3,23 +3,39 @@ let combat = require('../../combat/combat'); module.exports = { type: 'lifeDrain', + amount: 0, + + scaleDamage: { + isAttack: false, + damage: 1, + element: undefined, + noScale: false, + noMitigate: false, + noCrit: false + }, + events: { afterTick: function () { - let newDamage = combat.getDamage({ - source: { - stats: { - values: {} - } - }, - isAttack: false, + const { isAttack, damage, element, noScale, noMitigate, noCrit } = this.scaleDamage; + + const damageEvent = combat.getDamage({ + source: this.caster, target: this.obj, - damage: this.amount, - element: this.element, - noScale: this.noScale, - noCrit: true + isAttack, + damage, + element, + noScale, + noMitigate, + noCrit }); - this.obj.stats.takeDamage(newDamage, 1, this.caster); + this.obj.stats.takeDamage({ + damage: damageEvent, + threatMult: 1, + source: this.caster, + target: this.obj, + effectName: 'lifeDrain' + }); } } }; diff --git a/src/server/config/effects/effectReflectDamage.js b/src/server/config/effects/effectReflectDamage.js index 959ef62a..6b3f0ed7 100644 --- a/src/server/config/effects/effectReflectDamage.js +++ b/src/server/config/effects/effectReflectDamage.js @@ -2,9 +2,16 @@ module.exports = { type: 'reflectDamage', events: { - beforeTakeDamage: function (damage, source) { + beforeTakeDamage: function ({ damage, source }) { damage.amount *= 0.5; - source.stats.takeDamage(damage, this.threatMult, this.obj); + + source.stats.takeDamage({ + damage, + threatMult: 1, + source: this.obj, + target: source, + effectName: 'reflectDamage' + }); damage.failed = true; diff --git a/src/server/config/effects/effectStunned.js b/src/server/config/effects/effectStunned.js index ccb46557..4f2f6cbc 100644 --- a/src/server/config/effects/effectStunned.js +++ b/src/server/config/effects/effectStunned.js @@ -11,7 +11,7 @@ module.exports = { targetPos.success = false; }, - beforeDealDamage: function (damage) { + beforeDealDamage: function ({ damage }) { if (damage) damage.failed = true; }, diff --git a/src/server/config/factions/akarei.js b/src/server/config/factions/akarei.js index b2872f8b..6b930d2d 100644 --- a/src/server/config/factions/akarei.js +++ b/src/server/config/factions/akarei.js @@ -47,7 +47,7 @@ module.exports = { }, events: { - beforeDealDamage: function (item, damage, target) { + beforeDealDamage: function (item, { damage, target }) { if (!damage.crit) return; @@ -69,7 +69,13 @@ module.exports = { noCrit: true }); - boundTarget.stats.takeDamage(damageConfig, 1, this); + boundTarget.stats.takeDamage({ + damage: damageConfig, + threatMult: 1, + source: this, + target: boundTarget, + effectName: 'akareiZap' + }); }; this.instance.syncer.queue('onGetObject', { diff --git a/src/server/config/itemEffects/castSpellOnHit.js b/src/server/config/itemEffects/castSpellOnHit.js index 34bf083f..636eede8 100644 --- a/src/server/config/itemEffects/castSpellOnHit.js +++ b/src/server/config/itemEffects/castSpellOnHit.js @@ -8,7 +8,7 @@ module.exports = { return `${chance}% chance to cast a ${damage} damage ${spell} on hit`; }, - afterDealDamage: function (item, damage, target) { + afterDealDamage: function (item, { damage, target }) { //Should only proc for attacks...this is kind of a hack const { element } = damage; if (element) diff --git a/src/server/config/itemEffects/damageSelf.js b/src/server/config/itemEffects/damageSelf.js index 741ac3f2..a04ba3dc 100644 --- a/src/server/config/itemEffects/damageSelf.js +++ b/src/server/config/itemEffects/damageSelf.js @@ -10,7 +10,7 @@ module.exports = { return `you take ${rolls.percentage}% of the damage you deal`; }, - afterDealDamage: function (item, damage, target) { + afterDealDamage: function (item, { damage, target }) { let effect = item.effects.find(e => (e.type === 'damageSelf')); let rolls = effect.rolls; @@ -31,7 +31,13 @@ module.exports = { newDamage.noEvents = true; - this.stats.takeDamage(newDamage, 1, this); + this.stats.takeDamage({ + damage: newDamage, + threatMult: 1, + source: this, + target: this, + effectName: 'damageSelf' + }); } } }; diff --git a/src/server/config/itemEffects/freezeOnHit.js b/src/server/config/itemEffects/freezeOnHit.js index 9310666d..b47e2224 100644 --- a/src/server/config/itemEffects/freezeOnHit.js +++ b/src/server/config/itemEffects/freezeOnHit.js @@ -6,7 +6,7 @@ module.exports = { return `${rolls.chance}% chance on hit to freeze target for ${rolls.duration} ticks`; }, - afterDealDamage: function (item, damage, target) { + afterDealDamage: function (item, { damage, target }) { let rolls = item.effects.find(e => (e.type === 'freezeOnHit')).rolls; let chanceRoll = Math.random() * 100; diff --git a/src/server/config/itemEffects/healOnCrit.js b/src/server/config/itemEffects/healOnCrit.js index 438f9872..47a0f5b4 100644 --- a/src/server/config/itemEffects/healOnCrit.js +++ b/src/server/config/itemEffects/healOnCrit.js @@ -21,7 +21,7 @@ module.exports = { return text; }, - afterDealDamage: function (item, damage, target) { + afterDealDamage: function (item, { damage, target }) { if (!damage.crit) return; diff --git a/src/server/config/prophecies/crushable.js b/src/server/config/prophecies/crushable.js index 10c6d659..753be80a 100644 --- a/src/server/config/prophecies/crushable.js +++ b/src/server/config/prophecies/crushable.js @@ -10,8 +10,8 @@ module.exports = { }, events: { - beforeTakeDamage: function (dmg, source) { - dmg.amount *= 4; + beforeTakeDamage: function ({ damage }) { + damage.amount *= 4; } } }; diff --git a/src/server/config/spells/spellAmbush.js b/src/server/config/spells/spellAmbush.js index ae21772d..3a361eb5 100644 --- a/src/server/config/spells/spellAmbush.js +++ b/src/server/config/spells/spellAmbush.js @@ -183,7 +183,13 @@ module.exports = { this.obj.aggro.move(); let damage = this.getDamage(target); - target.stats.takeDamage(damage, this.threatMult, obj); + target.stats.takeDamage({ + damage, + threatMult: this.threatMult, + source: this.obj, + target, + spellName: 'ambush' + }); }, isTileValid: function (physics, fromX, fromY, toX, toY) { diff --git a/src/server/config/spells/spellChainLightning.js b/src/server/config/spells/spellChainLightning.js index 674b905b..82280ba5 100644 --- a/src/server/config/spells/spellChainLightning.js +++ b/src/server/config/spells/spellChainLightning.js @@ -31,6 +31,12 @@ module.exports = { return; let damage = this.getDamage(target); - target.stats.takeDamage(damage, this.threatMult, this.obj); + target.stats.takeDamage({ + damage, + threatMult: this.threatMult, + source: this.obj, + target, + spellName: 'chainLightning' + }); } }; diff --git a/src/server/config/spells/spellCharge.js b/src/server/config/spells/spellCharge.js index 7b7a394c..73378f4b 100644 --- a/src/server/config/spells/spellCharge.js +++ b/src/server/config/spells/spellCharge.js @@ -114,7 +114,13 @@ module.exports = { targetEffect.ttl = this.stunDuration; let damage = this.getDamage(target); - target.stats.takeDamage(damage, this.threatMult, obj); + target.stats.takeDamage({ + damage, + threatMult: this.threatMult, + source: this.obj, + target, + spellName: 'charge' + }); const moveEvent = { newPos: targetPos, diff --git a/src/server/config/spells/spellFireblast.js b/src/server/config/spells/spellFireblast.js index 1f1dc96a..a44c4d96 100644 --- a/src/server/config/spells/spellFireblast.js +++ b/src/server/config/spells/spellFireblast.js @@ -99,7 +99,13 @@ module.exports = { m.clearQueue(); let damage = this.getDamage(m); - m.stats.takeDamage(damage, 1, obj); + m.stats.takeDamage({ + damage, + threatMult: 1, + source: this.obj, + target: m, + spellName: 'fireblast' + }); if (m.destroyed) continue; diff --git a/src/server/config/spells/spellIceSpear.js b/src/server/config/spells/spellIceSpear.js index e54dd0e0..cc3b6430 100644 --- a/src/server/config/spells/spellIceSpear.js +++ b/src/server/config/spells/spellIceSpear.js @@ -60,6 +60,12 @@ module.exports = { }); let damage = this.getDamage(target); - target.stats.takeDamage(damage, this.threatMult, this.obj); + target.stats.takeDamage({ + damage, + threatMult: this.threatMult, + source: this.obj, + target, + spellName: 'iceSpear' + }); } }; diff --git a/src/server/config/spells/spellMelee.js b/src/server/config/spells/spellMelee.js index 98239ffe..1dd95297 100644 --- a/src/server/config/spells/spellMelee.js +++ b/src/server/config/spells/spellMelee.js @@ -43,6 +43,12 @@ module.exports = { return; let damage = this.getDamage(target); - target.stats.takeDamage(damage, this.threatMult, this.obj); + target.stats.takeDamage({ + damage, + threatMult: this.threatMult, + source: this.obj, + target, + spellName: 'melee' + }); } }; diff --git a/src/server/config/spells/spellProjectile.js b/src/server/config/spells/spellProjectile.js index 279ec801..f7c59158 100644 --- a/src/server/config/spells/spellProjectile.js +++ b/src/server/config/spells/spellProjectile.js @@ -138,6 +138,12 @@ module.exports = { if (this.applyEffect) target.effects.addEffect(this.applyEffect, this.obj); - target.stats.takeDamage(damage, this.threatMult, this.obj); + target.stats.takeDamage({ + damage, + threatMult: this.threatMult, + source: this.obj, + target, + spellName: 'projectile' + }); } }; diff --git a/src/server/config/spells/spellSlash.js b/src/server/config/spells/spellSlash.js index 5cf66ba2..a394073a 100644 --- a/src/server/config/spells/spellSlash.js +++ b/src/server/config/spells/spellSlash.js @@ -43,6 +43,12 @@ module.exports = { return; let damage = this.getDamage(target); - target.stats.takeDamage(damage, this.threatMult, this.obj); + target.stats.takeDamage({ + damage, + threatMult: this.threatMult, + source: this.obj, + target, + spellName: 'slash' + }); } }; diff --git a/src/server/config/spells/spellSlowBlast.js b/src/server/config/spells/spellSlowBlast.js index f1cbf67c..50835d31 100644 --- a/src/server/config/spells/spellSlowBlast.js +++ b/src/server/config/spells/spellSlowBlast.js @@ -89,7 +89,13 @@ module.exports = { continue; let damage = this.getDamage(m); - m.stats.takeDamage(damage, 1, obj); + m.stats.takeDamage({ + damage, + threatMult: 1, + source: obj, + target: m, + spellName: 'slowBlast' + }); } } } diff --git a/src/server/config/spells/spellSmite.js b/src/server/config/spells/spellSmite.js index 40f35b8e..bbe7aeb7 100644 --- a/src/server/config/spells/spellSmite.js +++ b/src/server/config/spells/spellSmite.js @@ -42,7 +42,13 @@ module.exports = { return; let damage = this.getDamage(target); - target.stats.takeDamage(damage, this.threatMult, this.obj); + target.stats.takeDamage({ + damage, + threatMult: this.threatMult, + source: this.obj, + target, + spellName: 'smite' + }); target.effects.addEffect({ type: 'stunned', diff --git a/src/server/config/spells/spellSmokeBomb.js b/src/server/config/spells/spellSmokeBomb.js index 9b37146b..c28c88bb 100644 --- a/src/server/config/spells/spellSmokeBomb.js +++ b/src/server/config/spells/spellSmokeBomb.js @@ -4,8 +4,14 @@ let cpnSmokePatch = { contents: [], ttl: 0, - applyDamage: function (o, amount) { - o.stats.takeDamage(amount, 1, this.caster); + applyDamage: function (target, damage) { + target.stats.takeDamage({ + damage, + threatMult: 1, + source: this.caster, + target: target, + spellName: 'smokeBomb' + }); }, collisionEnter: function (o) { diff --git a/src/server/config/spells/spellTrailDash.js b/src/server/config/spells/spellTrailDash.js index 966a39ac..0915192e 100644 --- a/src/server/config/spells/spellTrailDash.js +++ b/src/server/config/spells/spellTrailDash.js @@ -3,8 +3,14 @@ let cpnSpikePatch = { contents: [], - applyDamage: function (o, amount) { - o.stats.takeDamage(amount, 1, this.caster); + applyDamage: function (target, damage) { + target.stats.takeDamage({ + damage, + threatMult: 1, + source: this.caster, + target: target, + spellName: 'smokeBomb' + }); }, collisionEnter: function (o) { diff --git a/src/server/config/spells/spellWarnBlast.js b/src/server/config/spells/spellWarnBlast.js index e26afd86..577842aa 100644 --- a/src/server/config/spells/spellWarnBlast.js +++ b/src/server/config/spells/spellWarnBlast.js @@ -124,7 +124,13 @@ module.exports = { continue; let damage = this.getDamage(m); - m.stats.takeDamage(damage, 1, obj); + m.stats.takeDamage({ + damage, + threatMult: 1, + source: obj, + target: m, + spellName: 'warnBlast' + }); } } }; diff --git a/src/server/config/spells/spellWhirlwind.js b/src/server/config/spells/spellWhirlwind.js index 9079dfe6..aa9f354e 100644 --- a/src/server/config/spells/spellWhirlwind.js +++ b/src/server/config/spells/spellWhirlwind.js @@ -3,8 +3,14 @@ const coordinateDeltas = [ [[0, -2], [0, -1], [1, -2], [2, -2], [1, -1], [2, -1], [2, 0], [1, 0], [2, 1], [2, 2], [1, 1], [1, 2], [0, 2], [0, 1], [-1, 2], [-2, 2], [-2, 1], [-1, 1], [-2, 0], [-1, 0], [-2, -1], [-2, -2], [-1, -1], [-1, -2]] ]; -const applyDamage = (target, damage, threat, source) => { - target.stats.takeDamage(damage, threat, source); +const applyDamage = (target, damage, threatMult, source) => { + target.stats.takeDamage({ + damage, + threatMult, + source, + target, + spellName: 'whirlwind' + }); }; const dealDamage = (spell, obj, coords) => { diff --git a/src/server/config/spellsConfig.js b/src/server/config/spellsConfig.js index a865fef4..82a1b0a2 100644 --- a/src/server/config/spellsConfig.js +++ b/src/server/config/spellsConfig.js @@ -104,7 +104,7 @@ let spells = { statType: 'str', statMult: 1, threatMult: 4, - cdMax: 9, + cdMax: 1, castTimeMax: 1, manaCost: 4, useWeaponRange: true, @@ -140,7 +140,7 @@ let spells = { statType: 'str', statMult: 1, threatMult: 6, - cdMax: 12, + cdMax: 1, castTimeMax: 2, manaCost: 7, random: { diff --git a/src/server/events/phases/phaseKillMob.js b/src/server/events/phases/phaseKillMob.js index c31df9e1..f794a633 100644 --- a/src/server/events/phases/phaseKillMob.js +++ b/src/server/events/phases/phaseKillMob.js @@ -4,7 +4,7 @@ let cpnDeathStopper = { end: false, events: { - beforeTakeDamage: function (damage, source) { + beforeTakeDamage: function ({ damage }) { let statValues = this.obj.stats.values; let minHp = statValues.hpMax * this.percentage; if (statValues.hp - damage.amount < minHp) { diff --git a/src/server/mods/class-necromancer/spells/spellBloodBarrier.js b/src/server/mods/class-necromancer/spells/spellBloodBarrier.js index 854b7d4c..44573c32 100644 --- a/src/server/mods/class-necromancer/spells/spellBloodBarrier.js +++ b/src/server/mods/class-necromancer/spells/spellBloodBarrier.js @@ -35,8 +35,13 @@ module.exports = { return; let amount = (obj.stats.values.hpMax / 100) * this.drainPercentage; - const damage = { amount }; - obj.stats.takeDamage(damage, 0, obj); + obj.stats.takeDamage({ + damage: { amount }, + threatMult: 0, + source: obj, + target: obj, + spellName: 'bloodBarrier' + }); amount = amount * this.shieldMultiplier; const heal = { amount }; diff --git a/src/server/mods/class-necromancer/spells/spellHarvestLife.js b/src/server/mods/class-necromancer/spells/spellHarvestLife.js index e2b13c38..b52f3caa 100644 --- a/src/server/mods/class-necromancer/spells/spellHarvestLife.js +++ b/src/server/mods/class-necromancer/spells/spellHarvestLife.js @@ -44,7 +44,13 @@ module.exports = { return; let damage = this.getDamage(target); - target.stats.takeDamage(damage, this.threatMult, obj); + target.stats.takeDamage({ + damage, + threatMult: this.threatMult, + source: obj, + target, + spellName: 'harvestLife' + }); let healAmount = damage.amount * (this.healPercent / 100); obj.stats.getHp({