Cleaned up CZ_PC_SELL_ITEMLIST and its related functions
* Added a validation check for remaining item amount
This commit is contained in:
@@ -2849,7 +2849,7 @@ e_purchase_result npc_buylist( struct map_session_data* sd, std::vector<s_npc_bu
|
||||
}
|
||||
|
||||
/// npc_selllist for script-controlled shops
|
||||
static int npc_selllist_sub(struct map_session_data* sd, int n, unsigned short* item_list, struct npc_data* nd)
|
||||
static int npc_selllist_sub(struct map_session_data* sd, int list_length, PACKET_CZ_PC_SELL_ITEMLIST_sub* item_list, struct npc_data* nd)
|
||||
{
|
||||
char npc_ev[EVENT_NAME_LENGTH];
|
||||
char card_slot[NAME_LENGTH];
|
||||
@@ -2891,12 +2891,12 @@ static int npc_selllist_sub(struct map_session_data* sd, int n, unsigned short*
|
||||
}
|
||||
|
||||
// save list of to be sold items
|
||||
for( i = 0; i < n; i++ )
|
||||
for( i = 0; i < list_length; i++ )
|
||||
{
|
||||
int idx = item_list[i * 2] - 2;
|
||||
int idx = item_list[i].index - 2;
|
||||
|
||||
script_setarray_pc( sd, "@sold_nameid", i, sd->inventory.u.items_inventory[idx].nameid, &key_nameid );
|
||||
script_setarray_pc( sd, "@sold_quantity", i, item_list[i*2+1], &key_amount );
|
||||
script_setarray_pc( sd, "@sold_quantity", i, item_list[i].amount, &key_amount );
|
||||
|
||||
if( itemdb_isequip(sd->inventory.u.items_inventory[idx].nameid) )
|
||||
{// process equipment based information into the arrays
|
||||
@@ -2933,7 +2933,7 @@ static int npc_selllist_sub(struct map_session_data* sd, int n, unsigned short*
|
||||
///
|
||||
/// @param item_list 'n' pairs <index,amount>
|
||||
/// @return result code for clif_parse_NpcSellListSend
|
||||
uint8 npc_selllist(struct map_session_data* sd, int n, unsigned short *item_list)
|
||||
uint8 npc_selllist(struct map_session_data* sd, int list_length, PACKET_CZ_PC_SELL_ITEMLIST_sub* item_list)
|
||||
{
|
||||
double z;
|
||||
int i,skill;
|
||||
@@ -2950,13 +2950,13 @@ uint8 npc_selllist(struct map_session_data* sd, int n, unsigned short *item_list
|
||||
z = 0;
|
||||
|
||||
// verify the sell list
|
||||
for( i = 0; i < n; i++ )
|
||||
for( i = 0; i < list_length; i++ )
|
||||
{
|
||||
t_itemid nameid;
|
||||
int amount, idx, value;
|
||||
|
||||
idx = item_list[i*2]-2;
|
||||
amount = item_list[i*2+1];
|
||||
idx = item_list[i].index - 2;
|
||||
amount = item_list[i].amount;
|
||||
|
||||
if( idx >= MAX_INVENTORY || idx < 0 || amount < 0 )
|
||||
{
|
||||
@@ -2965,7 +2965,7 @@ uint8 npc_selllist(struct map_session_data* sd, int n, unsigned short *item_list
|
||||
|
||||
nameid = sd->inventory.u.items_inventory[idx].nameid;
|
||||
|
||||
if( !nameid || !sd->inventory_data[idx] || sd->inventory.u.items_inventory[idx].amount < amount )
|
||||
if( !nameid || !sd->inventory_data[idx] || sd->inventory.u.items_inventory[idx].amount < amount)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
@@ -2989,16 +2989,16 @@ uint8 npc_selllist(struct map_session_data* sd, int n, unsigned short *item_list
|
||||
|
||||
if( nd->master_nd )
|
||||
{// Script-controlled shops
|
||||
return npc_selllist_sub(sd, n, item_list, nd->master_nd);
|
||||
return npc_selllist_sub(sd, list_length, item_list, nd->master_nd);
|
||||
}
|
||||
|
||||
// delete items
|
||||
for( i = 0; i < n; i++ )
|
||||
for( i = 0; i < list_length; i++ )
|
||||
{
|
||||
int amount, idx;
|
||||
|
||||
idx = item_list[i*2]-2;
|
||||
amount = item_list[i*2+1];
|
||||
idx = item_list[i].index - 2;
|
||||
amount = item_list[i].amount;
|
||||
|
||||
// Forged packet, we do not care if he loses items
|
||||
if( sd->inventory_data[idx] == nullptr ){
|
||||
@@ -3013,7 +3013,9 @@ uint8 npc_selllist(struct map_session_data* sd, int n, unsigned short *item_list
|
||||
}
|
||||
}
|
||||
|
||||
pc_delitem(sd, idx, amount, 0, 6, LOG_TYPE_NPC);
|
||||
if (pc_delitem(sd, idx, amount, 0, 6, LOG_TYPE_NPC)) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if( z > MAX_ZENY )
|
||||
|
||||
Reference in New Issue
Block a user