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

Compilarea programului game din sursa Metin2: comenzi, verificare și test

2 noiembrie 2026 5 min de citit

`game` este programul care face jocul să existe: monștri, lupte, dropuri, questuri, hărți. În pachetul verificat, același fișier rulează ca `auth`, ca fiecare canal și ca `game99`. Îl compilezi atunci când schimbi ceva în codul C++ al jocului. Prima dată, însă, îl compilezi **fără nicio modificare**. Așa afli dacă mediul tău e corect, înainte să complici lucrurile.

Pe scurt: cu librăriile gata, intri în game/src, rulezi gmake cu log salvat, verifici fișierul rezultat și îl testezi pe serverul de test: login, monstru, cufăr, NPC, schimbare de canal, relogare. Abia când sursa nemodificată trece toate testele, începi să schimbi cod.

Nivel: Avansat. Ce trebuie să știi înainte: mediul de compilare (cu GAMEDIR schimbat), librăriile compilate și, ideal, compilarea db, care e mai mică și te încălzește.

Cuvinte pe care le vei întâlni

CuvântCe înseamnă
BuildRezultatul unei compilări (sau compilarea însăși). „Un build curat” = fără erori.
Simboluri de depanareInformații puse în program (flag-ul -g) care arată, la un crash, fișierul și rândul din cod.
OBJDIRFolderul unde se pun fișierele intermediare .o ale lui game.
Cod de ieșire (exit code)Numărul cu care se termină o comandă. 0 = fără eroare.

Pasul 1: Citește rețeta

sh
cd /usr/home/sursa/game/src
grep -n "^CC\|^CFLAGS\|^GAMEDIR\|^TARGET" Makefile

În sursa verificată, CFLAGS începe cu -g -Wall -w -O2 -m32 -pipe -std=c++2a. Pe românește:

FlagCe face
-gPune simbolurile de depanare. Fără ele, un crash e aproape imposibil de citit.
-wAscunde avertismentele. Erorile adevărate apar în continuare.
-O2Optimizare: programul merge mai repede.
-m32Program pe 32 de biți.
-std=c++2aVersiunea limbajului C++ folosită.

Verifică încă o dată că GAMEDIR arată spre /usr/home/build, nu spre un server pornit.

Pasul 2: Compilează

sh
touch Depend
gmake dep
gmake clean
gmake 2>&1 | tee /usr/home/build/game-build.log

Sursa verificată are peste 150 de fișiere .cpp doar în game/src, deci durează mai mult decât db. Pe un server de test cu două nuclee poți folosi gmake -j2 în loc de gmake, ca să meargă mai repede. Dacă apar erori, revino la gmake simplu: așa erorile nu se amestecă în log.

Ce ar trebui să vezi: multe rânduri compile ...cpp, apoi:

text
linking ../game....
Moving ../game to /usr/home/build
All done! Your game file moved to your server directory.

Atenție: când trimiți rezultatul prin tee, codul de ieșire pe care îl vezi e al lui tee, nu al lui gmake. De aceea nu te baza pe el. Caută erorile direct în log:

sh
grep -n "error" /usr/home/build/game-build.log | head -20

Dacă nu apare nimic și fișierul game există în /usr/home/build, compilarea a reușit.

Pasul 3: Verifică programul

sh
cd /usr/home/build
ls -lh game
file game
ldd game
sha256 game
mv game game-2026-11-02-nemodificat

Ce ar trebui să vezi:

  • file: aceeași arhitectură ca vechiul game (la noi ELF 32-bit ... Intel i386) și, datorită lui -g, with debug_info, not stripped.
  • ls -lh: un fișier mare, de zeci de MB. E normal din cauza simbolurilor de depanare. În pachetul verificat, game are în jur de 80 MB.
  • ldd: nicio librărie cu not found.

Notează amprenta sha256 în jurnalul tău.

Pasul 4: Testul complet pe serverul de test

Un build care se termină fără erori nu înseamnă un joc care merge. Pune-l pe serverul de test (pașii exacți sunt în cum pui binarele pe server) și verifică:

  1. Pornesc toate core-urile, în ordine: întâi db, apoi auth, apoi canalele.
  2. syserr din fiecare folder de core nu are erori noi.
  3. Te loghezi și alegi personajul.
  4. Omori un monstru și iei dropul.
  5. Deschizi un cufăr.
  6. Vorbești cu un NPC care are quest.
  7. Schimbi canalul.
  8. Ieși și intri din nou: totul e la locul lui.

Compară cu ce făcea vechiul game. Fiindcă n-ai modificat nimic în cod, comportamentul trebuie să fie identic.

De ce nu pornește

Ce veziCe înseamnăCe faci
Shared object "..." not foundLipsește o librărie de sistemRulează ldd game și instalează pachetul lipsă
ELF ... wrong class sau Exec format errorArhitectura nu se potrivește cu sistemulCompilează pe un sistem cu aceeași arhitectură
Pornește și se oprește imediatProblemă de configurare sau crashCitește syserr și caută un game.core
Merge, dar clientul nu se conecteazăPosibil mesaje diferite între game și clientVezi protocolul game–client

Pentru restul problemelor de pornire, lecția serverul nu pornește rămâne valabilă.

Greșeli des întâlnite

  • Începi cu modificări înainte de un build curat al sursei originale. Când apare o eroare, nu știi dacă e de la tine sau de la mediu.
  • Scoți simbolurile de depanare (strip) ca să micșorezi fișierul. La primul crash nu vei mai ști unde s-a întâmplat.
  • Testezi doar loginul. Multe probleme apar la trade, la drop sau la schimbarea canalului.
  • Rulezi gmake clean în sursa „bună” fără copie, apoi nu mai poți reveni la librăriile vechi.

Întrebări frecvente

Trebuie să compilez tot game pentru o mică schimbare?

Nu. Fără gmake clean, gmake recompilează doar fișierele schimbate și apoi face legarea finală. Folosește clean când schimbi flag-uri, compilatorul sau fișiere .h folosite peste tot.

Pot rula game compilat pe alt calculator decât cel de test?

Da, dacă sistemul are aceeași arhitectură și librăriile cerute de ldd. De aceea serverul de test trebuie să semene cu cel live.

Ce e limit_time.h?

Un fișier generat de un script Python, legat de o funcție de „expirare” a serverului. În sursa verificată, funcția e dezactivată (ENABLE_LIMIT_TIME e comentat), deci nu te afectează.

Ce urmează

Ai un game și un db testate. Află cum le pui pe server în siguranță. 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