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

Cum proiectezi un dungeon Metin2 pas cu pas, înainte să scrii prima linie de cod

2 noiembrie 2026 6 min de citit

Un dungeon e cel mai complicat lucru pe care îl poți adăuga pe un server Metin2. Are monștri, pietre Metin, un boss, un cronometru, un grup de jucători și o recompensă. Dacă una dintre piese nu e gândită bine, apar probleme: grupul rămâne blocat la un etaj, bossul apare de două ori sau cineva primește premiul de trei ori. Vestea bună este că majoritatea problemelor se evită **pe hârtie**, înainte de cod. În această lecție înveți să desenezi dungeonul ca pe o succesiune clară de etape.

Pe scurt: un dungeon e o „mașină cu etape”. Fiecare etapă are o condiție de intrare, un progres, un caz de eșec, o ieșire și, la final, o recompensă. Scrie-le pe hârtie, apoi construiește și testează câte o etapă pe rând.

Cuvinte pe care le vei întâlni

CuvântCe înseamnă
DungeonO zonă specială în care un grup trece prin etape până la un boss final.
InstanțăO copie privată a hărții, doar pentru grupul tău. Alt grup primește altă copie.
Etapă (stare)Un „pas” al dungeonului: etajul 1, pietrele, bossul etc.
d.setf / d.getfFuncții de quest care salvează și citesc o valoare a instanței, de exemplu etapa curentă.
Server timerUn ceas din quest, legat de instanță, care rulează o bucată de cod după câteva secunde.

Ce e, de fapt, o instanță

Când un grup intră în Turnul Demonilor, serverul nu-l trimite pe harta „normală”. Creează o copie privată a hărții, cu un număr nou. În pachetul pe care l-am verificat, harta Turnului Demonilor are indexul 66, iar instanțele primesc numere între 660000 și 669999. Questurile verifică exact acest interval:

lua
when 8016.kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin

Pe românește: „când este ucis monstrul 8016, doar dacă jucătorul e într-un dungeon și harta lui e o copie a hărții 66…”. Gândește-te la o sală de cinema cu multe săli identice: filmul e același, dar fiecare grup are sala lui.

Pasul 1: Scrie etapele pe hârtie

Înainte de orice cod, desenează drumul grupului. Un exemplu simplu, „Peștera Lupilor”, cu trei etaje:

text
ASTEAPTA -> ETAJ_1 (omoara toti lupii) -> ETAJ_2 (sparge piatra Metin)
         -> BOSS -> RECOMPENSA_DATA -> INCHIS

Fiecare săgeată e o trecere. Pentru fiecare trecere notează un singur lucru care o declanșează. De exemplu: „ETAJ_1 se termină când nu mai e niciun monstru în instanță”. Dacă o trecere are două declanșatoare diferite, riști să sară grupul două etaje deodată.

Pasul 2: Completează tabelul etapelor

Pentru fiecare etapă, răspunde la cinci întrebări:

EtapăCum intriCe trebuie făcutCe se întâmplă la eșecCum ieși
ETAJ_1Grupul intră pe ușăOmori toți lupiiTimpul expiră, toți sunt scoșiTrecere automată la ETAJ_2
ETAJ_2Ultimul lup a muritSpargi piatra MetinTimpul expirăPiatra spartă duce la BOSS
BOSSPiatra e spartăOmori bossulTimpul expirăBossul mort duce la RECOMPENSA
RECOMPENSABossul e mortFiecare ia premiul o datăGrupul iese fără să iaDupă 60 de secunde, toți sunt scoși

Tabelul pare plictisitor, dar e cea mai bună unealtă anti-bug. Dacă nu știi ce scrii într-o căsuță, ai găsit o problemă înainte să existe.

Pasul 3: Stabilește unde ții fiecare informație

Un dungeon lucrează cu trei feluri de „memorie”. E important să nu le amesteci:

Ce memoreziUnde o țiiExemplu
Etapa curentă, câte pietre mai suntÎn instanță: d.setf("level", 2)Dispare odată cu instanța.
Cooldown-ul, dacă a terminat dungeonul aziPe personaj: pc.setqf("ultima_intrare", ...)Rămâne și după relogare sau restart.
Un lucru valabil cât timp există grupulPe grup: party.setf(...)Dispare când grupul se desface.

Questurile din pachet folosesc chiar acest model. Turnul Demonilor ține etajul în d.setf("level", 4), iar dungeonul de foc (flame_dungeon.quest) salvează ora ieșirii pe personaj, ca să calculeze cooldown-ul.

Pasul 4: Pune o limită de timp pentru tot dungeonul

Orice dungeon trebuie să se termine sigur, chiar dacă grupul pleacă la cafea. În flame_dungeon.quest, la pornire se armează un ceas de 45 de minute, cu anunțuri la 30, 15, 5 și 1 minut, iar la final toată lumea e scoasă afară cu d.exit_all(). Fără această limită, o instanță poate rămâne deschisă mult timp, cu monștri care ocupă memorie.

Despre anunțuri și ceasuri ai mai citit în lecția despre evenimente cu timer și anunțuri.

Pasul 5: Lista fișierelor pe care le vei atinge

Un dungeon nu stă doar în quest. În pachetul verificat, sunt implicate:

  • questul dungeonului (fișierul .quest, compilat ca orice alt quest);
  • fișierele de spawn ale etajelor, în data/dungeon/ (formatul e cel din lecția despre regen.txt);
  • monștrii și bossul din mob_proto (vezi HP, EXP și yang la monștri);
  • harta dungeonului, care trebuie să fie încărcată pe același proces game (core) pe care rulează questul de intrare. În sursa verificată, instanța se creează pe core-ul curent; dacă harta nu e încărcată acolo, crearea eșuează.

Capcanele pe care le vei întâlni în lecțiile următoare

Le enumerăm acum, ca să le recunoști. Fiecare are lecția ei în acest capitol.

  1. Ștergerea monștrilor în momentul greșit poate prăbuși serverul. Folosește d.kill_all() în loc de d.purge() când ești într-un eveniment de kill.
  2. d.count_monster() poate arăta 0 imediat după spawn, pentru că monștrii apar o clipă mai târziu.
  3. Ceasurile care verifică etapele trebuie să se re-armeze singure, dar să se oprească la final.
  4. Recompensa trebuie dată o singură dată, chiar dacă cineva apasă de două ori sau iese din joc.
  5. Cooldown-ul trebuie salvat pe personaj, în momentul potrivit.
  6. Pe serverele cu mai multe core-uri, intrarea în instanță se face diferit.

Greșeli des întâlnite

  • Construiești zece etaje deodată. Fă primul etaj, testează-l complet, abia apoi treci la al doilea.
  • Progresul se bazează pe „câți monștri s-au omorât în total”. Un monstru rămas din etapa anterioară poate număra greșit. Fiecare etapă are condiția ei.
  • Nu există limită de timp. Instanța rămâne deschisă la nesfârșit.
  • Etapa se ține pe personaj în loc de instanță. Atunci fiecare jucător „vede” alt etaj.
  • Testezi direct pe serverul cu jucători. Un dungeon se testează mult, pe serverul de test.

Întrebări frecvente

Pot copia un dungeon din pachet și să-l modific?

Da, e cel mai bun mod de a învăța. Pornește de la deviltower_zone.quest sau flame_dungeon.quest. Schimbă un singur lucru, testează, apoi continuă. Unele questuri din pachete fac și lucruri riscante, așa că citește întâi capcanele din acest capitol.

Cât durează să faci un dungeon complet?

Pentru un începător, zile sau săptămâni, mai ales din cauza testelor. Scrierea codului e partea scurtă. Testarea la deconectare, restart și recompense ia cel mai mult.

Trebuie să știu C++?

Pentru un dungeon clasic, nu. Totul se face din quest, cu funcțiile d.*. C++ devine necesar doar pentru sisteme noi, de exemplu un clasament de damage la boss.

Ce urmează

Acum că ai planul, vezi cum verifici corect intrarea în dungeon pentru party. Dacă vrei să recapitulezi questurile, revino la quest flag-uri și condiții de nivel.

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