Administrator
Administrator
  • Mesaje: 4965
    Membru din: 07 Aug 2024, 18:53
  • Reacții: 125343
  • Mesaje utile: 47
  • Status: Pe aici.. 🤠
    Server: Saga2 - Soon
  • Regat: Jinno
  • [ID Discord]
  • *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:

    Cod: Selectaţi tot

    BYTE  : 0 - 255
    WORD  : 0 - 65535
    DWORD : 0 - ~4.29 miliarde

    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:

    Cod: Selectaţi tot

    put
    get
    move
    remove
    save
    load
    size
    checkout

    Nu modifica doar packet-ul de trimitere.

    Verifica ambele directii:

    Cod: Selectaţi tot

    Client -> Server
    Server -> Client

    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:

    Cod: Selectaţi tot

    Storage Checkout
    Object Market Checkout

    Daca modifici un struct comun, verifica toate locurile unde este folosit.


    Verifica si packet-urile dintre:

    Cod: Selectaţi tot

    GAME <-> DB

    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:

    Cod: Selectaţi tot

    item.count TINYINT

    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:

    Cod: Selectaţi tot

    Python -> Client C++ -> Packet -> Game -> DB -> Game -> Packet -> Client

    Daca un singur punct ramane pe 8 biti, overflow-ul poate reaparea.

    Nou Cum descarc de pe TeraBox?

    Afișează detalii Ascunde detalii
    • Este asemănător cu Mega.nz
    • Instalați-vă clientul lor de Download de aici
    • Faceți-vă un cont (vă puteți loga cu Facebook / Google / etc)
    • Nou Dacă nu vreți să descărcați clientul de Download, folosiți acest site
    • Gata! Acum puteți descărca resursele rapid & simplu.

    De ce folosim TeraBox?

    • Este gratuit
    • Primești 1TB de spațiu gratuit la orice cont creat!
    • Este ușor de folosit și varianta premium este foarte ieftină
    • Fișierele nu sunt șterse niciodată
    TeraBox logo
    See full signature

    Înapoi la “FIX-uri”

    Informații

    Utilizatori ce navighează pe acest forum: Niciun utilizator înregistrat și 2 vizitatori

    Discord ID copiat: