В порядке регистрации событий. Кто раньше зарегистрировался, тот раньше и сработает. А порядок регистрации диктуется расположением триггеров в редакторе: те что выше, регистрируются раньше. Там есть пара нюансов, когда триггер был только что создан, но это исправляется при закрытии и повторном открытии карты с сохранением.
Есть вариант хукнуть функцию нанесения урона, тем самым добавить к ней убирание способности сразу, как только она завершилась. Это поможет ситуациям вроде таких:
function ...
call UnitDamageTarget()
...
call UnitDamageTarget()
endfunction
Предположим, что в коде нет пауз. Без хука способность уберётся только после выполнения всего кода функции, а также того кода, где функция была вызвана. С хуком сразу после получения урона. Однако до этого все триггеры на урон сработают.
Однако это никак не поможет для ситуаций, когда триггеры срабатывают раз за разом. Это можно наблюдать в тестовой карте: порой там так жёстко расстреливают, что до таймера в 0 секунд очередь доходит только после нескольких срабатываний триггера. Что делать в такой ситуации, не совсем ясно.
И нужно понимать, что после вызова NegateDamage ничего не мешает делать что-то ещё в триггере, узнавать то же максимальное здоровье. Тут никакие хуки не помогут.
GetLocalPlayer, это просто исправляется введением функции, которая возвращает максимум хп без учёта этой способности.
function GetUnitMaxHealth takes unit u returns real
local real life = GetWidgetLife(u)
local real maxlife
local boolean removed = UnitRemoveAbility(u, HealthAbility)
set maxlife = GetUnitState(u, UNIT_STATE_MAX_LIFE)
if removed then
call UnitAddAbility(u, HealthAbility)
call SetWidgetLife(u, life)
endif
return maxlife
endfunction
Можно написать иначе, если известно, сколько здоровья абилка даёт.
function GetUnitMaxHealth takes unit u returns real
return GetUnitState(u, UNIT_STATE_MAX_LIFE) - 1000000 * GetUnitAbilityLevel(u, HealthAbility)
endfunction
Эту функцию можно добавить в саму либу, а можно, чтобы юзер её сам написал. Мне пока никто с такими проблемами не обращался, потому что либу никто не юзает.
Уверен, тут может быть много подводных камней, но для начинающих вполне сойдёт, а там дальше они своё напишут, или пересядут на мемхак/1.29+.
Именно по этому в WispTD я сделал своё здоровье, и просто процентно отражал его в реальном здоровье.
установить его текущее здоровье равное здоровью до удаления способности
Достаточно запустить тестовую карту и убедиться, что так работать не будет.
Кратко говоря - во время выполнения функции у юнита может быть ~миллион хп, после удаления способности это превратится в 100% его нормального здоровья. А до всех манипуляций у юнита было 3 хп. Это хорошо видно в тестовой карте, нужно рабочего вниз увести.
rsfghd, GetTriggerUnit - это стандартная функция, есть у всех. А все остальные - просто аналоги, порой кривые, как GetSpellAbilityUnit(). Зачем они - хз.
Desgul, баг-то и в одиночной проявляет себя. Fly123, да хватить цитировать комментарии полностью, да ещё и по нескольку раз.
Если хочешь оставить вейт, то в самом начале заноси нужные GetSpell в локалки.
А на самом деле я не совсем понял
Да допустим у тебя 1 триггер на каст. Он с вейтом. После вейта у тебя идёт обращение к цели каста (GetSpellAbilityTarget).
Срабатывает этот триггер (поток 1), начинается вейт. Тут этот триггер опять срабатывает (поток 2) и уже для этого начинается вейт. Для потока 1 вейт заканчивается, а GetSpellAbilityTarget в этом потоке возвращает null. Почему - потому что близзард. Причём это может быть даже без вейта.
Desgul, мой первый комментарий тут относился не в тебе, а к тс-у.
» WarCraft 3 / Как настроить такой триггер?
» WarCraft 3 / Negate Damage library
Ред. PT153
» WarCraft 3 / Negate Damage library
Ред. PT153
» WarCraft 3 / Negate Damage library
» WarCraft 3 / Negate Damage library
» WarCraft 3 / Как настроить такой триггер?
Ред. PT153
» WarCraft 3 / Negate Damage library
Уверен, тут может быть много подводных камней, но для начинающих вполне сойдёт, а там дальше они своё напишут, или пересядут на мемхак/1.29+.
» WarCraft 3 / Нарезалка LoadingScreen'а (теперь с интерфейсом!)
» WarCraft 3 / Как настроить такой триггер?
Ред. PT153
» WarCraft 3 / AI natives
Ред. PT153
» WarCraft 3 / Negate Damage library
» WarCraft 3 / Negate Damage library
» WarCraft 3 / Get Unit Armor
Ред. PT153
» WarCraft 3 / Negate Damage library
» WarCraft 3 / Negate Damage library
Ред. PT153
» WarCraft 3 / Negate Damage library
» WarCraft 3 / Negate Damage library
» H.P.W / H.P.W
» WarCraft 3 / В чём ошибка?
» WarCraft 3 / В чём ошибка?
Fly123, да хватить цитировать комментарии полностью, да ещё и по нескольку раз.
Если хочешь оставить вейт, то в самом начале заноси нужные GetSpell в локалки.
Срабатывает этот триггер (поток 1), начинается вейт. Тут этот триггер опять срабатывает (поток 2) и уже для этого начинается вейт. Для потока 1 вейт заканчивается, а GetSpellAbilityTarget в этом потоке возвращает null. Почему - потому что близзард. Причём это может быть даже без вейта.
» Администрация XGM / Убрать цитирование всего комментария
Вот опять.
» WarCraft 3 / В чём ошибка?
» WarCraft 3 / В чём ошибка?
» WarCraft 3 / В чём ошибка?
Ред. PT153
» WarCraft 3 / В чём ошибка?