diff --git a/source/WorldServer/Items/Items.cpp b/source/WorldServer/Items/Items.cpp index f8ace02..c506987 100644 --- a/source/WorldServer/Items/Items.cpp +++ b/source/WorldServer/Items/Items.cpp @@ -3378,8 +3378,13 @@ void PlayerItemList::DestroyItem(int16 index){ if(items.count(item->details.inv_slot_id) > 0 && items[item->details.inv_slot_id][item->details.appearance_type].count(item->details.slot_id) > 0) items[item->details.inv_slot_id][item->details.appearance_type].erase(item->details.slot_id); indexed_items[index] = 0; - + + vector::iterator itr = std::find(overflowItems.begin(), overflowItems.end(), item); + if(itr != overflowItems.end()) { + overflowItems.erase(itr); // avoid a dead ptr + } lua_interface->SetLuaUserDataStale(item); + safe_delete(item); } MPlayerItems.releasewritelock(__FUNCTION__, __LINE__); diff --git a/source/WorldServer/Player.cpp b/source/WorldServer/Player.cpp index 32046a4..3d9e227 100644 --- a/source/WorldServer/Player.cpp +++ b/source/WorldServer/Player.cpp @@ -2146,9 +2146,14 @@ void Player::UpdateInventory(int32 bag_id) { } EQ2Packet* Player::MoveInventoryItem(sint32 to_bag_id, int16 from_index, int8 new_slot, int8 charges, int8 appearance_type, bool* item_deleted, int16 version) { + Item* item = item_list.GetItemFromIndex(from_index); + bool isOverflow = ((item != nullptr) && (item->details.inv_slot_id == -2)); int8 result = item_list.MoveItem(to_bag_id, from_index, new_slot, appearance_type, charges); if (result == 1) { + if(isOverflow && item->details.inv_slot_id != -2) { + item_list.RemoveOverflowItem(item); + } if (item) { if (!item->needs_deletion) item->save_needed = true;