Показать сообщение отдельно

Спасение утопающих - дело рук самих утопающих
Старый 09.10.2009, 07:02   #1
animagus
Гуру
 
Аватар для animagus
 
Регистрация: 25.10.2008
Сообщения: 1,199
animagus - блестящий ораторanimagus - блестящий ораторanimagus - блестящий оратор
Вес репутации: 37
По умолчанию Спасение утопающих - дело рук самих утопающих

Так как наши админы не могут/не хотят/не успевают фиксить спеллы и таланты у меня возникло желание научиться это делать самому. Было бы неплохо если кто-нибудь объяснил как это делать.
Пример спелл lifebloom
http://github.com/mangos/mangos/raw/...SpellAuras.cpp
Код:
            // Lifebloom
            if (GetSpellProto()->SpellFamilyFlags & UI64LIT(0x1000000000))
            {
                if ( apply )
                {
                    if ( caster )
                        // prevent double apply bonuses
                        if(m_target->GetTypeId()!=TYPEID_PLAYER || !((Player*)m_target)->GetSession()->PlayerLoading())
                            m_modifier.m_amount = caster->SpellHealingBonus(m_target, GetSpellProto(), m_modifier.m_amount, SPELL_DIRECT_DAMAGE);
                }
                else
                {
                    // Final heal only on dispelled or duration end
                    if ( !(GetAuraDuration() <= 0 || m_removeMode == AURA_REMOVE_BY_DISPEL) )
                        return;

                    // have a look if there is still some other Lifebloom dummy aura
                    Unit::AuraList const& auras = m_target->GetAurasByType(SPELL_AURA_DUMMY);
                    for(Unit::AuraList::const_iterator itr = auras.begin(); itr!=auras.end(); ++itr)
                        if((*itr)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_DRUID &&
                            ((*itr)->GetSpellProto()->SpellFamilyFlags & UI64LIT(0x1000000000)))
                            return;

                    // final heal
                    if(m_target->IsInWorld() && m_stackAmount > 0)
                    {
                        int32 amount = m_modifier.m_amount / m_stackAmount;
                        m_target->CastCustomSpell(m_target, 33778, &amount, NULL, NULL, true, NULL, this, GetCasterGUID());

                        if (caster)
                        {
                            int32 returnmana = (GetSpellProto()->ManaCostPercentage * caster->GetCreateMana() / 100) * m_stackAmount / 2;
                            caster->CastCustomSpell(caster, 64372, &returnmana, NULL, NULL, true, NULL, this, GetCasterGUID());
                        }
                    }
                }
                return;
            }
Меня больше всего что происходит в строчках, которые как раз соотвествуют сломанному финальноу тику.
Код:
int32 amount = m_modifier.m_amount / m_stackAmount;
m_target->CastCustomSpell(m_target, 33778, &amount, NULL, NULL, true, NULL, this, GetCasterGUID());
m_stackAmount - если я правильно понял это количество стаков(но зачем на него делить?)
33778 - видимо id спелла отвечающего за финальный тик

Последний раз редактировалось animagus, 09.10.2009 в 10:09.
animagus вне форума   Ответить с цитированием