Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Патчи > Патчи на рассмотрении

Важная информация

Патчи на рассмотрении Рассматриваемые к принятию патчи

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.06.2010, 11:24   #1
Astellar
Гость
 
Сообщений: n/a
По умолчанию Simplified way to retrieve talent auras.

Преамбула.

Чем собственно ауры талантов отличаются от обычных? Нет, не только тем, что они пассивны. Для человека, правящего спеллы, они представляют головную боль, т.к. очень часто все SpellFamilyFlags у них равны 0, а в ванильном ядре до сих пор нет никакого способа для облегчения их получения.

Фабула.

Для себя я уже достаточно давно сделал вот такую "хитрую штуку".

В Unit.h:
Код:
Aura* GetAura(AuraType type, uint32 family, SpellEffectIndex effindex, uint32 iconID, uint32 miscValue = 0, uint64 casterGUID = 0) const;
В Unit.cpp:
Код:
Aura* Unit::GetAura(AuraType type, uint32 family, SpellEffectIndex effindex, uint32 iconID, uint32 miscValue, uint64 casterGUID) const
{
    AuraList const& auras = GetAurasByType(type);
    for(AuraList::const_iterator i = auras.begin();i != auras.end(); ++i)
    {
        if ((*i)->GetEffIndex() != effindex)
            continue;
        if (casterGUID && (*i)->GetCasterGUID()!=casterGUID)
            continue;
        if (miscValue && (*i)->GetMiscValue() != miscValue)
            continue;

        SpellEntry const *spell = (*i)->GetSpellProto();
        if (spell->SpellFamilyName == family && spell->SpellIconID == iconID)
            return (*i);
    }
    return NULL;
}
Пример обработки до использования данной функции:
Код:
            // Improved Moonkin Form
            if (form == FORM_MOONKIN)
            {
                Unit::AuraList const& dummyAuras = target->GetAurasByType(SPELL_AURA_DUMMY);
                for(Unit::AuraList::const_iterator i = dummyAuras.begin(); i != dummyAuras.end(); i++)
                {
                    if ((*i)->GetSpellProto()->SpellFamilyName==SPELLFAMILY_DRUID &&
                        (*i)->GetSpellProto()->SpellIconID == 2855)
                    {
                        uint32 spell_id = 0;
                        switch((*i)->GetId())
                        {
                            case 48384:spell_id=50170;break;//Rank 1
                            case 48395:spell_id=50171;break;//Rank 2
                            case 48396:spell_id=50172;break;//Rank 3
                            default:
                                sLog.outError("Aura::HandleShapeshiftBoosts: Not handled rank of IMF (Spell: %u)",(*i)->GetId());
                                break;
                        }

                        if(spell_id)
                            target->CastSpell(target, spell_id, true, NULL, this);
                        break;
                    }
                }
            }
С использованием:
Код:
            // Improved Moonkin Form
            if (form == FORM_MOONKIN)
            {
                if (Aura *aur = m_target->GetAura(SPELL_AURA_DUMMY, SPELLFAMILY_DRUID, EFFECT_INDEX_0, 2855))
                {
                    uint32 spell_id = 0;
                    switch(aur->GetId())
                    {
                        case 48384:spell_id=50170;break; // Rank 1
                        case 48395:spell_id=50171;break; // Rank 2
                        case 48396:spell_id=50172;break; // Rank 3
                        default:
                            sLog.outError("Aura::HandleShapeshiftBoosts: Not handled rank of IMF (Spell: %u)", aur->GetId());
                    }

                    if(spell_id)
                        m_target->CastSpell(m_target, spell_id, true, NULL, this);
                }
            }
Это еще не самая монструозная конструкция (проверок на кастера нет). Посчитайте, сколько раз по коду используется подобный велосипед и оцените выгоду от введения универсального варианта. Думаю будет полезно.
  Ответить с цитированием
7 пользователя(ей) сказали cпасибо:
ANTOMA (19.06.2010), Den (06.01.2011), Insider42 (17.06.2010), KiriX (17.06.2010), lina (18.06.2010), MangMan (17.06.2010)
Старый 17.06.2010, 11:39   #2
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Т.е. номер иконки надо указывать всегда?
Может лучше расширить существующую GetAura и добавить опциональную проверку по иконке и miscvalue?
zergtmn вне форума   Ответить с цитированием
Старый 17.06.2010, 11:48   #3
Astellar
Гость
 
Сообщений: n/a
По умолчанию

Вы знаете, я очень не люблю, когда какая-либо функция получает более 3-4 параметров. Тут их и так 6 в худшем случае. Если слить с той, которая флаги требует, получим вообще полный абзац, который никто и никогда не запомнит. Лезть в прототип каждый раз при попытке использования - не лучшая перспектива. Код должен быть максимально простым всегда.

Существующий GetAura требует указания флагов и нацелен на получение ауры именно по флагам. Мой - по иконке, индексу и опциональному miscvalue (очень редко нужен). Функциональностью они не пересекаются, поэтому и сливать их воедино смысла нет.
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[10616] Simplified trade distance checks, GROUP_UPDATE_FLAG_POSITION flag handling moved out of Map newsbot CMaNGOS Commits 0 17.10.2010 19:22
[10446] Small fix for single target auras: remove caster only auras newsbot CMaNGOS Commits 0 05.09.2010 08:00
[10051] Fixed talent 58426 broken after 3.3.3 switch. newsbot CMaNGOS Commits 0 12.06.2010 03:40
[9987] Restore work talent 12311 and ranks. newsbot CMaNGOS Commits 0 28.05.2010 00:13
[9661] Implement dual talent specializations in talent switch part. newsbot CMaNGOS Commits 1 03.04.2010 06:39


Текущее время: 11:28. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot