Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Баг-репорты (http://mangos.ytdb.ru/forumdisplay.php?f=27)
-   -   Achievement 1833 (http://mangos.ytdb.ru/showthread.php?t=5246)

KiriX 03.03.2012 19:00

Achievement 1833
 
Столкнулся тут с интересной неработающей ачивкой.
Странно, должен сказать, не работающей.
Прогресс считается, а выполнение не засчитывается.
1833 ачивка. В прогрессе показано, что выполнено 32 из 25, а не засчитывается. В чём может быть подвох?
По коду полазил с флагами посмотрел - стандартная ачива, обработка которой в коде имеется...
Правда она ещё содержит пару флагов, обработку которых я в коде так и не нашёл...

KiriX 03.03.2012 19:45

Т.к. ачивка имеет флаг ACHIEVEMENT_FLAG_SUMM, обратился к этому куску кода:
Код:

    if (entry->flags & ACHIEVEMENT_FLAG_SUMM)
    {
        for(AchievementCriteriaEntryList::const_iterator itr = cList->begin(); itr != cList->end(); ++itr)
        {
            AchievementCriteriaEntry const* criteria = *itr;

            CriteriaProgressMap::const_iterator itrProgress = m_criteriaProgress.find(criteria->ID);
            if(itrProgress == m_criteriaProgress.end())
                continue;

            CriteriaProgress const* progress = &itrProgress->second;
            count += progress->counter;

            // for counters, field4 contains the main count requirement
            if (count >= criteria->raw.count)
                return true;
        }
        return false;
    }

В конце его return false; Не значит ли это, что вне зависимости от того, что в теле цикла ачивка всегда будет незавершённой?
По идее должно идти сравнение с числом, что в achievementForTestCount (код чуть выше фрагмента), а его тут нет...

Vladimir 03.03.2012 20:37

Вариант завершения в самом цикле есть:
Код:

            // for counters, field4 contains the main count requirement
            if (count >= criteria->raw.count)
                return true;


KiriX 03.03.2012 21:19

Спасибо, соврал я с флагами... У данной ачивки флаги ACHIEVEMENT_FLAG_REQ_COUNT и ACHIEVEMENT_FLAG_BAR
Опять сначала - не понятно, почему не засчитывается =( Отдельной обработки этих флагов нет...

KiriX 05.03.2012 12:42

Агась... Понял, отрыл... Ачивка 1833 выполняется на основе ачивки 346 (общее число выпитых напитков). Но она имеет флаг 1 - каунтер. Собственно, когда идёт зачёт каунтера, попадаем в блок:
Код:

    // nothing do for counter case
    if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER)
        return;

т.е. по мнению сервера больше ничего проверять и не надо и мы не попадаем в блок bool AchievementMgr::IsCompletedAchievement(Achievement Entry const* entry), где, по идее, мог бы пройти засчёт выполненой ачивки...
Проблемы две:
Первое: таким образом работают всего ДВЕ ачивки. Хакать???
Второе: я пробовал в дебаге на лету менять флаг с 9 на 8 при обработке ачивки 346, в результате чего серв входил в вечный цикл и падал...

Есть ещё у кого какие идеи? =)


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

ru-mangos.ru - Русское сообщество MaNGOS