Browse Source

modding #1975: reworked takeDamage argument and damage event arguments

tags/v0.12.0
Shaun 1 year ago
parent
commit
91fb92a5e8
35 changed files with 284 additions and 138 deletions
  1. +4
    -2
      src/server/components/extensions/socialCommands.js
  2. +1
    -1
      src/server/components/gatherer.js
  3. +2
    -2
      src/server/components/mob.js
  4. +12
    -82
      src/server/components/stats.js
  5. +84
    -0
      src/server/components/stats/takeDamage.js
  6. +1
    -1
      src/server/config/effects/effectCocoon.js
  7. +1
    -1
      src/server/config/effects/effectHolyVengeance.js
  8. +2
    -2
      src/server/config/effects/effectInvulnerability.js
  9. +28
    -12
      src/server/config/effects/effectLifeDrain.js
  10. +9
    -2
      src/server/config/effects/effectReflectDamage.js
  11. +1
    -1
      src/server/config/effects/effectStunned.js
  12. +8
    -2
      src/server/config/factions/akarei.js
  13. +1
    -1
      src/server/config/itemEffects/castSpellOnHit.js
  14. +8
    -2
      src/server/config/itemEffects/damageSelf.js
  15. +1
    -1
      src/server/config/itemEffects/freezeOnHit.js
  16. +1
    -1
      src/server/config/itemEffects/healOnCrit.js
  17. +2
    -2
      src/server/config/prophecies/crushable.js
  18. +7
    -1
      src/server/config/spells/spellAmbush.js
  19. +7
    -1
      src/server/config/spells/spellChainLightning.js
  20. +7
    -1
      src/server/config/spells/spellCharge.js
  21. +7
    -1
      src/server/config/spells/spellFireblast.js
  22. +7
    -1
      src/server/config/spells/spellIceSpear.js
  23. +7
    -1
      src/server/config/spells/spellMelee.js
  24. +7
    -1
      src/server/config/spells/spellProjectile.js
  25. +7
    -1
      src/server/config/spells/spellSlash.js
  26. +7
    -1
      src/server/config/spells/spellSlowBlast.js
  27. +7
    -1
      src/server/config/spells/spellSmite.js
  28. +8
    -2
      src/server/config/spells/spellSmokeBomb.js
  29. +8
    -2
      src/server/config/spells/spellTrailDash.js
  30. +7
    -1
      src/server/config/spells/spellWarnBlast.js
  31. +8
    -2
      src/server/config/spells/spellWhirlwind.js
  32. +2
    -2
      src/server/config/spellsConfig.js
  33. +1
    -1
      src/server/events/phases/phaseKillMob.js
  34. +7
    -2
      src/server/mods/class-necromancer/spells/spellBloodBarrier.js
  35. +7
    -1
      src/server/mods/class-necromancer/spells/spellHarvestLife.js

+ 4
- 2
src/server/components/extensions/socialCommands.js View File

@@ -465,8 +465,10 @@ module.exports = {


die: function () { die: function () {
this.obj.stats.takeDamage({ this.obj.stats.takeDamage({
amount: 20000000
}, 1, this.obj);
damage: { amount: 20000000 },
source: this.obj,
target: this.obj
});
}, },


setPassword: async function (config) { setPassword: async function (config) {


+ 1
- 1
src/server/components/gatherer.js View File

@@ -311,7 +311,7 @@ module.exports = {
this.events.beforeMove.call(this); this.events.beforeMove.call(this);
}, },


beforeTakeDamage: function () {
beforeTakeDamage: function (damageEvent) {
this.events.beforeMove.call(this); this.events.beforeMove.call(this);
}, },




+ 2
- 2
src/server/components/mob.js View File

@@ -365,9 +365,9 @@ module.exports = {
}, },


events: { events: {
beforeTakeDamage: function (msg) {
beforeTakeDamage: function ({ damage }) {
if (this.goHome) if (this.goHome)
msg.failed = true;
damage.failed = true;
} }
} }
}; };

+ 12
- 82
src/server/components/stats.js View File

@@ -1,10 +1,13 @@
//Imports
const animations = require('../config/animations');
const spirits = require('../config/spirits');
const scheduler = require('../misc/scheduler');

//Methods //Methods
const die = require('./stats/die'); 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 = { let baseStats = {
mana: 20, mana: 20,
manaMax: 20, manaMax: 20,
@@ -82,6 +85,7 @@ let baseStats = {
fishItems: 0 fishItems: 0
}; };


//Exports
module.exports = { module.exports = {
type: 'stats', type: 'stats',


@@ -518,82 +522,8 @@ module.exports = {
this.addStat(s, gainStats[s] * count); 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; return;


const { obj, values: { lifeOnHit } } = this; const { obj, values: { lifeOnHit } } = this;


+ 84
- 0
src/server/components/stats/takeDamage.js View File

@@ -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;

+ 1
- 1
src/server/config/effects/effectCocoon.js View File

@@ -71,7 +71,7 @@ module.exports = {
targetPos.y = obj.y; targetPos.y = obj.y;
}, },


beforeDealDamage: function (damage) {
beforeDealDamage: function ({ damage }) {
if (damage) if (damage)
damage.failed = true; damage.failed = true;
}, },


+ 1
- 1
src/server/config/effects/effectHolyVengeance.js View File

@@ -4,7 +4,7 @@ module.exports = {
persist: true, persist: true,


events: { events: {
afterDealDamage: function (damage, target) {
afterDealDamage: function ({ damage, target }) {
damage.dealt *= 0.5; damage.dealt *= 0.5;
this.obj.stats.getHp(damage, this.obj); this.obj.stats.getHp(damage, this.obj);
} }


+ 2
- 2
src/server/config/effects/effectInvulnerability.js View File

@@ -2,12 +2,12 @@ module.exports = {
type: 'invulnerability', type: 'invulnerability',


events: { events: {
beforeDealDamage: function (damage) {
beforeDealDamage: function ({ damage }) {
if (damage) if (damage)
damage.amount = 0; damage.amount = 0;
}, },


beforeTakeDamage: function (damage, source) {
beforeTakeDamage: function ({ damage }) {
damage.amount = 0; damage.amount = 0;
} }
} }


+ 28
- 12
src/server/config/effects/effectLifeDrain.js View File

@@ -3,23 +3,39 @@ let combat = require('../../combat/combat');
module.exports = { module.exports = {
type: 'lifeDrain', type: 'lifeDrain',


amount: 0,

scaleDamage: {
isAttack: false,
damage: 1,
element: undefined,
noScale: false,
noMitigate: false,
noCrit: false
},

events: { events: {
afterTick: function () { 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, 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'
});
} }
} }
}; };

+ 9
- 2
src/server/config/effects/effectReflectDamage.js View File

@@ -2,9 +2,16 @@ module.exports = {
type: 'reflectDamage', type: 'reflectDamage',


events: { events: {
beforeTakeDamage: function (damage, source) {
beforeTakeDamage: function ({ damage, source }) {
damage.amount *= 0.5; 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; damage.failed = true;




+ 1
- 1
src/server/config/effects/effectStunned.js View File

@@ -11,7 +11,7 @@ module.exports = {
targetPos.success = false; targetPos.success = false;
}, },


beforeDealDamage: function (damage) {
beforeDealDamage: function ({ damage }) {
if (damage) if (damage)
damage.failed = true; damage.failed = true;
}, },


+ 8
- 2
src/server/config/factions/akarei.js View File

@@ -47,7 +47,7 @@ module.exports = {
}, },


events: { events: {
beforeDealDamage: function (item, damage, target) {
beforeDealDamage: function (item, { damage, target }) {
if (!damage.crit) if (!damage.crit)
return; return;


@@ -69,7 +69,13 @@ module.exports = {
noCrit: true 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', { this.instance.syncer.queue('onGetObject', {


+ 1
- 1
src/server/config/itemEffects/castSpellOnHit.js View File

@@ -8,7 +8,7 @@ module.exports = {
return `${chance}% chance to cast a ${damage} damage ${spell} on hit`; 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 //Should only proc for attacks...this is kind of a hack
const { element } = damage; const { element } = damage;
if (element) if (element)


+ 8
- 2
src/server/config/itemEffects/damageSelf.js View File

@@ -10,7 +10,7 @@ module.exports = {
return `you take ${rolls.percentage}% of the damage you deal`; 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 effect = item.effects.find(e => (e.type === 'damageSelf'));
let rolls = effect.rolls; let rolls = effect.rolls;


@@ -31,7 +31,13 @@ module.exports = {


newDamage.noEvents = true; newDamage.noEvents = true;


this.stats.takeDamage(newDamage, 1, this);
this.stats.takeDamage({
damage: newDamage,
threatMult: 1,
source: this,
target: this,
effectName: 'damageSelf'
});
} }
} }
}; };

+ 1
- 1
src/server/config/itemEffects/freezeOnHit.js View File

@@ -6,7 +6,7 @@ module.exports = {
return `${rolls.chance}% chance on hit to freeze target for ${rolls.duration} ticks`; 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 rolls = item.effects.find(e => (e.type === 'freezeOnHit')).rolls;


let chanceRoll = Math.random() * 100; let chanceRoll = Math.random() * 100;


+ 1
- 1
src/server/config/itemEffects/healOnCrit.js View File

@@ -21,7 +21,7 @@ module.exports = {
return text; return text;
}, },


afterDealDamage: function (item, damage, target) {
afterDealDamage: function (item, { damage, target }) {
if (!damage.crit) if (!damage.crit)
return; return;




+ 2
- 2
src/server/config/prophecies/crushable.js View File

@@ -10,8 +10,8 @@ module.exports = {
}, },


events: { events: {
beforeTakeDamage: function (dmg, source) {
dmg.amount *= 4;
beforeTakeDamage: function ({ damage }) {
damage.amount *= 4;
} }
} }
}; };

+ 7
- 1
src/server/config/spells/spellAmbush.js View File

@@ -183,7 +183,13 @@ module.exports = {
this.obj.aggro.move(); this.obj.aggro.move();


let damage = this.getDamage(target); 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) { isTileValid: function (physics, fromX, fromY, toX, toY) {


+ 7
- 1
src/server/config/spells/spellChainLightning.js View File

@@ -31,6 +31,12 @@ module.exports = {
return; return;
let damage = this.getDamage(target); 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'
});
} }
}; };

+ 7
- 1
src/server/config/spells/spellCharge.js View File

@@ -114,7 +114,13 @@ module.exports = {
targetEffect.ttl = this.stunDuration; targetEffect.ttl = this.stunDuration;


let damage = this.getDamage(target); 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 = { const moveEvent = {
newPos: targetPos, newPos: targetPos,


+ 7
- 1
src/server/config/spells/spellFireblast.js View File

@@ -99,7 +99,13 @@ module.exports = {
m.clearQueue(); m.clearQueue();


let damage = this.getDamage(m); 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) if (m.destroyed)
continue; continue;


+ 7
- 1
src/server/config/spells/spellIceSpear.js View File

@@ -60,6 +60,12 @@ module.exports = {
}); });


let damage = this.getDamage(target); 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'
});
} }
}; };

+ 7
- 1
src/server/config/spells/spellMelee.js View File

@@ -43,6 +43,12 @@ module.exports = {
return; return;


let damage = this.getDamage(target); 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'
});
} }
}; };

+ 7
- 1
src/server/config/spells/spellProjectile.js View File

@@ -138,6 +138,12 @@ module.exports = {
if (this.applyEffect) if (this.applyEffect)
target.effects.addEffect(this.applyEffect, this.obj); 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'
});
} }
}; };

+ 7
- 1
src/server/config/spells/spellSlash.js View File

@@ -43,6 +43,12 @@ module.exports = {
return; return;


let damage = this.getDamage(target); 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'
});
} }
}; };

+ 7
- 1
src/server/config/spells/spellSlowBlast.js View File

@@ -89,7 +89,13 @@ module.exports = {
continue; continue;


let damage = this.getDamage(m); let damage = this.getDamage(m);
m.stats.takeDamage(damage, 1, obj);
m.stats.takeDamage({
damage,
threatMult: 1,
source: obj,
target: m,
spellName: 'slowBlast'
});
} }
} }
} }


+ 7
- 1
src/server/config/spells/spellSmite.js View File

@@ -42,7 +42,13 @@ module.exports = {
return; return;


let damage = this.getDamage(target); 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({ target.effects.addEffect({
type: 'stunned', type: 'stunned',


+ 8
- 2
src/server/config/spells/spellSmokeBomb.js View File

@@ -4,8 +4,14 @@ let cpnSmokePatch = {
contents: [], contents: [],
ttl: 0, 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) { collisionEnter: function (o) {


+ 8
- 2
src/server/config/spells/spellTrailDash.js View File

@@ -3,8 +3,14 @@ let cpnSpikePatch = {


contents: [], 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) { collisionEnter: function (o) {


+ 7
- 1
src/server/config/spells/spellWarnBlast.js View File

@@ -124,7 +124,13 @@ module.exports = {
continue; continue;


let damage = this.getDamage(m); let damage = this.getDamage(m);
m.stats.takeDamage(damage, 1, obj);
m.stats.takeDamage({
damage,
threatMult: 1,
source: obj,
target: m,
spellName: 'warnBlast'
});
} }
} }
}; };

+ 8
- 2
src/server/config/spells/spellWhirlwind.js View File

@@ -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]] [[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) => { const dealDamage = (spell, obj, coords) => {


+ 2
- 2
src/server/config/spellsConfig.js View File

@@ -104,7 +104,7 @@ let spells = {
statType: 'str', statType: 'str',
statMult: 1, statMult: 1,
threatMult: 4, threatMult: 4,
cdMax: 9,
cdMax: 1,
castTimeMax: 1, castTimeMax: 1,
manaCost: 4, manaCost: 4,
useWeaponRange: true, useWeaponRange: true,
@@ -140,7 +140,7 @@ let spells = {
statType: 'str', statType: 'str',
statMult: 1, statMult: 1,
threatMult: 6, threatMult: 6,
cdMax: 12,
cdMax: 1,
castTimeMax: 2, castTimeMax: 2,
manaCost: 7, manaCost: 7,
random: { random: {


+ 1
- 1
src/server/events/phases/phaseKillMob.js View File

@@ -4,7 +4,7 @@ let cpnDeathStopper = {
end: false, end: false,


events: { events: {
beforeTakeDamage: function (damage, source) {
beforeTakeDamage: function ({ damage }) {
let statValues = this.obj.stats.values; let statValues = this.obj.stats.values;
let minHp = statValues.hpMax * this.percentage; let minHp = statValues.hpMax * this.percentage;
if (statValues.hp - damage.amount < minHp) { if (statValues.hp - damage.amount < minHp) {


+ 7
- 2
src/server/mods/class-necromancer/spells/spellBloodBarrier.js View File

@@ -35,8 +35,13 @@ module.exports = {
return; return;


let amount = (obj.stats.values.hpMax / 100) * this.drainPercentage; 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; amount = amount * this.shieldMultiplier;
const heal = { amount }; const heal = { amount };


+ 7
- 1
src/server/mods/class-necromancer/spells/spellHarvestLife.js View File

@@ -44,7 +44,13 @@ module.exports = {
return; return;
let damage = this.getDamage(target); 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); let healAmount = damage.amount * (this.healPercent / 100);
obj.stats.getHp({ obj.stats.getHp({


Loading…
Cancel
Save