farkmt2official 1
farkmt2official
Bvural41 1
Bvural41
noisiv 1
noisiv
Manwe Work 1
Manwe Work
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Hikaye Ekle

Cevaplanmadı Grup Kutsama sistemi ile ilgili

  • Konuyu başlatan Konuyu başlatan bnardo
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 2
  • Görüntüleme Görüntüleme 96

Ayyıldız2 | 2008 TR Yapısı • 1-99 Orta Emek Destan • Oto Avsız • 10 Temmuz 21:00 HEMEN TIKLA!

Selamun aleyküm grup kutsama sistemindeki iyleştirmenin karaktere işlemesini istiyorum sadece gruba dağıtmasını istemiyorum
bunun için REMOVE_BAD_AFFECT,PARTY yapılıyor biliyorum fakat Skill party varken calısıyor ve bendede calısıyor
aksine party de calısmamasına bende calısmasını sağlaması için REMOVE_BAD_AFFECT yapıyorum bu sefer skill hiç çalışmıyor bilen arkadaşlar yardımcı olacaktır. teşekkürler
 
Grup kutsama gibi party flag’li bir skill normalde party yoksa hedef bulamadığı için boşa düşüyor. Sen PARTY’yi kaldırınca bu kez skill akışı farklı yere gidiyor, çoğu source’ta pkVictim boş kaldığı için de ComputeSkill hiç çağrılmadan çıkıyor; o yüzden “skill hiç çalışmıyor” gibi görüyorsun. Çözüm PARTY’yi sökmek değil, party yokken de kendi üstüne düşecek bir fallback koymak.

Benim kullandığım ve sorunsuz çalışan mantık:
  • Skill PARTY ise
    • Party varsa: map içindeki party üyelerine uygula
    • Party yoksa: direkt kendine uygula
  • Skill PARTY değilse mevcut akış neyse o
Bunu server tarafında skill kullanımının geçtiği yerde (genelde char_skill.cpp veya char.cpp içinde UseSkill/ComputeSkill çağrısının yapıldığı blok) ekliyorsun. Örnek:

Kod:
// pkSk = skill proto, dwVnum = skill vnum



if (IS_SET(pkSk->dwFlag, SKILL_FLAG_SELFONLY))

{

    ComputeSkill(dwVnum, this);

}

else if (IS_SET(pkSk->dwFlag, SKILL_FLAG_PARTY))

{

    if (GetParty())

    {

        FPartyPIDCollector f;

        GetParty()->ForEachOnMapMember(f, GetMapIndex());



        for (std::vector<DWORD>::iterator it = f.vecPIDs.begin(); it != f.vecPIDs.end(); ++it)

        {

            LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(*it);

            if (ch)

                ComputeSkill(dwVnum, ch);

        }

    }

    else

    {

        // party yoksa skill boşa düşmesin, karaktere işlesin

        ComputeSkill(dwVnum, this);

    }

}

else

{

    // diğer skill tipleri senden nasıl akıyorsa onu bozma

    if (!IS_SET(pkSk->dwFlag, SKILL_FLAG_ATTACK))

        ComputeSkill(dwVnum, pkVictim);

}

Skill flag kısmında da senin dediğin gibi şu kalsın:

  • REMOVE_BAD_AFFECT
  • PARTY
Yani “REMOVE_BAD_AFFECT yapınca çalışmıyor” kısmını, PARTY’yi kaldırarak çözmeye çalışma. PARTY kalsın, sadece party yokken this’e compute düşecek şekilde akışı tamamla. Böylece hem gruba dağıtır hem solo basınca sadece kendine işler.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst