Metin2 item_attr ve item_attr_rare: Efsun Tabloları
Hazırlayan: Metin2VIP Editörleri Yayın: 6 dk okuma
İçindekiler
item_attr, eşyaların 5 normal efsun yerine gelebilecek efsunların tablosudur; item_attr_rare aynı biçimde 6. ve 7. efsunları tutar. Her satır bir efsundur ve dört şey söyler: efsunun hangi APPLY olduğu, seçilme ağırlığı (prob), beş kademenin değerleri (lv1-lv5) ve sekiz parçada çıkabileceği en yüksek kademe. İki tablo da player veritabanında durur ve oyun çekirdeğine açılışta gelir.
Aşağıdaki kurallar oyun çekirdeğinin kodundan çıkarıldı; resmî yapıdan türeyen sunucuların çok büyük çoğunluğunda aynıdır. Tablodaki sayılar sunucu ayarıdır. Oyuncu tarafındaki sonuçlar, yani efsunların hangi parçada hangi olasılıkla çıktığı efsun değerleri yazısında; burada tabloların kendisi var.
Tablolar nerede durur, kim okur?
db iki tabloyu şu sorguyla okur; item_attr_rare için tablo adı değişir:
SELECT apply, apply+0, prob, lv1, lv2, lv3, lv4, lv5,
weapon, body, wrist, foots, neck, head, shield, ear
FROM item_attr ORDER BY apply
Tablolardan biri boşsa günlüğe no result from item_attr ya da no result from item_attr_rare yazılır ve db açılmaz. Kostüm sütunları (costume_body, costume_hair, costume_weapon) yalnız ENABLE_ITEM_ATTR_COSTUME açık derlenmiş yapılarda sorguya girer. Bu kaynakta tanım kapalıdır; tablodaki kostüm sütunları dolu olsa da okunmaz.
db tabloları oyun çekirdeğine açılış paketinde gönderir. /reload p db'nin yeniden okumasını sağlar ama efsun tablolarını çalışan çekirdeklere yollamaz. Değişiklik için oyun çekirdeklerini yeniden başlatmak gerekir. Eşyalarda zaten duran efsunlar yeni değere geçmez; tablo yalnız bundan sonra çekilen efsunları etkiler.
Sütunlar
| Sütun | Anlamı | Not |
|---|---|---|
| apply | Efsunun adı, APPLY_ öneki olmadan | MySQL ENUM; sırası APPLY numarasıdır |
| prob | Seçilme ağırlığı | Yalnız item_attr'da kullanılır |
| lv1..lv5 | 1-5. kademenin değeri | Eşyada 16 bitlik sayı olarak durur |
| weapon | Silahlarda en yüksek kademe | Oklar efsun almaz |
| body, wrist, foots, neck, head, shield, ear | Zırh, bilezik, ayakkabı, kolye, kask, kalkan, küpe | 0 o parçaya hiç gelmez |
| costume_body, costume_hair, costume_weapon | Kostüm listeleri | Bu yapıda okunmaz |
Varsayılan item_attr 42 satırdır. Örnek iki satır:
apply prob lv1 lv2 lv3 lv4 lv5 weapon body wrist foots neck head shield ear
MAX_HP 35 500 500 1000 1500 2000 0 5 5 5 5 0 0 0
CRITICAL_PCT 18 1 2 3 5 10 5 0 0 5 5 0 0 0
Max. HP zırh, bilezik, ayakkabı ve kolyede beş kademeye kadar çıkar; silaha, kaska, kalkana ve küpeye gelmez. Kritik vuruş şansı silah, ayakkabı ve kolyede vardır.
apply sütunu neden ENUM sırasına bağlıdır?
db efsunun numarasını addan değil apply+0 ile, adın ENUM listesindeki sırasından alır. Bu sıra çekirdekteki APPLY numaralarıyla birebir aynı olmalıdır: MAX_HP 1, MAX_SP 2, CON 3 ... diye gider. Taban şemadaki liste 91. sıradaki RESIST_PENETRATE'te biter ve bazı adlar koddakinden farklıdır; 64. sıradaki ATT_BONUS, kodda APPLY_MALL_ATTBONUS'tur. Ad farklı olsa da sıra tuttuğu sürece efsun doğru çalışır.
Bundan iki kural çıkar. ENUM listesinin ortasına yeni bir ad eklemek, sonraki bütün adların sıra numarasını bir kaydırır; tablo bundan sonra çekilen efsunları yanlış APPLY numarasıyla verir ve kaymış satırlar komşu efsun olarak gelir. Eşyalarda zaten duran efsunlar numarayla saklandığı için etkilenmez. Yeni ad her zaman listenin sonuna, çekirdekteki numarasına denk gelecek yere eklenir. İkincisi, katı kipte çalışmayan bir MySQL listede olmayan bir adı yalnız bir uyarıyla boş değer olarak kaydeder; o satır APPLY_NONE olur ve hiçbir eşyaya gelmez.
Oyun çekirdeği satırları APPLY numarasına göre bir diziye koyar. Aynı efsun için ikinci bir satır yazmak ikinci bir liste açmaz, yalnız birini geçerli kılar. Bu yüzden bir efsunun silahta 10, zırhta 5 vermesi gibi parçaya özel değer bu tabloyla kurulamaz.
prob: seçilme ağırlığı nasıl kullanılır?
Bir eşyaya efsun çekilirken oyun önce eşyanın parçasını bulur: bütün silahlar (oklar hariç) weapon, gövde zırhı body, bilezik wrist, ayakkabı foots, kolye neck, kask head, kalkan shield, küpe ear sütununu kullanır. Kostüm sistemi olan yapılarda gövde kostümü body, saç kostümü head, silah kostümü weapon sütunundan beslenir. Yüzük, kemer ve özel eşya yuvasına takılanlar efsun almaz.
Sonra o sütunu 0'dan büyük olan ve eşyada henüz bulunmayan efsunlar aday olur. Eşyanın item_proto'daki sabit bonusları da "bulunan" sayılır; ayakkabıya hareket hızı efsunu bu yüzden gelmez. Adayların prob değerleri toplanır ve her efsun, toplam içindeki payı kadar olasılıkla seçilir.
prob efsuna aittir, parçaya değil. Bir efsunu yalnız tek bir parçada sıklaştırmanın yolu yoktur; ancak o parçadaki diğer efsunların sütununu 0 yaparak aday listesi daraltılabilir.
lv1-lv5 kademeleri ve parça sütunu
Kademeyi tablo değil, efsunun geldiği yol seçer: düşen eşyanın ilk efsunu, Arttırma Kağıdı ve Efsun Nesnesi farklı kademe dağılımları kullanır. Bu dağılımlar çekirdekte sabittir ve efsun sistemi yazısında tablo olarak duruyor. Tablo yalnız seçilen kademenin değerini verir.
Parça sütunundaki sayı o kademenin tavanıdır. Seçilen kademe tavandan büyükse tavana indirilir. Varsayılan tabloda sersemlik ve yavaşlama bağışıklığının kalkan sütunu 1'dir; Efsun Nesnesi 5. kademe çekse bile bu efsunlar 1. kademe değeriyle gelir. Değeri 5'ten küçük bir sayıyla sınırlamak, bir efsunu bir parçada zayıf tutmanın tek yoludur.
İki ayrıntı sorun çıkarır. Seçilen kademenin değeri 0 ise efsun eşyaya hiç yazılmaz. Arttırma Kağıdı bu durumda yine "başarılı" iletisi verir ve harcanır, ama eşyada yeni efsun görünmez; bu yüzden kullanılan her kademeye bir değer yaz. Değerler eşyada işaretli 16 bitlik sayı olarak saklandığı için 32.767'yi geçen bir değer taşar.
item_attr_rare: 6-7. efsun tablosu
item_attr_rare aynı sütunlara sahiptir ama başka kurallarla çalışır. Varsayılan tabloda 20 satır vardır; hepsinde prob 1'dir, beş kademe aynı değeri taşır ve sekiz parça sütununun hepsi 5'tir. Listenin oyuncu tarafı 6. ve 7. efsun yazısında.
| Kural | item_attr | item_attr_rare |
|---|---|---|
| Seçim | prob ağırlığıyla | Eşit kura, prob okunmaz |
| Kademe | Gelen yola göre 1-5 | Her zaman 5, parça sütunuyla kırpılır |
| Tekrar denetimi | Normal efsunlar ve sabit bonuslar | Yalnız 6-7. yerler |
| Yer | İlk 5 yer | 6. ve 7. yer |
Bu farkların pratik sonucu şudur: 6-7. efsunun değerini değiştirmek için lv5 sütunu yeterlidir, öteki kademeler kırpılma olmadıkça kullanılmaz. Bir özel efsunu nadirleştirmek için prob'a dokunmak işe yaramaz; tek yol satırı silmek ya da parça sütunlarını 0 yapmaktır. Özel efsun normal efsunlarla aynı türden olabilir, çünkü tekrar denetimi yalnız iki özel yere bakar.
Her parça için tabloda en az bir uygun satır bırak. 6-7. efsun nesnesi, o parça için aday bulamadığı bir eşyada boş listeden seçim yapmaya çalışır; böyle bir yapılandırma oyun çekirdeğinin kararlılığını tehlikeye atar.
Yeni efsun eklerken nelere dikkat edilir?
Tabloya satır eklemek, çekirdeğin zaten tanıdığı bir APPLY'ı efsun listesine almak için yeterlidir. Örneğin APPLY_ATTBONUS_MONSTER, yani canavarlara karşı güçlü, normal efsun listesinde yoktur; ENUM'da adı olduğu için şöyle bir satırla küpeye gelebilir hale gelir:
INSERT INTO item_attr (apply, prob, lv1, lv2, lv3, lv4, lv5,
weapon, body, wrist, foots, neck, head, shield, ear)
VALUES ('ATT_BONUS_TO_MONSTER', 10, 1, 2, 3, 5, 8, 0, 0, 0, 0, 0, 0, 0, 5);
Çekirdeğin hiç bilmediği yeni bir bonus ise tabloyla açılmaz: APPLY numarası, o numaranın hangi karakter puanını değiştireceği, ENUM'un sonuna eklenen ad ve istemcinin ipucu metni birlikte gerekir. Adımların tamamı yeni efsun ekleme yazısında. Tablo tarafında kontrol listesi şöyledir:
- Satırı ENUM'daki doğru adla yaz; adı listenin ortasına ekleme.
- prob'u mevcut efsunların ağırlık toplamına göre seç; 10 eklemek silahtaki toplamı 356'dan 366'ya çıkarır ve herkesin payını biraz düşürür.
- Kullanılan her kademeye 0'dan farklı bir değer yaz.
- Parça sütununa 0 ile 5 arasında tavan yaz; 0 o parçaya gelmez demektir.
- İstemcinin ipucunda efsun adının çıktığını kontrol et; istemci bilmediği bir APPLY'ı "UNKNOWN_TYPE" satırıyla gösterir.
- Oyun çekirdeklerini yeniden başlat.
Efsunların kendi sabit bonus olarak nasıl yazıldığı, yani item_proto'daki ApplyType sütunları item_proto yazısında; çekirdeğin tanıdığı bütün APPLY adları efsun listesi sayfasında.
Sık sorulan sorular
- Bir efsunun silahta ve zırhta farklı değer vermesini sağlayabilir miyim?
- Bu tabloyla sağlayamazsın. Her efsunun tek satırı vardır; aynı efsun için ikinci satır yazılırsa oyun yalnız birini kullanır. Parça sütunları değeri değil, o parçada çıkabilecek en yüksek kademeyi belirler.
- item_attr'da prob'u artırdım, efsun daha sık çıkıyor mu?
- Çıkar, ama yalnız normal 5 efsun yerinde ve o efsunun gelebildiği bütün parçalarda birlikte. Olasılık efsunun ağırlığının, o parçada gelebilen efsunların ağırlık toplamına bölümüdür. 6-7. efsun tablosundaki prob ise kullanılmaz.
- Efsun tablosunu değiştirdim ama oyunda bir şey değişmedi, neden?
- Efsun tabloları oyun çekirdeğine yalnız çekirdek açılırken gönderilir. /reload p db'nin tabloyu yeniden okumasını sağlar ama çalışan çekirdeklere yollamaz; oyun çekirdeklerini yeniden başlatmak gerekir. Eşyalarda zaten duran efsunlar da değişmez, yeni değerler yalnız yeni çekilen efsunlara uygulanır.
İlgili sayfalar
- Metin2 6. ve 7. Efsun: Nadir Efsunlar Nasıl Eklenir ve Ne İşe Yarar? (Wiki)
- Metin2 Efsun Değerleri: 1-5. Kademe Tablosu ve Hangi Eşyaya Hangi Efsun Gelir (Wiki)
- Metin2 Efsun Sistemi: Efsun Nasıl Gelir, Kaç Efsun Olur, Şans Neye Bağlı? (Wiki)
- Metin2 item_proto Rehberi: Sütunlar, Türler ve Bayraklar (Server kurma)
- Metin2 Yeni Efsun (Bonus) Ekleme: Sunucu ve İstemci (Server kurma)
Kategori: Server Kurma Proto ve Veri Dosyaları efsun sunucu dosyaları proto item_attr item_attr_rare
Bu sayfadaki bilgiler Metin2'nin sunucu yazılımındaki hesaplamalara ve standart oyun dosyalarına dayanır. Oyun dosyalarını değiştiren sunucularda değerler farklı olabilir. İçerikleri nasıl hazırlıyoruz?