diff --git a/npc/config/magic.txt b/npc/config/magic.txt index 58ceedccf68f7870a54022e42f1100974a62bf58..d59f1d0b870ca79a47dbf4d84a6f89f5d5ee6891 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 153e667503186e096aa1d55a90e5d2589f390bf7..b00ed850dc93f022694d2ec43ba3fdbb18cf6329 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