summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTest User <hax@andrewyu.org>2025-01-11 19:22:12 +0000
committerJesusalva Jesusalva <jesusalva@tmw2.org>2025-01-11 19:22:12 +0000
commit9c8ea9348eca34eee8dfe97d2988b95abed1e936 (patch)
tree836791039cbea614bd6f80f36bf75680683bf3bf
parent2b9e56ddc00303129d1d1a54cc83509a631abbc5 (diff)
downloadserverdata-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.txt50
-rw-r--r--npc/functions/hub.txt32
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