Înapoi la blogToate tutorialele Metin2
Tutoriale Metin2 · Lecția 37 din 99

Stivuirea și limitele unui item în Metin2: teancuri de 200, nivel cerut și durată

2 noiembrie 2026 6 min de citit

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ă).

Pe scurt: un item se stivuiește dacă are flag-ul 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ântCe înseamnă
Stivuire (stack)Mai multe bucăți din același item într-o singură căsuță, cu un număr pe ea.
TeancO căsuță cu mai multe bucăți, de exemplu 150 de licori.
ITEM_STACKABLEFlag-ul care permite stivuirea.
ANTI_STACKAnti-flag-ul care o interzice, chiar dacă există ITEM_STACKABLE.
LIMITO 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ă:

  1. itemul are flag-ul ITEM_STACKABLE în coloana FLAG;
  2. nu are anti-flag-ul ANTI_STACK;
  3. ambele teancuri au același VNUM;
  4. au aceleași valori în socket-uri (datele ascunse ale itemului, de exemplu timpul rămas).

Exemple din pachetul verificat:

ItemFLAGSe stivuiește?
Licoare roșie (S), 27001ITEM_STACKABLE și ITEM_SLOW_QUERYDa
Piele de talpă de urs, 30053ITEM_STACKABLEDa
Sabie+0, 10ITEM_TUNABLENu
Cufăr de începător, 50187NONE, plus ANTI_STACKNu

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:

text
NONE

devine:

text
ITEM_STACKABLE

Dacă erau deja alte flag-uri, îl adaugi lângă ele, despărțit prin bară verticală, de exemplu ITEM_STACKABLE | LOG. Apoi:

  1. verifici cu diff că s-a schimbat doar acea celulă;
  2. refaci și item_proto-ul clientului (lecția Item nou, server + client), ca fereastra de împărțire a teancului să funcționeze corect;
  3. 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:

TipCe înseamnă
LIMIT_NONEFără condiție
LEVELNivel minim
STR, DEX, INT, CONValoare minimă la un atribut
REAL_TIMEDurată reală, în secunde, care curge de la creare
REAL_TIME_FIRST_USEDurată care începe la prima folosire
TIMER_BASED_ON_WEARDurată 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:

text
LEVEL	75	LIMIT_NONE	0

Ca 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:

text
/item 30053 200
/item 30053 50
TestCe ar trebui să vezi
Primești 200, apoi 50Un teanc de 200 și unul de 50
Tragi teancul de 50 peste cel de 200Nu 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țiAceeași cantitate
Dai teancul la schimb (trade)Celălalt primește exact cantitatea
RelogCantităț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 de LEVEL. 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ă.

DiscordWhatsApp