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

Metin2 Boss Sistemi: Grandboss Spawn ve Drop Ayarları

Sağlam bir metin2 boss sistemi, bir özel sunucunun en çok oynanan içeriğini belirler: oyuncular bir grandboss'un ne zaman belireceğini bilir, o saatte haritada toplanır ve nadir droplar için rekabet eder. Ama bu deneyimin arkasında üç ayrı dosyanın uyum içinde çalışması gerekir — spawn'ı tetikleyen regen.txt ya da quest Lua, droplari belirleyen mob_drop_item.txt ve oyuncuları uyaran duyuru mesajları. Bu yazıda boss spawn sürelerini, drop tablosunu ve duyuruları sıfırdan nasıl yapılandıracağını adım adım anlatıyorum.

Boss ile Grandboss arasındaki fark

Teknik olarak ikisi de mob_proto içinde bir canavar satırıdır; aralarındaki fark tür (type/rank) alanı ve spawn mantığıdır. Normal bir boss genellikle bir haritada sürekli bulunur ve öldükten kısa süre sonra yeniden doğar. Grandboss ise nadir, güçlü ve çoğu zaman zamana bağlı doğan bir varlıktır — örneğin her gün belirli saatlerde ya da belirli bir koşul sağlandığında.

  • Boss: regen.txt içinde sabit bir konum ve respawn süresiyle tanımlanır. Sunucu çekirdeği gerisini otomatik halleder.
  • Grandboss: çoğunlukla bir quest tarafından, zamanlayıcı veya event flag ile spawn edilir; spawn anında tüm sunucuya duyuru yapılır.

Bu ayrımı baştan netleştirmek, hangi aracı kullanacağını belirler. Sürekli devriye gezen bir bossu quest'le yönetmek gereksiz karmaşıklık katar; tersine, programlı bir grandboss'u sadece regen.txt ile kurmaya çalışmak da seni esnek kontrolden mahrum bırakır.

regen.txt ile boss spawn ayarlamak

Her haritanın kendi klasöründe bir regen.txt dosyası bulunur (örneğin map_a1/regen.txt). Bir bossu sürekli spawn etmek için tek bir satır eklemen yeterlidir. Satırın sütun sırası şöyledir:

# tür  saldırgan  x     y    x_aralık y_aralık  z  yön  süre  yüzde  adet  vnum
m      1          512   480  0        0         0  0    30m   100    1     2492

Buradaki alanların anlamı:

  • m: tek bir canavar (grup için g, regen grubu için r kullanılır).
  • saldırgan: 1 ise oyuncuyu görür görmez saldırır, 0 ise pasiftir.
  • x / y: haritanın yerel koordinatları (haritanın sol-üst köşesine göre).
  • süre: ölümünden sonra yeniden doğma süresi — 5s, 10m, 1h biçiminde yazılır.
  • vnum: mob_proto içindeki canavar kimliği.

Dosyayı kaydettikten sonra değişikliğin geçerli olması için ya sunucuyu yeniden başlatman ya da GM komutu /reload ile ilgili veriyi tazelemen gerekir. Koordinatları doğru bulmanın en kolay yolu, oyuna girip hedef noktada durup /where benzeri bir GM komutuyla yerel x/y değerini okumaktır.

Quest Lua ile zamanlı grandboss spawn

Programlı bir grandboss için quest sistemini kullanırız. Temel araç game.spawn_mob(vnum, x, y) fonksiyonudur; bu, çağrıldığı haritada belirtilen yerel koordinata bir canavar doğurur. Aşağıdaki örnek, bir bossun öldürülmesini izleyen ve öldüğünde duyuru yapan basit bir iskelet kurar:

quest grandboss begin
    state start begin
        function spawn_meley()
            local x, y = 1023, 875
            game.spawn_mob(2493, x, y)
            notice_all("[Grandboss] Meley Lady haritada belirdi!")
        end

        when 2493.kill begin
            notice_all("Grandboss avlandi! Bir sonraki dogus icin hazirlanin.")
            server_timer("meley_respawn", 6 * 60 * 60)  -- 6 saat sonra
        end

        when meley_respawn.server_timer begin
            grandboss.spawn_meley()
        end
    end
end

Burada when 2493.kill bloğu, vnum 2493 olan canavar öldürüldüğünde tetiklenir. server_timer ise sunucu genelinde çalışan, oyuncuya bağlı olmayan bir geri sayım başlatır — grandboss zamanlamasının kalbi budur, çünkü boss kimse online olmasa da doğmalıdır. Gerçek saate bağlı (örneğin her gün 21:00) spawn istiyorsan, bir login tetikleyicisinde os.date ile saati kontrol edip event flag kullanabilirsin:

when login begin
    local saat = tonumber(os.date("%H"))
    if saat == 21 and game.get_event_flag("meley_bugun") == 0 then
        game.set_event_flag("meley_bugun", 1)
        grandboss.spawn_meley()
    end
end

Bu yöntem basit ve okunabilirdir; daha kararlı büyük sunucularda ise spawn'ı tek noktadan yöneten ayrı bir "boss timer" quest'i tercih edilir, böylece aynı boss iki kez doğmaz.

Drop ayarları: mob_drop_item.txt

Boss droplari büyük ölçüde mob_drop_item.txt dosyasındaki gruplarla yönetilir. Her grup bir Mob vnum'una bağlanır ve içindeki her satır bir eşyayı, miktarını ve düşme şansını (binde değil, yüzde olarak) tanımlar:

Group GrandbossMeley
{
    Mob     2493
    Type    drop
    1   71001   1   30.000000
    2   72003   5   15.000000
    3   50300   1   2.500000
}

Satırların anlamı: indeks item_vnum miktar şans. Type alanı drop davranışını belirler:

  • drop: her satır bağımsız olarak şansa göre düşer; bir bosstan birden çok eşya çıkabilir.
  • kill: gruptan yalnızca bir eşya seçilir; ganimet havuzu mantığı için uygundur.
  • limit / level_limit: seviye aralığına bağlı düşüşler için kullanılır.

Şansları belirlerken oyuncu sayısı ve sunucu rate'ini hesaba kat: yüksek rate'li bir sunucuda %30'luk bir nadir eşya hızla enflasyona yol açar. Nadir droplari düşük tutup (örneğin %1–3), sık droplari makul tutmak ekonomiyi sağlıklı kılar. Dosyayı düzenledikten sonra /reload d benzeri bir GM komutuyla ya da sunucu yeniden başlatmasıyla değişikliği uygulaman gerekir.

Spawn ve drop duyuru mesajları

İyi bir boss sistemi oyuncuyu bilgilendirir. En çok kullanılan iki fonksiyon şudur:

  • notice_all("..."): tüm sunucudaki oyunculara sarı bilgi mesajı gönderir — grandboss doğumu için idealdir.
  • notice("..."): yalnızca quest'i tetikleyen oyuncuya mesaj gönderir.

Çok beğenilen bir özellik de nadir bir eşya düştüğünde sunucuya duyuru yapmaktır. Bunu drop quest'inde, düşen eşyayı kontrol ederek kurabilirsin:

when kill with npc.is_pc() == false begin
    if npc.get_race() == 2493 then
        local oyuncu = pc.get_name()
        notice_all(string.format("%s, Meley Lady'den efsanevi bir esya kaptı!", oyuncu))
    end
end

Bu tür duyurular oyuncularda "ben de orada olmalıyım" hissini güçlendirir ve boss saatlerinde sunucu yoğunluğunu artırır. Yalnızca aşırıya kaçma — her sıradan drop için duyuru yaparsan mesajlar gürültüye dönüşür ve etkisini kaybeder.

Test etmek ve sık yapılan hatalar

Sistemi yayına almadan önce GM komutlarıyla test et: /mob 2493 bossu önüne doğurur, /notice test duyuruyu dener. En sık karşılaşılan sorunlar:

  • Yanlış koordinat: regen.txt haritanın yerel koordinatını ister, global değil. Boss görünmüyorsa neredeyse her zaman sebep budur.
  • vnum uyuşmazlığı: mob_proto, regen.txt ve mob_drop_item.txt aynı vnum'u kullanmalı. Tek bir hane hatası boss'u "drop'suz" bırakır.
  • Reload unutmak: dosyaları kaydetmek yetmez; veriler çekirdeğe yeniden yüklenmeli. Şüphedeysen sunucuyu yeniden başlat.
  • syserr kontrolü: quest hataları syserr günlüklerine düşer. Bir grandboss doğmuyorsa ilk bakacağın yer orasıdır.

Bu üç dosyayı (spawn, drop, duyuru) tutarlı tuttuğun sürece, ölçeklenebilir ve oyuncuların heyecanla beklediği bir boss içeriği kurmuş olursun.

Sık Sorulan Sorular

Grandboss kimse online değilken doğar mı?

server_timer ya da gerçek saate bağlı bir mekanizma kullanıyorsan, evet — spawn oyuncuya bağlı değildir. Ancak game.spawn_mob çağrıldığı anda ilgili haritanın çekirdek tarafından yüklü olması gerekir; çoğu sunucuda ana haritalar her zaman yüklüdür, bu yüzden sorun olmaz.

Drop şanslarını binde mi yüzde mi yazıyorum?

mob_drop_item.txt içinde şans değeri yüzde olarak yazılır (30.000000 = %30). Ondalık basamaklarla çok küçük şanslar (0.100000 = binde 1) tanımlayabilirsin. common_drop_item.txt gibi diğer dosyaların formatı farklı olabilir, karıştırma.

Aynı boss neden iki kez doğuyor?

Genellikle hem regen.txt hem de bir quest aynı bossu spawn ediyordur ya da event flag düzgün sıfırlanmıyordur. Programlı grandboss'u tek bir kaynaktan yönet ve respawn'dan önce bayrağı sıfırladığından emin ol.

Sunucun için dengeli bir boss ve grandboss sistemi mi istiyorsun? Spawn zamanlaması, drop ekonomisi ve duyuru akışını oyuncularını elde tutacak şekilde birlikte kurabiliriz. Projeni konuşmak için benimle iletişime geç.

Devamı için