This modification allows you trade normally non-trade-able items using a custom trade ticket defined in trade.h. The items are those defined in item_trade.txt
The currently set item is 501(Red Potion), it is recommended to change it to a custom non-droppable item.
Index: trade.c =================================================================== --- trade.c (revision 16496) +++ trade.c (working copy) @@ -316,6 +316,10 @@ int trade_i, trade_weight; int src_lv, dst_lv; + //[clydelion] + int i,j = 0; + int ttcindex, ttc = 0; + nullpo_retv(sd); if( !sd->state.trading || sd->state.deal_locked > 0 ) return; //Can't add stuff. @@ -343,7 +347,18 @@ item = &sd->status.inventory[index]; src_lv = pc_get_group_level(sd); dst_lv = pc_get_group_level(target_sd); - if( !itemdb_cantrade(item, src_lv, dst_lv) && //Can't trade + + //[clydelion] + if( item->nameid == BYPASS_TRADE_TICKET ) + return; + for( i = 0; i < MAX_INVENTORY; i++ ){ + if( sd->status.inventory[i].nameid == BYPASS_TRADE_TICKET ){ + j++; + ttc = sd->status.inventory[i].amount; + ttcindex = i; + } + } + if( (!itemdb_cantrade(item, src_lv, dst_lv) && !j && ttc < amount) && //Can't trade (pc_get_partner(sd) != target_sd || !itemdb_canpartnertrade(item, src_lv, dst_lv)) ) //Can't partner-trade { clif_displaymessage (sd->fd, msg_txt(260)); @@ -373,6 +388,10 @@ return; } + //[clydelion] + if(itemdb_cantrade(item, src_lv, dst_lv) == 0) + pc_delitem(sd,ttcindex,amount,0,0,LOG_TYPE_OTHER); + if( sd->deal.item[trade_i].index == index ) { //The same item as before is being readjusted. if( sd->deal.item[trade_i].amount + amount > sd->status.inventory[index].amount ) @@ -448,6 +467,12 @@ struct map_session_data *target_sd; int trade_i; + //[clydelion] + struct item item_tmp; + struct item item; + memset(&item_tmp,0,sizeof(item_tmp)); + memset(&item,0,sizeof(item_tmp)); + item_tmp.nameid=BYPASS_TRADE_TICKET; target_sd = map_id2sd(sd->trade_partner); if(!sd->state.trading) @@ -464,6 +489,11 @@ for(trade_i = 0; trade_i < 10; trade_i++) { // give items back (only virtual) if (!sd->deal.item[trade_i].amount) continue; + + //[clydelion] + item = sd->status.inventory[sd->deal.item[trade_i].index]; + if(itemdb_cantrade(&item, pc_get_group_level(sd), pc_get_group_level(target_sd)) == 0) + pc_additem(sd, &item_tmp, sd->deal.item[trade_i].amount,LOG_TYPE_OTHER); clif_additem(sd, sd->deal.item[trade_i].index, sd->deal.item[trade_i].amount, 0); sd->deal.item[trade_i].index = 0; sd->deal.item[trade_i].amount = 0; @@ -484,6 +514,11 @@ for(trade_i = 0; trade_i < 10; trade_i++) { // give items back (only virtual) if (!target_sd->deal.item[trade_i].amount) continue; + + //[clydelion] + item = target_sd->status.inventory[target_sd->deal.item[trade_i].index]; + if(itemdb_cantrade(&item, pc_get_group_level(target_sd), pc_get_group_level(sd)) == 0) + pc_additem(target_sd, &item_tmp, target_sd->deal.item[trade_i].amount,LOG_TYPE_OTHER); clif_additem(target_sd, target_sd->deal.item[trade_i].index, target_sd->deal.item[trade_i].amount, 0); target_sd->deal.item[trade_i].index = 0; target_sd->deal.item[trade_i].amount = 0; Index: trade.h =================================================================== --- trade.h (revision 16496) +++ trade.h (working copy) @@ -5,6 +5,9 @@ #define _TRADE_H_ //#include "map.h" + +#define BYPASS_TRADE_TICKET 501 //[clydelion] + struct map_session_data; void trade_traderequest(struct map_session_data *sd, struct map_session_data *target_sd);