Добавлен Стас Орлов
Такой вопрос. Я пытаюсь сделать щит, который блокирует входящий урон. Я решил это сделать триггерно, через востановление хп, но проблема в том, что в редакторе есть только условие юнит атакован, которое срабатывает в момент до атаки, когда приказ отдан и юнит начинает атаковать. Проблема в том, что я не могу найти команду на проверку урона (приходиться считать из вычитания хп) и не могу найти команду - юнит полчает урон или что-то в этом роде, а не атакован. Без этого выходит, что противник наносящий урон медленно не триггерит щит и это выглядит некрасиво. Вопрос в том, что есть ли команда на принятие входящего урона в момент его получения, а если нет, то как это заменить?
Принятый ответ
Событие юнит получает урон регистрируется на конкретного юнита.
Для того что бы отлавливать урон по цели твоего "щита", нужно создать для цели (т.е. для того юнита, на которого накладывают щит) отдельное событие на получением им урона. И делать это надо именно в тот момент, когда ты накладываешь щит.
Для этого есть функция добавить событие в триггер, в ней можно указать конкретного юнита и само событие получения урона. Дальше тебе придётся только лишь определить был ли юнит в момент получения урона под действием "щита" и дальше блокировать урона (восстанавливать хп юнита).
Так же надо отметить момент, что если ты для юнита создаёшь больше ОДНОГО события на получение урона - они будут работать каждый сам по себе (т.е. при получении урона 1 раз, будут срабатывать 2 события, и триггер будет срабатывать ДВА раза = больше события и больше срабатываний в один момент времени).
Для этого надо маркеровать юнитов, для которых создаётся событие на получение урона (например заносить их в группу юнитов, а перед этим проверять есть ли юнит в этой группе).
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Суть - Событие - Юнит получает урон, далеко не всегда удобно создавать 1 триггер на всех юнитов, и их создают динамически, по 1 для одного или нескольких юнитов, а затем удаляют.
function Trig_Unholy_shield_1_Jass_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A00V' ) ) then
return false
endif
return true
endfunction
local real shieldBlock Число, которое показывает колличество блокируемого урона
local real hp Число, которое показывает колличество жизней юнита на момент наложения щита
local unit w = GetSpellTargetUnit() Юнит, на которого повешен щит
local integer h Нужна для проверки соответствия после
local integer j = GetHandleId(w) Узнаём ID юнита, на которого повешен щит
set shieldBlock = 150.00
set hp = GetUnitStateSwap(UNIT_STATE_LIFE, GetSpellTargetUnit())
set h = j
call SaveUnitHandle(udg_hash,j,1,w)
call SaveReal(udg_hash,j,2,shieldBlock)
call SaveReal(udg_hash,j,3,hp)
call SaveInteger(udg_hash,j,4, h)
set w = null
call EnableTrigger( gg_trg_Unholy_shield_2_v2_Jass )
endfunction
function InitTrig_Unholy_shield_1_Jass takes nothing returns nothing
set gg_trg_Unholy_shield_1_Jass = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Unholy_shield_1_Jass, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Unholy_shield_1_Jass, Condition( function Trig_Unholy_shield_1_Jass_Conditions ) )
call TriggerAddAction( gg_trg_Unholy_shield_1_Jass, function Trig_Unholy_shield_1_Jass_Actions )
endfunction
function Trig_w_Actions takes nothing returns nothing
local unit attacked = GetAttackedUnitBJ()
local integer j = GetHandleId(attacked)
local real hpA = GetUnitStateSwap(UNIT_STATE_LIFE, GetAttackedUnitBJ())
local real uron
local unit a = LoadUnitHandle(udg_hash, j,1)
local real shieldBlock = LoadReal(udg_hash, j,2)
local real hp = LoadReal(udg_hash, j,3)
local integer h = LoadInteger(udg_hash, j,4)
local real Yron2
set uron = ( hp - hpA )
if ( shieldBlock > 0.00 ) then
if ( shieldBlock > uron) then
call SetUnitLifeBJ( GetAttackedUnitBJ(), ( GetUnitStateSwap(UNIT_STATE_LIFE, GetAttackedUnitBJ()) + uron ) )
set shieldBlock = ( shieldBlock - uron )
call SaveReal(udg_hash,j,2,shieldBlock)
else
set Yron2 = (uron - shieldBlock)
call SetUnitLifeBJ( GetAttackedUnitBJ(), ( GetUnitStateSwap(UNIT_STATE_LIFE, GetAttackedUnitBJ()) + Yron2 ) )
set shieldBlock = ( shieldBlock - uron )
call SaveReal(udg_hash,j,2,shieldBlock)
endif
else
if ( shieldBlock <= 0.00 ) then
call UnitRemoveBuffBJ( 'B009', GetTriggerUnit() )
endif
endif
endfunction
function InitTrig_Unholy_shield_2_v2_Jass takes nothing returns nothing
set gg_trg_Unholy_shield_2_v2_Jass = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Unholy_shield_2_v2_Jass, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddAction( gg_trg_Unholy_shield_2_v2_Jass, function Trig_w_Actions )
endfunction
Ред. quq_CCCP
Потом конверты гуи не юзай.
Что сперва ты ждешь пока юнит применит скилл, ты записываешь в хештаблицу этого юнита, все нужные данные, а так же создаешь для него отдельный триггер, которому ставишь события, что юнит умер, юнит получает урон, время вышло, ну добавляешь триггеру условия, действия, где производишь манипуляции с юнитом в зависмости от события, на которое сработал триггер.
При уроне выше 0 и от нужных тебе юнитов, вручаешь юниту способность на 100500 хп (в моем случае я сделал способность с ро кодом 'Amhp' на 150000 хп), записываешь в хештаблицу кол-во здоровья перед ударом, и запускаешь таймер на 0.00 секунд, как он кончится, удаляешь способность и разумеется устанавливаешь хп - сколько было.
Возможны и другие реализации когда один триггер обслуживает сразу множество юнитов, к примеру отвечает за каку-нибудь пассивку на атаку вроде крита или баша (кастомного), у крипов коих десятки. Да такие варианты лучше, но они гораздо сложнее, и я не советую начинающим рассматривать их.