[C++] Şaman Grup Kutsama [Kendinini Kutsayamama Bugu Çözüldü]

Whistle

Ruhsuz Filozof
Kurucu
Kurumsal Üye
Geliştirici
Yardımsever Üye
Mesaj
11.495
Çözümler
546
Beğeni
12.047
Puan
5.864
Merhaba arkadaşlar, diğer forumda bir arkadaşım bu sorunu çözmüş bana da özel mesaj yoluyla nasıl çözdüğünü açıklamıştı. Bende faydalı olabileceğini düşünerekten sizinle paylaşmak istiyorum. :)

Sırasıyla şu işlemleri uygulayınız;
Server/game/src/skill.h
açılır ve aratılır;
C++:
SKILL_FLAG_FIRE = (1 << 26),
Altına şu kod eklenir:
C++:
SKILL_FLAG_PARTY = (1 << 27),

Server/game/src/char_skill.cpp açılır ve aratılır;
C++:
SKILL_RESIST_PENETRATE

Kod blogunun { ..code.. }; altına şu kod eklenir:
C++:
struct FPartyPIDCollector
{
    std::vector <DWORD> vecPIDs;
    FPartyPIDCollector()
    {
    }
    void operator () (LPCHARACTER ch)
    {
    vecPIDs.push_back(ch->GetPlayerID());
    }
};

kod.jpg


Aynı dosyada arat;
C++:
    if (IS_SET(pkSk->dwFlag, SKILL_FLAG_SELFONLY))
        pkVictim = this;
Altına şu kod eklenir:
C++:
    if (IS_SET(pkSk->dwFlag, SKILL_FLAG_PARTY) && !GetParty() && !pkVictim)
        pkVictim = this;

Aynı dosyada arat;
C++:
   if (IS_SET(pkSk->dwFlag, SKILL_FLAG_SELFONLY))
        pkVictim = this;
Altına şu kod eklenir:
Burayı görüntülemek için üye girişi yapmalı veya kayıt olmalısınız.


Aynı dosyada arat;
C++:
   if (IS_SET(pkSk->dwFlag, SKILL_FLAG_SELFONLY))
        ComputeSkill(dwVnum, this);
    else if (!IS_SET(pkSk->dwFlag, SKILL_FLAG_ATTACK))
        ComputeSkill(dwVnum, pkVictim);
    else if (dwVnum == SKILL_BYEURAK)
        ComputeSkill(dwVnum, pkVictim);
    else if (dwVnum == SKILL_MUYEONG || pkSk->IsChargeSkill())
        ComputeSkill(dwVnum, pkVictim);

    m_dwLastSkillTime = get_dword_time();

    return true;
}

Şu kodlarla değiştir:
C++:
    if (IS_SET(pkSk->dwFlag, SKILL_FLAG_SELFONLY))
        ComputeSkill(dwVnum, this);
    else if (IS_SET(pkSk->dwFlag, SKILL_FLAG_PARTY) && !GetParty() && !pkVictim)
        ComputeSkill(dwVnum, this);
    else if (IS_SET(pkSk->dwFlag, SKILL_FLAG_PARTY) && 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);
            ComputeSkill(dwVnum, ch);
        }
    }
    else if (!IS_SET(pkSk->dwFlag, SKILL_FLAG_ATTACK))
        ComputeSkill(dwVnum, pkVictim);
    else if (dwVnum == SKILL_BYEURAK)
        ComputeSkill(dwVnum, pkVictim);
    else if (dwVnum == SKILL_MUYEONG || pkSk->IsChargeSkill())
        ComputeSkill(dwVnum, pkVictim);

    m_dwLastSkillTime = get_dword_time();

    return true;
}

Server/game/src/guild.cpp açılır ve aratılır;
C++:
   if ((pkSk->dwFlag & SKILL_FLAG_SELFONLY))
    {
        // 이미 걸려 있으므로 사용하지 않음.
        if (ch->FindAffect(pkSk->dwVnum))
            return;

        victim = ch;
    }

Altına şu kod eklenir:
C++:
    if ((pkSk->dwFlag & SKILL_FLAG_PARTY))
    {
        if (ch->FindAffect(pkSk->dwVnum))
            return;

        victim = ch;
    }

Navicat'ta yapılacak ayarlar;
Navicat
=> Player => skill_proto => sağ tıklayıp "Design Table" diyoruz.
"setFlag" stununa gelip "PARTY" isimli değeri en sona ekliyoruz.

navicat.jpg


Bu değeri ekledikten sonra "OK" Butonuna basıp kayıt ediyoruz.

Sonra skil_proto'ya sol tık ile girip aşağıda vereceğim "dwVnum" idlerinin "setFlag" sütunundaki değerlerinin sonuna ekliyoruz.
94, 95, 96, 109, 110 ve 111 dwVnum değerlerine aşağıdaki resimdeki gibi "PARTY" değerinin ekliyoruz.

navicat2.jpg


Sözlük;
dwVnum => Yeteneklerin id numarası.
 
Yukarıdaki konuya ekleme,
arkadaşlar navicatta verileri anlattığım halde ekleyemeyenler varsa sırasıyla şu queryleri çalıştırabilirler.
Not: Bu querylerin çalışması için sütuna değerin eklenmesi gerekmektedir.

navicat-jpg.627


PARTY değerinin dwVnum'lara eklenmesi.
Not: Queryleri sırasıyla tek tek çalıştırınız.

SQL:
UPDATE `skill_proto` SET `setFlag`='PARTY' WHERE (`dwVnum`='94');
UPDATE `skill_proto` SET `setFlag`='PARTY' WHERE (`dwVnum`='95');
UPDATE `skill_proto` SET `setFlag`='PARTY' WHERE (`dwVnum`='96');
UPDATE `skill_proto` SET `setFlag`='REMOVE_BAD_AFFECT,PARTY' WHERE (`dwVnum`='109');
UPDATE `skill_proto` SET `setFlag`='PARTY' WHERE (`dwVnum`='110');
UPDATE `skill_proto` SET `setFlag`='PARTY' WHERE (`dwVnum`='111');
 
Merhaba,

biraz eski bir cevap ama kusura bakmayın. srcye aşağıdaki kodu ekleyemiyorum.

Kod:
SKILL_FLAG_PARTY = (1 << 27),

Benim sourcede aynı kod mevcut fakat değerleri aşağıdaki gibi. aşağıdaki değerleri 27 yapıp source kapatsam sorun olurmu ilerisi için?

Kod:
SKILL_FLAG_PARTY = (1 << 26),
 
Merhaba,

biraz eski bir cevap ama kusura bakmayın. srcye aşağıdaki kodu ekleyemiyorum.

Kod:
SKILL_FLAG_PARTY = (1 << 27),

Benim sourcede aynı kod mevcut fakat değerleri aşağıdaki gibi. aşağıdaki değerleri 27 yapıp source kapatsam sorun olurmu ilerisi için?

Kod:
SKILL_FLAG_PARTY = (1 << 26),

Öylede yaptım olmadı hata vermiyor ama oyuna girdiğimde gene şaman tek kendine atıyor :S yardımcı olabilir misiniz acaba?
 
Bizzat kendi serverim de kullandığım şey bu. Kodlarınızı tekrar kontrol edin. Elbet bir yerde eksiklik vardır.
Mysql konusunda çok hata yapanlar oldu. Mysqla da dikkat ediniz.
 
Geri
Üst