浏览代码

Small isequippedcnt script command update (#4229)

* Updated the command to only count the unique ID

Thanks to @cydh, @secretdataz and @aleos89 for the reviews !
Atemo 5 年之前
父节点
当前提交
786186f728
共有 2 个文件被更改,包括 21 次插入19 次删除
  1. 6 7
      doc/script_commands.txt
  2. 15 12
      src/map/script.cpp

+ 6 - 7
doc/script_commands.txt

@@ -3955,7 +3955,7 @@ The renewal feature to check is determined by type.
 \\
 \\
 ---------------------------------------
 ---------------------------------------
 
 
-*isequipped(<id>{,<id>{,<id>{,<id>}}})
+*isequipped(<id>{,<id>{,..}})
 
 
 This function will return 1 if the invoking character has all of the item
 This function will return 1 if the invoking character has all of the item
 IDs given equipped (if card IDs are passed, then it checks if the cards are
 IDs given equipped (if card IDs are passed, then it checks if the cards are
@@ -3973,15 +3973,14 @@ in February 2005, but it will work just fine in normal NPC scripts.
 
 
 ---------------------------------------
 ---------------------------------------
 
 
-*isequippedcnt(<card id>{,<card id>{,<card id>{,<card id>}}})
+*isequippedcnt(<id>{,<id>{,..}})
 
 
 This function is similar to 'isequipped', but instead of 1 or 0, it will return
 This function is similar to 'isequipped', but instead of 1 or 0, it will return
-the number of cards in the list given that were found on the invoking character.
+the amount of item/card equipped that were found on the invoking character from the given list.
 
 
-If a given parameter is not a card, the function returns the amount of that
-item equipped on the invoking character.
-
-    if (isequippedcnt(4001,4005,4033,4196) == 4) mes "Finally got all four poring cards?";
+Example:
+    if (isequippedcnt(4001,4005,4033,4196) == 5)
+		mes "Finally got 5 cards from poring monsters type?";
 
 
 ---------------------------------------
 ---------------------------------------
 
 

+ 15 - 12
src/map/script.cpp

@@ -15407,38 +15407,41 @@ BUILDIN_FUNC(isday)
 BUILDIN_FUNC(isequippedcnt)
 BUILDIN_FUNC(isequippedcnt)
 {
 {
 	TBL_PC *sd;
 	TBL_PC *sd;
-	int i, id = 1;
-	int ret = 0;
 
 
-	if (!script_rid2sd(sd)) { //If the player is not attached it is a script error anyway... but better prevent the map server from crashing...
+	if (!script_rid2sd(sd)) {
 		script_pushint(st,0);
 		script_pushint(st,0);
 		return SCRIPT_CMD_SUCCESS;
 		return SCRIPT_CMD_SUCCESS;
 	}
 	}
 
 
-	for (i=0; id!=0; i++) {
-		short j;
-		FETCH (i+2, id) else id = 0;
+	int ret = 0;
+	int total = script_lastdata(st);
+	std::vector<int32> list(total);
+
+	for (int i = 2; i <= total; ++i) {
+		int id = script_getnum(st,i);
 		if (id <= 0)
 		if (id <= 0)
 			continue;
 			continue;
+		if (std::find(list.begin(), list.end(), id) != list.end())
+			continue;
+		list.push_back(id);
 
 
-		for (j=0; j<EQI_MAX; j++) {
+		for (short j = 0; j < EQI_MAX; j++) {
 			short index = sd->equip_index[j];
 			short index = sd->equip_index[j];
-			if(index < 0)
+			if (index < 0)
 				continue;
 				continue;
 			if (pc_is_same_equip_index((enum equip_index)j, sd->equip_index, index))
 			if (pc_is_same_equip_index((enum equip_index)j, sd->equip_index, index))
 				continue;
 				continue;
 
 
-			if(!sd->inventory_data[index])
+			if (!sd->inventory_data[index])
 				continue;
 				continue;
 
 
 			if (itemdb_type(id) != IT_CARD) { //No card. Count amount in inventory.
 			if (itemdb_type(id) != IT_CARD) { //No card. Count amount in inventory.
 				if (sd->inventory_data[index]->nameid == id)
 				if (sd->inventory_data[index]->nameid == id)
-					ret+= sd->inventory.u.items_inventory[index].amount;
+					ret += sd->inventory.u.items_inventory[index].amount;
 			} else { //Count cards.
 			} else { //Count cards.
-				short k;
 				if (itemdb_isspecial(sd->inventory.u.items_inventory[index].card[0]))
 				if (itemdb_isspecial(sd->inventory.u.items_inventory[index].card[0]))
 					continue; //No cards
 					continue; //No cards
-				for(k=0; k<sd->inventory_data[index]->slot; k++) {
+				for (short k = 0; k < sd->inventory_data[index]->slot; k++) {
 					if (sd->inventory.u.items_inventory[index].card[k] == id)
 					if (sd->inventory.u.items_inventory[index].card[k] == id)
 						ret++; //[Lupus]
 						ret++; //[Lupus]
 				}
 				}