Itemele sunt „banii” serverului tău. Când un update atinge ceva legat de ele (un item nou, o fereastră nouă, binare noi de `game`), cele mai sensibile locuri sunt trade-ul, depozitul și inventarul. O greșeală aici are două forme, ambele grave: un item **dispare** (jucător supărat) sau un item **apare de două ori** (dupe, care strică economia). În această lecție îți faci o listă de teste pe care o rulezi după fiecare update de acest fel, întâi pe serverul de test, apoi rapid pe live.
Cuvinte pe care le vei întâlni
| Cuvânt | Ce înseamnă |
|---|---|
| Trade (schimb) | Fereastra în care doi jucători își dau iteme și yang. |
| Depozit (safebox) | Spațiul de depozitare al contului, comun tuturor personajelor lui. |
| Stivă (stack) | Mai multe bucăți din același item într-o singură căsuță. |
| Dupe | Un item copiat printr-o eroare: există de două ori, deși a fost creat o dată. |
| Relog | Te deloghezi și te loghezi din nou. |
De ce aceste trei locuri
Când muți un item, serverul îl scoate dintr-un loc și îl pune în altul, apoi salvarea ajunge în baza de date mai târziu (vezi cum salvează db datele). Dacă ceva se rupe la mijloc (un canal schimbat, un restart, o fereastră nouă care nu verifică totul), itemul poate rămâne în ambele locuri sau în niciunul. Trade-ul, depozitul și inventarul sunt exact locurile unde se mută cel mai des.
Pasul 1: Pregătește-te pe serverul de test
- Două conturi de test: A și B, fiecare cu un personaj.
- Pe A, câteva iteme ușor de recunoscut: o armă (de exemplu Sabie+9, VNUM
19în pachetele clasice), o stivă de poțiuni, puțin yang. Le creezi cu comenzile de GM pe serverul de test. - Dacă update-ul a adus un item nou, include-l și pe el.
- O foaie cu trei coloane: înainte, după, observație.
Notează pe foaie ce are fiecare personaj: ce iteme, câte bucăți, cât yang. Verifică și în baza de date (vezi Pasul 4).
Pasul 2: Rulează testele, unul câte unul
| Nr. | Ce faci | Ce trebuie să iasă |
|---|---|---|
| 1 | A îi dă lui B arma prin trade | Arma e doar la B |
| 2 | A îi dă lui B jumătate din stiva de poțiuni | Totalul A + B e același ca înainte |
| 3 | A îi dă lui B yang prin trade | Yang total A + B neschimbat |
| 4 | Trade cu inventarul lui B plin | Trade-ul e refuzat, nimic nu dispare |
| 5 | Trade anulat în ultimul moment | Fiecare își păstrează itemele |
| 6 | B pune arma în depozit, închide, redeschide | Arma e în depozit |
| 7 | B ia arma din depozit | Arma e în inventar, depozitul e gol |
| 8 | Itemul nou pus în depozit și scos înapoi | Același item, aceleași bonusuri |
| 9 | Relog după testele de mai sus | Totul e unde l-ai lăsat |
| 10 | Schimbare de canal | Totul e unde l-ai lăsat |
| 11 | Restart complet al serverului de test | Totul e unde l-ai lăsat |
Fă câte un test o dată și notează rezultatul înainte să treci la următorul. Dacă un test eșuează, te oprești: nu mai are sens să continui până nu afli de ce.
Testele 9, 10 și 11 sunt cele mai importante. Multe probleme nu se văd imediat, ci abia după ce datele trec prin salvare și se încarcă din nou. Un item care arată bine în fereastră, dar dispare după relog, e o problemă de salvare.
Pasul 3: Testează și cazurile „urâte”
Jucătorii nu fac doar ce te aștepți. Încearcă și:
- dublu-click rapid pe butonul de acceptare la trade;
- deschiderea depozitului și mutarea rapidă a mai multor iteme;
- delogare imediat după trade;
- trade cu un item care, conform setărilor lui din
item_proto, nu ar trebui să se poată schimba (vezi itemul nou la trade și depozit).
Nu încerca să „spargi” serverul live. Aceste teste se fac doar pe test.
Pasul 4: Confirmă din baza de date
Ce vezi în joc trebuie să se potrivească cu ce e în baza de date. Pe serverul de test, după restartul de la testul 11 (ca datele să fie sigur salvate), rulează:
SELECT window, vnum, SUM(count) AS total FROM player.item WHERE owner_id IN (4567, 4568) GROUP BY window, vnum;Pune în paranteză ID-urile personajelor A și B (le găsești în player.player). Comanda numără, pe fiecare fereastră și pe fiecare VNUM, câte bucăți au.
Pentru depozit, adaugă ID-urile conturilor, pentru că itemele din depozit au ca proprietar contul:
SELECT vnum, SUM(count) AS total FROM player.item WHERE owner_id IN (123, 124) AND window = 'SAFEBOX' GROUP BY vnum;Yang-ul personajelor e în coloana gold din player.player:
SELECT id, name, gold FROM player.player WHERE id IN (4567, 4568);Ce ar trebui să vezi: totalurile identice cu cele de dinainte de teste. Dacă arma apare de două ori, ai un dupe. Dacă lipsește, ai o pierdere. Ambele înseamnă: update-ul nu merge pe live.
Pe serverul live nu numeri itemele jucătorilor reali, dar poți folosi aceleași comenzi pe personajele tale de test, după mentenanță.
Pasul 5: Uită-te în jurnale
syserrdin core-uri și dindb: erori noi apărute în timpul testelor?- Tabelul
log.log: în pachetul verificat, schimburile apar cuEXCHANGE_GIVEșiEXCHANGE_TAKEîn coloanahow. Dacă trade-ul a mers, dar nu apare în log, sistemul de jurnale e oprit sau a fost modificat.
Pasul 6: Versiunea scurtă, pe live
După mentenanță, pe serverul live, cu personajele tale de test, repetă rapid testele 1, 6, 7 și 9. Durează cinci minute și îți confirmă că ce a mers pe test merge și pe live. Abia apoi deschizi serverul (vezi planul de mentenanță).
Greșeli des întâlnite
- Testezi doar în fereastră, fără relog sau restart. Problemele de salvare se văd doar după.
- Testezi cu un singur cont. Trade-ul are nevoie de doi.
- Nu numeri înainte. Fără „înainte” nu poți dovedi că lipsește sau s-a dublat ceva.
- Cauți depozitul cu ID-ul personajului. Itemele din depozit au ca proprietar contul.
- Treci peste un test eșuat „că e o întâmplare”. Dupe-urile încep exact așa.
Întrebări frecvente
Trebuie să fac toate testele la fiecare update?
La fiecare update care atinge iteme, ferestre de inventar sau binarele game/db, da. Pentru o schimbare doar de drop sau de text, ajunge o verificare scurtă.
Ce fac dacă descopăr un dupe pe live?
Nu șterge iteme la întâmplare. Fă backup imediat, notează ce ai observat, verifică log.log ca să vezi de unde vine și, dacă e nevoie, oprește temporar funcția afectată. Apoi repari pe serverul de test.
Trebuie să testez și magazinele personale?
Da, dacă update-ul le atinge. Aplică aceeași idee: numeri înainte, cumperi, numeri după, relog, restart.
Ce urmează
Multe update-uri au și o parte de client. Lecția următoare: cum pregătești un update de client cu autopatcher. 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ă.