Ru-MaNGOS

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

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

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

Закрытая тема
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.03.2012, 19:00   #1
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию Achievement 1833

Столкнулся тут с интересной неработающей ачивкой.
Странно, должен сказать, не работающей.
Прогресс считается, а выполнение не засчитывается.
1833 ачивка. В прогрессе показано, что выполнено 32 из 25, а не засчитывается. В чём может быть подвох?
По коду полазил с флагами посмотрел - стандартная ачива, обработка которой в коде имеется...
Правда она ещё содержит пару флагов, обработку которых я в коде так и не нашёл...
KiriX вне форума  
Старый 03.03.2012, 19:45   #2
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Т.к. ачивка имеет флаг 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 (код чуть выше фрагмента), а его тут нет...
KiriX вне форума  
Старый 03.03.2012, 20:37   #3
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Вариант завершения в самом цикле есть:
Код:
            // for counters, field4 contains the main count requirement
            if (count >= criteria->raw.count)
                return true;
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума  
Старый 03.03.2012, 21:19   #4
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Спасибо, соврал я с флагами... У данной ачивки флаги ACHIEVEMENT_FLAG_REQ_COUNT и ACHIEVEMENT_FLAG_BAR
Опять сначала - не понятно, почему не засчитывается Отдельной обработки этих флагов нет...
KiriX вне форума  
Старый 05.03.2012, 12:42   #5
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Агась... Понял, отрыл... Ачивка 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, в результате чего серв входил в вечный цикл и падал...

Есть ещё у кого какие идеи?
KiriX вне форума  
Закрытая тема


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неработающие Достижения\Achievement Володимир Корзина 5 26.12.2010 09:10
Достижение/Achievement Крепость Утгард Володимир Корзина 1 25.12.2010 19:32
[10342] Cleanup achievement code and add new commands. newsbot CMaNGOS Commits 1 11.08.2010 08:27
Achievement Alucard Флудильня 6 16.03.2010 17:08


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


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