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

Misiune Metin2 de colectare: jucătorul adună obiecte și le predă la NPC

2 noiembrie 2026 7 min de citit

„Adu-mi 10 Gheare de lup și îți dau poțiuni.” Sună simplu, dar o misiune de colectare are câteva capcane: ce se întâmplă dacă jucătorul are doar 9? Dacă ghearele sunt puse la vânzare în magazinul lui personal? Dacă primește recompensa, dar ghearele nu i se iau? În lecția asta construim misiunea pas cu pas, cu toate verificările făcute corect, în ordinea corectă.

Pe scurt: numeri obiectele cu pc.count_item, ceri confirmare, verifici din nou după confirmare, verifici locul pentru recompensă, iei obiectele cu pc.remove_item, schimbi etapa questului și abia apoi dai recompensa. Totul în același bloc.

Cuvinte pe care le vei întâlni

CuvântCe înseamnă
pc.count_item(vnum)Câte bucăți dintr-un item are jucătorul în inventar.
pc.remove_item(vnum, câte)Ia din inventarul jucătorului numărul de bucăți cerut.
pc.enough_inventory(vnum)Răspunde „da” sau „nu”: are jucătorul un loc liber pentru acel item?
pc.give_item2(vnum, câte)Dă jucătorului un item.
return„Oprește-te aici.” Restul blocului nu se mai execută.

Ce face misiunea noastră

Biologul (NPC-ul 20084, „Biologist Chaegirab” în pachetul verificat) cere 10 Gheare de lup (itemul 30028). În schimb dă 20 de Poțiuni roșii (M) (itemul 27002). VNUM-urile sunt din pachetul de referință; verifică-le la tine în item_names.txt și mob_names.txt.

Înainte de orice: obiectul cerut trebuie să poată fi obținut. Dacă ghearele nu cad de la niciun monstru, misiunea e imposibilă. Verifică sau adaugă dropul cu lecția despre drop la monștri.

Codul complet

Fișierul gheare_lup.quest:

lua
quest gheare_lup begin
    state start begin
        when 20084.chat."Gheare de lup" with pc.get_level() >= 10 begin
            say_title("Gheare de lup")
            say("Am nevoie de 10 Gheare de lup pentru cercetare.")
            say("Ti le platesc cu 20 de Potiuni Rosii (M).")
            local alegere = select("Accept", "Nu acum")
            if alegere == 1 then
                set_state(colectare)
            end
        end
    end

    state colectare begin
        when letter begin
            send_letter("Gheare de lup")
        end

        when button or info begin
            say_title("Gheare de lup")
            say(string.format("Ai %d din 10 Gheare de lup.", pc.count_item(30028)))
        end

        when 20084.chat."Predau ghearele" begin
            say_title("Gheare de lup")
            if pc.count_item(30028) < 10 then
                say(string.format("Ai doar %d din 10. Mai cauta.", pc.count_item(30028)))
                return
            end
            say("Vrei sa predai 10 Gheare de lup?")
            local alegere = select("Da, predau", "Nu inca")
            if alegere ~= 1 then
                return
            end
            if pc.count_item(30028) < 10 then
                say("Ghearele nu mai sunt in inventar.")
                return
            end
            if not pc.enough_inventory(27002) then
                say("Fa loc in inventar si revino.")
                return
            end
            pc.remove_item(30028, 10)
            clear_letter()
            set_state(terminat)
            pc.give_item2(27002, 20)
            say("Multumesc! Iata potiunile.")
        end
    end

    state terminat begin
    end
end

Explicat rând cu rând

Prima parte (acceptarea misiunii și scrisoarea) e la fel ca în misiunea de vânătoare. Ne concentrăm pe predare.

RândCe înseamnă
say(string.format("Ai %d din 10 ...", pc.count_item(30028)))La apăsarea scrisorii, jucătorul vede câte gheare are acum. Nu salvăm nimic: numărăm direct în inventar.
when 20084.chat."Predau ghearele" beginOpțiunea apare doar celor care au acceptat misiunea (etapa colectare).
if pc.count_item(30028) < 10 thenPrima verificare: are cel puțin 10?
returnDacă nu are, scriem mesajul și ne oprim. Nimic nu se ia, nimic nu se dă.
local alegere = select("Da, predau", "Nu inca")Cerem confirmare. Jucătorul nu trebuie să piardă obiecte dintr-o apăsare greșită.
if alegere ~= 1 then~= înseamnă „diferit de”. Dacă n-a ales „Da, predau”, ne oprim.
if pc.count_item(30028) < 10 then (a doua oară)A doua verificare, după confirmare. Vezi mai jos de ce.
if not pc.enough_inventory(27002) thenAre loc pentru poțiuni? Dacă nu, ne oprim înainte să-i luăm ghearele.
pc.remove_item(30028, 10)Luăm exact 10 gheare.
clear_letter() și set_state(terminat)Scoatem scrisoarea și închidem misiunea, ca să nu poată fi predată din nou.
pc.give_item2(27002, 20)Abia acum dăm recompensa.

De ce verificăm de două ori

Când apare fereastra cu „Da, predau / Nu inca”, questul se oprește și așteaptă. Fereastra poate sta deschisă oricât. Între timp, jucătorul poate face alte lucruri: să arunce un item, să-l dea altcuiva, să-l pună în depozit. Prima verificare a fost adevărată atunci, dar poate să nu mai fie adevărată acum.

Și mai e un detaliu important, verificat în sursa pachetului de referință: dacă ceri să iei 10 bucăți și jucătorul are doar 6, pc.remove_item ia cele 6 și scrie doar un mesaj în log. Nu refuză. Fără a doua verificare, jucătorul ar putea primi recompensa întreagă pentru 6 gheare.

Regula de aur: după orice select(), wait() sau input(), verifici din nou tot ce contează.

Ce numără, de fapt, pc.count_item

Tot din sursa pachetului verificat:

  • Numără doar inventarul jucătorului. Obiectele din depozit nu se pun la socoteală.
  • Sare peste obiectele pe care jucătorul le vinde în magazinul lui personal. La fel face și pc.remove_item. Așa nu poți lua un obiect pe care tocmai îl cumpără altcineva.
  • Adună toate grămezile (stivele): 3 gheare într-un loc și 7 în altul fac 10.

La tine, dacă sursa a fost modificată (de exemplu cu inventare speciale pentru materiale), comportamentul poate fi diferit. Testează cu obiectele puse în locuri diferite.

Ordinea corectă, pe scurt

  1. Verifici că are obiectele.
  2. Ceri confirmare.
  3. Verifici din nou obiectele.
  4. Verifici locul din inventar pentru recompensă.
  5. Iei obiectele.
  6. Schimbi etapa questului.
  7. Dai recompensa.

Dacă inversezi pașii 4 și 5, jucătorul cu inventarul plin își pierde ghearele. Dacă sari peste pasul 6, poate preda de mai multe ori. Despre locul din inventar avem o lecție întreagă: recompense în inventar în siguranță.

Pune questul pe server și testează

Copiezi fișierul în folderul de questuri, îl adaugi în listă (locale_list sau quest_list), compilezi și dai /reload q, exact ca în primul quest Lua. Apoi testează pe serverul de test:

  1. Cu 9 gheare: trebuie să primești „Ai doar 9 din 10”.
  2. Cu 10 gheare, apeși „Predau”, iar cât timp fereastra e deschisă arunci o gheară. Apoi alegi „Da, predau”. Trebuie să vezi „Ghearele nu mai sunt in inventar” și să nu primești nimic.
  3. Cu inventarul plin: trebuie să vezi „Fa loc in inventar” și să-ți păstrezi ghearele.
  4. Cu 10 gheare în două grămezi: predarea trebuie să meargă.
  5. După predare, vorbește din nou cu NPC-ul: nu trebuie să mai apară opțiunea.

Ce ar trebui să vezi: 10 gheare mai puțin, 20 de poțiuni în plus, scrisoarea dispărută.

Greșeli des întâlnite

  • Ceri obiectul fără să existe o sursă de drop. Jucătorii abandonează misiunea și se plâng.
  • Iei obiectele înainte să verifici locul din inventar. Jucătorul rămâne fără ele și fără recompensă.
  • Verifici doar înainte de select(). Lași o fereastră de timp pentru trișat.
  • Nu schimbi etapa după predare. Misiunea poate fi repetată la nesfârșit.
  • Ceri un obiect care se poate cumpăra ieftin de la un magazin NPC. Misiunea devine o simplă cumpărătură. Verifică magazinele cu lecția despre magazinul NPC.

Întrebări frecvente

Pot cere două tipuri diferite de obiecte?

Da. Verifici fiecare cu pc.count_item, înainte și după confirmare, și le iei pe rând cu pc.remove_item. Verificările se fac toate înainte de prima luare.

Pot face misiunea repetabilă?

Da: în loc de set_state(terminat) poți reveni la set_state(start). Atunci gândește-te la economie: dacă o misiune repetabilă dă iteme valoroase, poate umple serverul de ele. Pentru o misiune pe zi, vezi lecția despre quest flag-uri și condiții de nivel.

Dacă vreau schimb pe loc, fără misiune?

Atunci ai nevoie doar de un dialog la NPC, fără etape. Vezi schimbul de iteme la NPC, din capitolul despre NPC-uri.

Ce urmează

Am folosit deja pc.enough_inventory. În lecția următoare vedem exact ce verifică, ce nu verifică și ce se întâmplă cu un item dat când inventarul e plin: cum dai recompense în inventar î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