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

Whistle

I LIKE LikapaTR
Kurucu
Kurumsal Üye
Geliştirici
Yardımsever Üye
Mesaj
11.914
Çözümler
564
Beğeni
13.340
Puan
5.915
Ticaret Puanı
2
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++:
Genişlet Daralt Kopyala
SKILL_FLAG_FIRE = (1 << 26),
Altına şu kod eklenir:
C++:
Genişlet Daralt Kopyala
SKILL_FLAG_PARTY = (1 << 27),

Server/game/src/char_skill.cpp açılır ve aratılır;
C++:
Genişlet Daralt Kopyala
SKILL_RESIST_PENETRATE

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

kod.jpg


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

Aynı dosyada arat;
C++:
Genişlet Daralt Kopyala
   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++:
Genişlet Daralt Kopyala
   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++:
Genişlet Daralt Kopyala
    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++:
Genişlet Daralt Kopyala
   if ((pkSk->dwFlag & SKILL_FLAG_SELFONLY))
    {
        // 이미 걸려 있으므로 사용하지 않음.
        if (ch->FindAffect(pkSk->dwVnum))
            return;

        victim = ch;
    }

Altına şu kod eklenir:
C++:
Genişlet Daralt Kopyala
    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:
Genişlet Daralt Kopyala
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:
Genişlet Daralt Kopyala
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:
Genişlet Daralt Kopyala
SKILL_FLAG_PARTY = (1 << 26),
 
Merhaba,

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

Kod:
Genişlet Daralt Kopyala
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:
Genişlet Daralt Kopyala
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.
 
Üst