Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Баг-репорты

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

Баг-репорты Описываем проблемы и ошибки работы ядра

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.12.2010, 07:24   #1
zhenya
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 85
Сказал(а) спасибо: 5
Поблагодарили 42 раз(а) в 17 сообщениях
zhenya Скоро придёт к известности
По умолчанию SPELL_AURA_SCHOOL_IMMUNITY

Собственно заметил такую штуку:
Код:
ID - 642 Divine Shield
....

Effect 1: Id 6 (SPELL_EFFECT_APPLY_AURA)
BasePoints = 0
Targets (1, 0) (TARGET_SELF, NO_TARGET)
Aura Id 39 (SPELL_AURA_SCHOOL_IMMUNITY), value = 0, misc = 127 (127), miscB = 0, periodic = 0

Effect 2: Id 6 (SPELL_EFFECT_APPLY_AURA)
BasePoints = 1
Targets (1, 0) (TARGET_SELF, NO_TARGET)
Aura Id 39 (SPELL_AURA_SCHOOL_IMMUNITY), value = 1, misc = 126 (126), miscB = 0, periodic = 0
смотрим код ауры
Код:
void Aura::HandleAuraModSchoolImmunity(bool apply, bool Real)
{
    Unit* target = GetTarget();
    target->ApplySpellImmune(GetId(), IMMUNITY_SCHOOL, m_modifier.m_miscvalue, apply);
....
}
теперь смотрим
Код:
void Unit::ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply)
{
    if (apply)
    {
        for (SpellImmuneList::iterator itr = m_spellImmune[op].begin(), next; itr != m_spellImmune[op].end(); itr = next)
        {
            next = itr; ++next;
            if(itr->type == type)
            {
                m_spellImmune[op].erase(itr);
                next = m_spellImmune[op].begin();
            }
        }
        SpellImmune Immune;
        Immune.spellId = spellId;
        Immune.type = type;
        m_spellImmune[op].push_back(Immune);
    }
    else
    {
        for (SpellImmuneList::iterator itr = m_spellImmune[op].begin(); itr != m_spellImmune[op].end(); ++itr)
        {
            if(itr->spellId == spellId)
            {
                m_spellImmune[op].erase(itr);
                break;
            }
        }
    }

}
1) собственно, если будут одинаковые type при apply = true то код удалит спелл с данным типом имуна и вставит свой.
В результате apply у нас будет m_spellImmune[op] c 2 разными type и одинаковыми spellid (если это так то при apply = false будет косяк).
2) теперь посмотрим на часть с apply = false удаляется первое совпадение по spellid и прерывается. Выходит 2ая запись спела остается.

Код:
...
                next = m_spellImmune[op].begin();
эта строчка кода по-моему тут не нужна.
собственно предложение удалить её и изменить часть отвечающую за apply = false на
Код:
        for (SpellImmuneList::iterator itr = m_spellImmune[op].begin(), next; itr != m_spellImmune[op].end(); itr = next)
        {
            next = itr; ++next;
            if (itr->spellId == spellId)
                m_spellImmune[op].erase(itr);
        }
походу это все неверное и код сам вызовет для данного спела 2 раза HandleAuraModSchoolImmunity с apply false. ^^ пойду смотреть в дебагер.

Последний раз редактировалось zhenya; 11.12.2010 в 07:31.
zhenya вне форума   Ответить с цитированием
Ответ


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

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



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


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