From 595d9b743d6e2401525c7fd4c4e2fa2a8c110841 Mon Sep 17 00:00:00 2001 From: aleos89 Date: Thu, 24 Nov 2016 23:41:53 -0500 Subject: [PATCH] Fixed a potential map server crash * Resolves an invalid operator check for pc_check_available_item. * Added a new flag for pc_delitem to not calculate a player's status when unequipping an item. Thanks to @cydh! --- src/map/pc.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/map/pc.c b/src/map/pc.c index 4ac1630f76..5c19a418b4 100755 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -4549,7 +4549,7 @@ char pc_additem(struct map_session_data *sd,struct item *item,int amount,e_log_p * @param sd * @param n Item index in inventory * @param amount - * @param type &1: Don't notify deletion; &2 Don't notify weight change + * @param type &1: Don't notify deletion; &2 Don't notify weight change; &4 Don't calculate status * @param reason Delete reason * @param log_type e_log_pick_type * @return 1 - invalid itemid or negative amount; 0 - Success @@ -4567,7 +4567,7 @@ char pc_delitem(struct map_session_data *sd,int n,int amount,int type, short rea sd->weight -= sd->inventory_data[n]->weight*amount ; if( sd->inventory.u.items_inventory[n].amount <= 0 ){ if(sd->inventory.u.items_inventory[n].equip) - pc_unequipitem(sd,n,3); + pc_unequipitem(sd,n,2|(!(type&4) ? 1 : 0)); memset(&sd->inventory.u.items_inventory[n],0,sizeof(sd->inventory.u.items_inventory[0])); sd->inventory_data[n] = NULL; } @@ -9941,7 +9941,7 @@ void pc_check_available_item(struct map_session_data *sd, uint8 type) nullpo_retv(sd); - if (battle_config.item_check&ITMCHK_INVENTORY || type&ITMCHK_INVENTORY) { // Check for invalid(ated) items in inventory. + if (battle_config.item_check&ITMCHK_INVENTORY && type&ITMCHK_INVENTORY) { // Check for invalid(ated) items in inventory. for(i = 0; i < MAX_INVENTORY; i++) { nameid = sd->inventory.u.items_inventory[i].nameid; @@ -9951,7 +9951,7 @@ void pc_check_available_item(struct map_session_data *sd, uint8 type) sprintf(output, msg_txt(sd, 709), nameid); // Item %hu has been removed from your inventory. clif_displaymessage(sd->fd, output); ShowWarning("Removed invalid/disabled item (ID: %hu, amount: %d) from inventory (char_id: %d).\n", nameid, sd->inventory.u.items_inventory[i].amount, sd->status.char_id); - pc_delitem(sd, i, sd->inventory.u.items_inventory[i].amount, 0, 0, LOG_TYPE_OTHER); + pc_delitem(sd, i, sd->inventory.u.items_inventory[i].amount, 4, 0, LOG_TYPE_OTHER); continue; } if (!sd->inventory.u.items_inventory[i].unique_id && !itemdb_isstackable(nameid)) @@ -9959,7 +9959,7 @@ void pc_check_available_item(struct map_session_data *sd, uint8 type) } } - if (battle_config.item_check&ITMCHK_CART || type&ITMCHK_CART) { // Check for invalid(ated) items in cart. + if (battle_config.item_check&ITMCHK_CART && type&ITMCHK_CART) { // Check for invalid(ated) items in cart. for(i = 0; i < MAX_CART; i++) { nameid = sd->cart.u.items_cart[i].nameid; @@ -9977,7 +9977,7 @@ void pc_check_available_item(struct map_session_data *sd, uint8 type) } } - if (battle_config.item_check&ITMCHK_STORAGE || type&ITMCHK_STORAGE) { // Check for invalid(ated) items in storage. + if (battle_config.item_check&ITMCHK_STORAGE && type&ITMCHK_STORAGE) { // Check for invalid(ated) items in storage. for(i = 0; i < sd->storage.max_amount; i++) { nameid = sd->storage.u.items_storage[i].nameid;