diff options
-rw-r--r-- | Changelog-Trunk.txt | 2 | ||||
-rw-r--r-- | src/map/clif.c | 2 | ||||
-rw-r--r-- | src/map/itemdb.c | 43 | ||||
-rw-r--r-- | src/map/itemdb.h | 22 | ||||
-rw-r--r-- | src/map/pc.c | 8 | ||||
-rw-r--r-- | src/map/pc.h | 2 | ||||
-rw-r--r-- | src/map/script.c | 2 | ||||
-rw-r--r-- | src/map/storage.c | 4 | ||||
-rw-r--r-- | src/map/trade.c | 13 | ||||
-rw-r--r-- | src/map/vending.c | 2 |
10 files changed, 64 insertions, 36 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index aff2322e8..824b45194 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -4,6 +4,8 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2006/07/06
+ * Rewrote all the item restriction functions so that they will take into
+ account slotted card restrictions as well. [Skotlex]
* Added no_skill_delay setting, when set, affected object types will have
the minimum skill delay for all skills. Defaults to mobs, since they
don't have skill delays. [Skotlex]
diff --git a/src/map/clif.c b/src/map/clif.c index 5f2db6d12..522199539 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -1873,7 +1873,7 @@ int clif_selllist(struct map_session_data *sd) { WFIFOW(fd,0)=0xc7;
for(i=0;i<MAX_INVENTORY;i++) {
if(sd->status.inventory[i].nameid > 0 && sd->inventory_data[i]) {
- if (!itemdb_cansell(sd->status.inventory[i].nameid, pc_isGM(sd)))
+ if (!itemdb_cansell(&sd->status.inventory[i], pc_isGM(sd)))
continue;
val=sd->inventory_data[i]->value_sell;
diff --git a/src/map/itemdb.c b/src/map/itemdb.c index 80a58a520..669324532 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -289,48 +289,63 @@ static int itemdb_ispetequip(struct item_data *data) * Trade Restriction functions [Skotlex]
*------------------------------------------
*/
-int itemdb_isdropable(int nameid, int gmlv)
+int itemdb_isdropable_sub(struct item_data *item, int gmlv, int unused)
{
- struct item_data* item = itemdb_exists(nameid);
return (item && (!(item->flag.trade_restriction&1) || gmlv >= item->gm_lv_trade_override));
}
-int itemdb_cantrade(int nameid, int gmlv, int gmlv2)
+int itemdb_cantrade_sub(struct item_data* item, int gmlv, int gmlv2)
{
- struct item_data* item = itemdb_exists(nameid);
return (item && (!(item->flag.trade_restriction&2) || gmlv >= item->gm_lv_trade_override || gmlv2 >= item->gm_lv_trade_override));
}
-int itemdb_canpartnertrade(int nameid, int gmlv, int gmlv2)
+int itemdb_canpartnertrade_sub(struct item_data* item, int gmlv, int gmlv2)
{
- struct item_data* item = itemdb_exists(nameid);
return (item && (item->flag.trade_restriction&4 || gmlv >= item->gm_lv_trade_override || gmlv2 >= item->gm_lv_trade_override));
}
-int itemdb_cansell(int nameid, int gmlv)
+int itemdb_cansell_sub(struct item_data* item, int gmlv, int unused)
{
- struct item_data* item = itemdb_exists(nameid);
return (item && (!(item->flag.trade_restriction&8) || gmlv >= item->gm_lv_trade_override));
}
-int itemdb_cancartstore(int nameid, int gmlv)
+int itemdb_cancartstore_sub(struct item_data* item, int gmlv, int unused)
{
- struct item_data* item = itemdb_exists(nameid);
return (item && (!(item->flag.trade_restriction&16) || gmlv >= item->gm_lv_trade_override));
}
-int itemdb_canstore(int nameid, int gmlv)
+int itemdb_canstore_sub(struct item_data* item, int gmlv, int unused)
{
- struct item_data* item = itemdb_exists(nameid);
return (item && (!(item->flag.trade_restriction&32) || gmlv >= item->gm_lv_trade_override));
}
-int itemdb_canguildstore(int nameid, int gmlv)
+int itemdb_canguildstore_sub(struct item_data* item, int gmlv, int unused)
{
- struct item_data* item = itemdb_exists(nameid);
return (item && (!(item->flag.trade_restriction&64) || gmlv >= item->gm_lv_trade_override));
}
+int itemdb_isrestricted(struct item* item, int gmlv, int gmlv2, int (*func)(struct item_data*, int, int))
+{
+ struct item_data* item_data = itemdb_search(item->nameid);
+ int i;
+
+ if (!func(item_data, gmlv, gmlv2))
+ return 0;
+
+ if(item_data->slot == 0 ||
+ item->card[0] ==(short)0xff00 ||
+ item->card[0]==0x00ff ||
+ item->card[0]==0x00fe)
+ return 1;
+
+ for(i = 0; i < item_data->slot; i++) {
+ if (!item->card[i]) continue;
+ if (!func(itemdb_search(item->card[i]), gmlv, gmlv2))
+ return 0;
+ }
+ return 1;
+}
+
/*==========================================
*
*------------------------------------------
diff --git a/src/map/itemdb.h b/src/map/itemdb.h index fd3c5191f..a9b74b0ca 100644 --- a/src/map/itemdb.h +++ b/src/map/itemdb.h @@ -88,13 +88,21 @@ int itemdb_searchrandomid(int flags); #define itemdb_value_notoc(n) itemdb_search(n)->flag.value_notoc
#define itemdb_canrefine(n) itemdb_search(n)->flag.no_refine
//Item trade restrictions [Skotlex]
-int itemdb_isdropable(int nameid, int gmlv);
-int itemdb_cantrade(int nameid, int gmlv, int gmlv2);
-int itemdb_cansell(int nameid, int gmlv);
-int itemdb_canstore(int nameid, int gmlv);
-int itemdb_canguildstore(int nameid, int gmlv);
-int itemdb_cancartstore(int nameid, int gmlv);
-int itemdb_canpartnertrade(int nameid, int gmlv, int gmlv2);
+int itemdb_isdropable_sub(struct item_data *, int, int);
+int itemdb_cantrade_sub(struct item_data*, int, int);
+int itemdb_canpartnertrade_sub(struct item_data*, int, int);
+int itemdb_cansell_sub(struct item_data*,int, int);
+int itemdb_cancartstore_sub(struct item_data*, int, int);
+int itemdb_canstore_sub(struct item_data*, int, int);
+int itemdb_canguildstore_sub(struct item_data*, int, int);
+int itemdb_isrestricted(struct item* item, int gmlv, int gmlv2, int (*func)(struct item_data*, int, int));
+#define itemdb_isdropable(item, gmlv) itemdb_isrestricted(item, gmlv, 0, itemdb_isdropable_sub)
+#define itemdb_cantrade(item, gmlv, gmlv2) itemdb_isrestricted(item, gmlv, gmlv2, itemdb_cantrade_sub)
+#define itemdb_canpartnertrade(item, gmlv, gmlv2) itemdb_isrestricted(item, gmlv, gmlv2, itemdb_canpartnertrade_sub)
+#define itemdb_cansell(item, gmlv) itemdb_isrestricted(item, gmlv, 0, itemdb_cansell_sub)
+#define itemdb_cancartstore(item, gmlv) itemdb_isrestricted(item, gmlv, 0, itemdb_cancartstore_sub)
+#define itemdb_canstore(item, gmlv) itemdb_isrestricted(item, gmlv, 0, itemdb_canstore_sub)
+#define itemdb_canguildstore(item, gmlv) itemdb_isrestricted(item , gmlv, 0, itemdb_canguildstore_sub)
int itemdb_isequip(int);
int itemdb_isequip2(struct item_data *);
diff --git a/src/map/pc.c b/src/map/pc.c index f965fb6e3..4604ef41c 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -2672,7 +2672,7 @@ int pc_dropitem(struct map_session_data *sd,int n,int amount) return 0; //Can't drop items in nodrop mapflag maps. } - if (!pc_candrop(sd,sd->status.inventory[n].nameid)) { + if (!pc_candrop(sd,&sd->status.inventory[n])) { clif_displaymessage (sd->fd, msg_txt(263)); return 0; } @@ -2914,7 +2914,7 @@ int pc_cart_additem(struct map_session_data *sd,struct item *item_data,int amoun return 1; data = itemdb_search(item_data->nameid); - if(!itemdb_cancartstore(item_data->nameid, pc_isGM(sd))) + if(!itemdb_cancartstore(item_data, pc_isGM(sd))) { //Check item trade restrictions [Skotlex] clif_displaymessage (sd->fd, msg_txt(264)); return 1; @@ -5645,12 +5645,12 @@ int pc_setriding(struct map_session_data *sd) * アイテムドロップ可不可判定 *------------------------------------------ */ -int pc_candrop(struct map_session_data *sd,int item_id) +int pc_candrop(struct map_session_data *sd,struct item *item) { int level = pc_isGM(sd); if ( pc_can_give_items(level) ) //check if this GM level can drop items return 0; - return (itemdb_isdropable(item_id, level)); + return (itemdb_isdropable(item, level)); } /*========================================== diff --git a/src/map/pc.h b/src/map/pc.h index 6cfb9f532..b6d34a873 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -246,7 +246,7 @@ struct map_session_data *pc_get_child(struct map_session_data *sd); int pc_set_gm_level(int account_id, int level);
void pc_setstand(struct map_session_data *sd);
-int pc_candrop(struct map_session_data *sd,int item_id);
+int pc_candrop(struct map_session_data *sd,struct item *item);
int pc_jobid2mapid(unsigned short b_class); // Skotlex
int pc_mapid2jobid(unsigned short class_, int sex); // Skotlex
diff --git a/src/map/script.c b/src/map/script.c index 9244c00d3..22cd3c8a0 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -3959,7 +3959,7 @@ int buildin_getitem(struct script_state *st) return 0; if((flag = pc_additem(sd,&item_tmp,amount))) { clif_additem(sd,0,0,flag); - if(pc_candrop(sd,nameid)) + if (pc_candrop(sd, &item_tmp)) map_addflooritem(&item_tmp,amount,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0); } diff --git a/src/map/storage.c b/src/map/storage.c index 29b48527d..0a54f0dde 100644 --- a/src/map/storage.c +++ b/src/map/storage.c @@ -168,7 +168,7 @@ static int storage_additem(struct map_session_data *sd,struct storage *stor,stru data = itemdb_search(item_data->nameid);
- if (!itemdb_canstore(item_data->nameid, pc_isGM(sd)))
+ if (!itemdb_canstore(item_data, pc_isGM(sd)))
{ //Check if item is storable. [Skotlex]
clif_displaymessage (sd->fd, msg_txt(264));
return 1;
@@ -517,7 +517,7 @@ int guild_storage_additem(struct map_session_data *sd,struct guild_storage *stor if(item_data->nameid <= 0 || amount <= 0)
return 1;
- if (!itemdb_canguildstore(item_data->nameid, pc_isGM(sd)))
+ if (!itemdb_canguildstore(item_data, pc_isGM(sd)))
{ //Check if item is storable. [Skotlex]
clif_displaymessage (sd->fd, msg_txt(264));
return 1;
diff --git a/src/map/trade.c b/src/map/trade.c index b9c142332..04d4c83e5 100644 --- a/src/map/trade.c +++ b/src/map/trade.c @@ -294,7 +294,8 @@ int trade_check(struct map_session_data *sd, struct map_session_data *tsd) { */
void trade_tradeadditem(struct map_session_data *sd, int index, int amount) {
struct map_session_data *target_sd;
- int trade_i, trade_weight, nameid;
+ struct item *item;
+ int trade_i, trade_weight;
nullpo_retv(sd);
if (!sd->state.trading || sd->state.deal_locked > 0)
@@ -324,10 +325,12 @@ void trade_tradeadditem(struct map_session_data *sd, int index, int amount) { if (amount < 0 || amount > sd->status.inventory[index].amount)
return;
- nameid = sd->inventory_data[index]->nameid;
-
- if (!itemdb_cantrade(nameid, pc_isGM(sd), pc_isGM(target_sd)) && //Can't trade
- (pc_get_partner(sd) != target_sd || !itemdb_canpartnertrade(nameid, pc_isGM(sd), pc_isGM(target_sd)))) //Can't partner-trade
+ item = &sd->status.inventory[index];
+ trade_i = pc_isGM(sd); //Recycling the variables to check for trad restrict.
+ trade_weight = pc_isGM(target_sd);
+ if (!itemdb_cantrade(item, trade_i, trade_weight) && //Can't trade
+ (pc_get_partner(sd) != target_sd ||
+ !itemdb_canpartnertrade(item, trade_i, trade_weight))) //Can't partner-trade
{
clif_displaymessage (sd->fd, msg_txt(260));
return;
diff --git a/src/map/vending.c b/src/map/vending.c index 6d26ef518..073a21303 100644 --- a/src/map/vending.c +++ b/src/map/vending.c @@ -231,7 +231,7 @@ void vending_openvending(struct map_session_data *sd,int len,char *message,int f for(i = 0, j = 0; (85 + 8 * j < len) && (i < MAX_VENDING); i++, j++) {
sd->vending[i].index = *(short*)(p+8*j)-2;
if (sd->vending[i].index < 0 || sd->vending[i].index >= MAX_CART ||
- !itemdb_cantrade(sd->status.cart[sd->vending[i].index].nameid, pc_isGM(sd), pc_isGM(sd)))
+ !itemdb_cantrade(&sd->status.cart[sd->vending[i].index], pc_isGM(sd), pc_isGM(sd)))
{
i--; //Preserve the vending index, skip to the next item.
continue;
|