Guida Rendere i "UNIQUE_ITEM" (Anello/Guanto ecc.) stackabili

xXIntelXx

Utente Platinum
18 Ottobre 2009
5,093
40
1,443
1,068
Di tanto in tanto continuo a leggere, tra tuuutti i vari problemi dei privati, uno in particolare (piuttosto richiesto tra l'altro): gli anelli/guanti del ladro sono stackabili ma la stack viene indossata interamente, facendo scadere il tempo a tutti gli oggetti di essa.
O vengono resi stackabili e si possono indossare senza buggarsi, o si tengono non stackabili. NON esiste una via di mezzo.

Perciò, ecco a voi una soluzione evergreen.

Aprite char_item.cpp e andate in:
C++:
bool CHARACTER::EquipItem(LPITEM item, int iCandidateCell)
Andate alla riga con:
C++:
BYTE bOldCell = item->GetCell();
o
C++:
WORD wOldCell = item->GetCell();
se avete le stack maggiori di 200 (o UCHAR_MAX).
Sostituite:
C++:
            if (item->EquipTo(this, iWearCell))
            {
                SyncQuickslot(QUICKSLOT_TYPE_ITEM, bOldCell, iWearCell);
            }
con:
C++:
        if (item->EquipTo(this, iWearCell))
        {
            if(ITEM_UNIQUE == item->GetType() && item->GetCount() > 1 && item->IsStackable())
            {
                DWORD dwCount = item->GetCount();
                DWORD dwVnum = item->GetVnum();
                item->SetCount(1);
                LPITEM item2 = ITEM_MANAGER::instance().CreateItem( dwVnum, dwCount-1 );
                item2->AddToCharacter(this, TItemPos(INVENTORY, bOldCell));
            }
            SyncQuickslot(QUICKSLOT_TYPE_ITEM, bOldCell, iWearCell);
        }

Che cosa fa? Molto semplicemente se l'item è UNIQUE e nella cella ce n'è più di 1 e quell'oggetto UNIQUE è stackabile, viene preso il vnum e il count, setta l'item che viene equipaggiato a 1, e vi rimette nell'inventario, nella cella originale dove stava la stack, la quantità precedente meno 1.
Fine.
Enjoy (sempre che qualcuno la legga).
 
Di tanto in tanto continuo a leggere, tra tuuutti i vari problemi dei privati, uno in particolare (piuttosto richiesto tra l'altro): gli anelli/guanti del ladro sono stackabili ma la stack viene indossata interamente, facendo scadere il tempo a tutti gli oggetti di essa.
O vengono resi stackabili e si possono indossare senza buggarsi, o si tengono non stackabili. NON esiste una via di mezzo.

Perciò, ecco a voi una soluzione evergreen.

Aprite char_item.cpp e andate in:
C++:
bool CHARACTER::EquipItem(LPITEM item, int iCandidateCell)
Andate alla riga con:
C++:
BYTE bOldCell = item->GetCell();
o
C++:
WORD wOldCell = item->GetCell();
se avete le stack maggiori di 200 (o UCHAR_MAX).
Sostituite:
C++:
            if (item->EquipTo(this, iWearCell))
            {
                SyncQuickslot(QUICKSLOT_TYPE_ITEM, bOldCell, iWearCell);
            }
con:
C++:
        if (item->EquipTo(this, iWearCell))
        {
            if(ITEM_UNIQUE == item->GetType() && item->GetCount() > 1 && item->IsStackable())
            {
                DWORD dwCount = item->GetCount();
                DWORD dwVnum = item->GetVnum();
                item->SetCount(1);
                LPITEM item2 = ITEM_MANAGER::instance().CreateItem( dwVnum, dwCount-1 );
                item2->AddToCharacter(this, TItemPos(INVENTORY, bOldCell));
            }
            SyncQuickslot(QUICKSLOT_TYPE_ITEM, bOldCell, iWearCell);
        }

Che cosa fa? Molto semplicemente se l'item è UNIQUE e nella cella ce n'è più di 1 e quell'oggetto UNIQUE è stackabile, viene preso il vnum e il count, setta l'item che viene equipaggiato a 1, e vi rimette nell'inventario, nella cella originale dove stava la stack, la quantità precedente meno 1.
Fine.
Enjoy (sempre che qualcuno la legga).
Ottima soluzione, thanks!