浏览代码

Merged `getmapmobs` script function into `mobcount` (bugreport:244). See script commands documentation for details.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@15530 54d463be-8e91-2dee-dedb-b68131a5f0ec
gepard1984 13 年之前
父节点
当前提交
0709205ee8
共有 2 个文件被更改,包括 29 次插入61 次删除
  1. 11 15
      doc/script_commands.txt
  2. 18 46
      src/map/script.c

+ 11 - 15
doc/script_commands.txt

@@ -3087,15 +3087,6 @@ Example:
 
 ---------------------------------------
 
-*getmapmobs("<map name>")
-
-This function will return the total count of monsters currently located on the 
-specified map. If the map name is given as "this", the map the invoking 
-character is on will be used. If the map is not found, or the invoker is not a 
-character while the map is "this", it will return -1.
-
----------------------------------------
-
 *skillpointcount()
 
 Returns the total amount of skill points a character possesses (SkillPoint+SP's used in skills)
@@ -5012,14 +5003,19 @@ per 'db/mob_db.txt'. Type is the kind of information returned. Valid types are:
 
 This function will count all the monsters on the specified map that have a given 
 event label and return the number or 0 if it can't find any. Naturally, only 
-monsters spawned with 'monster' and 'areamonster' script commands can be like 
-this.
-
-However, apparently, if you pass this function an empty string for the event 
-label, it should return the total count of normal permanently respawning 
-monsters instead. With the current dynamic mobs system, where mobs are not kept 
+monsters spawned with 'monster' and 'areamonster' script commands can have non-empty 
+event label.
+If you pass this function an empty string for the event label, it will return 
+the total count of monster without event label, including permanently spawning monsters.
+With the dynamic mobs system enabled, where mobs are not kept 
 in memory for maps with no actual people playing on them, this will return a 0 
 for any such map.
+If the event label is given as "all", all monsters will be counted, regardless of
+having any event label attached.
+
+If the map name is given as "this", the map the invoking character is on will 
+be used. If the map is not found, or the invoker is not a character while the map 
+is "this", it will return -1.
 
 ---------------------------------------
 

+ 18 - 46
src/map/script.c

@@ -10489,7 +10489,7 @@ static int buildin_mobcount_sub(struct block_list *bl,va_list ap)	// Added by Ro
 {
 	char *event=va_arg(ap,char *);
 	struct mob_data *md = ((struct mob_data *)bl);
-	if(strcmp(event,md->npc_event)==0 && md->status.hp > 0)
+	if( md->status.hp > 0 && (!event || strcmp(event,md->npc_event) == 0) )
 		return 1;
 	return 0;
 }
@@ -10500,9 +10500,22 @@ BUILDIN_FUNC(mobcount)	// Added by RoVeRT
 	int m;
 	mapname=script_getstr(st,2);
 	event=script_getstr(st,3);
-	check_event(st, event);
 
-	if( (m = map_mapname2mapid(mapname)) < 0 ) {
+	if( strcmp(event, "all") == 0 )
+		event = NULL;
+	else
+		check_event(st, event);
+
+	if( strcmp(mapname, "this") == 0 ) {
+		struct map_session_data *sd = script_rid2sd(st);
+		if( sd )
+			m = sd->bl.m;
+		else {
+			script_pushint(st,-1);
+			return 0;
+		}
+	}
+	else if( (m = map_mapname2mapid(mapname)) < 0 ) {
 		script_pushint(st,-1);
 		return 0;
 	}
@@ -10517,6 +10530,7 @@ BUILDIN_FUNC(mobcount)	// Added by RoVeRT
 
 	return 0;
 }
+
 BUILDIN_FUNC(marriage)
 {
 	const char *partner=script_getstr(st,2);
@@ -11859,47 +11873,6 @@ BUILDIN_FUNC(jump_zero)
 	return 0;
 }
 
-/*==========================================
- * GetMapMobs
-	returns mob counts on a set map:
-	e.g. GetMapMobs("prontera")
-	use "this" - for player's map
- *------------------------------------------*/
-BUILDIN_FUNC(getmapmobs)
-{
-	const char *str=NULL;
-	int m=-1,bx,by;
-	int count=0;
-	struct block_list *bl;
-
-	str=script_getstr(st,2);
-
-	if(strcmp(str,"this")==0){
-		TBL_PC *sd=script_rid2sd(st);
-		if(sd)
-			m=sd->bl.m;
-		else{
-			script_pushint(st,-1);
-			return 0;
-		}
-	}else
-		m=map_mapname2mapid(str);
-
-	if(m < 0){
-		script_pushint(st,-1);
-		return 0;
-	}
-
-	for(by=0;by<=(map[m].ys-1)/BLOCK_SIZE;by++)
-		for(bx=0;bx<=(map[m].xs-1)/BLOCK_SIZE;bx++)
-			for( bl = map[m].block_mob[bx+by*map[m].bxs] ; bl != NULL ; bl = bl->next )
-				if(bl->x>=0 && bl->x<=map[m].xs-1 && bl->y>=0 && bl->y<=map[m].ys-1)
-					count++;
-
-	script_pushint(st,count);
-	return 0;
-}
-
 /*==========================================
  * movenpc [MouseJstr]
  *------------------------------------------*/
@@ -16236,8 +16209,7 @@ struct script_function buildin_func[] = {
 	BUILDIN_DEF(getmercinfo,"i?"),
 	BUILDIN_DEF(checkequipedcard,"i"),
 	BUILDIN_DEF(jump_zero,"il"), //for future jA script compatibility
-	BUILDIN_DEF(globalmes,"s?"),
-	BUILDIN_DEF(getmapmobs,"s"), //end jA addition
+	BUILDIN_DEF(globalmes,"s?"), //end jA addition
 	BUILDIN_DEF(unequip,"i"), // unequip command [Spectre]
 	BUILDIN_DEF(getstrlen,"s"), //strlen [Valaris]
 	BUILDIN_DEF(charisalpha,"si"), //isalpha [Valaris]