Ru-MaNGOS

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

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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.12.2010, 10:50   #1
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию Алгоритм проверки TargetAuraState в CheckCast()

В соответствии с проведенными разборками, в настоящее время алгоритм проверки
на TargetAuraStateNot и targetAuraSpell в функции CheckCast() неверен. Там еще
и ошибка в возвращаемом коде, но это к делу не относится.
Рассмотрим на примере спеллов 72176 - 72202 - 72178 (спеллы Саурфанга и его кровавых бестий).
В соответствии с имеющимся сниффом, на Саурфанге висит 72178, на бестиях 72176.
72176 при успешной атаке (требует записи в spell_proc_event, но это другой вопрос)
триггерит 72202, который имеет имеет 1й думмиэффект с целью TARGET_SCRIPT и требование TargetAura 72178
В соответствии с текущим кодом, первичной целью спелла будет this (см. код Unit::HandleProcTriggerSpellAuraProc)
Реальная цель думмиэффекта - Саурфанг и он нормально выбирается (при наличии записи в spell_script_target).
Но до момента выбора Саурфанга в качестве цели мы в функции CheckCast() не добираемся, поскольку обламываемся на
Код:
 // Target aura req check if need
 if(m_spellInfo->targetAuraSpell && !target->HasAura(m_spellInfo->targetAuraSpell))
      return SPELL_FAILED_CASTER_AURASTATE;
- требуемая по DBC аура висит не на первичной цели, а на реальной цели из spell_script_target. А проверка идет до выборки реальной цели.

Точно такая же ситуация (в теории, примеров я пока не нашел) и с целями с ограничением
TargetAuraStateNot.
Решение:
https://github.com/rsa/mangos/commit...d0ce1a87924362
Сразу говорю, решение не очень красивое, и достаточно слабо отттестировано. Если кто предложит лучше - буду рад.
rsa вне форума   Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
KiriX (21.12.2010), Konctantin (24.12.2010)
Старый 23.12.2010, 20:23   #2
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Может быть перенести
Код:
// Database based targets from spell_target_script
в функцию например возвращающую найденную цель (для effect 0)
и вызывать ее раньше для замены (выставления) цели по умолчанию?

Для остальных эфектов вызывать как и сейчас.
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Старый 23.12.2010, 20:31   #3
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

я думал над этим, но это уже политическое решение нужно я в политику не лезу, могу только костыль предложить.
с моей точки зрения, сначала вообще должна быть залита карта таргетов (а то может и проверять валидность каста незачем вообще?) и только потом идти проверка.
точнее наверное так:
CheckSpellSource()
FillTargetMap()
for ... to ...
CheckSpellTargets()

PS сегодня разбирался в Spell::SetTargetMap(). Много думал

Последний раз редактировалось rsa; 23.12.2010 в 20:48.
rsa вне форума   Ответить с цитированием
Старый 23.12.2010, 21:55   #4
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

не уверен - большей частью проверяется имеено главная цель которая сообщается клиентом - большей частью опятьже это проверки дублирующие проверки сделанные клиентом во избежание читинга. Цели выбранные сервером вообщемто безсмысленно проверять - но в случае выбора по базе - мы имеено делаем не выбор целей каста типа арейных - а автонаведение на цель. По мне так вынос автонаведенеия перед проверкой основной цели выглядит естесвенным.
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Старый 24.12.2010, 09:25   #5
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Увы, продолжение разборок показывает что мой первый патч тоже далеко не все учитывает. В случае пары целей 22,15 мы имеем облом в любом случае поскольку выборка целей идет не из базы а совсем потом... Пример - 72256-72255 которые должны прицеливаться по ауре 72293. К сожалению без реализации алгоритма из №3 это нереально. Я-то этот спелл хакну, но хотелось бы иметь универсальное решение...
rsa вне форума   Ответить с цитированием
Старый 16.03.2011, 07:23   #6
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Длительное тестирование показало, что патч из первого поста неэффективен и не учитывает кучи вариантов.
В результате сравнения механики неработающих спеллов (в частности кроме вышеупомянутых это спеллы квесткомплитов 71518, 72289, 72934, взгляните на таргет и требуемую ауру), выявлено что проверка из темы в CheckCast не нужна вообще - абсолютно правильная выборка по аурам идет в SetTargetMap. Осталось только обеспечить (забытую?) проверку TargetAuraStateNot в CheckTarget() и все.
проект решения:
https://github.com/rsa/mangos/commit...ab6cd20eec88da
внутреннее тестирование проблем пока не выявило. сейчас тестируется общественностью.
Проблемы - теряем правильное сообщение о требуемой ауре (впрочем, в клиент оно по моему и не передавалось никогда).
rsa вне форума   Ответить с цитированием
Старый 16.03.2011, 10:07   #7
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

CheckTarget не для всех типов целей используется.
zergtmn вне форума   Ответить с цитированием
Старый 16.03.2011, 11:04   #8
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от zergtmn Посмотреть сообщение
CheckTarget не для всех типов целей используется.
Для всех, где вызывается FillTargetMap():
Код:
        for (std::list<Unit*>::iterator itr = tmpUnitMap.begin(); itr != tmpUnitMap.end();)
        {
            if (!CheckTarget (*itr, SpellEffectIndex(i)))
            {
                itr = tmpUnitMap.erase(itr);
                continue;
            }
            else
                ++itr;
        }
я пока не знаю ни одного спелла, где бы было требования аур и он не пропускался через FillTargetMap(). покажите - подумаю.
rsa вне форума   Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм DistributeArenaPoints() xmolex Прочая документация 1 16.10.2010 14:48
Bash скрипт проверки сервера на зависание deadangel Tools 11 06.06.2010 13:26


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


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