Herkese hayırlı forumlar,
Yaşadığınız sorun oldukça yaygın ve genellikle kaynak kodlardaki merkezi bir hesaplama fonksiyonundaki eksiklikten kaynaklanır. Saldırı değeriniz, üzerine eklenmesi gereken bonusları (efsun, skill, simya vb.) hesaba katmıyor.
Çözüm için sunucunuzun kaynak kodlarındaki (game core) char_point.cpp dosyasını açıp içerisindeki CHARACTER::ComputePoints() fonksiyonunu dikkatle incelemeniz gerekmektedir. Aşağıda, bu fonksiyonun içinde olması gereken ama sizde muhtemelen eksik olan kod bloklarına dair örnekler ve açıklamalar bulunmaktadır.
Kendi ComputePoints fonksiyonunuzu bu örneklerle karşılaştırarak eksik kısımları ekleyip, sunucunuzu yeniden derlediğinizde (build aldığınızda) sorununuz çözülecektir.
1. Efsunlardan Gelen STR (Güç) Bonusunun Saldırı Değerine Etkisi
ComputePoints fonksiyonu içinde, karakterin üzerindeki eşyalardan gelen APPLY_STR bonusunu alıp, bunu saldırı değerine çeviren bir bölüm olmalıdır. Bu bölüm şuna benzer:
[CODE title="C++"]// Örnek Kod Bloğu 1: STR'den gelen saldırı değeri
points.st += GetPoint(APPLY_STR); // Önce toplam STR'yi al
// Sonra bu STR'yi sınıfa göre saldırı değerine çevir
switch (GetJob())
{
case JOB_WARRIOR:
points.atk += points.st * 2; // Savaşçılar için STR başına +2 saldırı değeri
break;
case JOB_SURA:
points.atk += points.st; // Sura için +1
break;
// Diğer sınıflar için de benzer hesaplamalar...
default:
points.atk += points.st;
break;
}[/CODE]
Eğer fonksiyonunuzda buna benzer bir blok yoksa, STR efsunu saldırı değerinizi artırmaz.
2. Hava Kılıcı ve Büyülü Keskinlik Gibi Skill'lerin Etkisi
Yine aynı ComputePoints fonksiyonu içinde, aktif olan büyülü saldırı skillerini kontrol eden bir bölüm olmalıdır. Bu skillerin bonusu genellikle karakterin Zeka (INT) puanına göre hesaplanır.
[CODE title="C++"]// Örnek Kod Bloğu 2: Büyülü Silah Skilleri
if (FindAffect(AFFECT_GWIGEOM)) // Hava Kılıcı (Enchanted Blade) affect'i
{
const CSkill* pkSk = GetSkill(GWIGEOM); // Skill'i ve seviyesini al
if (pkSk)
points.atk += (pkSk->lLevel * 2 + GetPoint(POINT_INT)) * 2 / 5; // Formül sunucuya göre değişebilir
}
if (FindAffect(AFFECT_GEOMGYEONG)) // Büyülü Keskinlik (Enchanted Armour) affect'i
{
const CSkill* pkSk = GetSkill(GEOMGYEONG);
if (pkSk)
points.atk += (pkSk->lLevel + GetPoint(POINT_INT)) / 3; // Formül sunucuya göre değişebilir
}[/CODE]
3. Simya ve Diğer Genel Saldırı Değeri Bonusları
Son olarak, fonksiyonun en genel kısmında, karakterin üzerindeki tüm aktif etkileri (affect) bir döngü içinde gezip, doğrudan saldırı değeri veren bonusları (APPLY_ATT_GRADE_BONUS vb.) toplayan bir bölüm olmalıdır.
[CODE title="C++"]// Örnek Kod Bloğu 3: Genel Bonus Döngüsü
// Bu döngü, simya dahil tüm genel efsunları ve etkileri hesaba katar.
for (it = m_list_pkAffect.begin(); it != m_list_pkAffect.end(); ++it)
{
CAffect* pkAffect = *it;
if (pkAffect->lDuration > 0)
{
switch (pkAffect->bType)
{
case APPLY_ATT_GRADE_BONUS: // Sunucunuzda bu APPLY_ATT_VALUE olabilir
points.atk += pkAffect->lApplyValue;
break;
// Buraya diğer bonus türleri de eklenebilir.
// Örneğin: APPLY_ATT_BONUS_TO_MONSTER vb.
}
}
}[/CODE]
Özetleyelim:
Yapmanız gereken, char_point.cpp dosyanızdaki CHARACTER::ComputePoints() fonksiyonunu açıp, yukarıdaki örneklere benzer kod bloklarının eksik olup olmadığını kontrol etmektir. Eksik olanları, kendi sunucu yapınıza uygun formüllerle ekleyip yeniden derlediğinizde, simya, STR ve skillerden gelen tüm saldırı değeri bonuslarının karakterinize doğru bir şekilde yansıdığını göreceksiniz.
İyi çalışmalar dilerim.