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 () {
this.obj.stats.takeDamage({
amount: 20000000
}, 1, this.obj);
damage: { amount: 20000000 },
source: this.obj,
target: this.obj
});
},

setPassword: async function (config) {


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

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

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



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

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

events: {
beforeTakeDamage: function (msg) {
beforeTakeDamage: function ({ damage }) {
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
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;


+ 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;
},

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


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

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


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

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


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

@@ -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'
});
}
}
};

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

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



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

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

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


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

@@ -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', {


+ 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`;
},

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)


+ 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`;
},

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'
});
}
}
};

+ 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`;
},

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;


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

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

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



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

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

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();

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) {


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

@@ -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'
});
}
};

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

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


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

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


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

@@ -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'
});
}
};

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

@@ -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'
});
}
};

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

@@ -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'
});
}
};

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

@@ -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'
});
}
};

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

@@ -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'
});
}
}
}


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

@@ -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',


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

@@ -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) {


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

@@ -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) {


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

@@ -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'
});
}
}
};

+ 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]]
];

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) => {


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

@@ -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: {


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

@@ -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) {


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

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


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

@@ -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({


Loading…
Cancel
Save