summaryrefslogtreecommitdiff
path: root/world/map
diff options
context:
space:
mode:
Diffstat (limited to 'world/map')
-rw-r--r--world/map/npc/magic/level1-detect-magic.txt31
1 files changed, 31 insertions, 0 deletions
diff --git a/world/map/npc/magic/level1-detect-magic.txt b/world/map/npc/magic/level1-detect-magic.txt
index 33597d02..7936fa99 100644
--- a/world/map/npc/magic/level1-detect-magic.txt
+++ b/world/map/npc/magic/level1-detect-magic.txt
@@ -12,6 +12,9 @@
if (CASTS < 0) set CASTS, 1; // overflow
misceffect FX_MAGIC_DETECT_CAST, strcharinfo(0);
set .@range, (@spellpower/50)+1;
+ set .caster, getcharid(3);
+ foreach 0, getmap(), POS_X - .@range, POS_Y - .@range, POS_X + .@range, POS_Y + .@range,
+ strnpcinfo(0) + "::OnNearbyPlayer";
foreach 1, getmap(), POS_X - .@range, POS_Y - .@range, POS_X + .@range, POS_Y + .@range,
strnpcinfo(0) + "::OnNearbyNpc";
if (getmap() == "099-4")
@@ -21,6 +24,14 @@
callfunc "magic_exp";
end;
+OnNearbyPlayer:
+ if (@target_id == BL_ID) end; // Dont do lookups on caster.
+ if (sc_check(SC_HIDE, @target_id)) end; // Also skip hidden (anwiltyp) players.
+ if (attachrid(@target_id) < 1) end; // Switch context -> found player (to look up focused skills)
+ if (call("is_magician")) misceffect FX_MAGIC_DETECT_HIT, BL_ID; // BL_ID because now attached to target
+ if (attachrid(.caster) < 1) end; // Try to reattach back -> caster (is it needed?)
+ end;
+
OnNearbyNpc:
set .@e$, strnpcinfo(2,@target_id);
if(.@e$ == "#_M" || .@e$ == "#MAGIC" || get(.IS_MAGIC, @target_id))
@@ -35,3 +46,23 @@ OnInit:
set .exp_gain, 0;
end;
}
+
+// This function tests if current RID is a magician (Astral soul skill Lv 9).
+function|script|is_magician
+{
+ getactivatedpoolskilllist;
+ if (@skilllist_count != 0) goto L_iterate_focused; // Had some focused skills -> look further
+ goto L_focus_notfound; // No focused skills at all -> bail out.
+
+L_iterate_focused:
+ set @skilllist_count, @skilllist_count-1;
+ if ((@skilllist_id[@skilllist_count] == SKILL_ASTRAL_SOUL) && (getskilllv(SKILL_ASTRAL_SOUL) >= 2)) goto L_focus_found;
+ if (@skilllist_count == 0) goto L_focus_notfound;
+ goto L_iterate_focused; // iterate via array of focused skills.
+
+L_focus_found:
+ return 1;
+
+L_focus_notfound:
+ return 0;
+}