Jucătorii se plâng des de inventarul plin: fiecare material ocupă un loc separat, licorile nu se adună. Alteori problema e invers: un item puternic poate fi folosit de un personaj de nivel 1. Ambele se reglează din câteva coloane ale `item_proto`. În lecția asta vezi cum funcționează **stivuirea** (adunarea mai multor bucăți într-un singur loc) și **limitele** (nivel cerut, atribute, durată).
ITEM_STACKABLE și nu are ANTI_STACK. Teancul are maximum 200 de bucăți în pachetul verificat, limită scrisă în cod și în baza de date. Nivelul cerut și durata se pun în coloanele LIMIT.Cuvinte pe care le vei întâlni
| Cuvânt | Ce înseamnă |
|---|---|
| Stivuire (stack) | Mai multe bucăți din același item într-o singură căsuță, cu un număr pe ea. |
| Teanc | O căsuță cu mai multe bucăți, de exemplu 150 de licori. |
| ITEM_STACKABLE | Flag-ul care permite stivuirea. |
| ANTI_STACK | Anti-flag-ul care o interzice, chiar dacă există ITEM_STACKABLE. |
| LIMIT | O condiție de folosire: nivel minim, putere minimă, durată. |
Partea 1: stivuirea
Ce decide dacă un item se stivuiește
Am verificat în sursa game (funcția de mutare a itemelor din char_item.cpp). Două teancuri se unesc doar dacă:
- itemul are flag-ul
ITEM_STACKABLEîn coloana FLAG; - nu are anti-flag-ul
ANTI_STACK; - ambele teancuri au același VNUM;
- au aceleași valori în socket-uri (datele ascunse ale itemului, de exemplu timpul rămas).
Exemple din pachetul verificat:
| Item | FLAG | Se stivuiește? |
|---|---|---|
| Licoare roșie (S), 27001 | ITEM_STACKABLE și ITEM_SLOW_QUERY | Da |
| Piele de talpă de urs, 30053 | ITEM_STACKABLE | Da |
| Sabie+0, 10 | ITEM_TUNABLE | Nu |
| Cufăr de începător, 50187 | NONE, plus ANTI_STACK | Nu |
De ce maximum 200
În sursa verificată, limita e o constantă: ITEM_MAX_COUNT = 200 în common/item_length.h. Valoarea 200 apare și scrisă direct în cod, la unirea teancurilor. În plus, în baza de date, coloana count din tabelul item e de tip tinyint unsigned, care nu poate ține mai mult de 255.
Asta înseamnă că nu poți mări teancul la 1000 doar din fișiere TXT. Ar trebui schimbate sursa serverului, sursa clientului și structura bazei de date, apoi recompilat totul. E o lucrare pentru un programator, testată foarte atent. Unele pachete gata modificate au deja teancuri mai mari; dacă al tău e unul dintre ele, limita e alta.
Comanda GM respectă și ea limita: /item 27001 500 îți dă tot 200.
Cum faci un item să se stivuiască
Exemplu: un material propriu, VNUM 95010, care nu se stivuia. În coloana FLAG a rândului lui din item_proto.txt:
NONEdevine:
ITEM_STACKABLEDacă erau deja alte flag-uri, îl adaugi lângă ele, despărțit prin bară verticală, de exemplu ITEM_STACKABLE | LOG. Apoi:
- verifici cu
diffcă s-a schimbat doar acea celulă; - refaci și item_proto-ul clientului (lecția Item nou, server + client), ca fereastra de împărțire a teancului să funcționeze corect;
- repornești serverul de test.
Ce nu are voie să se stivuiască
Nu activa stivuirea pentru iteme care au date unice pe fiecare bucată:
- arme și armuri (au bonusuri și pietre diferite);
- iteme cu durată (fiecare are timpul lui);
- iteme pe care un quest le „marchează” cu valori proprii.
Dacă le stivuiești, poți pierde sau amesteca datele dintre bucăți. Serverul verificat refuză să unească teancuri cu socket-uri diferite, dar nu te baza pe asta ca protecție: itemele astfel făcute trebuie proiectate pentru stivuire.
Partea 2: limitele (LIMIT)
Fiecare item are două condiții, în coloanele LIMIT_TYPE0/LIMIT_VALUE0 și LIMIT_TYPE1/LIMIT_VALUE1. Tipurile acceptate în pachetul verificat, din codul care citește fișierul:
| Tip | Ce înseamnă |
|---|---|
LIMIT_NONE | Fără condiție |
LEVEL | Nivel minim |
STR, DEX, INT, CON | Valoare minimă la un atribut |
REAL_TIME | Durată reală, în secunde, care curge de la creare |
REAL_TIME_FIRST_USE | Durată care începe la prima folosire |
TIMER_BASED_ON_WEAR | Durată care curge doar cât timp itemul e echipat |
Atenție la nume: în acest fișier se scrie LEVEL, nu LIMIT_LEVEL. Un tip scris greșit oprește încărcarea itemelor, iar în syserr apare „ItemProto Reading Failed”.
Exemplu verificat: o sabie de nivel 75 (VNUM 189) are:
LEVEL 75 LIMIT_NONE 0Ca să ceară nivelul 70, schimbi doar 75 în 70. Pentru un item care dispare după 7 zile de la creare, folosești REAL_TIME cu 604800 (7 × 24 × 3600 secunde).
Ce ar trebui să vezi: un personaj sub nivelul cerut primește un mesaj că nu poate echipa itemul; tooltip-ul (după actualizarea clientului) arată nivelul nou.
Cum testezi stivuirea
Pe serverul de test, cu GM-ul:
/item 30053 200
/item 30053 50| Test | Ce ar trebui să vezi |
|---|---|
| Primești 200, apoi 50 | Un teanc de 200 și unul de 50 |
| Tragi teancul de 50 peste cel de 200 | Nu se poate depăși 200; cele 50 rămân separat |
| Împarți un teanc (Shift + tragere) | Două teancuri, suma rămâne aceeași |
| Pui teancul în depozit și îl scoți | Aceeași cantitate |
| Dai teancul la schimb (trade) | Celălalt primește exact cantitatea |
| Relog | Cantitățile rămân identice |
Notează de fiecare dată cantitatea înainte și după. Orice bucată „apărută” sau „dispărută” e un semnal de problemă, posibil chiar o cale de dublare.
Greșeli des întâlnite
- Pui ITEM_STACKABLE pe arme sau pe iteme cu durată. Datele unice se pot amesteca.
- Schimbi doar serverul. Clientul nu afișează corect numărul sau nu permite împărțirea.
- Crezi că poți pune 999 în fișiere. Limita e în cod și în baza de date.
- Scrii
LIMIT_LEVELîn loc deLEVEL. Serverul nu mai încarcă itemele. - Uiți de ANTI_STACK. Ai pus ITEM_STACKABLE, dar itemul are și ANTI_STACK și tot nu se adună.
Întrebări frecvente
De ce două licori identice nu se adună?
De obicei, una are date diferite în socket-uri (de exemplu, vine dintr-un sistem care le marchează). Verifică și dacă itemul are ANTI_STACK.
Pot pune două condiții, nivel și putere?
Da: LEVEL în prima pereche și STR în a doua. Ambele trebuie îndeplinite.
Schimbarea de nivel se aplică și itemelor echipate deja?
Condiția se verifică la echipare. Testează pe serverul de test ce se întâmplă cu un item deja echipat, la relog, în pachetul tău.
Ce urmează
Lecția următoare: Verifici că un item nou merge la trade și depozit. Toate lecțiile sunt în lista tutorialelor Metin2.
Server Metin2 gata de joc
Găzduire Metin2 în România, cu instalare de serverfiles, bază de date MySQL și protecție Anti-DDoS inclusă.