@@ -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) { | ||||
@@ -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); | ||||
}, | }, | ||||
@@ -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; | |||||
} | } | ||||
} | } | ||||
}; | }; |
@@ -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; | ||||
@@ -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; |
@@ -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; | ||||
}, | }, | ||||
@@ -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,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; | ||||
} | } | ||||
} | } | ||||
@@ -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' | |||||
}); | |||||
} | } | ||||
} | } | ||||
}; | }; |
@@ -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; | ||||
@@ -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; | ||||
}, | }, | ||||
@@ -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', { | ||||
@@ -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) | ||||
@@ -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' | |||||
}); | |||||
} | } | ||||
} | } | ||||
}; | }; |
@@ -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; | ||||
@@ -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; | ||||
@@ -10,8 +10,8 @@ module.exports = { | |||||
}, | }, | ||||
events: { | events: { | ||||
beforeTakeDamage: function (dmg, source) { | |||||
dmg.amount *= 4; | |||||
beforeTakeDamage: function ({ damage }) { | |||||
damage.amount *= 4; | |||||
} | } | ||||
} | } | ||||
}; | }; |
@@ -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) { | ||||
@@ -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' | |||||
}); | |||||
} | } | ||||
}; | }; |
@@ -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, | ||||
@@ -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; | ||||
@@ -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' | |||||
}); | |||||
} | } | ||||
}; | }; |
@@ -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' | |||||
}); | |||||
} | } | ||||
}; | }; |
@@ -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' | |||||
}); | |||||
} | } | ||||
}; | }; |
@@ -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' | |||||
}); | |||||
} | } | ||||
}; | }; |
@@ -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' | |||||
}); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -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', | ||||
@@ -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) { | ||||
@@ -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) { | ||||
@@ -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' | |||||
}); | |||||
} | } | ||||
} | } | ||||
}; | }; |
@@ -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) => { | ||||
@@ -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: { | ||||
@@ -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) { | ||||
@@ -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 }; | ||||
@@ -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({ | ||||