summaryrefslogtreecommitdiff
path: root/src/map/script.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/script.c')
-rw-r--r--src/map/script.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/map/script.c b/src/map/script.c
index f09b24a5c..28cea9ed1 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -13655,6 +13655,80 @@ BUILDIN_FUNC(setfont)
return 0;
}
+static int buildin_mobuseskill_sub(struct block_list *bl,va_list ap)
+{
+ TBL_MOB* md = (TBL_MOB*)bl;
+ struct block_list *tbl;
+ int mobid = va_arg(ap,int);
+ int skillid = va_arg(ap,int);
+ int skilllv = va_arg(ap,int);
+ int casttime = va_arg(ap,int);
+ int cancel = va_arg(ap,bool);
+ int emotion = va_arg(ap,int);
+ int target = va_arg(ap,int);
+
+ if( md->class_ != mobid )
+ return 0;
+
+ if( md->ud.skilltimer != -1 ) // Cancel the casting skill.
+ unit_skillcastcancel(bl,0);
+
+ // 0:self, 1:target, 2:master, default:random
+ switch( target )
+ {
+ case 0: tbl = map_id2bl(md->bl.id); break;
+ case 1: tbl = map_id2bl(md->target_id); break;
+ case 2: tbl = map_id2bl(md->master_id); break;
+ default:tbl = battle_getenemy(&md->bl, DEFAULT_ENEMY_TYPE(md),skill_get_range2(&md->bl, skillid, skilllv)); break;
+ }
+
+ if( !tbl )
+ return 0;
+
+ if( skill_get_casttype(skillid) == CAST_GROUND )
+ unit_skilluse_pos2(&md->bl, tbl->x, tbl->y, skillid, skilllv, casttime, cancel);
+ else
+ unit_skilluse_id2(&md->bl, tbl->id, skillid, skilllv, casttime, cancel);
+
+ clif_emotion(&md->bl, emotion);
+
+ return 0;
+}
+/*==========================================
+ * areamobuseskill "Map Name",<x1>,<y1>,<x2>,<y2>,<Mob ID>,"Skill Name"/<Skill ID>,<Skill Lv>,<Cast Time>,<Cancelable>,<Emotion>,<Target Type>;
+ *------------------------------------------*/
+BUILDIN_FUNC(areamobuseskill)
+{
+ int m,x1,y1,x2,y2,mobid,skillid,skilllv,casttime,emotion,target;
+ bool cancel;
+
+ if( m = map_mapname2mapid(script_getstr(st,2)) < 0 )
+ {
+ ShowError("areamobuseskill: invalid map name.\n");
+ return 0;
+ }
+
+ skillid = ( script_isstring(st,8) ? skill_name2id(script_getstr(st,8)) : script_getnum(st,8) );
+
+ skilllv = script_getnum(st,9);
+ if( skilllv > battle_config.mob_max_skilllvl )
+ skilllv = battle_config.mob_max_skilllvl;
+
+ x1 = script_getnum(st,3);
+ y1 = script_getnum(st,4);
+ x2 = script_getnum(st,5);
+ y2 = script_getnum(st,6);
+
+ mobid = script_getnum(st,7);
+ casttime = script_getnum(st,10);
+ cancel = script_getnum(st,11);
+ emotion = script_getnum(st,12);
+ target = script_getnum(st,13);
+
+ map_foreachinarea(buildin_mobuseskill_sub, m, x1, y1, x2, y2, BL_MOB, mobid,skillid,skilllv,casttime,cancel,emotion,target);
+ return 0;
+}
+
// declarations that were supposed to be exported from npc_chat.c
#ifdef PCRE_SUPPORT
BUILDIN_FUNC(defpattern);
@@ -14014,6 +14088,7 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(mercenary_set_faith,"ii"),
BUILDIN_DEF(readbook,"ii"),
BUILDIN_DEF(setfont,"i"),
+ BUILDIN_DEF(areamobuseskill,"siiiiiviiiii"),
// WoE SE
BUILDIN_DEF(agitstart2,""),
BUILDIN_DEF(agitend2,""),