Explorar el Código

* Added missing command #delitem.
* Fixed charcommand behavior where those that can accept a name with no additional parameters
being able to execute under said player's name with the name as a parameter.(bugreport:2601)

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@13420 54d463be-8e91-2dee-dedb-b68131a5f0ec

sketchyphoenix hace 16 años
padre
commit
590bdb332d
Se han modificado 3 ficheros con 90 adiciones y 10 borrados
  1. 4 0
      Changelog-Trunk.txt
  2. 3 0
      conf/atcommand_athena.conf
  3. 83 10
      src/map/atcommand.c

+ 4 - 0
Changelog-Trunk.txt

@@ -3,6 +3,10 @@ Date	Added
 AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
+2008/12/28
+	* Added missing command #delitem. [SketchyPhoenix]
+	* Fixed charcommand behavior where those that can accept a name with no additional parameters 
+	  being able to execute under said player's name with the name as a parameter. (bugreport:2601)
 2008/12/25
 	* Extended sv_escape_c to escape '\a','\b','\t','\v','\f','\?' characters 
 	  to their respective representations instead of octal. [FlavioJS]

+ 3 - 0
conf/atcommand_athena.conf

@@ -508,6 +508,9 @@ item: 60,60
 // Creates a complet item (card, etc...) of your choosing, either Item ID or Name.
 item2: 60,60
 
+// Deletes an item of your choosing, either Item ID or Name.
+delitem: 60,60
+
 // Kill another character without hitting them.
 kill: 60,60
 

+ 83 - 10
src/map/atcommand.c

@@ -8549,6 +8549,66 @@ int atcommand_stats(const int fd, struct map_session_data* sd, const char* comma
 	return 0;
 }
 
+int atcommand_delitem(const int fd, struct map_session_data* sd, const char* command, const char* message)
+{
+	char item_name[100];
+	int i, number = 0, item_id, item_position, count;
+	struct item_data *item_data;
+	char output[200];
+
+	nullpo_retr(-1, sd);
+
+	memset(item_name, '\0', sizeof(item_name));
+	memset(output, '\0', sizeof(output));
+
+	if (!message || !*message || (
+		sscanf(message, "\"%99[^\"]\" %d", item_name, &number) < 2 &&
+		sscanf(message, "%s %d", item_name, &number) < 2
+	) || number < 1) {
+		clif_displaymessage(fd, "Please, enter an item name/id, a quantity and a player name (usage: #delitem <item_name_or_ID> <quantity> <player>).");
+		return -1;
+	}
+
+	item_id = 0;
+	if ((item_data = itemdb_searchname(item_name)) != NULL ||
+	    (item_data = itemdb_exists(atoi(item_name))) != NULL)
+		item_id = item_data->nameid;
+	
+	if (item_id > 500) {
+		item_position = pc_search_inventory(sd, item_id);
+		if (item_position >= 0) {
+			count = 0;
+			for(i = 0; i < number && item_position >= 0; i++) {
+
+				//Logs (A)dmins items [Lupus]
+				if(log_config.enable_logs&0x400)
+					log_pick_pc(sd, "A", sd->status.inventory[item_position].nameid, -1, &sd->status.inventory[item_position]);
+
+				pc_delitem(sd, item_position, 1, 0);
+				count++;
+				item_position = pc_search_inventory(sd, item_id); // for next loop
+			}
+			sprintf(output, msg_txt(113), count); // %d item(s) removed by a GM.
+			clif_displaymessage(sd->fd, output);
+			if (number == count)
+				sprintf(output, msg_txt(114), count); // %d item(s) removed from the player.
+			else
+				sprintf(output, msg_txt(115), count, count, number); // %d item(s) removed. Player had only %d on %d items.
+			clif_displaymessage(fd, output);
+		} else {
+			clif_displaymessage(fd, msg_txt(116)); // Character does not have the item.
+			return -1;
+		}
+	}
+	else
+	{
+		clif_displaymessage(fd, msg_txt(19)); // Invalid item ID or name.
+		return -1;
+	}
+
+	return 0;
+}
+
 
 
 /*==========================================
@@ -8851,6 +8911,7 @@ AtCommandInfo atcommand_info[] = {
 	{ "cartlist",           40,40,    atcommand_cart_list },
 	{ "itemlist",           40,40,    atcommand_itemlist },
 	{ "stats",              40,40,    atcommand_stats },
+	{ "delitem",            60,60,    atcommand_delitem },
 };
 
 
@@ -8965,13 +9026,15 @@ bool is_atcommand(const int fd, struct map_session_data* sd, const char* message
 
 	if (*message == charcommand_symbol)
 	{
+		//Fail any #commands without names.
 		if( sscanf(message, "%99s %99[^\n]", cmd, param) == 1 ) {
-				sprintf(output, "%s failed. Please enter a player name.", cmd);
+				sprintf(output, "Charcommand failed. Usage: #<command> <char name> <params>.", cmd);
 				clif_displaymessage(fd, output);
 				return true;
 		}
-		else if (sscanf(message, "%99s \"%23[^\"]\" %99[^\n]", cmd, charname, param) > 1
-		|| sscanf(message, "%99s %23s %99[^\n]", cmd, charname, param) > 1)
+		//Checks to see if #command has a name or a name + parameters.
+		else if (sscanf(message, "%99s \"%23[^\"]\" %99[^\n]", cmd, charname, param) >= 2
+		|| sscanf(message, "%99s %23s %99[^\n]", cmd, charname, param) >= 2)
 		{
 			if ( (pl_sd = map_nick2sd(charname)) == NULL )
 			{
@@ -8980,14 +9043,24 @@ bool is_atcommand(const int fd, struct map_session_data* sd, const char* message
 				return true;
 			}
 			else {
-				//we pass fd instead of pl_sd->fd otherwise command output messages are sent to the target
-				//also, the name is taken out of the message since it's not needed anymore
-				sprintf(output, "%s %s", cmd, param);
-				memcpy(output2, output, sizeof(output2));
-				message2 = output2;
-				return is_atcommand_sub(fd,pl_sd,message2,gmlvl);
+				//If it's just a name and no params, send the command with no name. Otherwise, send it with the parameters.
+				if (sscanf(message, "%99s \"%23[^\"]\" %99[^\n]", cmd, charname, param) == 2
+				|| sscanf(message, "%99s %23s %99[^\n]", cmd, charname, param) == 2)
+				{
+					sprintf(output, "%s", cmd);
+					memcpy(output2, output, sizeof(output2));
+					message2 = output2;
+					//NOTE: fd is passed to is_atcommand_sub instead of pl_sd->fd because we want output sent to the user of the command, not the target.
+					return is_atcommand_sub(fd,pl_sd,message2,gmlvl);
+				}
+				else {
+					sprintf(output, "%s %s", cmd, param);
+					memcpy(output2, output, sizeof(output2));
+					message2 = output2;
+					return is_atcommand_sub(fd,pl_sd,message2,gmlvl);
+				}
 			}
-		}
+		}	
 	}
 	
 	return is_atcommand_sub(fd,sd,message,gmlvl);