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