From c3b7fe59af3b7b160b6ce1004f205abb6748025c Mon Sep 17 00:00:00 2001 From: HoraK-FDF Date: Wed, 7 Feb 2024 17:05:33 +0100 Subject: upmarmu v4 --- world/map/npc/functions/global_event_handler.txt | 1 + world/map/npc/magic/level2-magic-knuckles.txt | 61 +++++++++++++++++------- 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; -- cgit v1.2.3-60-g2f50