А ведь задержка есть для всех спеллов, которым нужно ждать пассивного восстановления ресурса
Кажется, простые проверки IsUsableSpell не всегда хороши, когда проверяют за 400 мс.
usable, noMana = IsUsableSpell(). Если он не юзабельный только из-за самовосстанавливающейся "маны", то лучше спамить его, а не пассивно ждать регена. Именно так в хонорбадди делали спам абилок, это оказалось эффективнее, чем самый высокий тикрейт бота.
Под маной понимают любые ресурсы.
Например, для генераторов роги noMana это только энергия. А вот для финишеров noMana это энергия И комбопоинты.
В Spell Queue нельзя поставить спелл, у которого "нет маны". Даже если механика класса предполагает, что мана гарантированно отрегенится за SpellQueueWindow, серверу плевать, он не поставит.
У вас в
CanCast() не совсем понятное мне
and usable and (not nomana).
Если уж сейчас
usable, то никогда не будет
nomana. nomana немного уточняет причину, по которой спелл not usable.
Такая проверка приводит к пропуску приоритетного умения лишь потому, что "маны" не хватило, и может вызвать срабатывания более дешёвого по мане умения, нарушая приоритетность.
Это вынуждает для
каждого умения дополнительно добавлять проверки, чтобы просто обеспечить соблюдения порядка приоритетов.
Список приоритетов -- самая популярная логика в WoW. Но сейчас для blackdps расположение в списке мало что значит, т.к. само по себе не гарантирует соблюдение приоритетов. Имеющаяся принудительная CanCastUnit() даже своими условиями внутри умения не позволит вернуть логику приоритетов
Однако это легко меняется.
Если
хочется спамить, то замена на and (usable or nomana) вызовет спам за 400 мс до гкд. Но тогда залипания бега будут вообще постоянно и тут уж я посмотрю на тех, кто "не сталкивается"
Если
не хочется спамить, то лучше вывалиться из функции SpellSelector() по нехватке маны на подходящий спелл и пройти приоритеты заново, чем ошибочно продвинуться дальше по списку в поисках "что бы ещё тут нажать раз уж зашли".
if CanCastUnit() then return spellID, unit
elseif select(2,IsUsableSpell(spellID)) then return --ничего, выходим
end
Так сохранится нынешний пропуск спеллов, которые не у персонажа (для любителей мешать спеки в одну ротацию или не вставлять проверку на взятый талант), но не случится ошибочного перехода дальше по приоритетам, когда нужный приоритет уже найден.
Для некоторых классов в ВоВ "простой" с одними лишь автоатаками это нормальное действие. В результатах симкрафта всегда указывают это значение :Р
Правда, и спамилка, и выход из функции потребуют от пользователей очень бережно относиться к списку приоритетов. Потому что "сам по себе" рандомный переход на более низкий приоритет уже никогда не случится.
Обычно это значит лишь, что выполнение спеллов по своим макросам, интеррапты, использование потов и предметов нужно будет держать наверху, а вот автоатаку держать внизу.
С нынешней заменой простоя на поиск неверного приоритета требуется условиями дополнительно блокировать ВСЁ что ниже по списку. Развлечение ещё то
Гарантия приоритетов же сильно облегчит начинающему создание ротации, ведь будет достаточно копировать из симкрафта или AMR. Для продолжающего это уберёт длительные поиски причины "почему этот спелл лезет впереди, он же ниже в списке!".
Во всяком случае, я верю, что прозрачные правила всегда лучше скрытых.