Explorar o código

* When loading shop scripts automatically check if the prices can be exploited with OC/DC
* If the buying price provided in item_db.txt is above 2x higher than selling price for an item no need to reset and redetermine the buying price

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

(no author) %!s(int64=20) %!d(string=hai) anos
pai
achega
200bd8bb6a
Modificáronse 3 ficheiros con 36 adicións e 10 borrados
  1. 4 0
      Changelog.txt
  2. 23 7
      src/map/itemdb.c
  3. 9 3
      src/map/npc.c

+ 4 - 0
Changelog.txt

@@ -1,6 +1,10 @@
 Date	Added
 
 02/03
+        * When loading shop scripts automatically check if the prices can be exploited
+          with OC/DC [celest]
+        * If the buying price provided in item_db.txt is above 2x higher than selling
+          price for an item no need to reset and redetermine the buying price [celest]
         * Fixed a mistake that was causing Ruwach to only work in PvP and PvM [celest]
         * Added DracoRPG's code for Joint Beat effects, thanks! [celest]
 

+ 23 - 7
src/map/itemdb.c

@@ -326,13 +326,29 @@ static int itemdb_readdb(void)
 			memcpy(id->name,str[1],24);
 			memcpy(id->jname,str[2],24);
 			id->type=atoi(str[3]);
-			// buy≠sell*2 は item_value_db.txt で指定してください。
-			if (atoi(str[5])) {		// sell値を優先とする
-				id->value_buy=atoi(str[5])*2;
-				id->value_sell=atoi(str[5]);
-			} else {
-				id->value_buy=atoi(str[4]);
-				id->value_sell=atoi(str[4])/2;
+
+			{
+				int buy = atoi(str[4]), sell = atoi(str[5]);
+				// if buying price > selling price * 2 consider it valid and don't change it [celest]
+				if (buy && sell && buy > sell*2){
+					id->value_buy = buy;
+					id->value_sell = sell;
+				} else {
+					// buy≠sell*2 は item_value_db.txt で指定してください。
+					if (sell) {		// sell値を優先とする
+						id->value_buy = sell*2;
+						id->value_sell = sell;
+					} else {
+						id->value_buy = buy;
+						id->value_sell = buy/2;
+					}
+				}
+				// check for bad prices that can possibly cause exploits
+				if (id->value_buy*75/100 < id->value_sell*124/100) {
+					sprintf (tmp_output, "Item %s [%d] buying:%d < selling:%d\n",
+						id->name, id->nameid, id->value_buy*75/100, id->value_sell*124/100);
+					ShowWarning (tmp_output);
+				}
 			}
 			id->weight=atoi(str[6]);
 			id->atk=atoi(str[7]);

+ 9 - 3
src/map/npc.c

@@ -1513,15 +1513,21 @@ static int npc_parse_shop(char *w1,char *w2,char *w3,char *w4)
 
 	while (p && pos < max) {
 		int nameid,value;
+		struct item_data *id;
 		p++;
 		if (sscanf(p, "%d:%d", &nameid, &value) != 2)
 			break;
 		nd->u.shop_item[pos].nameid = nameid;
-		if (value < 0) {
-			struct item_data *id = itemdb_search(nameid);
+		id = itemdb_search(nameid);
+		if (value < 0)			
 			value = id->value_buy;
-		}
 		nd->u.shop_item[pos].value = value;
+		// check for bad prices that can possibly cause exploits
+		if (value*75/100 < id->value_sell*124/100) {
+			sprintf (tmp_output, "Item %s [%d] buying:%d < selling:%d\n",
+				id->name, id->nameid, value*75/100, id->value_sell*124/100);
+			ShowWarning (tmp_output);
+		}
 		pos++;
 		p=strchr(p,',');
 	}