Pe scurt: cand cumpai un item stackable dintr-un shop/npc (magazin general, samd) itemele nu se puneau automat pe stack-ul existent din inventar, ci crea un slot nou. Daca inventarul era plin, itemele dispareau sau cauza comportament nedefinit.
Testat pe serverul propriu:
- Cumparare normala din NPC shop → item in inventar, banii scazuti corect.
- Item stackable cu slot existent → se adauga pe stack, fara slot nou creat.
- Cumperi 10x licori dar ai deja 4990x in inventar (bCount = 0) → se completeaza la 5000x automat, banii scazuti corect.
- Inventar plin + item non-stackable → mesaj eroare, banii nu se scad.
- Inventar plin + item stackable cu stack posibil → se adauga pe stack existent.
- Dragon Soul → apare in DS inventory corect, cu ItemLog si SendMoneyLog.
- FlushDelayedSave apelat corect pentru toate cazurile.
- Niciun item pierdut, niciun yang scazut fara sa primesti item.
*Instructiuni:Testat pe Martysama 5.8 P23. Dacă folositi mainline, lasati un reply cu rezultatul + sugestii pentru imbunatatirea codului sau eventuale erori de cod.
1. CommonDefines.h
Adauga:
Code:
#define ENABLE_CHAMP_SHOP_AUTO_STACKCauta:
Code:
int iEmptyPos = ch->GetEmptyInventoryEx(item);
if (iEmptyPos < 0)
{
if (m_pkPC)
{
sys_log(1, "Shop::Buy at PC Shop : Inventory full : %s size %d", ch->GetName(), item->GetSize());
return SHOP_SUBHEADER_GC_INVENTORY_FULL;
}
else
{
sys_log(1, "Shop::Buy : Inventory full : %s size %d", ch->GetName(), item->GetSize());
M2_DESTROY_ITEM(item);
return SHOP_SUBHEADER_GC_INVENTORY_FULL;
}
}Dupa tot blocul de mai sus adaugat, inainte de ch->PointChange(POINT_GOLD, -dwPrice, false);
Adauga mai jos
Cauta blocul else final (NPC shop):
Code:
else
{
item->AddToCharacter(ch, TItemPos(item->GetWindowInventoryEx(), iEmptyPos));
ITEM_MANAGER::instance().FlushDelayedSave(item);
LogManager::instance().ItemLog(ch, item, "BUY", item->GetName());
la acest mesaj și conținutul se va afișa automat.