summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFedja Beader <fedja@protonmail.ch>2025-03-25 00:45:46 +0000
committerJesusalva Jesusalva <jesusalva@tmw2.org>2025-03-25 00:45:46 +0000
commit1015f04948cd46de6a9e95a16e87b7a527a5dcad (patch)
tree73dacd88b65a5502bdc63cf2b4fc4037cb13a123
parent16bd3c94fcea9a8c5a2cab817c35cc34ac5d8792 (diff)
downloadserverdata-1015f04948cd46de6a9e95a16e87b7a527a5dcad.tar.gz
serverdata-1015f04948cd46de6a9e95a16e87b7a527a5dcad.tar.bz2
serverdata-1015f04948cd46de6a9e95a16e87b7a527a5dcad.tar.xz
serverdata-1015f04948cd46de6a9e95a16e87b7a527a5dcad.zip
Fix harm() credit
Note: there are two harm() calls in `npc/config/traps`, but I don't know if NPCs can be the source of damage? And, if so, what to pass as damage source. Maybe npcinfo(0)? + made parlor code a tiny bit more readable + fixed Healing's broken debuff * Apply fix suggested by jes * Fix harm() credit **** ml/serverdata!181 Reviewed-by: Jesusalva Jesusalva <jesusalva@tmw2.org>
-rw-r--r--npc/006-7/ctrl.txt2
-rw-r--r--npc/026-7/boss.txt4
-rw-r--r--npc/042-11/boss.txt4
-rw-r--r--npc/functions/hub.txt84
4 files changed, 50 insertions, 44 deletions
diff --git a/npc/006-7/ctrl.txt b/npc/006-7/ctrl.txt
index d82f11bf7..5bc441814 100644
--- a/npc/006-7/ctrl.txt
+++ b/npc/006-7/ctrl.txt
@@ -205,7 +205,7 @@ OnTimer5000:
.@dsb = .@mtk * .@SPW / 100;
sleep(1000);
squareharm(.@mvp, .@RG, .@dsb, HARM_MAGI, Ele_Holy, .BOSS);
- harm(.@mvp, .@dmg, HARM_MAGI, Ele_Holy);
+ harm(.@mvp, .@dmg, HARM_MAGI, Ele_Holy, .BOSS);
break;
// (3/6) Random Target (~60s)
case 2:
diff --git a/npc/026-7/boss.txt b/npc/026-7/boss.txt
index 7398611f1..a0ee45faf 100644
--- a/npc/026-7/boss.txt
+++ b/npc/026-7/boss.txt
@@ -474,7 +474,7 @@ OnTimer10000:
sleep(1000);
specialeffect(FX_LIGHTNING, AREA, .@mvp);
squareharm(.@mvp, .@RG, .@dsb, HARM_MAGI, Ele_Wind, .@mob);
- harm(.@mvp, .@dmg, HARM_MAGI, Ele_Holy);
+ harm(.@mvp, .@dmg, HARM_MAGI, Ele_Holy, .@mob);
break;
case 18:
.@msg$ = sprintf("Come forth, my minions! Wreak chaos and havoc!");
@@ -509,7 +509,7 @@ OnTimer10000:
sleep(1000);
specialeffect(FX_LIGHTNING, AREA, .@mvp);
squareharm(.@mvp, .@RG, .@dsb, HARM_MAGI, Ele_Wind, .@mob);
- harm(.@mvp, .@dmg, HARM_MAGI, Ele_Holy);
+ harm(.@mvp, .@dmg, HARM_MAGI, Ele_Holy, .@mob);
break;
case 21:
.@msg$ = sprintf("##BMagic: Armageddon");
diff --git a/npc/042-11/boss.txt b/npc/042-11/boss.txt
index d79a7951f..9e3afc070 100644
--- a/npc/042-11/boss.txt
+++ b/npc/042-11/boss.txt
@@ -233,7 +233,7 @@ OnTimer5000:
sleep(1000);
specialeffect(FX_LIGHTNING, AREA, .@mvp);
squareharm(.@mvp, .@RG, .@dsb, HARM_MAGI, Ele_Wind, .@mob);
- harm(.@mvp, .@dmg, HARM_MAGI, Ele_Holy);
+ harm(.@mvp, .@dmg, HARM_MAGI, Ele_Holy, .@mob);
break;
default:
// First Attack Pattern: Napalm Beat (vs Random)
@@ -245,7 +245,7 @@ OnTimer5000:
sleep(1000);
specialeffect(FX_LIGHTNING, AREA, .@rnd);
squareharm(.@rnd, .@RG, .@dsb, HARM_MAGI, Ele_Wind, .@mob);
- harm(.@rnd, .@dmg, HARM_MAGI, Ele_Holy);
+ harm(.@rnd, .@dmg, HARM_MAGI, Ele_Holy, .@mob);
break;
}
unittalk(.@mob, .@msg$);
diff --git a/npc/functions/hub.txt b/npc/functions/hub.txt
index 18be56672..5db919aa1 100644
--- a/npc/functions/hub.txt
+++ b/npc/functions/hub.txt
@@ -671,10 +671,11 @@ function script HUB_SkillInvoke {
break;
case TMW2_HEALING:
.@PW=130+(20*@skillLv);
+ .@heal = -AdjustSpellpower(.@PW);
// Penalty if you have HALT_REGEN on and trying to self heal
if (getstatus(SC_HALT_REGENERATION) && @skillTarget == getcharid(3))
.@heal /= 3;
- harm(@skillTarget, -AdjustSpellpower(.@PW), HARM_MISC);
+ harm(@skillTarget, .@heal, HARM_MISC, Ele_Neutral, @skillCaster);
GetManaExp(TMW2_HEALING, 2);
break;
case TMW2_MAGNUSHEAL:
@@ -698,7 +699,7 @@ function script HUB_SkillInvoke {
.@PW=140+(10*@skillLv);
// 4% chance, 2.5s
sc_start SC_BLOODING, 4500, 1, 400, SCFLAG_NONE, @skillTarget;
- harm(@skillTarget, AdjustSpellpower(.@PW), HARM_MAGI, Ele_Fire);
+ harm(@skillTarget, AdjustSpellpower(.@PW), HARM_MAGI, Ele_Fire, @skillCaster);
GetManaExp(TMW2_FIREBALL, 1);
break;
case TMW2_FIREBALL:
@@ -725,14 +726,14 @@ function script HUB_SkillInvoke {
.@dmg=AdjustSpellpower(.@PW);
.@RG=2+(@skillLv/3);
squareharm(@skillTarget, .@RG, .@dmg, HARM_MAGI, Ele_Holy, @skillCaster);
- harm(@skillTarget, .@dmg/10, HARM_MAGI, Ele_Holy);
+ harm(@skillTarget, .@dmg/10, HARM_MAGI, Ele_Holy, @skillCaster);
GetManaExp(TMW2_HOLYLIGHT, 1);
break;
case TMW2_HOLYLIGHT:
.@PW=125+(25*@skillLv);
.@dmg=AdjustSpellpower(.@PW);
squareharm(@skillTarget, 1, .@dmg/5, HARM_MAGI, Ele_Holy, @skillCaster);
- harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Holy);
+ harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Holy, @skillCaster);
GetManaExp(TMW2_HOLYLIGHT, 2);
break;
case TMW2_JUDGMENT:
@@ -742,7 +743,7 @@ function script HUB_SkillInvoke {
.@dsub=AdjustSpellpower(.@SPW);
.@RG=3+(@skillLv/5);
squareharm(@skillTarget, .@RG, .@dsub, HARM_MAGI, Ele_Holy, @skillCaster);
- harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Holy);
+ harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Holy, @skillCaster);
GetManaExp(TMW2_HOLYLIGHT, 3);
break;
////////////////////////////////
@@ -751,13 +752,13 @@ function script HUB_SkillInvoke {
case TMW2_MAGICSTRIKE:
.@PW=125+(25*@skillLv);
.@dmg=AdjustSpellpower(.@PW);
- harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Wind);
+ harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Wind, @skillCaster);
GetManaExp(TMW2_LIGHTNINGBOLT, 1);
break;
case TMW2_LIGHTNINGBOLT:
.@PW=150+(50*@skillLv);
.@dmg=AdjustSpellpower(.@PW);
- harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Wind);
+ harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Wind, @skillCaster);
GetManaExp(TMW2_LIGHTNINGBOLT, 2);
break;
case TMW2_TEMPEST:
@@ -774,7 +775,7 @@ function script HUB_SkillInvoke {
.@PW=80+(10*@skillLv);
// 22% chance, 2.5s
sc_start SC_FREEZE, 2500, 1, 2200, SCFLAG_NONE, @skillTarget;
- harm(@skillTarget, AdjustSpellpower(.@PW), HARM_MAGI, Ele_Water);
+ harm(@skillTarget, AdjustSpellpower(.@PW), HARM_MAGI, Ele_Water, @skillCaster);
GetManaExp(TMW2_NILFHEIM, 1);
break;
case TMW2_FROSTNOVA:
@@ -802,7 +803,7 @@ function script HUB_SkillInvoke {
.@dmg=AdjustSpellpower(.@PW);
.@TM=1200+(@skillLv*300);
sc_start SC_STUN, .@TM, 1, 800, SCFLAG_NONE, @skillTarget;
- harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Earth);
+ harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Earth, @skillCaster);
GetManaExp(TMW2_METEORSTRIKE, 1);
break;
case TMW2_METEORSHOWER:
@@ -821,16 +822,21 @@ function script HUB_SkillInvoke {
.@dsub=AdjustSpellpower(.@PWB);
areasc(2, 5000, SC_INCDEFRATE, BL_PC, 10, "filter_friendly");
rectharm(@skillTarget, 2, 5, .@dsub, HARM_MAGI, Ele_Earth, @skillCaster);
- harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Earth);
+ harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Earth, @skillCaster);
GetManaExp(TMW2_METEORSTRIKE, 3);
break;
////////////////////////////////
// XXX: Parlor Tricks
// (Pathetic skills)
case TMW2_PARLORTRICK:
- .@PW=(getmapmask(getmap()) & MASK_RAIN ? 30 : 0)+(20*@skillLv);
+ .@PW = 20*@skillLv;
+ // Rain bonus
+ if (playerattached()) {
+ if (getmapmask(getmap()) & MASK_RAIN)
+ .@PW += 30;
+ }
.@dmg=AdjustSpellpower(.@PW);
- harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Water);
+ harm(@skillTarget, .@dmg, HARM_MAGI, Ele_Water, @skillCaster);
//No Mana EXP
break;
/*
@@ -935,7 +941,7 @@ function script HUB_SkillInvoke {
.@PW=100;
.@PW+=(5*@skillLv);
@SCombo=@skillTarget;
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
GetManaExp(@skillId, rand2(1,3));
break;
case TMW2_DIAGONALSLASH:
@@ -947,7 +953,7 @@ function script HUB_SkillInvoke {
if (@SCombo != @skillTarget)
.@PW=100;
.@PW+=(5*@skillLv);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
GetManaExp(@skillId, rand2(1,3));
break;
case TMW2_VERTICALSLASH:
@@ -961,7 +967,7 @@ function script HUB_SkillInvoke {
if (@SCombo != @skillTarget)
.@PW=100;
.@PW+=(5*@skillLv);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
GetManaExp(@skillId, rand2(1,3));
break;
case TMW2_STAB:
@@ -977,7 +983,7 @@ function script HUB_SkillInvoke {
if (@SCombo != @skillTarget)
.@PW=100;
.@PW+=(5*@skillLv);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
GetManaExp(@skillId, rand2(1,3));
break;
case TMW2_GRANDBLAST:
@@ -995,7 +1001,7 @@ function script HUB_SkillInvoke {
if (@SCombo != @skillTarget)
.@PW=100;
.@PW+=(5*@skillLv);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Holy);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Holy, @skillCaster);
GetManaExp(@skillId, rand2(2,3));
break;
@@ -1007,7 +1013,7 @@ function script HUB_SkillInvoke {
.@ST=0+(10*@skillLv);
.@TM=100+(90*@skillLv);
sc_start SC_STUN, .@TM, 1, .@ST, SCFLAG_NONE, @skillTarget;
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
GetManaExp(@skillId, rand2(1,3));
break;
case TMW2_GROUNDSTRIKE:
@@ -1023,14 +1029,14 @@ function script HUB_SkillInvoke {
break;
case TMW2_SUPREMEATTACK:
.@PW=100+(50*@skillLv);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
GetManaExp(@skillId, rand2(1,3));
break;
////////////////////////////////
// XXX: Physical Class (Archery)
case TMW2_CHARGEDARROW:
.@PW=100+(50*@skillLv);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
GetManaExp(@skillId, rand2(1,3));
break;
case TMW2_ARROWSHOWER:
@@ -1048,11 +1054,11 @@ function script HUB_SkillInvoke {
// Using a shield, so power is halved
if (getequipid(EQI_HAND_L) > 0)
.@PW=.@PW/2;
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
sleep2(10);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
sleep2(10);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
break;
case TMW2_BEARSTRIKE:
// 60x5 = 300
@@ -1060,15 +1066,15 @@ function script HUB_SkillInvoke {
// Using a shield, so power is halved
if (getequipid(EQI_HAND_L) > 0)
.@PW=.@PW/2;
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
sleep2(10);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
sleep2(10);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
sleep2(10);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
sleep2(10);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
break;
case TMW2_ALLINONE:
// 45x8 = 360
@@ -1076,20 +1082,20 @@ function script HUB_SkillInvoke {
// Using a shield, so power is halved
if (getequipid(EQI_HAND_L) > 0)
.@PW=.@PW/2;
- //harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Fire);
+ //harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Fire, @skillCaster);
sleep2(10);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Water);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Water, @skillCaster);
sleep2(10);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Earth);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Earth, @skillCaster);
sleep2(10);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Wind);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Wind, @skillCaster);
sleep2(10);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Holy);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Holy, @skillCaster);
sleep2(10);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Shadow);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Shadow, @skillCaster);
sleep2(10);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Ghost);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Ghost, @skillCaster);
sleep2(10);
// The main elemental-less blast hits all in same square,
// and also hits behind (and on your square)
@@ -1102,11 +1108,11 @@ function script HUB_SkillInvoke {
// Using a shield, so power is halved
if (getequipid(EQI_HAND_L) > 0)
.@PW=.@PW/2;
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
sleep2(10);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
sleep2(10);
- harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral);
+ harm(@skillTarget, AdjustAttackpower(.@PW), HARM_PHYS, Ele_Neutral, @skillCaster);
sc_start SC_STUN, .@TM, 1, 3333, SCFLAG_NONE, @skillTarget;
break;