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

Metin2 Bonus Düzenleme: Attr Tabloları ve Apply Türleri

Bir oyuncu eşyasına sağ tıklayıp ittiğinde gördüğü o yeşil satırlar — "Maks. CP +500", "Saldırma hızı +8" — sunucunun ruhudur. Metin2 bonus düzenleme, hangi eşyaya hangi bonusun, ne olasılıkla ve ne değerde çıkacağını belirleme işidir. Bunun tamamı player veritabanındaki iki tabloda ve oyun çekirdeğindeki apply türlerinde gizlidir. Bu rehberde tabloların mantığını, olasılık sistemini ve sıfırdan yeni bir bonus eklemeyi kendi sunucum Runa2'deki yapıyla anlatıyorum.

İki tablo: item_attr ve item_attr_rare

Bonus havuzu player veritabanındaki iki tabloda durur:

  • item_attr — eşyaların normal (1–4.) bonus satırlarının çıkabileceği havuz.
  • item_attr_rare — 5./6. (nadir) bonus satırı için ayrı havuz; bunlar genellikle özel bir eşyayla eklenir.

Her satır bir apply türünü, bir prob (olasılık ağırlığı) değerini, lv1lv5 değer kademelerini ve hangi eşya tiplerinde çıkabileceğini belirten açma/kapama sütunlarını içerir:

SELECT apply, prob, lv1, lv2, lv3, lv4, lv5
FROM item_attr
WHERE weapon = 1
ORDER BY prob DESC;

Slot sütunları tipik olarak weapon, body, wrist, foots, neck, head, shield, ear'dır. 1 ise o bonus, o eşya tipinde çıkabilir; 0 ise çıkamaz.

prob nasıl çalışır: olasılık değil, ağırlık

Yaygın bir yanlış anlama: prob bir yüzde değildir. Çekirdek, bir eşyaya bonus verirken o slot için işaretli (weapon=1 gibi) tüm satırların prob değerlerini toplar ve bu toplam içinde rastgele seçer. Yani bir satırın çıkma şansı kendi prob'u / o slottaki tüm prob'ların toplamı'dır. Sonuç olarak:

  • Bir bonusu daha sık görmek istiyorsan prob'unu artır.
  • Tüm değerleri orantılı büyütürsen göreli olasılıklar değişmez — sadece toplam büyür.
  • Bir bonusu o slottan tamamen kaldırmak için satırı silmek yerine ilgili slot sütununu 0 yapmak daha güvenlidir.

lv1–lv5: değer kademeleri

Bir eşyaya bonus eklendiğinde, çıkan değer lv1lv5 sütunlarından gelir; lv1 en zayıf, lv5 en güçlü kademedir. Örneğin bir silahta CP çalma bonusunu güçlendirmek istersen:

UPDATE item_attr
SET lv1 = 1, lv2 = 2, lv3 = 3, lv4 = 4, lv5 = 6
WHERE apply = 'STEAL_HP';

Burada dikkat: apply sütunu apply türünü "APPLY_" öneki olmadan tutar — yani MAX_HP, ATT_SPEED, STEAL_HP gibi. Bu adlar oyun çekirdeğindeki tablo ile eşleşmek zorundadır.

Apply türleri: adlar nereden geliyor?

Her apply türü oyun çekirdeğinde bir sayıya ve bir point (istatistik) türüne bağlıdır. Bu eşleme srcs/game/src/constants.cpp içindeki aApplyInfo dizisinde durur:

const TValueName aApplyInfo[MAX_APPLY_NUM] =
{
    { "NONE",       APPLY_NONE,       POINT_NONE },
    { "MAX_HP",     APPLY_MAX_HP,     POINT_MAX_HP },
    { "STR",        APPLY_STR,        POINT_ST },
    { "ATT_SPEED",  APPLY_ATT_SPEED,  POINT_ATT_SPEED },
    { "STEAL_HP",   APPLY_STEAL_HP,   POINT_STEAL_HP },
    // ...
};

Dizideki ilk sütun ("MAX_HP") tam olarak DB'deki apply değeridir. İkinci sütun length.h içindeki APPLY_ enum'u, üçüncü sütun ise değerin hangi istatistiğe yazılacağını söyleyen POINT_ türüdür. Mevcut bir bonusu eklemek için sadece DB'ye satır eklemen yeterli; çünkü adı zaten bu tabloda tanımlı.

Mevcut bir bonusu yeni bir eşya tipine açma

Diyelim ki "CP çalma" bonusunun bileklikte de çıkmasını istiyorsun. Tek yapman gereken ilgili satırın slot sütununu güncellemek:

UPDATE item_attr
SET wrist = 1
WHERE apply = 'STEAL_HP';

Yeni bir bonusu havuza eklemek de bir INSERT'ten ibarettir:

INSERT INTO item_attr
  (apply, prob, lv1, lv2, lv3, lv4, lv5,
   weapon, body, wrist, foots, neck, head, shield, ear)
VALUES
  ('CRITICAL_PCT', 250, 1, 2, 3, 4, 5,
   1, 0, 0, 0, 0, 0, 0, 0);

Gerçekten YENİ bir bonus (apply) eklemek

Havuzda olmayan, tamamen yeni bir etkiyi tanımlamak istiyorsan iş sadece DB ile bitmez; hem sunucu hem istemci kaynağına dokunman gerekir. Sıra şudur:

  • length.hAPPLY_ enum'una yeni türü ekle ve MAX_APPLY_NUM'u güncelle.
  • constants.cppaApplyInfo dizisine { "AD", APPLY_AD, POINT_AD } satırını ekle.
  • char.cpp / char_battle.cpp — yeni POINT_ türü için PointChange / etki uygulama mantığını yaz (yeni bir nokta tipiyse).
  • İstemciitem_length.h'taki apply numaraları sunucuyla birebir aynı olmalı; aksi halde tooltip yanlış bonus gösterir. Ardından root/uiToolTip.py içindeki apply ad sözlüğüne ve locale dosyalarına yeni metni ekle.

Numaralar sunucu ve istemci arasında kaymışsa "+5 STR" diye yazan bir bonus oyunda "+5 başka bir şey" gibi görünür — bu yüzden iki tarafı senkron tutmak kritiktir.

Değişikliği devreye almak

item_attr tabloları DB çekirdeği tarafından açılışta okunup oyun çekirdeğine gönderilir; bu yüzden sadece SQL'i değiştirmek anında etki etmez. Tipik akış: değişikliği uygula, sonra db ve game çekirdeklerini yeniden başlat. Kaynağa (apply türü) dokunduysan ayrıca yeniden derleyip yeni binary'yi dağıtman gerekir. Canlıya almadan önce mutlaka bir test sunucusunda bir-iki eşyayı yenileyip bonusların doğru çıktığını kontrol et.

Sık Sorulan Sorular

prob değerini yükseltince bonus garanti mi çıkar?

Hayır. prob bir ağırlıktır; çıkma şansı senin satırının prob'unun, o slottaki tüm prob'ların toplamına oranıdır. Garanti istiyorsan diğer satırların prob'unu düşürmen ya da slottaki seçenekleri azaltman gerekir.

SQL'i değiştirdim ama oyunda değişmedi, neden?

Çünkü attr tabloları çalışırken yeniden okunmaz. db ve game çekirdeklerini yeniden başlatman gerekir; ancak ondan sonra yeni verilen bonuslar güncel havuzu kullanır.

item_attr ile item_attr_rare arasındaki fark ne?

item_attr normal 1–4. bonus satırları için, item_attr_rare ise nadir 5./6. satır için ayrı bir havuzdur. İkisi farklı eşyalar/işlemlerle tetiklenir.

Sunucun için dengeli bir bonus sistemi mi kurmak istiyorsun? Attr tablolarından yeni apply türlerine kadar bonus sistemini sıfırdan tasarlayıp dengeleyebilirim — benimle iletişime geç.

Bu kategorideki tüm yazılar →

Devamı için