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

xXIntelXx

Utente Platinum
18 Ottobre 2009
5,087
40
1,430
1,066
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).
 

Thomas Shelby

Utente Emerald
28 Giugno 2020
1,501
26
590
445
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!