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

Ce se întâmplă la deconectare în dungeon: revenire, instanțe goale și reguli clare

2 noiembrie 2026 6 min de citit

Internetul pică, calculatorul se blochează, jucătorul închide jocul din greșeală. În lumea deschisă nu e mare lucru: se reloghează și continuă. Într-un dungeon, însă, o deconectare ridică întrebări: mai există instanța? poate reveni? ce se întâmplă cu bossul și cu premiul? În această lecție afli ce face serverul singur și ce reguli trebuie să decizi tu, ca să nu existe nici instanțe „fantomă”, nici jucători frustrați.

Pe scurt: în sursa verificată, o instanță goală se închide singură la ~10 secunde după ce pleacă ultimul jucător. Cât timp un membru e înăuntru, instanța trăiește. Tu decizi cât timp are cineva voie să revină și ce primește dacă lipsește la final, apoi testezi deconectarea la fiecare etaj.

Cuvinte pe care le vei întâlni

CuvântCe înseamnă
Deconectare (logout)Ieșirea din joc, voită sau nu. Questurile au evenimentul when logout.
Instanță goalăO copie a hărții dungeonului în care nu mai e niciun jucător.
timer()Ceas de quest legat de personaj.
server_timer()Ceas de quest legat de instanță, care nu depinde de un anumit jucător.
d.find(index)Verifică dacă o instanță cu acel număr mai există.

Ce face serverul singur

Am citit codul care gestionează instanțele în sursa verificată (dungeon.cpp):

  • când un jucător iese din instanță, e scos din lista ei;
  • când lista rămâne goală, serverul programează închiderea instanței peste 10 secunde;
  • dacă intră cineva înapoi în aceste 10 secunde, închiderea se anulează;
  • când instanța se închide, ceasurile ei (server_timer) nu mai găsesc instanța: d.select(...) întoarce fals și nu se mai întâmplă nimic.

Deci un jucător singur care pică din joc își pierde, practic, instanța. Într-un grup, instanța rămâne cât timp măcar un membru e înăuntru.

Ceasurile: de ce server_timer e mai sigur

Un timer() aparține personajului care l-a pornit. Dacă acel jucător iese din joc, ceasul lui dispare odată cu el. În Turnul Demonilor din pachet, trecerea de la primul etaj folosește timer("devil_stone1_1", 6): dacă jucătorul care a spart piatra iese exact în acele 6 secunde, trecerea poate să nu mai aibă loc.

Pentru tot ce ține de dungeon (etape, limită de timp, ieșire la final), folosește server_timer cu numărul instanței, ca flame_dungeon.quest:

lua
server_timer("verifica_camera", 5, d.get_map_index())

Ceasul acesta nu depinde de niciun jucător anume.

Pasul 1: Unde ajunge jucătorul la relogare

În pachetul verificat, flame_dungeon.quest tratează relogarea în when login: dacă jucătorul apare pe harta de bază a dungeonului, e trimis afară, la intrare. Un fragment simplificat:

lua
when login begin
    if pc.get_map_index() == MAPA_DUNGEON then
        pc.warp(6142 * 100, 7068 * 100, MAPA_IESIRE)
    end
end
BucatăCe face
pc.get_map_index() == MAPA_DUNGEON„S-a logat pe harta dungeonului, dar nu într-o instanță?”
pc.warp(x * 100, y * 100, harta)Îl trimite la intrarea dungeonului. Coordonatele se înmulțesc cu 100, ca în pachet.

Observă că aici doar mutăm jucătorul. Nu scriem niciun semn de quest în when login: există un bug cunoscut al motorului care poate strica datele questurilor dacă scrii semne la login.

Pasul 2: Reintrarea pentru grup

Dungeonul de foc din pachet permite reintrarea în 5 minute, dacă instanța grupului mai există și liderul e același. Ideea, pe scurt:

  1. La pornirea dungeonului, salvează numărul instanței pe grup: party.setf("dungeon_index", d.get_map_index()).
  2. Salvează și liderul în instanță: d.setf("party_leader_pid", party.get_leader_pid()).
  3. Când jucătorul revine la NPC-ul de intrare, verifici:
lua
local idx = party.getf("dungeon_index")
if d.find(idx) and d.getf_from_map_index("party_leader_pid", idx) == party.get_leader_pid() then
    pc.warp(7762 * 100, 6739 * 100, idx)
    return
end
BucatăCe face
party.getf("dungeon_index")Numărul instanței grupului.
d.find(idx)Mai există instanța?
d.getf_from_map_index("party_leader_pid", idx)Citește liderul salvat în instanță, din afara ei.
== party.get_leader_pid()E același grup, cu același lider?
pc.warp(..., idx)Îl duce înapoi în instanța grupului.

În pachet, verificarea mai include și limita de 5 minute de la ieșire. Reține și consecințele: dacă grupul se desface, party.getf se pierde și reintrarea nu mai e posibilă; dacă liderul se schimbă, verificarea eșuează. Sunt alegeri de design, nu bug-uri, dar trebuie spuse jucătorilor.

Pasul 3: Hotărăște regulile

Scrie răspunsurile în descrierea dungeonului, ca jucătorii să le știe dinainte:

SituațiaO regulă posibilă
Un membru pică la etajul 2Poate reveni prin NPC în 5 minute, dacă grupul și liderul sunt aceleași.
Toți membrii picăInstanța se închide; biletul nu se returnează.
Liderul picăGrupul își alege alt lider; reintrarea liderului vechi poate să nu mai meargă.
Cineva lipsește când moare bossulPrimește premiul doar dacă se întoarce înainte de ieșirea automată și vorbește cu cufărul.
Grupul stă AFK în instanțăLimita totală de timp scoate pe toată lumea cu d.exit_all().

Pentru premii, folosește modelul din lecția despre recompense: fiecare își ia premiul de la NPC, o singură dată.

Pasul 4: Curăță itemele de dungeon la ieșire

Unele dungeon-uri folosesc chei sau obiecte valabile doar înăuntru. Turnul Demonilor din pachet le șterge la deconectare:

lua
when logout begin
    if pc.count_item(30300) >= 1 then
        pc.remove_item(30300, pc.count_item(30300))
    end
end

Fără asta, un jucător scoate cheile afară și le folosește la o intrare următoare ca să sară etape.

Ce ar trebui să vezi: un membru care iese și revine prin NPC în timp util ajunge în aceeași instanță, la etapa curentă. Un jucător singur care pică ajunge afară, iar instanța lui dispare. Cheile de dungeon nu rămân în inventar după ieșire.

Cum testezi

Pe serverul de test, cu 2–3 personaje:

  1. Ieși din joc la fiecare etaj, pe rând, și încearcă să revii.
  2. Ieși cu toți membrii și verifică în syslog că instanța se închide.
  3. Doi membri revin în același timp.
  4. Liderul iese, grupul primește alt lider, liderul vechi încearcă să revină.
  5. Ieși exact după ce ai spart o piatră sau ai omorât bossul.
  6. Repornește serverul cu jucători în dungeon și vezi unde ajung la logare.

Vezi și testezi questurile la relogare și restart.

Greșeli des întâlnite

  • Etapele depind de timer() personal. Dacă jucătorul iese, trecerea nu mai are loc.
  • Semne scrise în when login. Risc de date de quest stricate.
  • Nicio limită totală de timp. Un grup AFK ține instanța deschisă.
  • Cheile de dungeon rămân în inventar. Se folosesc la intrarea următoare.
  • Nu testezi deconectarea deloc. E primul lucru pe care îl încearcă jucătorii.

Întrebări frecvente

Pot face ca jucătorul să revină automat în instanță la relogare?

Unele surse modificate fac asta, dar cere atenție: instanța trebuie să mai existe, iar regulile de recompensă trebuie să rămână corecte. Modelul cu NPC și limită de 5 minute din pachet e mai simplu și mai ușor de testat.

Ce se întâmplă la crash-ul serverului?

Instanțele se pierd, pentru că există doar în memorie. Ce e salvat pe personaj (cooldown, premiu „o dată pe viață”) rămâne. De aceea cooldown-ul se salvează pe personaj, la intrare.

Returnez biletul dacă pică serverul?

E o decizie a ta. Dacă o faci, fă-o manual, după verificare în loguri, nu automat, ca să nu se abuzeze.

Ce urmează

Ieșim din dungeon, în lumea deschisă: world boss cu recompense corecte. Pentru respawnul bossului, revezi și boss de lume cu respawn controlat.

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