Добавлен Стас Орлов
Создал триггер, где таймер должен включать определённую фнкцию(нашёл подобное в интернете), но он выдаёт ошибку, я не понимаю в чём проблема
function Unholy_Shield_Cast_Cond1 takes nothing returns boolean условие первое для проверки способности
return GetSpellAbilityId() == 'A00V'
endfunction
return GetSpellAbilityId() == 'A00V'
endfunction
function Sosdanie_Shita_Act1 takes nothing returns nothing
local real shieldBlock = 150.00 Число, которое показывает колличество блокируемого урона
local unit w = GetSpellTargetUnit() Юнит, на которого повешен щит
local integer j = GetHandleId(w) Узнаём ID юнита, на которого повешен щит
local timer t = CreateTimer ()
local real time = 30.00
call TimerStart (t, time, false, function Unholy_Shield_End)
call SaveUnitHandle(udg_hash,j,1,w)
call SaveReal(udg_hash,j,2, shieldBlock)
set t = null
set w = null
endfunction
local real shieldBlock = 150.00 Число, которое показывает колличество блокируемого урона
local unit w = GetSpellTargetUnit() Юнит, на которого повешен щит
local integer j = GetHandleId(w) Узнаём ID юнита, на которого повешен щит
local timer t = CreateTimer ()
local real time = 30.00
call TimerStart (t, time, false, function Unholy_Shield_End)
call SaveUnitHandle(udg_hash,j,1,w)
call SaveReal(udg_hash,j,2, shieldBlock)
set t = null
set w = null
endfunction
function Unholy_Shield_End takes nothing returns nothing
call UnitRemoveBuffBJ( 'B009', GetTriggerUnit() )
endfunction
call UnitRemoveBuffBJ( 'B009', GetTriggerUnit() )
endfunction
===========================================================================
function InitTrig_Unholy_shield_Jass takes nothing returns nothing
set gg_trg_Unholy_shield_Jass = CreateTrigger( )
call TriggerAddCondition( gg_trg_Unholy_shield_Jass, Condition( function Unholy_Shield_Cast_Cond1 ) )
endfunction
function InitTrig_Unholy_shield_Jass takes nothing returns nothing
set gg_trg_Unholy_shield_Jass = CreateTrigger( )
call TriggerAddCondition( gg_trg_Unholy_shield_Jass, Condition( function Unholy_Shield_Cast_Cond1 ) )
endfunction
Принятый ответ
У тебя ошибка, фукнкцию которую ты хочешь вызвать должна находится выше места вызова.
Unholy_Shield_End должна быть описана выше чем Sosdanie_Shita_Act1
Unholy_Shield_End должна быть описана выше чем Sosdanie_Shita_Act1
Ну и вовсе, тебе нужен не хендл ид юнита а таймера,ибо сохранять ты данные должен на таймер а не на юнита, когда таймер истечет и вызовет функцию, внутри этой функции у тебя будет работать функция GetExpiredTimer() - которая вернет тот таймер, который запустил эту функцию, это единственный обьект связывающий твой триггер и функцию Unholy_Shield_End, и разумеется GetTriggerUnit() - не будет работать в потоке таймера, т.к это функция реакция на событие триггера. Ты походу копипастишь код совершенно не вникая в принципы его работы.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Unholy_Shield_End должна быть описана выше чем Sosdanie_Shita_Act1
Отредактирован Стас Орлов
return GetSpellAbilityId() == 'A00V'
endfunction
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local unit attacked = LoadUnitHandle(udg_hash,h,1)
call UnitRemoveBuffBJ( 'B009', attacked )
endfunction
local real shieldBlock = 150.00 Число, которое показывает колличество блокируемого урона
local unit w = GetSpellTargetUnit() Юнит, на которого повешен щит
local timer t = CreateTimer ()
local integer h = GetHandleId(w) узнаём ID юнита на которого повесили щит
local integer j = GetHandleId(t) Узнаём ID таймера конца
local real time = 3.00
call TimerStart (t, time, false, function Unholy_Shield_End)
call SaveUnitHandle(udg_hash,j,1,w) Записываем юнита для таймера
call SaveReal(udg_hash,h,2, shieldBlock)
call SaveUnitHandle(udg_hash,h,1,w) Записываем юнита, на которого повеслили щит
set t = null
set w = null
endfunction
function InitTrig_Unholy_shield_Jass takes nothing returns nothing
set gg_trg_Unholy_shield_Jass = CreateTrigger( )
call TriggerAddAction (gg_trg_Unholy_shield_Jass, function Sosdanie_Shita_Act1)
call TriggerAddCondition( gg_trg_Unholy_shield_Jass, Condition( function Unholy_Shield_Cast_Cond1 ) )
endfunction
Для начала нужен триггер с событием - юнит приводит способность в действие, ну и условие как ты правильно заметил что это нужная способность.
Далее в действиях этого триггера уже и нужно делать то, что тебя нужно от спелла.
У одного триггера может быть бесчисленное количество разных событий, условий и действий.
Ты хочешь щит на блок урона, это считай кастомный бафф. (все баффы способностей и есть внутри игровые триггеры, но описаны внутри движка), т.к ни одна из стандартных способностей тебя не устраивает - твоя задача на языке JASS описать кастомный бафф который тебя устроит.
Что нам нужно, ну во первых нам нужно узнать когда юнит получил урон, верно? создаем новый триггер и записываем на него через хт юнита, вешаем на триггер событие что юнит получил урон, далее нам нужно узнать что способность.
Ну и соответствующие действия.
Тут много тонкостей по которые лучше почитать в статьях.