Şamanın
Kükreme (Roar) skillinin “istediği yere atma” (free target) özelliğini
kapatarak sadece
menzili kadar, ileri doğru çalışmasını istiyorsan, bunu
sadece skill_proto ile değil,
server source (game/src) tarafında düzeltmen gerekiyor.
Bu durum PVP kaynaklarında çok sık görülür.
✔ Çünkü Roar, “area (alan)” tipi skildir ve client tarafından “free target” gibi kullanılabilir.
Aşağıda tamamen net çözümü veriyorum.
1) Amaç Ne?
Kükreme skili şöyle çalışsın:
- Oyuncu sadece menzil içinde kükreme atsın
- Fare ile istediği uzak noktaya tıklayıp atamasın
- Şamanın önündeki koni/ dairesel alana etki etsin
Yani tam olarak
Charge / Ara saldırı gibi çalışacak.
2) Yapılması Gereken (Temel Mantık)
Metin2’de skilin hedef tipi skill_proto üzerinden gelir,
ama davranış
game/src/char_skill.cpp içinde belirlenir.
Kükreme şu şekilde işlenir:
SKILL_TONGUE_STRIKE (şaman kükreme)
kodda ismi genelde:
SKILL_TONGUE_STRIKE // roar
veya:
SKILL_DRAGON_ROAR
Kaynaklarda değişik olabilir.
Bu skil çoğunlukla
TARGET_LOCATION (konum hedefli) çalışır.
Senin istediğin ise:
TARGET_DIRECTION veya
TARGET_RANGE tipi olsun.
Yani oyuncu tıklamasın → karakterin yönüne göre vursun.
3) Skill Proto Düzenlemesi (Ama YETERLİ DEĞİL)
skill_proto.txt veya skill_proto SQL'de:
- type veya target_type değerini kontrol et.
Muhtemelen şu şekildedir:
target_type : 4 (location / ground)
Bunu şu türlerden birine çekebilirsin:
1 = target (karakter)
2 = self (kendine)
3 = forward (yön alanı)
Roar için genelde
3 forward area en uygunudur.
Ama TEK BAŞINA YETMEZ.
⚠ 4) Asıl Çözüm: game/src/char_skill.cpp düzenleme
Şamanın kükremesi şu fonksiyonda işlenir:
bool CHARACTER::UseSkill(...)
veya:
int CSkillManager::ApplySkill(...)
Kükreme skill ID'sini bulup şunu değiştiriyoruz:
Şu anki hatalı yapı:
// Konum hedefli kullanım
GetTargetPosition(...)
Hasar hesapla...
✔ Olması gereken:
// Yön + menzil alanı hesaplama
GetMultiTargetVictim(CHARACTER, direction, range);
Yani kod yaklaşık şu hale getirilir:
if (skill_id == SKILL_TONGUE_STRIKE)
{
int range = GetSkillRange(skill_id);
float rot = GetRotation(); // karakterin baktığı yön
std::vector<LPCHARACTER> targets;
FetchAttackTargets(targets, this, range, rot);
for (auto & ch : targets)
Hit(ch); // normal skill damage hesaplama
return true;
}
Böylece:
✔ İleri doğru menzil alanına vurur
✔ Tıklanan yere gitmez
✔ Free-target kalkar
✔ Gerçek koni veya dairesel alan gibi etkiler
5) Eğer sadece CLIENT tarafını kapatmak istersen
client/UI tarafında şunu kapatabilirsin:
root/uiSkill.py → skill target tipi UI’ı.
Ama bu
tek başına yetmez, çünkü server hala skill’i location olarak işleyebilir.
Yani “skill görünüşü” düzelir, ama arka planda yine hedef noktaya gider.
Doğru çözüm =
server + proto.
6) Sana birebir tam çözümü verebilmem için:
Şunlardan birini gönderirsen
tam kod yamasını hazırlayabilirim:
- skill_proto.txt içinde Kükreme satırı
- skill ID’si (ör: 131, 132 vs. kaynaklara göre değişir)
- char_skill.cpp içindeki ilgili bölüm
- veya sadece kullandığın source sürümünü söyle (Martysama 40k? Mainline? Daroo? Wolfman dahil mi?)
İstersen dosyaları at, düzenleyip en kısa haliyle göndereyim.