İçeriğe geç

Metin2 skill_proto Sütunları ve Formüller

Hazırlayan: Metin2VIP Editörleri Yayın: 9 dk okuma

Kısaca: skill_proto, player veritabanındaki bir MySQL tablosudur; her becerinin etkilediği puan, hasar ya da etki miktarı, SP maliyeti, süresi ve bekleme süresi bu satırlarda formül olarak durur. Formüllerde k beceri gücüdür, lv karakter seviyesi, str, dex, con ve iq statüler, atk düz vuruş hasarıdır. setFlag becerinin saldırı mı güçlendirme mi olduğunu, alana mı vurduğunu, sersemletme ya da zehir gibi ek etkilerini belirler. Tablo açılışta ve /reload p ile okunur; istemcinin ipucu formülleri ayrı skilltable.txt dosyasındadır.
İçindekiler
  1. skill_proto nerede durur, kim okur?
  2. Sütunlar tek tek
  3. bType ve bMaxLevel neden önemli?
  4. szPointOn hangi puanları değiştirebilir?
  5. Formüller nasıl yazılır?
  6. setFlag bayrakları ne yapar?
  7. Süre, SP ve bekleme formülleri nasıl çalışır?
  8. setAffectFlag ve şema farkı
  9. Sık yapılan hatalar

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 skill satı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

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?

Bu sayfa işine yaradı mı?

Giriş yap, oy ver ya da sayfayı kaydet. Okumak için üyelik gerekmez. WhatsApp X'te paylaş
Yanlış ya da eksik bir bilgi mi gördün? Bildir
Neyin yanlış olduğunu, doğrusunun ne olduğunu ve bunu nereden bildiğini yaz. Mesajın editörlere gider; yazı, kontrol edildikten sonra düzeltilir.
Yalnız editör görür.

Tartışma

Kurallar

Henüz yorum yok. Bu konuda bir deneyimin ya da sorun varsa ilk yorumu sen yaz.

Giriş yap ya da kayıt ol, sonra yorum yaz. Metin2VIP üyeliği hiçbir oyun sunucusunun hesabı değildir.