Mai jos vei invata cum sa faci un obiect (bless/pergamente/cufere/etc.) sa fie stacabile.
Adica, sa se suprapuna mai multe iteme si sa faca stack (Exemplu: Daca ai mai multe "Cufar Costum" in inventar, sa le poti pune unul peste altul)
Daca serverul tau citeste .txt, atunci intra in item_proto.txt si cauta itemul pe care vrei sa-l faci stackabil. Exista iteme pentru care aceasta modificare functioneaza direct, dar, pentru iteme precum Bless-ul sau Pietrele, va trebui sa facem anumite ajustari din Sursa si din client.
Exemplu pentru bless: Vnum 25040
Code:
25040 Bless ITEM_USE USE_TUNING 1 NONE NONE NONE NONE 5000 5000 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 0 0 0 0 0 0 0 0
Code:
25040 Bless ITEM_USE USE_TUNING 1 NONE ITEM_STACKABLENONE NONE 5000 5000 0 0 0 LIMIT_NONE 0 LIMIT_NONE 0 APPLY_NONE 0 APPLY_NONE 0 APPLY_NONE 0 0 0 0 0 0 0 0 0 0
Intra in Navicat, cauta itemul dorit in tabelul item_proto, si la coloana flag introdu valoarea 4 pentru a face itemul stackabil.
Daca vrem sa stackam pietre, trebuie sa facem un mic FIX in sursa
1. Deschidem common/service.h iar aici adaugam:
#define ENABLE_STONES_STACKFIX
2. Intram in char_item.cpp si cautam
Code:
bool CHARACTER::DoRefine(LPITEM item, bool bMoneyOnly):
// END_OF_REFINE_COST
if (prob <= prt->prob)
{
LPITEM pkNewItem = ITEM_MANAGER::instance().CreateItem(result_vnum, 1, 0, false);
Code:
pkNewItem->AddToCharacter(this, TItemPos(INVENTORY, bCell));
ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (REFINE SUCCESS)");
Cautam:
Code:
bool CHARACTER::DoRefineWithScroll(LPITEM item):
if (prob <= success_prob)
{
LPITEM pkNewItem = ITEM_MANAGER::instance().CreateItem(result_vnum, 1, 0, false);
Code:
pkNewItem->AddToCharacter(this, TItemPos(INVENTORY, bCell));
ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (REFINE SUCCESS)");
Cautam:
Code:
else if (!bDestroyWhenFail && result_fail_vnum)
{
LPITEM pkNewItem = ITEM_MANAGER::instance().CreateItem(result_fail_vnum, 1, 0, false);
Code:
pkNewItem->AddToCharacter(this, TItemPos(INVENTORY, bCell));
ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (REFINE FAIL)");
Cautam:
Code:
ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (METIN)");
Cautam:
Code:
bool CHARACTER::DoRefineWithScroll(LPITEM item)
{
if (!CanHandleItem(true))
{
ClearRefineMode();
return false;
}
Adaugam sub:
Cautam:
Code:
bool CHARACTER::DoRefine(LPITEM item, bool bMoneyOnly)
{
if (!CanHandleItem(true))
{
ClearRefineMode();
return false;
}
Cautam:
Code:
bool CHARACTER::DoRefine(LPITEM item, bool bMoneyOnly):
Code:
else
{
// Eșec! Toate obiectele dispar.
DBManager::instance().SendMoneyLog(MONEY_LOG_REFINE, item->GetVnum(), -cost);
NotifyRefineFail(this, item, IsRefineThroughGuild() ? "GUILD" : "POWER");
item->AttrLog();
ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (REFINE FAIL)");
//PointChange(POINT_GOLD, -cost);
PayRefineFee(cost);
}
return true;
}
Deschidem uiinventory.py si cautam:
Code:
def __CanUseSrcItemToDstItem(self, srcItemVNum, srcSlotPos, dstSlotPos):
Code:
if srcSlotPos == dstSlotPos:
return False
Code:
elif (player.GetItemFlags(srcSlotPos) & ITEM_FLAG_APPLICABLE) == ITEM_FLAG_APPLICABLE:
return True
Cautam:
Code:
def __DropSrcItemToDestItemInInventory(self, srcItemVID, srcItemSlotPos, dstItemSlotPos):
if srcItemSlotPos == dstItemSlotPos:
return;
Code:
else:
#snd.PlaySound("sound/ui/drop.wav")