28

» WarCraft 3 / Negate Damage library

до их выполнения
До? Я думал, после.
Было бы удобнее хукать TriggerRegisterUnitEvent
А что это даст? Событие всё равно добавится.
28

» WarCraft 3 / Negate Damage library

GetLocalPlayer:
последовательность исполнения триггеров
В порядке регистрации событий. Кто раньше зарегистрировался, тот раньше и сработает. А порядок регистрации диктуется расположением триггеров в редакторе: те что выше, регистрируются раньше. Там есть пара нюансов, когда триггер был только что создан, но это исправляется при закрытии и повторном открытии карты с сохранением.
Есть вариант хукнуть функцию нанесения урона, тем самым добавить к ней убирание способности сразу, как только она завершилась. Это поможет ситуациям вроде таких:
function ...
    call UnitDamageTarget()
    ...
    call UnitDamageTarget()
endfunction
Предположим, что в коде нет пауз. Без хука способность уберётся только после выполнения всего кода функции, а также того кода, где функция была вызвана. С хуком сразу после получения урона. Однако до этого все триггеры на урон сработают.
Однако это никак не поможет для ситуаций, когда триггеры срабатывают раз за разом. Это можно наблюдать в тестовой карте: порой там так жёстко расстреливают, что до таймера в 0 секунд очередь доходит только после нескольких срабатываний триггера. Что делать в такой ситуации, не совсем ясно.
И нужно понимать, что после вызова NegateDamage ничего не мешает делать что-то ещё в триггере, узнавать то же максимальное здоровье. Тут никакие хуки не помогут.
28

» WarCraft 3 / Negate Damage library

GetLocalPlayer, есть идеи, как отменять урон без добавления максимального хп?
28

» WarCraft 3 / Negate Damage library

Сразу скажу наперёд - да, будут проблемы с событиями "Жизни у юнита становятся таким-то". Но без изменения здоровья тут никак.
28

» WarCraft 3 / Negate Damage library

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 я сделал своё здоровье, и просто процентно отражал его в реальном здоровье.
28

» WarCraft 3 / Как настроить такой триггер?

Принятый ответ
Нужно проверять нанесение урона. Если кто-то получил урон от мины, то она взорвалась.
28

» WarCraft 3 / AI natives

quq_CCCP, я же написал, какие критуют и при каких обстоятельствах.
28

» WarCraft 3 / Negate Damage library

Обновлено, теперь стало ещё круче. Даже на гуи использовать можно. И без UMSWE. Спасибо GetLocalPlayer.
28

» WarCraft 3 / Negate Damage library

GetLocalPlayer, я проверил, вроде всё пашет как надо. Это здорово всё упрощает.

Да что-то мне кажется, что я кому делал ровно так, как и описал GetLocalPlayer, но когда решил выложить, намутил дичи.
28

» WarCraft 3 / Get Unit Armor

Короче, это не пашет на эфериалов, сниму с публикации до фикса.
28

» WarCraft 3 / Negate Damage library

GetLocalPlayer, ну так ему ставится миллион хп + текущее хп во время добавления способности.
28

» WarCraft 3 / Negate Damage library

Обновил проверку того, что юнит жив, заменив на более надёжную.
28

» WarCraft 3 / Negate Damage library

установить его текущее здоровье равное здоровью до удаления способности
Достаточно запустить тестовую карту и убедиться, что так работать не будет.

Кратко говоря - во время выполнения функции у юнита может быть ~миллион хп, после удаления способности это превратится в 100% его нормального здоровья. А до всех манипуляций у юнита было 3 хп. Это хорошо видно в тестовой карте, нужно рабочего вниз увести.
28

» WarCraft 3 / В чём ошибка?

rsfghd, GetTriggerUnit - это стандартная функция, есть у всех. А все остальные - просто аналоги, порой кривые, как GetSpellAbilityUnit(). Зачем они - хз.
28

» WarCraft 3 / В чём ошибка?

Desgul, баг-то и в одиночной проявляет себя.
Fly123, да хватить цитировать комментарии полностью, да ещё и по нескольку раз.
Если хочешь оставить вейт, то в самом начале заноси нужные GetSpell в локалки.
А на самом деле я не совсем понял
Да допустим у тебя 1 триггер на каст. Он с вейтом. После вейта у тебя идёт обращение к цели каста (GetSpellAbilityTarget).
Срабатывает этот триггер (поток 1), начинается вейт. Тут этот триггер опять срабатывает (поток 2) и уже для этого начинается вейт. Для потока 1 вейт заканчивается, а GetSpellAbilityTarget в этом потоке возвращает null. Почему - потому что близзард. Причём это может быть даже без вейта.

Desgul, мой первый комментарий тут относился не в тебе, а к тс-у.
28

» WarCraft 3 / В чём ошибка?

Почему нельзя использовать "Ждать"?
Сработает триггер на каст ещё раз, и все GetSpell... для триггера в паузе обратятся в нули.
28

» WarCraft 3 / В чём ошибка?

юнит триггера принадлежит игрок синий
Юнит триггера это кастер...
28

» WarCraft 3 / В чём ошибка?

Desgul, и что? Это повод ставить ненужное условие? В группе должны быть только герои, а потому условие должно быть Matching Unit is Hero.