*Descriere:
Mai jos vei afla cum sa implementezi 4 pagini inventare pe serverul tau de Metin2.
Tutorial destinat pentru cei care au 2 pagini de inventar!
Daca ai inceput pe un proiect nou, pe un
serverfiles vanilla (clean de tot), vei vedea ca vine la pachet cu clasicele 2 inventare.
Tutorialul va adauga 4 pagini, exact ca in pozele de mai jos. Daca vrei design ca pe Oficial (butoanele sa fie mai mici, unul dupa altul), trebuie sa sa faci modificari in python.
Vei afla cum sa mai adaugi 2, astfel jucatorii tai se pot bucura de mai mult spatiu cu 4 pagini de inventar.
FIX in caz ca aveti BUG la negot:
Show Spoiler
In caz ca aveti probleme la negot dupa ce faceti tutorialul de mai jos, aveti aici un fix.:
In exchange.cpp
Cautati:
for (i = 0; i < INVENTORY_MAX_NUM / 4; ++i)
{
if (!(item = victim->GetInventoryItem(i)))
continue;
s_grid1.Put(i, 1, item->GetSize());
}
for (i = INVENTORY_MAX_NUM / 4; i < INVENTORY_MAX_NUM; ++i)
{
if (!(item = victim->GetInventoryItem(i)))
continue;
s_grid2.Put(i - INVENTORY_MAX_NUM / 4, 1, item->GetSize());
}
Schimbati cu:
for (i = 0; i < INVENTORY_MAX_NUM / 4; ++i)
{
if (!(item = victim->GetInventoryItem(i)))
continue;
s_grid1.Put(i, 1, item->GetSize());
}
for (i = INVENTORY_MAX_NUM / 4; i < (INVENTORY_MAX_NUM / 4) * 2; ++i)
{
if (!(item = victim->GetInventoryItem(i)))
continue;
s_grid2.Put(i - INVENTORY_MAX_NUM / 4, 1, item->GetSize());
}
for (i = (INVENTORY_MAX_NUM / 4) * 2; i < (INVENTORY_MAX_NUM / 4) * 3; ++i)
{
if (!(item = victim->GetInventoryItem(i)))
continue;
s_grid3.Put(i - (INVENTORY_MAX_NUM / 4) * 2, 1, item->GetSize());
}
for (i = (INVENTORY_MAX_NUM / 4) * 3; i < (INVENTORY_MAX_NUM / 4) * 4; ++i)
{
if (!(item = victim->GetInventoryItem(i)))
continue;
s_grid4.Put(i -(INVENTORY_MAX_NUM / 4) * 3, 1, item->GetSize());
}
Tot aici cautati:
int iPos = s_grid1.FindBlank(1, item->GetSize());
if (iPos >= 0)
{
s_grid1.Put(iPos, 1, item->GetSize());
}
else
{
iPos = s_grid2.FindBlank(1, item->GetSize());
if (iPos >= 0)
{
s_grid2.Put(iPos, 1, item->GetSize());
}
else
{
return false;
}
}
}
}
return true;
}
Inlocuiti tot cu:
int iPos = s_grid1.FindBlank(1, item->GetSize());
if (iPos >= 0) {
s_grid1.Put(iPos, 1, item->GetSize());
continue;
}
iPos = s_grid2.FindBlank(1, item->GetSize());
if (iPos >= 0) {
s_grid2.Put(iPos, 1, item->GetSize());
continue;
}
iPos = s_grid3.FindBlank(1, item->GetSize());
if (iPos >= 0) {
s_grid3.Put(iPos, 1, item->GetSize());
continue;
}
iPos = s_grid4.FindBlank(1, item->GetSize());
if (iPos >= 0) {
s_grid4.Put(iPos, 1, item->GetSize());
continue;
}
return false; // No space left in inventory
}
}
return true;
}
*Poze / Video:
*Link download / Code:
Tutorial 4 Inventory Pages - FULL:
Deschidem
char_item.cpp si cautam:
BYTE bPage = bCell / (INVENTORY_MAX_NUM / 2);
Modificam asa:
Reacționează
la acest mesaj și conținutul se va afișa automat.
(e in 2 locuri, atentie!)
Acum cautam:
if (p / (INVENTORY_MAX_NUM / 2) != bPage) (si asta tot in 2 parti)
Modificam asa:
Reacționează
la acest mesaj și conținutul se va afișa automat.
Deschidem
exchange.cpp si cautam:
static CGrid s_grid1(5, INVENTORY_MAX_NUM/5 / 2); // inven page 1
static CGrid s_grid2(5, INVENTORY_MAX_NUM/5 / 2); // inven page 2
În loc de ele adăugați:
Reacționează
la acest mesaj și conținutul se va afișa automat.
Cautam:
s_grid1.Clear();
s_grid2.Clear();
Modificam asa:
Reacționează
la acest mesaj și conținutul se va afișa automat.
Cautam:
for (i = 0; i < INVENTORY_MAX_NUM / 4; ++i)
{
if (!(item = victim->GetInventoryItem(i)))
continue;
s_grid1.Put(i, 1, item->GetSize());
}
for (i = INVENTORY_MAX_NUM / 4; i < INVENTORY_MAX_NUM; ++i)
{
if (!(item = victim->GetInventoryItem(i)))
continue;
s_grid2.Put(i - INVENTORY_MAX_NUM / 4, 1, item->GetSize());
}
Modificam asa / inlocuim:
Reacționează
la acest mesaj și conținutul se va afișa automat.
Mergem in
/usr/src/your_source/Srcs/Server/common , deschidem
lenght.h si cautam::
În loc de 90 treceți 180.
Deschidem sursa binary si mergem in fisierul
GameType.h . Aici cautam:
const DWORD c_Inventory_Page_Count = 2;
Modificam asa:
Reacționează
la acest mesaj și conținutul se va afișa automat.
Despachetam locale din
pack si deschidem
inventorywindow.py Inlocuiti tot fisierul / adaptati sa fie asa:
Reacționează
la acest mesaj și conținutul se va afișa automat.
Mergem in root si deschidem
uiinventory.py , unde cautam:
self.inventoryTab.append(self.GetChild("Inventory_Tab_02"))
Adaugam sub:
Reacționează
la acest mesaj și conținutul se va afișa automat.
Cautam:
self.inventoryTab[0].SetEvent(lambda arg=0: self.SetInventoryPage(arg))
self.inventoryTab[1].SetEvent(lambda arg=1: self.SetInventoryPage(arg))
self.inventoryTab[0].Down()
Modificam asa:
Reacționează
la acest mesaj și conținutul se va afișa automat.
Cautam func.
SetInventoryPage si o inlocuim / adaptam asa:
Reacționează
la acest mesaj și conținutul se va afișa automat.
Acum, in
locale_interface.txt adaugam:
INVENTORY_PAGE_BUTTON_TOOLTIP_1 1. Inventar
INVENTORY_PAGE_BUTTON_TOOLTIP_2 2. Inventar
INVENTORY_PAGE_BUTTON_TOOLTIP_3 3. Inventar
INVENTORY_PAGE_BUTTON_TOOLTIP_4 4. Inventar