summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHoraK-FDF <horak-fdf@web.de>2024-02-07 17:05:33 +0100
committerHoraK-FDF <horak-fdf@web.de>2024-02-07 17:05:33 +0100
commitc3b7fe59af3b7b160b6ce1004f205abb6748025c (patch)
tree07d055b67568bc1bef16a924a881746d96c2a197
parent529e83db25e8844844a937321aeb42380b25e672 (diff)
downloadserverdata-c3b7fe59af3b7b160b6ce1004f205abb6748025c.tar.gz
serverdata-c3b7fe59af3b7b160b6ce1004f205abb6748025c.tar.bz2
serverdata-c3b7fe59af3b7b160b6ce1004f205abb6748025c.tar.xz
serverdata-c3b7fe59af3b7b160b6ce1004f205abb6748025c.zip
upmarmu v4
-rw-r--r--world/map/npc/functions/global_event_handler.txt1
-rw-r--r--world/map/npc/magic/level2-magic-knuckles.txt61
2 files changed, 44 insertions, 18 deletions
diff --git a/world/map/npc/functions/global_event_handler.txt b/world/map/npc/functions/global_event_handler.txt
index eba97ab2..d71a08a6 100644
--- a/world/map/npc/functions/global_event_handler.txt
+++ b/world/map/npc/functions/global_event_handler.txt
@@ -44,6 +44,7 @@ OnPCDieEvent:
end;
OnPCLogoutEvent:
+ if (getnpcid("#Upmarmu#" + getcharid(3)) >= 1) addnpctimer 0, "#Upmarmu#" + getcharid(3) + "::OnDestroy"; // @upmarmu_spell_npc_name$ is already lost at this point so it must be done like this
callfunc "VaultLogout";
end;
diff --git a/world/map/npc/magic/level2-magic-knuckles.txt b/world/map/npc/magic/level2-magic-knuckles.txt
index 78500e17..b4a85b69 100644
--- a/world/map/npc/magic/level2-magic-knuckles.txt
+++ b/world/map/npc/magic/level2-magic-knuckles.txt
@@ -1,6 +1,16 @@
-|script|magic-knuckles|32767
{
if @_U_BLOCK >= 1 goto L_Still_Exhausted;
+ set @upmarmu_spell_npc_name$, "#Upmarmu#" + getcharid(3); // make a unique puppet name for every player
+ set .upmarmu_spell_npc, getnpcid(@upmarmu_spell_npc_name$);
+ if ( .upmarmu_spell_npc >= 1 ) goto L_NPC_Exists; // if this npc already exist reuse it so that idle recovery timer does not get destroyed
+
+ set .upmarmu_spell_npc, puppet(getmap(), 0, 0, @upmarmu_spell_npc_name$, 127); // clone npc => get puppet id (npc 127 is invisible and can't be targeted)
+ if (.upmarmu_spell_npc < 1) end;
+ set .caster, getcharid(3), .upmarmu_spell_npc; // tell the puppet who controls it
+ goto L_NPC_Exists;
+
+L_NPC_Exists:
if (call("magic_checks")) end;
if (Sp < 20) end;
if (getskilllv(SKILL_MAGIC) < .level) end;
@@ -16,14 +26,15 @@
set Sp, Sp - 20;
set CASTS, CASTS + 1;
if (CASTS < 0) set CASTS, 1; // overflow
- set .caster, getcharid(3);
+
misceffect FX_MAGIC_KNUCKLE_CAST, strcharinfo(0);
setarray @upmarmuspell[0],
- max(1, (BASE_ATK - 100 + min(100, (Int+Int2))) * 2 ), // dmg
- ((@spellpower/10) + (((Dex+Dex2) * 8)/(sqrt(BaseLevel + 34)) + 20)), // charges (you get more at lower levels)
- ((sqrt((300 - ((Agi+Agi2) * 2)) + (5/2))) * 4), // delay
- (((Agi+Agi2) + (Int+Int2)) / 5), // dmg bonus
+ max(1, BASE_ATK + (@spellpower / 6)), // dmg
+ ((@spellpower/12) + (((Dex+Dex2) * 8)/(sqrt(BaseLevel + 34)) + 20)), // charges (you get more at lower levels)
+ ((sqrt((300 - ((Agi+Agi2) * 2)) - (10/2))) * 3), // delay
+ (((Str+Str2) + (Dex+Dex2)) / 5), // dmg bonus
(((BaseLevel/5) + Str) * 2); // do not allow to equip light armor, cast, and then switch to heavy armor to get bonus str
+
callfunc "magic_exp";
goto L_FreeRecast;
@@ -32,19 +43,12 @@ OnAttack:
if (target(BL_ID, @target_id, 22) != 22) goto L_FreeRecast; // 0x10 | 0x02 | 0x04
void call("elt_damage", @upmarmuspell[0], (@upmarmuspell[3] + @upmarmuspell[4]), ELT_WATER, ELT_FIRE, FX_NONE);
- // This timer is if you stopped somewhere below max hits then after 25sec you recover fully and start at 0 hits again
- stopnpctimer;
- // to get this work stoptimer must be executed here or after setnpctimer and then started again else
- // a timer somehow detaches that cant be set anymore, startnpctimer then attaches it again somehow
- // i think the problem is in npc_timerevent_calc_next somewhere
- if (@num_upmarmu_hits < 1) initnpctimer;
- setnpctimer 0;
- startnpctimer;
+ addtimer 0, @upmarmu_spell_npc_name$ + "::OnResetTimer";
set @upmarmuspell[1], @upmarmuspell[1] - 1;
set @num_upmarmu_hits, @num_upmarmu_hits + 1;
- if @num_upmarmu_hits > UPMARMU_HITS_TILL_EXHAUST goto L_Exhausted;
+ if @num_upmarmu_hits >= UPMARMU_HITS_TILL_EXHAUST goto L_Exhausted;
goto L_FreeRecast;
L_FreeRecast:
@@ -67,8 +71,7 @@ L_Still_Exhausted:
end;
L_StopTimer:
- stopnpctimer;
- setnpctimer 0;
+ addtimer 0, @upmarmu_spell_npc_name$ + "::OnStopTimer";
end;
OnDischarge:
@@ -76,17 +79,39 @@ OnDischarge:
set @upmarmuspell[1], 0;
misceffect FX_MAGIC_DISCHARGE, strcharinfo(0);
overrideattack;
- goto L_StopTimer;
+ end;
OnSetRecast:
overrideattack (@upmarmuspell[2] * @upmarmuspell[2]), 1, ATTACK_ICON_GENERIC, OVERRIDE_KNUCKLES, strnpcinfo(0)+"::OnAttack", @upmarmuspell[1]; // delay needs to be squared
end;
+OnResetTimer:
+ // This timer is if you stopped somewhere below max hits then after 25sec you recover fully and start at 0 hits again
+ stopnpctimer;
+ // to get this work stoptimer must be executed here or after setnpctimer and then started again else
+ // a timer somehow detaches that cant be set anymore, startnpctimer then attaches it again somehow
+ // i think the problem is in npc_timerevent_calc_next somewhere
+ if (@num_upmarmu_hits < 1) initnpctimer;
+ setnpctimer 0;
+ startnpctimer;
+ end;
+
+OnStopTimer:
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
OnTimer25000:
if (attachrid(.caster) < 1) end;
set @num_upmarmu_hits, 0;
detachrid;
- goto L_StopTimer;
+
+ stopnpctimer;
+ setnpctimer 0;
+ end;
+
+OnDestroy:
+ destroy;
OnInit:
set .school, SKILL_MAGIC_WAR;