I think I got the working code for adding items into inventory(picking up drops, buying, !item) and they'll stack.
So I'll share my code with you guys and hope I did something good :)
Open up GameServer/Inventory.cpp and find "
bool Inventory::addItem(Player* player, Item* item, int itemId)" function.
Replace the function with this code:
Code:
bool Inventory::addItem(Player* player, Item* item, int itemId)
{
PlayerInventory* inventory = player->inv;
if(inventory->getFirstUnunsedSlot()==-1 || inventory->getFirstUnunsedSlot()>42)
{
MessagePacket::InformationMessage(player,TID_GAME_LACKSPACE);
return false;
}
//Collect all the item ids in inventory thats not equipped.
vector<int> item_list;
vector<int> slot_list;
vector<int> amount_list;
for(unsigned int index = 0; index<42; index++)
{
if(inventory->getItemBySlot(index)!= NULL)
{
item_list.push_back(inventory->getItemBySlot(index)->getItemId());
slot_list.push_back(index);
amount_list.push_back(inventory->getItemBySlot(index)->getAmount());
}
}
//Log(MSG_DEBUG,"Size of item_list %d\n",item_list.size());
// use the list_item to check if the passed item is in the inventory
int itemAdded = 0;
if(item_list.size()>0)
{
for(unsigned int index = 0; index<item_list.size();index++)
{
// If the item is found
if(item_list.at(index) == itemId)
{
ItemBank *itembank = ItemBanks::getItemBankById(item->getItemId());
if(item->getAmount() > ItemBanks::getItemBankById(item->getItemId())->maxItems)
item->setAmount(ItemBanks::getItemBankById(item->getItemId())->maxItems);
else if(item->getAmount() < 0)
{
item->setAmount(0);
itemAdded = 1;
return false;
}
else if(amount_list.at(index) < itembank->maxItems)
{
Item* newItem = new Item();
newItem->setItemId(item->getItemId());
newItem->setAmount(amount_list.at(index) + item->getAmount());
inventory->removeItem(inventory->getItemBySlot(slot_list.at(index)));
inventory->removeUsedSlot(slot_list.at(index));
int newSlot = slot_list.at(index);
inventory->addUsedSlot(newSlot);
newItem->setSlot(newSlot);
InventoryPacket::addItem(player, newItem, newSlot);
inventory->addItem(newItem);
InventoryPacket::updateSlot(player, newItem, newSlot);
itemAdded = 1;
break;
}
else
continue;
}
}
if(itemAdded == 0)
{
int newSlot = inventory->getFirstUnunsedSlot();
inventory->addUsedSlot(newSlot);
item->setSlot(newSlot);
InventoryPacket::addItem(player, item, newSlot);
inventory->addItem(item);
InventoryPacket::updateSlot(player, item, newSlot);
InventoryPacket::updateInventorySlot(player, item, newSlot, false);
itemAdded = 1;
}
}
else
{
int newSlot = inventory->getFirstUnunsedSlot();
inventory->addUsedSlot(newSlot);
item->setSlot(newSlot);
InventoryPacket::addItem(player, item, newSlot);
inventory->addItem(item);
InventoryPacket::updateSlot(player, item, newSlot);
itemAdded = 1;
}
item_list.clear();
amount_list.clear();
slot_list.clear();
itemAdded = 0;
return true;
}
Hope it's working properly for you guys, I've been working on this some days now ^^.
Edit: I'm not sure about the
part. I replaced it before I could test it. (Don't really want to test it 2 AM ;3).
I will test it tomorrow :>