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

Prețuri și restricții la magazinele NPC din Metin2, fără bucle de profit

2 noiembrie 2026 6 min de citit

Prețurile de la NPC par un detaliu, dar sunt una dintre cele mai rapide căi prin care un server își strică economia. Dacă un item se poate cumpăra cu 100 de yang și revinde cu 120, un jucător atent face asta de mii de ori și „tipărește” yang. În lecția asta afli de unde vin prețurile, cum se calculează revânzarea și cum închizi un magazin pentru cei sub un anumit nivel.

Pe scurt: în pachetele clasice, prețul nu stă în magazin, ci în item_proto: o coloană pentru prețul de cumpărare de la NPC și una pentru revânzare. Revânzarea trebuie să aducă mereu mai puțin decât costă cumpărarea. Restricțiile (nivel, clasă) le faci printr-un quest care deschide magazinul.

Cuvinte pe care le vei întâlni

CuvântCe înseamnă
item_protoFișierul (sau tabelul) cu toate detaliile itemelor, inclusiv prețurile.
Preț de cumpărareCât plătește jucătorul când cumpără de la NPC.
Preț de revânzareCât primește jucătorul când vinde un item la NPC.
Buclă de profitCumperi și revinzi și câștigi. Repetat la infinit, creează yang din nimic.
AntiflagO interdicție pe item, de exemplu „nu se poate vinde la NPC”.

De unde vine prețul

În pachetul verificat, item_proto.txt are două coloane de preț, a 10-a și a 11-a (după VNUM, nume, tip, subtip, mărime, antiflag-uri, flag-uri, purtare și imunitate). În unele pachete au nume clare (de exemplu gold și shop_buy_price), în altele antetul e un text coreean ilizibil. Numără coloanele, nu te baza pe nume.

ColoanaCe face, în sursa verificată
a 10-aPrețul pe bucată când cumperi de la NPC.
a 11-aBaza de calcul când vinzi la NPC.

Exemple reale din pachetul verificat:

ItemColoana 10Coloana 11
27001 Red Potion(S)3230
27002 Red Potion(M)9690
20 Long Sword+0400400

Unele pachete țin item_proto într-un tabel MySQL, nu într-un fișier. Logica e aceeași, doar locul diferă.

Cum se calculează, pe cifre

Cumpărarea de la NPC. Prețul = coloana 10 × bucățile din pachet. Un pachet de 20 de Red Potion(S) costă 32 × 20 = 640 yang.

În sursa verificată mai există o regulă: dacă jucătorul e din alt regat decât NPC-ul, plătește de trei ori mai mult. Deci același pachet costă 1.920 yang pentru un străin.

Vânzarea la NPC. În sursa verificată: coloana 11 × bucăți, împărțit la 5, apoi minus o taxă de 3% (rotunjită în jos, deci la sume mici poate fi 0). Pentru 100 de Red Potion(M): 90 × 100 = 9.000, împărțit la 5 = 1.800, minus 3% (54) = 1.746 yang. Le-ai cumpărat cu 9.600 și le vinzi cu 1.746. Pierderea e voită: NPC-ul nu trebuie să fie o afacere.

Există și o excepție rară: itemele cu flag-ul COUNT_PER_1GOLD, la care calculul e invers (câte bucăți primești pentru 1 yang). Dacă dai peste un item cu acest flag, testează-l separat.

Cum eviți bucla de profit

Bucla apare când un item se revinde cu mai mult decât costă la NPC. Cu formula de mai sus, asta se întâmplă când coloana 11 e de peste aproximativ 5 ori mai mare decât coloana 10.

Coloana 10Coloana 11CumpărareRevânzareRezultat
10010010020Corect: pierzi 80.
10040010078Corect, dar strâns.
1002.000100388Buclă: câștigi 288 la fiecare tură.

Regula simplă: pentru itemele vândute la NPC, ține coloana 11 egală sau mai mică decât coloana 10. Pentru itemele care nu se vând la NPC (materiale din drop), coloana 11 e venitul jucătorului din vânzarea dropului, deci contează pentru economia de yang.

Pasul 1: Schimbă un preț

  1. Fă backup la item_proto.txt (și la tabelul item_proto, dacă pachetul tău îl folosește).
  2. Află ce fișier citește serverul. În pachetul verificat, procesul db are propriul item_proto.txt în folderul db/, identic cu cel din share/conf. La tine poate fi un link sau o copie separată.
  3. Găsește rândul itemului după primul număr (VNUM) și schimbă coloana 10 sau 11. Păstrează taburile.
  4. Ține și item_proto-ul clientului la fel, ca prețurile din descrierea itemului să nu-i încurce pe jucători.
  5. Repornește serverul de test. În sursa verificată, prețurile din magazin se calculează o singură dată, la pornire.

Ce ar trebui să vezi: prețul nou în fereastra magazinului. Cumpără și vinde o dată și notează cifrele.

Pasul 2: Interzice revânzarea unui item

Pentru iteme care nu trebuie vândute la NPC (de exemplu iteme de eveniment), în coloana de antiflag-uri adaugi ANTI_SELL. În sursa verificată, serverul refuză vânzarea la NPC a unui item cu acest antiflag. Dacă deja există alte antiflag-uri, le păstrezi și îl adaugi pe acesta în același câmp, în formatul pe care îl folosesc celelalte rânduri din fișierul tău.

Pasul 3: Un magazin doar de la nivelul 50

Tabelul shop nu are o coloană de nivel. Restricția o faci cu un quest. Ideea:

  1. Creezi un magazin nou, fără NPC (npc_vnum = 0), ca să nu se deschidă singur la click.
  2. Un quest pe un NPC existent îl deschide doar dacă jucătorul are nivelul cerut.

În baza de date (pe test, cu backup, vezi lecția despre magazine):

sql
INSERT INTO shop (vnum, name, npc_vnum) VALUES (50, 'magazin_nivel_50', 0);
INSERT INTO shop_item (shop_vnum, item_vnum, count) VALUES (50, 27003, 20);

Pachetul verificat folosește deja această idee: are magazine cu npc_vnum = 0. Alege un număr de magazin care nu există la tine.

Questul:

lua
quest magazin_nivel begin
    state start begin
        when 9003.chat."Magazin" begin
            npc.open_shop()
            setskin(NOWINDOW)
        end
        when 9003.chat."Magazin avansat" begin
            if pc.get_level() < 50 then
                say("Magazinul avansat se deschide de la nivelul 50.")
                return
            end
            npc.open_shop(50)
            setskin(NOWINDOW)
        end
    end
end

Bucată cu bucată:

  • Prima opțiune, „Magazin”, păstrează magazinul obișnuit. E necesară: odată ce NPC-ul are un quest, click-ul arată meniul de dialog, nu magazinul.
  • pc.get_level() < 50 oprește jucătorii sub nivelul 50.
  • npc.open_shop(50) deschide magazinul cu numărul 50, nu pe cel al NPC-ului.

Ce ar trebui să vezi: cu un personaj de nivel 49 primești mesajul; cu unul de nivel 50 se deschide magazinul cu pachetul de Red Potion(L).

Greșeli des întâlnite

  • Revânzare mai mare decât cumpărarea. Testează fiecare item nou: cumpără, vinde, compară.
  • Uiți de prețul triplu pentru alt regat. Jucătorii din alt regat se plâng de prețuri „greșite”. Nu e o greșeală, e regula jocului.
  • Pui restricția doar în client. Ascunderea unui buton nu oprește pe nimeni. Condiția trebuie să fie în quest, pe server.
  • Pui un quest pe negustor și uiți opțiunea „Magazin”. Magazinul obișnuit dispare.

Întrebări frecvente

Pot pune un preț diferit în două magazine pentru același item?

Nu în tabelul clasic: prețul vine din item_proto, deci e același peste tot. Poți varia cantitatea din pachet sau folosi un quest de schimb (vezi schimbul de iteme la NPC).

Cum aleg prețul potrivit?

Pornește de la cât yang câștigă un jucător pe oră la nivelul care folosește itemul. Lecția despre economia yang te ajută cu cifrele.

Pot restricționa după clasă?

Da, în același fel: în quest verifici clasa cu pc.get_job() înainte de npc.open_shop. Testează valorile pe personaje din fiecare clasă.

Ce urmează

Mai departe: rețetele de crafting din cube.txt. 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