From f47e370d5cffc16a6ee4888c76768f9309e1fe83 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@54d463be-8e91-2dee-dedb-b68131a5f0ec> Date: Thu, 3 Feb 2005 11:20:57 +0000 Subject: * 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://rathena.svn.sourceforge.net/svnroot/rathena/branches/stable@1024 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/itemdb.c | 30 +++++++++++++++++++++++------- src/map/npc.c | 12 +++++++++--- 2 files changed, 32 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/map/itemdb.c b/src/map/itemdb.c index dd8de15d4..971f6cacf 100644 --- a/src/map/itemdb.c +++ b/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]); diff --git a/src/map/npc.c b/src/map/npc.c index 49608720b..cbb6c5495 100644 --- a/src/map/npc.c +++ b/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,','); } -- cgit v1.2.3-70-g09d2