Metin2 skill_proto Sütunları ve Formüller
Hazırlayan: Metin2VIP Editörleri Yayın: 9 dk okuma
İçindekiler
skill_proto, oyundaki her becerinin tek satırlık tanımıdır: hangi puanı ne kadar değiştirdiği, SP maliyeti, süresi, bekleme süresi ve davranış bayrakları burada formül olarak durur. Tablo bir txt dosyası değil, player veritabanındaki bir MySQL tablosudur. db çekirdeği açılışta okur, oyun çekirdekleri formülleri her beceri kullanımında o anki değerlerle hesaplar; istemci ise beceri ipucu için kendi dosyasını taşır.
Aşağıdaki davranışlar oyun çekirdeğinin kodundan çıkarıldı; resmî yapıdan türeyen sunucuların çok büyük çoğunluğunda aynıdır. Formüllerin kendisi sunucu ayarıdır ve örnekler varsayılan tablodandır. Beceri seviyesinin formüle hangi güçle girdiği beceri gücü yazısında.
skill_proto nerede durur, kim okur?
db, tabloyu tek bir sorguyla ORDER BY dwVnum sırasında okur. Tablo boşsa günlüğe no result from skill_proto yazılır ve db açılmaz. Oyun çekirdekleri satırları db'den alır, her satırda puan adını ve formülleri ayrıştırır. Bir satırda tanınmayan bir puan adı ya da formülde sözdizimi hatası varsa günlükte cannot find point type ya da syntax error skill satırı çıkar.
Hatanın sonucu zamana göre değişir. Açılışta tek bir hatalı satır cannot initialize skill table yazdırıp çekirdeği kapatır. /reload p sırasında ise yeni tablo hiç uygulanmaz, eski tablo yerinde kalır ve günlüğe "There were erros when loading skill table" düşer. Yani reload sonrası değişmeyen bir beceri çoğu zaman başka bir satırdaki hatayı gösterir. /reload p beceri tablosunu da çekirdeklere gönderdiği için değer değişikliklerinde yeniden başlatma gerekmez; komutun ayrıntısı proto araçları yazısında.
İstemci bu tabloyu görmez. Beceri ipucundaki sayılar locale/common/skilltable.txt dosyasından hesaplanır. Bu dosya sekmeyle ayrılmış dokuz sütundur: vnum, en yüksek seviye, seviye şartı, etki formülü, SP formülü, süre formülü, süreli SP formülü, bekleme formülü ve hedef menzili. Sütun sayısı tutmayan satır atlanır, vnum'u skilldesc.txt'de olmayan beceri de kaydedilmez. Sunucuda formül değiştirip bu dosyayı güncellemeyen bir sunucuda oyuncu ipucunda eski değeri görür.
Sütunlar tek tek
| Sütun | Anlamı | Not |
|---|---|---|
| dwVnum | Beceri numarası | Birincil anahtar |
| szName | İç ad | En çok 32 karakter; oyuncu adı skilldesc.txt'den görür |
| bType | Becerinin grubu | 0 ortak, 1 savaşçı, 2 ninja, 3 sura, 4 şaman, 5 at, 7 Lycan |
| bLevelStep | Seviye adımı | Sunucu kullanmaz |
| bMaxLevel | k çarpanı; bType 0'da en yüksek seviye | Aşağıda ayrıca |
| bLevelLimit | Beceriyi yükseltmek için gereken karakter seviyesi | Varsayılanda yalnız at becerilerinde dolu |
| szPointOn | Değişen puan | HP, ATT_GRADE, MOV_SPEED gibi |
| szPointPoly | Etki miktarı | Saldırıda eksi işaretli hasar |
| szSPCostPoly | SP maliyeti | |
| szDurationPoly | Etki süresi (sn) | 0 ise etki anlık uygulanır |
| szDurationSPCostPoly | Açık kalan becerilerde süreli SP | TOGGLE becerileri |
| szCooldownPoly | Bekleme süresi (sn) | Yalnız k ile hesaplanır |
| szMasterBonusPoly | G ve P'de szPointPoly'nin yerine geçer | |
| szAttackGradePoly | Eski alan | db okumaz |
| setFlag | Davranış bayrakları | MySQL SET, virgülle |
| setAffectFlag | Karaktere konan durum işareti | MySQL ENUM |
| szPointOn2, szPointPoly2, szDurationPoly2, setAffectFlag2 | İkinci etki | Bazı bayraklarda şans değeri |
| szPointOn3, szPointPoly3, szDurationPoly3 | Üçüncü etki | Yalnız G ve üstünde; durum işareti yok |
| szGrandMasterAddSPCostPoly | G ve üstünde SP formülü | Adına rağmen eklenmez, yerine geçer |
| prerequisiteSkillVnum, prerequisiteSkillLevel | Ön koşul becerisi ve seviyesi | Varsayılanda boş |
| eSkillType | NORMAL, MELEE, RANGE, MAGIC | Hasarın hangi dirençle azalacağı |
| iMaxHit | Bir kullanımda sayılan en çok vuruş | 0 sınırsız |
| szSplashAroundDamageAdjustPoly | Ana hedef dışındakilere hasar çarpanı | 0,8 yazılırsa çevredekiler %80 alır |
| dwTargetRange | Hedefin en uzak mesafesi | 0 denetim yok; 50 birim pay vardır |
| dwSplashRange | Alan yarıçapı | SPLASH bayrağıyla |
Formül alanları en çok 100 karakter tutar; daha uzun formül db okurken kesilir ve kesilen hâli ya sözdizimi hatası verir ya da yanlış hesaplanır. Varsayılan tablodaki en uzun formül 82 karakterdir.
bType ve bMaxLevel neden önemli?
Varsayılan tabloda 97 satır vardır: 39'u bType 0, dört sınıfın her biri 12'şer, Lycan 6, at becerileri 4 satır. Puanla yükseltmede bType 0 destek beceri puanı, 1-4 ve 7 beceri puanı, 5 at becerisi puanı harcar. 8 ve üstü bir bType değeri Wrong skill type hatası verir ve beceri yükselmez.
bMaxLevel iki işe yarar ve en çok yanlış anlaşılan sütundur. Oyun k değerini beceri gücü × bMaxLevel / 100 diye hesaplar. Sınıf becerilerinde bu sütun 1'dir; böylece k M1'de 0,5, P'de 1,25 olur. Bu satırlardan birine 2 yazmak becerinin en yüksek seviyesini değiştirmez, k'yı ikiye katlar. Sınıf becerilerinin üst sınırı çekirdekte sabit 40'tır. Yalnız bType 0 becerilerinde bMaxLevel gerçekten en yüksek seviyedir: Liderlik ve Dönüşüm 40, at çağırma 10.
szPointOn hangi puanları değiştirebilir?
Oyunun tanıdığı adlar şunlardır: NONE, MAX_HP, MAX_SP, HP_REGEN, SP_REGEN, BLOCK, HP, SP, ATT_GRADE, DEF_GRADE, MAGIC_ATT_GRADE, MAGIC_DEF_GRADE, BOW_DISTANCE, MOV_SPEED, ATT_SPEED, POISON_PCT, RESIST_RANGE, CASTING_SPEED, REFLECT_MELEE, ATT_BONUS, DEF_BONUS, RESIST_NORMAL, DODGE, KILL_HP_RECOVER, KILL_SP_RECOVER, HIT_HP_RECOVER, HIT_SP_RECOVER, CRITICAL, MANASHIELD, SKILL_DAMAGE_BONUS ve NORMAL_HIT_DAMAGE_BONUS. Lycan açık yapılarda BLEEDING_PCT de eklenir. Büyük ya da küçük harf fark etmez.
szPointOn ve szPointOn2 boş bırakılamaz; kullanılmıyorsa NONE yazılır, boş hücre cannot find point type hatasıdır. szPointOn3 ise boş kalabilir. Saldırı becerileri HP'yi hedef alır, güçlendirmeler ATT_GRADE, DEF_GRADE, MOV_SPEED gibi puanları. ATT_GRADE ve DEF_GRADE karakterin taban değerini değil saldırı ve savunma bonusunu artırır.
Formüller nasıl yazılır?
Formüller dört işlem, ^ üs işareti, parantez ve ondalık noktalı sayılarla yazılır. Kullanılabilecek değişkenler:
| Değişken | Değeri |
|---|---|
| k | Beceri gücü × bMaxLevel / 100 |
| lv | Kullananın seviyesi |
| str, dex, con, iq | Kullananın Güç, Çeviklik, Canlılık ve Zeka değeri |
| atk | Düz vuruş hasarı: USE_MELEE_DAMAGE ile yakın, USE_MAGIC_DAMAGE ile büyü, USE_ARROW_DAMAGE ile ok hasarı |
| wep | Silahın Value3-Value4 arasından rastgele saldırı değeri + Value5 |
| mwep, mtk | Silahın Value1-Value2 arasından büyü saldırısı + Value5 |
| ar | Saldırı isabet oranı |
| def, odef | Kullananın savunması; odef bonuslar hariç savunma |
| maxhp, maxsp | Etki formüllerinde hedefin en yüksek HP ve SP'si |
| maxv | szPointOn MOV_SPEED ise hedefin hareket hızı sınırı |
| chain | Şimşek Pençesi'nde sıçrama sırası |
SP formülünde değişkenler farklıdır: k, kullananın kendi maxhp'si, maxv olarak en yüksek SP'si ve v olarak o anki SP'si. USE_HP_AS_COST bayrağı varsa v o anki HP'dir ve maliyet SP yerine candan düşer. Bekleme formülü yalnız k'yı tanır. Silahsız bir karakterde wep, mwep ve mtk 0'dır; yay ya da ok yoksa ok hasarı da 0'a düşer.
Fonksiyonlar: number(a, b) ya da irandom(a, b) iki sınır arasında tam sayı, frandom(a, b) ondalıklı rastgele sayı verir; min, max, floor, abs, sqrt, mod, sign, log, ln, log10, sin, cos, tan ile pi ve e sabitleri de vardır. Varsayılan tabloda kullanılanlar yalnız number ve floor'dur.
Üç kural hata kaynağıdır. Değişken adları yalnız harften oluşur; tanınmayan her ad hata vermeden yeni bir değişken sayılır ve 0 değerini alır. Kodun atadığı horse_level adı alt çizgi içerdiği için formülde kullanılamaz. Sonuç tam sayıya kesilir: 207,5 çıkan bir değer 207 olur. Saldırı becerilerinde formül eksi işaretle yazılır, oyun sonucu ters çevirip hasar yapar; işareti unutulan beceri 1-5 arası vurur.
Aşağıda Hava Kılıcı satırı adım adım çözülüyor.
setFlag bayrakları ne yapar?
setFlag bir MySQL SET sütunudur; db bunu sayıya çevirir ve listedeki sıra bayrağın bitidir. Bayrakların oyundaki karşılığı:
| Bayrak | Etkisi |
|---|---|
| ATTACK | Saldırı becerisi; hasar yolu çalışır |
| USE_MELEE_DAMAGE, USE_MAGIC_DAMAGE, USE_ARROW_DAMAGE | atk değişkeninin hangi vuruştan hesaplanacağı |
| SELFONLY | Hedef her zaman kullananın kendisidir |
| PARTY | Lycan açık yapılarda grup becerisi; hedef kullanandır |
| SPLASH | dwSplashRange içindeki herkese uygulanır |
| USE_HP_AS_COST | Maliyet SP yerine HP'den düşer |
| COMPUTE_MAGIC_DAMAGE | Hasar büyü hasarı türünde işlenir |
| PENETRATE | szPointPoly2 yüzdesiyle hedefin savunması yok sayılır |
| IGNORE_TARGET_RATING | szPointPoly2 yüzdesiyle hedefin kaçınma değeri yok sayılır |
| ATTACK_STUN, ATTACK_SLOW | szPointPoly2 şans, szDurationPoly2 süre; yavaşlatma hızı 30 düşürür |
| ATTACK_POISON, ATTACK_BLEEDING | szPointPoly2 yüzdesiyle zehirler ya da kanatır |
| ATTACK_FIRE_CONT | szPointPoly2 yanma hasarı, szDurationPoly2 tutuşma şansıdır |
| HP_ABSORB, SP_ABSORB | Verilen hasarın szPointPoly2 yüzdesi HP ya da SP olarak geri gelir |
| REMOVE_BAD_AFFECT, REMOVE_GOOD_AFFECT | szPointPoly2 şansla kötü etkileri siler ya da hedefin güçlendirmelerini kaldırır |
| CRUSH, CRUSH_LONG | Hedefi 200 birim, CRUSH_LONG'da iki katı geri savurur; hareketsiz canavarlara işlemez |
| TOGGLE | Açık beceri yeniden kullanılınca SP harcamadan kapanır |
| DISABLE_BY_POINT_UP | Beceri puanla yükseltilemez |
| ATTACK_WIND, ATTACK_ELEC, ATTACK_FIRE | Canavarlarda hasarı rüzgar, şimşek ve ateş direnciyle azaltır |
| COMPUTE_ATTGRADE, GIVE_PENALTY | Bu yapıda hiçbir yerde denetlenmez |
eSkillType ise hasarın son adımını seçer. MELEE silah türü direncini uygular ve hedefin savunmasını çıkarır; PENETRATE tutarsa savunma çıkarılmaz. RANGE yalnız ok direncini, MAGIC ırk ve sınıf bonusunu ve büyü direncini uygular, ikisinde de savunma düşülmez. NORMAL güçlendirmeler içindir, ek azaltma yapmaz. Sura'nın Parmak Darbesi satırı bayrakların ve ikinci formülün birlikte nasıl çalıştığını gösterir.
Süre, SP ve bekleme formülleri nasıl çalışır?
Güçlendirme becerilerinde szDurationPoly'nin sonucu 0'dan büyükse etki o kadar saniye süren bir durum olarak eklenir; değilse puan anında değişir. Varsayılan tabloda İyileştirme satırının süre formülü bu yüzden boştur. Grupta Tampon rolündeki oyuncunun becerilerine ayrıca ek saniye gelir. szDurationSPCostPoly, TOGGLE bayraklı becerilerde açık kaldıkça düşen SP'dir.
szCooldownPoly saniye cinsindendir ve yalnız k ile hesaplanır; çıkan süreye karakterin büyü hızı uygulanır. G ve P seviyesinde iki formül yer değiştirir: etki için szMasterBonusPoly, maliyet için szGrandMasterAddSPCostPoly kullanılır. Bu yalnız ilk etkiyi kapsar; szPointPoly2 her seviyede aynıdır. Varsayılan tabloda sınıf becerilerinden yalnız dört okçu becerisinin ve Yüksek Saldırı'nın G formülü normal formülden farklıdır.
Üçüncü etki (szPointOn3) yalnız beceri G ve üstündeyken uygulanır ve ona durum işareti bağlanmaz. Varsayılan tabloda hiçbir satırda dolu değildir; G'ye özel bir etki eklemek isteyen sunucu bu alanları kullanabilir.
setAffectFlag ve şema farkı
setAffectFlag bir MySQL ENUM'dur ve oyun listedeki sırayı doğrudan durum işaretinin numarası olarak kullanır; istemci bu numarayla becerinin efektini çizer. Bu yüzden ENUM'a araya bir ad eklemek sonraki bütün becerilerin görünümünü kaydırır. Durum işaretlerinin ayrıntısı affect sistemi yazısında.
sql/player.sql içindeki taban şemada setFlag listesi CRUSH_LONG'da biter. ATTACK_WIND, ATTACK_ELEC, ATTACK_FIRE, ATTACK_BLEEDING ve PARTY yalnız sql/updates/player__skill_proto.sql ile kurulan tabloda vardır. Lycan satırları taban şemaya aktarılırsa, katı kipte çalışmayan bir MySQL bu bayrakları yalnız bir uyarıyla düşürür.
Sık yapılan hatalar
- Sınıf becerisinde bMaxLevel'i en yüksek seviye sanıp 40 yazmak: k 40 katına çıkar.
- szPointOn2'yi boş bırakmak; NONE yazılmalıdır.
- Formüle tanımlı olmayan bir değişken yazmak ya da adı yanlış yazmak: hata çıkmaz, terim 0 olur.
- Saldırı formülünde eksi işaretini unutmak.
- Değişikliği yalnız sunucuda yapıp istemcinin skilltable.txt dosyasını güncellememek.
- Reload'dan sonra değişmeyen beceride hatayı o satırda aramak: tablonun tamamı geri çevrilmiş olabilir, günlükteki
syntax error skillsatırına bak. - 100 karakteri aşan formül yazmak.
Canavarların kullandığı beceriler de bu tablodan gelir; canavar tarafındaki SKILL sütunları mob_proto yazısında. Seviye basamaklarının oyuncu tarafı beceri seviyeleri yazısında.
Sık sorulan sorular
- skill_proto'da formülü değiştirdim, oyunda değişmesi için ne yapmalıyım?
- MySQL'deki satırı değiştirip IMPLEMENTOR yetkili bir karakterle /reload p yazmak yeter; db tabloyu yeniden okur ve oyun çekirdeklerine gönderir. Satırlardan birinde hata varsa yeni tablo hiç uygulanmaz, eski tablo kalır. Beceri ipucundaki sayıların da değişmesi için istemcinin skilltable.txt dosyası ayrıca güncellenmelidir.
- Formüldeki k neden 1 değil de 0,5 gibi bir sayı?
- k, beceri gücü yüzdesi ile bMaxLevel sütununun çarpımının yüzde biridir. Sınıf becerilerinde bMaxLevel 1 yazılıdır, bu yüzden k M1'de 0,5, P'de 1,25 olur. bMaxLevel 2 yazılırsa k ikiye katlanır ve beceri iki kat güçlenir.
- Saldırı becerisinin formülü neden eksi işaretle başlıyor?
- Oyun saldırı becerilerinde formülün sonucunu ters çevirip hasar olarak kullanır. Eksi işareti unutulan bir saldırı becerisi 1 ile 5 arasında hasar vurur.
- Formülde yanlış yazdığım değişken hata verir mi?
- Vermez. Ayrıştırıcı tanımadığı her adı yeni bir değişken sayar ve değerini 0 kabul eder. strr ya da atak gibi bir yazım hatası formülün o kısmını sessizce sıfırlar.
İlgili sayfalar
- Metin2 Affect Sistemi: Etkiler, Süreler ve Yeni Etki Ekleme (Server kurma)
- Metin2 Beceri Gücü Tablosu: Seviyeye Göre Güç Yüzdesi ve Anlamı (Wiki)
- Metin2 Beceri Seviyeleri: Normal, M, G ve P Nasıl Yükselir? (Wiki)
- Metin2 mob_proto Rehberi: Sütunlar, Rütbeler ve AI Bayrakları (Server kurma)
- Metin2 Proto Dönüştürme: dump_proto ve Mysql2Proto Nasıl Kullanılır? (Server kurma)
Kategori: Server Kurma Proto ve Veri Dosyaları beceri sunucu dosyaları proto skill_proto formül
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?