Преглед на файлове

- Re-committed r16971/trunk/src/ (tid:74924).

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@16994 54d463be-8e91-2dee-dedb-b68131a5f0ec
momacabu преди 12 години
родител
ревизия
fa9879ca5d
променени са 2 файла, в които са добавени 64 реда и са изтрити 6 реда
  1. 22 5
      src/map/atcommand.c
  2. 42 1
      src/map/script.c

+ 22 - 5
src/map/atcommand.c

@@ -6148,8 +6148,9 @@ ACMD_FUNC(mobsearch)
 
 /*==========================================
  * @cleanmap - cleans items on the ground
+ * @cleanarea - cleans items on the ground within an specified area
  *------------------------------------------*/
-static int atcommand_cleanmap_sub(struct block_list *bl, va_list ap)
+static int atcommand_cleanfloor_sub(struct block_list *bl, va_list ap)
 {
 	nullpo_ret(bl);
 	map_clearflooritem(bl);
@@ -6159,10 +6160,25 @@ static int atcommand_cleanmap_sub(struct block_list *bl, va_list ap)
 
 ACMD_FUNC(cleanmap)
 {
-	map_foreachinarea(atcommand_cleanmap_sub, sd->bl.m,
-		sd->bl.x-AREA_SIZE*2, sd->bl.y-AREA_SIZE*2,
-		sd->bl.x+AREA_SIZE*2, sd->bl.y+AREA_SIZE*2,
-		BL_ITEM);
+	map_foreachinmap(atcommand_cleanfloor_sub, sd->bl.m, BL_ITEM);
+	clif_displaymessage(fd, msg_txt(1221)); // All dropped items have been cleaned up.
+	return 0;
+}
+
+ACMD_FUNC(cleanarea)
+{
+	int x0 = 0, y0 = 0, x1 = 0, y1 = 0;
+
+	if (!message || !*message || sscanf(message, "%d %d %d %d", &x0, &y0, &x1, &y1) < 1) {
+		map_foreachinarea(atcommand_cleanfloor_sub, sd->bl.m, sd->bl.x - (AREA_SIZE * 2), sd->bl.y - (AREA_SIZE * 2), sd->bl.x + (AREA_SIZE * 2), sd->bl.y + (AREA_SIZE * 2), BL_ITEM);
+	}
+	else if (sscanf(message, "%d %d %d %d", &x0, &y0, &x1, &y1) == 1) {
+		map_foreachinarea(atcommand_cleanfloor_sub, sd->bl.m, sd->bl.x - x0, sd->bl.y - x0, sd->bl.x + x0, sd->bl.y + x0, BL_ITEM);
+	}
+	else if (sscanf(message, "%d %d %d %d", &x0, &y0, &x1, &y1) == 4) {
+		map_foreachinarea(atcommand_cleanfloor_sub, sd->bl.m, x0, y0, x1, y1, BL_ITEM);
+	}
+
 	clif_displaymessage(fd, msg_txt(1221)); // All dropped items have been cleaned up.
 	return 0;
 }
@@ -8977,6 +8993,7 @@ void atcommand_basecommands(void) {
 		ACMD_DEF(misceffect),
 		ACMD_DEF(mobsearch),
 		ACMD_DEF(cleanmap),
+		ACMD_DEF(cleanarea),
 		ACMD_DEF(npctalk),
 		ACMD_DEF(pettalk),
 		ACMD_DEF(users),

+ 42 - 1
src/map/script.c

@@ -14135,7 +14135,7 @@ BUILDIN_FUNC(strpos) {
 	else
 		i = 0;
 
-	if ( strlen(needle) == 0 ) {
+	if (needle[0] == '\0') {
 		script_pushint(st, -1);
 		return 0;
 	}
@@ -17227,6 +17227,45 @@ BUILDIN_FUNC(getrandgroupitem) {
 	return 0;
 }
 
+/* cleanmap <map_name>;
+ * cleanfloor <map_name, <x0>, <y0>, <x1>, <y1>; */
+static int atcommand_cleanfloor_sub(struct block_list *bl, va_list ap)
+{
+	nullpo_ret(bl);
+	map_clearflooritem(bl);
+
+	return 0;
+}
+
+BUILDIN_FUNC(cleanmap)
+{
+	const char *map;
+	int m, index;
+	short x0, y0, x1, y1;
+
+	map = script_getstr(st, 2);
+	index = mapindex_name2id(map);
+	if (index)
+		m = map_mapindex2mapid(index);
+	
+	if ((script_lastdata(st) - 2) < 4) {
+		map_foreachinmap(atcommand_cleanfloor_sub, m, BL_ITEM);
+	} else {
+		x0 = script_getnum(st, 3);
+				y0 = script_getnum(st, 4);
+				x1 = script_getnum(st, 5);
+				y1 = script_getnum(st, 6);
+		if (x0 > 0 && y0 > 0 && x1 > 0 && y1 > 0) {
+			map_foreachinarea(atcommand_cleanfloor_sub, m, x0, y0, x1, y1, BL_ITEM);
+		} else {
+			ShowError("cleanarea: invalid coordinate defined!\n");
+			return 1;
+		}
+	}
+	
+	return 0;
+}
+
 
 // declarations that were supposed to be exported from npc_chat.c
 #ifdef PCRE_SUPPORT
@@ -17668,6 +17707,8 @@ struct script_function buildin_func[] = {
 	BUILDIN_DEF(get_revision,""),
 	BUILDIN_DEF(freeloop,"i"),
 	BUILDIN_DEF(getrandgroupitem, "ii"),
+	BUILDIN_DEF(cleanmap, "s"),
+	BUILDIN_DEF2(cleanmap, "cleanarea", "siiii"),
 	/**
 	 * @commands (script based)
 	 **/