*Descriere:
Metin2 Inventory & Storage BYTE Overflow Fix - Sloturi peste 255
Acest ghid explica problema de overflow care apare atunci cand extinzi inventarul sau depozitul peste limita unui BYTE. Daca un slot, count sau index ramane pe 8 biti, valorile peste 255 pot reveni la inceput, deveni negative sau crea ghost items.
- explica de ce slotul 260 poate ajunge in slotul 4;
- ajuta la identificarea tipurilor prea mici din packet-uri;
- acopera traseul Client -> Game -> DB;
- util pentru inventory, storage si sisteme custom cu multe sloturi.
*Link download / Code:
Inainte de modificari, tine cont de limitele tipurilor:
Daca un slot cu valoarea:
este transmis printr-un BYTE, valoarea poate ajunge:
Acesta este motivul pentru care un item pus intr-un slot mare poate aparea din nou pe prima pagina.
Simptomele cele mai comune sunt:
- sloturile mari revin la valori mici;
- apar ghost items;
- itemele par mutate sau disparute;
- valorile mai mari de 255 sunt afisate gresit;
- dupa restart, itemele pot reveni in alte pozitii;
- count-urile mari pot fi trunchiate.
Cand maresti inventarul sau depozitul, verifica tot traseul valorii.
Trebuie verificate operatiile de:
Nu modifica doar packet-ul de trimitere.
Verifica ambele directii:
Pe Client Source, verifica in special:
- tipul folosit cand valoarea vine din Python;
- tipul variabilei C++;
- semnatura functiei Send;
- struct-ul packet-ului trimis.
Daca valoarea este citita cu un tip de 8 biti, marirea doar a packet-ului nu rezolva problema.
Pe Game Source, verifica:
- struct-urile packet-urilor;
- argumentele functiilor;
- variabilele care tin slotul;
- functiile de move / checkout / remove;
- packet-urile trimise inapoi spre client.
Ai grija la struct-urile reutilizate.
Un acelasi struct poate fi folosit de mai multe sisteme, de exemplu:
Daca modifici un struct comun, verifica toate locurile unde este folosit.
Verifica si packet-urile dintre:
Daca item-ul este afisat corect in joc, dar dupa restart pozitia sau count-ul se strica, problema este foarte posibil sa fie in packet-urile Game -> DB sau DB -> Game.
Verifica si structurile folosite la salvarea itemelor.
La nivel de baza de date, verifica tipul coloanelor.
De exemplu, daca ai:
limita ramane:
chiar daca in cod ai schimbat tipul cu unul mai mare.
Dupa ce maresti tipurile, Client, Game si DB trebuie recompilate si distribuite impreuna.
Nu lasa o componenta pe structurile vechi, deoarece dimensiunea packet-urilor nu va mai corespunde si pot aparea erori noi.
Regula generala este simpla: orice valoare care poate depasi 255 nu trebuie sa ramana pe BYTE pe niciun punct din traseu.
Pentru fiecare sistem extins, urmareste valoarea cap-coada:
Daca un singur punct ramane pe 8 biti, overflow-ul poate reaparea.
Metin2 Inventory & Storage BYTE Overflow Fix - Sloturi peste 255
Acest ghid explica problema de overflow care apare atunci cand extinzi inventarul sau depozitul peste limita unui BYTE. Daca un slot, count sau index ramane pe 8 biti, valorile peste 255 pot reveni la inceput, deveni negative sau crea ghost items.
- explica de ce slotul 260 poate ajunge in slotul 4;
- ajuta la identificarea tipurilor prea mici din packet-uri;
- acopera traseul Client -> Game -> DB;
- util pentru inventory, storage si sisteme custom cu multe sloturi.
*Link download / Code:
Inainte de modificari, tine cont de limitele tipurilor:
Cod: Selectaţi tot
BYTE : 0 - 255
WORD : 0 - 65535
DWORD : 0 - ~4.29 miliardeDaca un slot cu valoarea:
Cod: Selectaţi tot
260este transmis printr-un BYTE, valoarea poate ajunge:
Cod: Selectaţi tot
4Acesta este motivul pentru care un item pus intr-un slot mare poate aparea din nou pe prima pagina.
Simptomele cele mai comune sunt:
- sloturile mari revin la valori mici;
- apar ghost items;
- itemele par mutate sau disparute;
- valorile mai mari de 255 sunt afisate gresit;
- dupa restart, itemele pot reveni in alte pozitii;
- count-urile mari pot fi trunchiate.
Cand maresti inventarul sau depozitul, verifica tot traseul valorii.
Trebuie verificate operatiile de:
Cod: Selectaţi tot
put
get
move
remove
save
load
size
checkoutNu modifica doar packet-ul de trimitere.
Verifica ambele directii:
Cod: Selectaţi tot
Client -> Server
Server -> ClientPe Client Source, verifica in special:
- tipul folosit cand valoarea vine din Python;
- tipul variabilei C++;
- semnatura functiei Send;
- struct-ul packet-ului trimis.
Daca valoarea este citita cu un tip de 8 biti, marirea doar a packet-ului nu rezolva problema.
Pe Game Source, verifica:
- struct-urile packet-urilor;
- argumentele functiilor;
- variabilele care tin slotul;
- functiile de move / checkout / remove;
- packet-urile trimise inapoi spre client.
Ai grija la struct-urile reutilizate.
Un acelasi struct poate fi folosit de mai multe sisteme, de exemplu:
Cod: Selectaţi tot
Storage Checkout
Object Market CheckoutDaca modifici un struct comun, verifica toate locurile unde este folosit.
Verifica si packet-urile dintre:
Cod: Selectaţi tot
GAME <-> DBDaca item-ul este afisat corect in joc, dar dupa restart pozitia sau count-ul se strica, problema este foarte posibil sa fie in packet-urile Game -> DB sau DB -> Game.
Verifica si structurile folosite la salvarea itemelor.
La nivel de baza de date, verifica tipul coloanelor.
De exemplu, daca ai:
Cod: Selectaţi tot
item.count TINYINTlimita ramane:
Cod: Selectaţi tot
255chiar daca in cod ai schimbat tipul cu unul mai mare.
Dupa ce maresti tipurile, Client, Game si DB trebuie recompilate si distribuite impreuna.
Nu lasa o componenta pe structurile vechi, deoarece dimensiunea packet-urilor nu va mai corespunde si pot aparea erori noi.
Regula generala este simpla: orice valoare care poate depasi 255 nu trebuie sa ramana pe BYTE pe niciun punct din traseu.
Pentru fiecare sistem extins, urmareste valoarea cap-coada:
Cod: Selectaţi tot
Python -> Client C++ -> Packet -> Game -> DB -> Game -> Packet -> ClientDaca un singur punct ramane pe 8 biti, overflow-ul poate reaparea.




