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

Compilarea questurilor Metin2 cu qc și make.py, fără să strici questurile existente

2 noiembrie 2026 5 min de citit

Ai scris deja [primul tău quest](/blog/tutorial-quest-lua-metin2/) și l-ai compilat cu o comandă primită „de-a gata”. Acum e momentul să înțelegi ce se întâmplă în spatele ei. Compilarea questurilor **nu** are nimic de-a face cu `gmake` și cu sursa C++: are unealta ei, `qc`, și un script care o pornește pentru toate questurile. Iar scriptul acela are un obicei periculos, pe care trebuie să-l cunoști înainte să-l rulezi pe un server cu jucători.

Pe scurt: qc transformă fiecare fișier .quest în fișiere pe care le citește game, în folderul object. Scriptul make.py șterge tot folderul object și compilează din nou toate questurile din locale_list. Dacă un quest are o greșeală, scriptul se oprește la jumătate. De aceea compilezi întâi pe serverul de test.

Nivel: Avansat. Ce trebuie să știi înainte: primul quest Lua, fișierele TXT și encoding-ul și să ai un server de test.

Cuvinte pe care le vei întâlni

CuvântCe înseamnă
qc„Quest compiler”, programul care compilează questurile.
objectFolderul cu questurile compilate. game citește de aici, nu din fișierele .quest.
locale_listLista questurilor care se compilează. Un nume de fișier pe rând. Unele pachete o numesc quest_list.
pre_qcUn pas de pregătire care înlocuiește „prescurtările” (define) din questuri înainte de qc.

Pasul 1: Uită-te în folderul de questuri

În pachetul verificat, folderul este share/locale/english/quest. La tine poate fi romania sau alt nume de limbă.

sh
cd /usr/home/game/share/locale/english/quest
ls | grep -v "\.quest$"

Comanda arată tot ce nu e fișier .quest. În pachetul verificat apar, printre altele:

FișierCe e
qcCompilatorul (program pe 32 de biți pentru FreeBSD)
make.pyScriptul care compilează toate questurile
pre_qc.pyPasul de pregătire
locale_listLista questurilor (238 de rânduri în pachetul verificat)
questlib.lua, quest_functionsFuncțiile pe care le poți folosi în questuri
objectRezultatul compilării

Pasul 2: Citește ce face make.py

Deschide make.py. În pachetul verificat, partea importantă arată așa:

python
os.system('rm -rf object')
os.system('mkdir object')
for line in file('locale_list'):
	r = pre_qc.run (line)
	...
	if os.system('./qc '+filename):
		print 'Error occured on compile ' + line
		...
		sys.exit(-1)

Pe românește:

  1. Șterge tot folderul object (toate questurile compilate).
  2. Îl creează gol.
  3. Ia fiecare quest din locale_list, îl pregătește cu pre_qc și îl compilează cu qc.
  4. La prima eroare scrie Error occured on compile ... și se oprește.

Vezi problema? Dacă al 50-lea quest din listă are o greșeală, rămâi cu doar 49 de questuri compilate. La următorul restart, serverul pornește fără restul. Pe serverul live, asta înseamnă NPC-uri mute și misiuni dispărute.

Mai e un detaliu: scriptul e scris în Python 2 (print fără paranteze, file(...)). Cu Python 3 nu merge. Verifică ce ai:

sh
which python python2.7 python3

Pe versiunile noi de FreeBSD, Python 2 s-ar putea să nu mai existe ca pachet. Verifică înainte, pe serverul de test.

Pasul 3: Compilează un singur quest, sigur

Pentru un quest nou sau modificat nu trebuie să recompilezi tot. Rulezi qc doar pe el:

sh
cd /usr/home/game/share/locale/english/quest
cp -Rp object /usr/home/backup/object-2026-11-02
./qc bun_venit.quest
  • Prima comandă te duce în folder.
  • A doua face copie la questurile compilate (creează întâi folderul /usr/home/backup dacă nu există).
  • A treia compilează doar bun_venit.quest și adaugă rezultatul în object.

Ce ar trebui să vezi: niciun mesaj de eroare. Dacă există o greșeală, qc îți arată de obicei numele fișierului și rândul, sub forma fisier:rand:mesaj. Cele mai dese cauze: un end lipsă, o ghilimea " uitată, o paranteză.

Dacă questul tău folosește define, trece întâi prin pre_qc. Cel mai simplu: compilează-l pe serverul de test cu make.py, care face automat ambii pași.

Nu uita: adaugă numele questului într-un rând nou în locale_list. Altfel, următoarea rulare a lui make.py îl va șterge din object și nu-l va mai compila.

Pasul 4: Compilarea completă, doar pe test

Pe serverul de test:

sh
cd /usr/home/game/share/locale/english/quest
python2.7 make.py

Ce ar trebui să vezi: questurile trec unul după altul, fără Error occured on compile. Un mesaj despre grupul quest (de la comanda chgrp) apare doar dacă grupul nu există pe sistem și nu oprește compilarea.

Abia când rularea completă trece pe test, o repeți pe live (după copia folderului object) sau copiezi pe live doar fișierele schimbate.

Pasul 5: Încarcă questurile în joc

Questurile compilate se încarcă la pornirea serverului. În pachetul verificat există și comanda de GM /reload q, care reîncarcă questurile pe core-ul pe care ești conectat. Cel mai sigur rămâne un restart controlat. Apoi testezi questul, inclusiv după relogare (vezi testarea questurilor la relogare și restart).

Greșeli des întâlnite

  • Rulezi make.py direct pe live și un quest greșit oprește compilarea la jumătate.
  • Uiți să adaugi questul în locale_list. Merge azi, dispare la următoarea compilare completă.
  • Ștergi singur folderul object ca „să faci curat”.
  • Scrii în when login cod care setează quest flag-uri (pc.setqf). E o capcană cunoscută a motorului, care poate strica datele. Setează flag-urile doar din acțiuni făcute de jucător.
  • Salvezi questul cu alt encoding și apar semne ciudate în dialoguri. Vezi fișierele TXT și encoding-ul.

Întrebări frecvente

Trebuie să recompilez game când schimb un quest?

Nu. Questurile au compilatorul lor. game se recompilează doar când schimbi codul C++.

Pot face eu un qc nou?

Da, sursa lui e în game/src/quest în sursa verificată și se compilează cu gmake după liblua. Ai nevoie de asta doar dacă qc-ul existent lipsește sau nu rulează pe sistemul tău.

qc scrie „Calls undeclared function!”. De ce?

În sursa verificată, qc citește lista de funcții din fișierul quest_functions și refuză questul dacă folosești o funcție care nu e acolo. Sub mesaj vezi numele funcției. Fie ai scris-o greșit, fie nu există în pachetul tău. Caută-o în quest_functions sau în questlib.lua înainte s-o folosești.

Ce urmează

Treci la partea de client: compilarea clientului cu Visual Studio. 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