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.
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ânt | Ce înseamnă |
|---|---|
| qc | „Quest compiler”, programul care compilează questurile. |
object | Folderul cu questurile compilate. game citește de aici, nu din fișierele .quest. |
locale_list | Lista questurilor care se compilează. Un nume de fișier pe rând. Unele pachete o numesc quest_list. |
| pre_qc | Un 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ă.
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șier | Ce e |
|---|---|
qc | Compilatorul (program pe 32 de biți pentru FreeBSD) |
make.py | Scriptul care compilează toate questurile |
pre_qc.py | Pasul de pregătire |
locale_list | Lista questurilor (238 de rânduri în pachetul verificat) |
questlib.lua, quest_functions | Funcțiile pe care le poți folosi în questuri |
object | Rezultatul compilării |
Pasul 2: Citește ce face make.py
Deschide make.py. În pachetul verificat, partea importantă arată așa:
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:
- Șterge tot folderul
object(toate questurile compilate). - Îl creează gol.
- Ia fiecare quest din
locale_list, îl pregătește cupre_qcși îl compilează cuqc. - 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:
which python python2.7 python3Pe 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:
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/backupdacă nu există). - A treia compilează doar
bun_venit.questși adaugă rezultatul înobject.
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:
cd /usr/home/game/share/locale/english/quest
python2.7 make.pyCe 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.pydirect 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
objectca „să faci curat”. - Scrii în
when logincod 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ă.