|
Баг-репорты Описываем проблемы и ошибки работы ядра |
|
Опции темы | Поиск в этой теме | Опции просмотра |
21.12.2010, 10:50 | #1 |
Почетный флудер
Старожил
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
|
Алгоритм проверки 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; Точно такая же ситуация (в теории, примеров я пока не нашел) и с целями с ограничением TargetAuraStateNot. Решение: https://github.com/rsa/mangos/commit...d0ce1a87924362 Сразу говорю, решение не очень красивое, и достаточно слабо отттестировано. Если кто предложит лучше - буду рад. |
2 пользователя(ей) сказали cпасибо: | KiriX (21.12.2010), Konctantin (24.12.2010) |
23.12.2010, 20:23 | #2 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Может быть перенести
Код:
// Database based targets from spell_target_script и вызывать ее раньше для замены (выставления) цели по умолчанию? Для остальных эфектов вызывать как и сейчас.
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
23.12.2010, 20:31 | #3 |
Почетный флудер
Старожил
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
|
я думал над этим, но это уже политическое решение нужно я в политику не лезу, могу только костыль предложить.
с моей точки зрения, сначала вообще должна быть залита карта таргетов (а то может и проверять валидность каста незачем вообще?) и только потом идти проверка. точнее наверное так: CheckSpellSource() FillTargetMap() for ... to ... CheckSpellTargets() PS сегодня разбирался в Spell::SetTargetMap(). Много думал Последний раз редактировалось rsa; 23.12.2010 в 20:48. |
23.12.2010, 21:55 | #4 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
не уверен - большей частью проверяется имеено главная цель которая сообщается клиентом - большей частью опятьже это проверки дублирующие проверки сделанные клиентом во избежание читинга. Цели выбранные сервером вообщемто безсмысленно проверять - но в случае выбора по базе - мы имеено делаем не выбор целей каста типа арейных - а автонаведение на цель. По мне так вынос автонаведенеия перед проверкой основной цели выглядит естесвенным.
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
24.12.2010, 09:25 | #5 |
Почетный флудер
Старожил
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
|
Увы, продолжение разборок показывает что мой первый патч тоже далеко не все учитывает. В случае пары целей 22,15 мы имеем облом в любом случае поскольку выборка целей идет не из базы а совсем потом... Пример - 72256-72255 которые должны прицеливаться по ауре 72293. К сожалению без реализации алгоритма из №3 это нереально. Я-то этот спелл хакну, но хотелось бы иметь универсальное решение...
|
16.03.2011, 07:23 | #6 |
Почетный флудер
Старожил
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
|
Длительное тестирование показало, что патч из первого поста неэффективен и не учитывает кучи вариантов.
В результате сравнения механики неработающих спеллов (в частности кроме вышеупомянутых это спеллы квесткомплитов 71518, 72289, 72934, взгляните на таргет и требуемую ауру), выявлено что проверка из темы в CheckCast не нужна вообще - абсолютно правильная выборка по аурам идет в SetTargetMap. Осталось только обеспечить (забытую?) проверку TargetAuraStateNot в CheckTarget() и все. проект решения: https://github.com/rsa/mangos/commit...ab6cd20eec88da внутреннее тестирование проблем пока не выявило. сейчас тестируется общественностью. Проблемы - теряем правильное сообщение о требуемой ауре (впрочем, в клиент оно по моему и не передавалось никогда). |
16.03.2011, 10:07 | #7 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
CheckTarget не для всех типов целей используется.
|
16.03.2011, 11:04 | #8 |
Почетный флудер
Старожил
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
|
Для всех, где вызывается FillTargetMap():
Код:
for (std::list<Unit*>::iterator itr = tmpUnitMap.begin(); itr != tmpUnitMap.end();) { if (!CheckTarget (*itr, SpellEffectIndex(i))) { itr = tmpUnitMap.erase(itr); continue; } else ++itr; } |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Алгоритм DistributeArenaPoints() | xmolex | Прочая документация | 1 | 16.10.2010 14:48 |
Bash скрипт проверки сервера на зависание | deadangel | Tools | 11 | 06.06.2010 13:26 |