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.txtiç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çing, regen grubu içinrkullanılır).- saldırgan:
1ise oyuncuyu görür görmez saldırır,0ise 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,1hbiçiminde yazılır. - vnum:
mob_protoiç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.txtharitanın yerel koordinatını ister, global değil. Boss görünmüyorsa neredeyse her zaman sebep budur. - vnum uyuşmazlığı:
mob_proto,regen.txtvemob_drop_item.txtaynı 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ı
syserrgü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ç.