diff options
author | Test User <hax@andrewyu.org> | 2025-01-11 19:22:12 +0000 |
---|---|---|
committer | Jesusalva Jesusalva <jesusalva@tmw2.org> | 2025-01-11 19:22:12 +0000 |
commit | 9c8ea9348eca34eee8dfe97d2988b95abed1e936 (patch) | |
tree | 836791039cbea614bd6f80f36bf75680683bf3bf | |
parent | 2b9e56ddc00303129d1d1a54cc83509a631abbc5 (diff) | |
download | serverdata-9c8ea9348eca34eee8dfe97d2988b95abed1e936.tar.gz serverdata-9c8ea9348eca34eee8dfe97d2988b95abed1e936.tar.bz2 serverdata-9c8ea9348eca34eee8dfe97d2988b95abed1e936.tar.xz serverdata-9c8ea9348eca34eee8dfe97d2988b95abed1e936.zip |
Fix AoE magic credit
* Reoder functions so it works
* Adjust comments, make areaharm use rectharm
* Merge {area,rect}harm2 -> old ones
* And these, too
* Let's not fiddle with SCs yet for this fix, so it can be merged
* Add optional caster argument to areaharm2() and rectharm2() for future use
* Fix AoE magic credit, fix magic effects to be started after the harm so they aren't immediately removed
This patch was NOT checked for console warnings and errors.
This patch does NOT address Monster Points being reduced due to max_timer limitations.
****
Approved-by: Fedja Beader <fedja@protonmail.ch>
Reviewed-by: Jesusalva Jesusalva <jesusalva@tmw2.org>
-rw-r--r-- | npc/config/magic.txt | 50 | ||||
-rw-r--r-- | npc/functions/hub.txt | 32 |
2 files changed, 37 insertions, 45 deletions
diff --git a/npc/config/magic.txt b/npc/config/magic.txt index 58ceedccf..d59f1d0b8 100644 --- a/npc/config/magic.txt +++ b/npc/config/magic.txt @@ -151,37 +151,11 @@ function script SummonMagic { return; } -// areaharm(caster, range, DMG, {type, element, filter, bl}) + +// rectharm(target, x, y, DMG, {type, element, filter, bl, caster}) // Defaults to HARM_MISC, Ele_Neutral, filter filter_hostile and all BLs // Valid BL: BL_MOB | BL_PC | BL_HOM | BL_MER // Do not use: NPC, PET, ELEM -// Range centers on caster (player), implement and use areaharm2 elsewhere -function script areaharm { - .@t=getarg(0); - .@r=getarg(1); - .@d=getarg(2); - .@h=getarg(3, HARM_MISC); - .@e=getarg(4, Ele_Neutral); - .@f$=getarg(5, "filter_hostile"); - .@b=getarg(6, BL_PC | BL_MOB | BL_MER | BL_HOM); - - getmapxy(.@m$, .@x, .@y, getunittype(.@t), .@t); - - .@c=getunits(.@b, .@mbs, false, .@m$, .@x-.@r, .@y-.@r, .@x+.@r, .@y+.@r); - for (.@i = 0; .@i < .@c; .@i++) { - // Filtering - if (!callfunc(.@f$, .@mbs[.@i])) - continue; - harm(.@mbs[.@i], .@d, .@h, .@e, .@t); - specialeffect(FX_ATTACK, AREA, .@mbs[.@i]); - // TODO: Handle MobPt to don't overload timer system? - } - return; -} - - -// rectharm(caster, x, y, DMG, {type, element, filter, bl}) -// Same as areaharm() but causes a rectangle in (x,y) size, instead of a square function script rectharm { .@t=getarg(0); .@rx=getarg(1); @@ -191,6 +165,7 @@ function script rectharm { .@e=getarg(5, Ele_Neutral); .@f$=getarg(6, "filter_hostile"); .@b=getarg(7, BL_PC | BL_MOB | BL_MER | BL_HOM); + .@caster=getarg(8, .@t); getmapxy(.@m$, .@x, .@y, getunittype(.@t), .@t); @@ -199,7 +174,7 @@ function script rectharm { // Filtering if (!callfunc(.@f$, .@mbs[.@i])) continue; - harm(.@mbs[.@i], .@d, .@h, .@e, .@t); + harm(.@mbs[.@i], .@d, .@h, .@e, .@caster); specialeffect(FX_ATTACK, AREA, .@mbs[.@i]); // TODO: Handle MobPt to don't overload timer system? } @@ -207,6 +182,23 @@ function script rectharm { } +// areaharm(target, range, DMG, {type, element, filter, bl, caster}) +// Same as rectharm() but using a square instead of two lengths for a rectangle +function script areaharm { + .@t=getarg(0); + .@r=getarg(1); + .@d=getarg(2); + .@h=getarg(3, HARM_MISC); + .@e=getarg(4, Ele_Neutral); + .@f$=getarg(5, "filter_hostile"); + .@b=getarg(6, BL_PC | BL_MOB | BL_MER | BL_HOM); + .@caster=getarg(7, .@t); + + rectharm(.@t, .@r, .@r, .@d, .@h, .@e, .@f$, .@b, .@caster); + return; +} + + // mescordialog(text, color, {dialog=1}) function script mescordialog { if (getarg(2, true)) diff --git a/npc/functions/hub.txt b/npc/functions/hub.txt index 153e66750..b00ed850d 100644 --- a/npc/functions/hub.txt +++ b/npc/functions/hub.txt @@ -621,7 +621,7 @@ function script HUB_SkillInvoke { // Weapon Overload attack case TMW2_OVERLOAD: .@PW=200+(@skillLv > 3 ? @skillLv : 0)+(@skillLv > 7 ? @skillLv*2 : 0); - areaharm(@skillTarget, 0, AdjustAttackpower(.@PW), HARM_MISC); + areaharm(@skillTarget, 0, AdjustAttackpower(.@PW), HARM_MISC, @skillCaster); break; //////////////////////////////// // Magic v3 @@ -631,7 +631,7 @@ function script HUB_SkillInvoke { // And is a trick. Each level improves ratio in 1 // Has no cooldown, so it is powerful with pots // And is a good starter offensive skill - areaharm(@skillTarget, 0, Sp*@skillLv, HARM_MISC, Ele_Ghost); + areaharm(@skillTarget, 0, Sp*@skillLv, HARM_MISC, Ele_Ghost, @skillCaster); Sp=0; GetManaExp(@skillId, 1); break; @@ -662,7 +662,7 @@ function script HUB_SkillInvoke { // Area healing .@PW=200+(20*@skillLv); .@RG=4+(@skillLv/5); - areaharm(@skillTarget, .@RG, -AdjustSpellpower(.@PW), HARM_MISC, "filter_friendly"); + areaharm(@skillTarget, .@RG, -AdjustSpellpower(.@PW), HARM_MISC, "filter_friendly", @skillCaster); GetManaExp(TMW2_HEALING, 3); break; //////////////////////////////// @@ -685,7 +685,7 @@ function script HUB_SkillInvoke { .@RG=2+(@skillLv/5); // 22% chance, 2.5s sc_start SC_BLOODING, 2500, 1, 4200, SCFLAG_NONE, @skillTarget; - areaharm(@skillTarget, .@RG, AdjustSpellpower(.@PW), HARM_MAGI, Ele_Fire); + areaharm(@skillTarget, .@RG, AdjustSpellpower(.@PW), HARM_MAGI, Ele_Fire, @skillCaster); GetManaExp(TMW2_FIREBALL, 2); break; case TMW2_ARMAGEDDON: @@ -693,7 +693,7 @@ function script HUB_SkillInvoke { .@RG=5+(@skillLv/5); // 18% chance, 3s, 3x3 radius areasc(.@RG, 6000, SC_BLOODING, BL_MOB|BL_PC|BL_HOM|BL_MER, 1, "filter_hostile", @skillTarget, 1800); - areaharm(@skillTarget, .@RG, AdjustSpellpower(.@PW), HARM_MAGI, Ele_Fire); + areaharm(@skillTarget, .@RG, AdjustSpellpower(.@PW), HARM_MAGI, Ele_Fire, @skillCaster); GetManaExp(TMW2_FIREBALL, 3); break; //////////////////////////////// @@ -703,14 +703,14 @@ function script HUB_SkillInvoke { .@PW=35+(5*@skillLv); .@dmg=AdjustSpellpower(.@PW); .@RG=2+(@skillLv/3); - areaharm(@skillTarget, .@RG, .@dmg, HARM_MAGI, Ele_Holy); + areaharm(@skillTarget, .@RG, .@dmg, HARM_MAGI, Ele_Holy, @skillCaster); harm(@skillTarget, .@dmg/10, HARM_MAGI, Ele_Holy); GetManaExp(TMW2_HOLYLIGHT, 1); break; case TMW2_HOLYLIGHT: .@PW=125+(25*@skillLv); .@dmg=AdjustSpellpower(.@PW); - areaharm(@skillTarget, 1, .@dmg/5, HARM_MAGI, Ele_Holy); + areaharm(@skillTarget, 1, .@dmg/5, HARM_MAGI, Ele_Holy, @skillCaster); harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Holy); GetManaExp(TMW2_HOLYLIGHT, 2); break; @@ -720,7 +720,7 @@ function script HUB_SkillInvoke { .@dmg=AdjustSpellpower(.@PW); .@dsub=AdjustSpellpower(.@SPW); .@RG=3+(@skillLv/5); - areaharm(@skillTarget, .@RG, .@dsub, HARM_MAGI, Ele_Holy); + areaharm(@skillTarget, .@RG, .@dsub, HARM_MAGI, Ele_Holy, @skillCaster); harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Holy); GetManaExp(TMW2_HOLYLIGHT, 3); break; @@ -743,7 +743,7 @@ function script HUB_SkillInvoke { .@PW=125+(25*@skillLv); .@dmg=AdjustSpellpower(.@PW); .@RG=2+(@skillLv/5); - areaharm(@skillTarget, .@RG, .@dmg, HARM_MAGI, Ele_Wind); + areaharm(@skillTarget, .@RG, .@dmg, HARM_MAGI, Ele_Wind, @skillCaster); GetManaExp(TMW2_LIGHTNINGBOLT, 3); break; //////////////////////////////// @@ -761,7 +761,7 @@ function script HUB_SkillInvoke { .@RG=2+(@skillLv/5); // 18% chance, 3s, 3x3 radius areasc(.@RG, 3000, SC_FREEZE, BL_MOB|BL_PC|BL_HOM|BL_MER, 1, "filter_hostile", @skillTarget, 1800); - areaharm(@skillTarget, .@RG, AdjustSpellpower(.@PW), HARM_MAGI, Ele_Water); + areaharm(@skillTarget, .@RG, AdjustSpellpower(.@PW), HARM_MAGI, Ele_Water, @skillCaster); GetManaExp(TMW2_NILFHEIM, 2); break; case TMW2_NILFHEIM: @@ -769,7 +769,7 @@ function script HUB_SkillInvoke { .@PW=80+(10*@skillLv); .@RG=4+(@skillLv/5); areasc(.@RG, 15000, SC_FREEZE, BL_PC | BL_MOB | BL_MER | BL_HOM, 1, "filter_hostile"); - areaharm(getcharid(3), .@RG*3/2, AdjustSpellpower(.@PW), HARM_MAGI, Ele_Water); + areaharm(getcharid(3), .@RG*3/2, AdjustSpellpower(.@PW), HARM_MAGI, Ele_Water, @skillCaster); // Maybe filter_notme() would work better, indeed GetManaExp(TMW2_NILFHEIM, 3); break; @@ -790,7 +790,7 @@ function script HUB_SkillInvoke { .@RG=3+(@skillLv/5); .@TM=800+(@skillLv*200); areasc(.@RG, .@TM, SC_STUN, BL_MOB | BL_PC | BL_HOM | BL_MER, 1, "filter_hostile", @skillTarget, 800); - areaharm(@skillTarget, .@RG, .@dmg, HARM_MAGI, Ele_Earth); + areaharm(@skillTarget, .@RG, .@dmg, HARM_MAGI, Ele_Earth, @skillCaster); GetManaExp(TMW2_METEORSTRIKE, 2); break; case TMW2_GAIABREAK: @@ -799,7 +799,7 @@ function script HUB_SkillInvoke { .@dmg=AdjustSpellpower(.@PWA); .@dsub=AdjustSpellpower(.@PWB); areasc(2, 5000, SC_INCDEFRATE, BL_PC, 10, "filter_friendly"); - rectharm(@skillTarget, 2, 5, .@dsub, HARM_MAGI, Ele_Earth); + rectharm(@skillTarget, 2, 5, .@dsub, HARM_MAGI, Ele_Earth, @skillCaster); harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Earth); GetManaExp(TMW2_METEORSTRIKE, 3); break; @@ -988,7 +988,7 @@ function script HUB_SkillInvoke { .@ST=500+(100*@skillLv); .@EF=any(SC_STUN, SC_BLIND, SC_BLOODING, SC_BLIND, SC_BLOODING); areasc(.@RG, .@TM, .@EF, BL_MOB | BL_PC | BL_HOM | BL_MER, 1, "filter_hostile", @skillTarget, .@ST); - areaharm(@skillTarget, .@RG, .@dmg, HARM_PHYS, Ele_Neutral); + areaharm(@skillTarget, .@RG, .@dmg, HARM_PHYS, Ele_Neutral, @skillCaster); GetManaExp(@skillId, rand2(1,3)); break; case TMW2_SUPREMEATTACK: @@ -1007,7 +1007,7 @@ function script HUB_SkillInvoke { .@PW=150+(10*@skillLv); .@dmg=AdjustAttackpower(.@PW); .@RG=1+(@skillLv/3); - areaharm(@skillTarget, .@RG, .@dmg, HARM_PHYS, Ele_Neutral); + areaharm(@skillTarget, .@RG, .@dmg, HARM_PHYS, Ele_Neutral, @skillCaster); GetManaExp(@skillId, rand2(1,3)); break; //////////////////////////////// @@ -1063,7 +1063,7 @@ function script HUB_SkillInvoke { sleep2(10); // The main elemental-less blast hits all in same square, // and also hits behind (and on your square) - rectharm(@skillTarget, 0, 1, AdjustAttackpower(.@PW/2), HARM_PHYS, Ele_Neutral); // FIXME: May not fire (properly) if target dies + rectharm(@skillTarget, 0, 1, AdjustAttackpower(.@PW/2), HARM_PHYS, Ele_Neutral, @skillCaster); // FIXME: May not fire (properly) if target dies break; case TMW2_STUNNINGSTRIKE: // 70x3 = 210 |