aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Metin2

Metin2 Biolog Sistemi: Toplama ve Ödül Mekaniği

Metin2 biolog sistemi, oyuncuya bir NPC üzerinden günlük toplama görevleri veren ve teslim edilen malzemeler karşılığında kademeli ödüller dağıtan klasik bir döngüdür. Biyolog (ya da bazı sürümlerde "Bilgin") oyuncudan belirli bir avlanma malzemesini belirli miktarda ister; oyuncu malzemeyi toplayıp teslim ettiğinde ödülünü alır ve bir sonraki kademeye geçer. Bu rehberde sistemi quest motoru (Lua) ile sıfırdan nasıl kuracağını, ödül kademelerini, günlük sıfırlamayı ve sömürüye kapalı tasarımı adım adım anlatıyorum.

Biolog sistemi nasıl çalışır?

Mantık aslında basit bir topla–teslim et–ilerle döngüsüdür. Sistem üç ana parçadan oluşur:

  • NPC — oyuncunun konuşacağı biyolog. Bir vnum'a sahiptir ve quest bu vnum'un chat ve click olaylarına bağlanır.
  • İstenen malzeme — genelde canavarların düşürdüğü bir item_proto kaydı (örneğin bir organ, bitki ya da numune). Her kademe farklı bir malzeme ve miktar isteyebilir.
  • İlerleme verisi — oyuncunun hangi kademede olduğu ve günlük teslim hakkını kullanıp kullanmadığı. Bunu quest flag'lerinde (pc.setqf/pc.getqf) tutarsın.

Oyuncu NPC ile konuştuğunda quest, envanterindeki malzeme sayısını kontrol eder. Yeterliyse malzemeyi siler, ödülü verir, kademeyi bir artırır. Yetersizse oyuncuya kaç tane daha gerektiğini söyler. Tüm akış tek bir Lua dosyasında yönetilebilir.

Temel quest iskeleti

Aşağıda tek kademeli, çalışır bir biyolog quest iskeleti var. 9001 NPC vnum'u, 30301 istenen malzeme vnum'u olsun. Oyuncudan 20 adet malzeme istiyoruz:

quest biolog begin
    state start begin
        when 9001.chat."Biyolog" begin
            say_title("Biyolog:")
            say("Bana 20 adet numune getir,")
            say("karsiliginda seni odullendireyim.")
            say("")

            local have = pc.count_item(30301)
            say("Elindeki numune: "..have.."/20")

            local s = select("Teslim et", "Vazgec")
            if s == 2 then return end

            if pc.count_item(30301) < 20 then
                say_title("Biyolog:")
                say("Henuz yeterli numunen yok.")
                return
            end

            pc.remove_item(30301, 20)
            pc.give_item2(50300, 5)   -- odul: 5 adet iksir
            say_title("Biyolog:")
            say("Tesekkurler! Iste odulun.")
        end
    end
end

Burada pc.count_item envanterdeki miktarı sayar, pc.remove_item teslim edilen malzemeyi siler ve pc.give_item2 ödülü verir. say/select diyalog akışını kurar. Bu iskelet tek görev için çalışır; asıl biyolog sistemini cazip kılan, bunu kademelere ve günlük döngüye bağlamaktır.

Ödül kademeleri

Gerçek biyolog sistemlerinde her teslimden sonra istenen malzeme ve ödül büyür. Bunu bir Lua tablosuyla veri odaklı şekilde tasarlamak en temizidir. Kademeyi bir quest flag'inde tutarsın ve her teslimle bir artırırsın:

local KADEMELER = {
    -- {istenen_vnum, miktar, odul_vnum, odul_miktar}
    {30301, 20, 50300,  5},
    {30302, 30, 50301,  8},
    {30303, 40, 71001,  1},  -- son kademede nadir odul
}

quest biolog begin
    state start begin
        when 9001.chat."Biyolog" begin
            local step = pc.getqf("biolog_step")
            if step == 0 then step = 1 end
            if step > table.getn(KADEMELER) then
                say("Tum kademeleri tamamladin!")
                return
            end

            local k = KADEMELER[step]
            local vnum, need = k[1], k[2]
            local have = pc.count_item(vnum)

            say_title("Biyolog:")
            say(step..". kademe: "..have.."/"..need)
            local s = select("Teslim et", "Vazgec")
            if s == 2 then return end

            if pc.count_item(vnum) < need then
                say("Henuz yeterli malzemen yok.")
                return
            end

            pc.remove_item(vnum, need)
            pc.give_item2(k[3], k[4])
            pc.setqf("biolog_step", step + 1)
            say("Bir sonraki kademeye gectin!")
        end
    end
end

Bu yapı ölçeklenebilir: yeni bir kademe eklemek için KADEMELER tablosuna tek satır eklemen yeterli. Mantığı bir kez yazıp veriyi tablodan beslemek, bakım açısından kod tekrarından çok daha sağlıklıdır.

Günlük sıfırlama

Biyolog sisteminin "günlük görev" karakterini veren kısım sıfırlamadır. Amaç, oyuncunun teslimini günde bir kez yapabilmesi. Bunun için son teslim gününü bir flag'de saklar ve her girişte güncel günle karşılaştırırsın. Günü get_global_time() değerinden türetebilirsin (saniye cinsinden zaman damgasını 86400'e bölersen gün numarasını alırsın):

local function bugun()
    return math.floor(get_global_time() / 86400)
end

-- NPC akisi icinde, teslimden once:
if pc.getqf("biolog_gun") == bugun() then
    say_title("Biyolog:")
    say("Bugunluk teslimini yaptin.")
    say("Yarin tekrar gel.")
    return
end

-- ... basarili teslimden sonra:
pc.setqf("biolog_gun", bugun())

Bu yöntem sunucu yeniden başlasa bile tutarlıdır, çünkü tarihi oyuncunun kendi flag'inde saklar. İstersen "gün" hesabını sunucu saat diliminize göre bir saat ofseti ekleyerek (örn. gece yarısı yerine sabah 06:00) kaydırabilirsin.

Sömürüye kapalı tasarım

Toplama–ödül sistemleri, dikkatli kurulmazsa istismara açıktır. Şu noktalara dikkat et:

  • Önce kontrol, sonra silme: Malzemeyi pc.remove_item ile silmeden önce miktarı mutlaka yeniden say. select ekranında oyuncu eşyasını başka pencereden taşıyabilir.
  • Atomik akış: Sil ve ödül ver işlemlerini art arda, araya diyalog koymadan yap. Aksi halde oyuncu diyalogda beklerken eşyayı düşürebilir.
  • Envanter taşması: Ödül vermeden önce yer var mı kontrol et; doluysa oyuncuyu uyar ve teslimi geri al, yoksa ödül kaybolur.
  • Günlük flag'i en sonda yaz: Teslim başarıyla bittikten sonra günü kaydet ki hata durumunda hakkı boşa gitmesin.

Bu sistemi loglamak da iyi fikirdir: hangi oyuncu, hangi kademede, ne zaman teslim etti? Anormal sıklıkta teslimleri yakalamak, dupe hatalarını erken fark etmeni sağlar.

Sık Sorulan Sorular

Biyolog sistemini server source'a dokunmadan kurabilir miyim?

Evet. Tüm akış quest motoruyla (Lua) yönetilir; ihtiyacın olan tek "yeni" tanımlar NPC vnum'u ve item_proto kayıtlarıdır. Source derlemeden, yalnızca quest dosyası ve proto düzenlemesiyle çalışır bir biyolog kurabilirsin.

İstenen malzemeyi nasıl belirlerim?

Malzeme normal bir item_proto eşyasıdır. Genelde belirli canavarlara drop olarak bağlanır (mob_drop_item / drop tabloları). Böylece oyuncu malzemeyi avlanarak toplar; bu da sistemi farm döngüsüne dahil eder.

Oyuncu kademede ne kadar ilerlediğini görebilir mi?

Evet, pc.getqf("biolog_step") değerini NPC diyalogunda gösterebilirsin. Birçok sunucu ayrıca bir quest arayüzü (UI) ya da basit bir say özetiyle oyuncuya kalan miktarı ve sıradaki ödülü gösterir.

Sunucun için kademeli, günlük sıfırlanan ve sömürüye kapalı bir biyolog sistemi mi istiyorsun? Quest mantığını, ödül tablolarını ve günlük döngüyü baştan sona kurup test edebilirim. Projeni konuşmak için benimle iletişime geç.

Bu kategorideki tüm yazılar →

Devamı için