Создал триггер, где таймер должен включать определённую фнкцию(нашёл подобное в интернете), но он выдаёт ошибку, я не понимаю в чём проблема
function Unholy_Shield_Cast_Cond1 takes nothing returns boolean условие первое для проверки способности
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
function Unholy_Shield_End takes nothing returns nothing
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

Принятый ответ

У тебя ошибка, фукнкцию которую ты хочешь вызвать должна находится выше места вызова.
Unholy_Shield_End должна быть описана выше чем Sosdanie_Shita_Act1

Ну и вовсе, тебе нужен не хендл ид юнита а таймера,ибо сохранять ты данные должен на таймер а не на юнита, когда таймер истечет и вызовет функцию, внутри этой функции у тебя будет работать функция GetExpiredTimer() - которая вернет тот таймер, который запустил эту функцию, это единственный обьект связывающий твой триггер и функцию Unholy_Shield_End, и разумеется GetTriggerUnit() - не будет работать в потоке таймера, т.к это функция реакция на событие триггера. Ты походу копипастишь код совершенно не вникая в принципы его работы.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
4 года назад
0
Похожие вопросы:

ответ
Происходящее здесь напомнило мне один случай из моего далекого прошлого. В те времена я еще только начинал осваивать редактор. Одна из тем, которая меня заинтересовала и по которой мне не удалось найти достаточно полной информации - утечки. Тогда я пошел на один форум и задал простой вопрос о том, как определить наличие и степень серьезности утечек в карте, не перебирая весь код. В результате я получил тонну флуда и "ответ от профи", с которым все в итоге согласились - фрагмент кода с ценным указанием "если это число растет быстро - утечек много, если медленно - мало или нет вовсе". Код представлял из себя таймер с малым периодом, который создавал объект, брал его хендл, писал в чат и удалял объект, но был один нюанс - создаваемый объект утекал на каждой итерации таймера.
ответ
я посмотрел короче муй с помощью текста и знаете что он даже не доходит до 100) когда доходит до рандомное число от 1 до 100 примерно(могу ошибаться) он опять становится 2 так что писать таймер[от 1 до 100] вариант)

0
32
4 года назад
0
У тебя ошибка, фукнкцию которую ты хочешь вызвать должна находится выше места вызова.
Unholy_Shield_End должна быть описана выше чем Sosdanie_Shita_Act1

Ну и вовсе, тебе нужен не хендл ид юнита а таймера,ибо сохранять ты данные должен на таймер а не на юнита, когда таймер истечет и вызовет функцию, внутри этой функции у тебя будет работать функция GetExpiredTimer() - которая вернет тот таймер, который запустил эту функцию, это единственный обьект связывающий твой триггер и функцию Unholy_Shield_End, и разумеется GetTriggerUnit() - не будет работать в потоке таймера, т.к это функция реакция на событие триггера. Ты походу копипастишь код совершенно не вникая в принципы его работы.
Принятый ответ
0
12
4 года назад
Отредактирован Стас Орлов
0
quq_CCCP:
У тебя ошибка, фукнкцию которую ты хочешь вызвать должна находится выше места вызова.
Unholy_Shield_End должна быть описана выше чем Sosdanie_Shita_Act1

Ну и вовсе, тебе нужен не хендл ид юнита а таймера,ибо сохранять ты данные должен на таймер а не на юнита, когда таймер истечет и вызовет функцию, внутри этой функции у тебя будет работать функция GetExpiredTimer() - которая вернет тот таймер, который запустил эту функцию, это единственный обьект связывающий твой триггер и функцию Unholy_Shield_End, и разумеется GetTriggerUnit() - не будет работать в потоке таймера, т.к это функция реакция на событие триггера. Ты походу копипастишь код совершенно не вникая в принципы его работы.
Я это уже после того, как спросил понял и поменял код, однако он всё равно не хочет работать.
function Unholy_Shield_Cast_Cond1 takes nothing returns boolean условие первое для проверки способности
return GetSpellAbilityId() == 'A00V'
endfunction
function Unholy_Shield_End takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local unit attacked = LoadUnitHandle(udg_hash,h,1)
call UnitRemoveBuffBJ( 'B009', attacked )
endfunction
function Sosdanie_Shita_Act1 takes nothing returns nothing
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
Заклинание с юнита не убирается, почему? Вроде бы всё написал...
0
32
4 года назад
0
У твоего триггера события нету, у тебя же нет отдельной ситсмы как у меня в карте которая следит за всеми юнитами на карте и когда они кастуют спеллы ищет в бд фунцию спелла и вызвает её. Так что все ручками, дебаг сообщения так же не мешает сделать.
0
12
4 года назад
0
quq_CCCP:
У твоего триггера события нету, у тебя же нет отдельной ситсмы как у меня в карте которая следит за всеми юнитами на карте и когда они кастуют спеллы ищет в бд фунцию спелла и вызвает её. Так что все ручками, дебаг сообщения так же не мешает сделать.
quq_CCCP:
У твоего триггера события нету, у тебя же нет отдельной ситсмы как у меня в карте которая следит за всеми юнитами на карте и когда они кастуют спеллы ищет в бд фунцию спелла и вызвает её. Так что все ручками, дебаг сообщения так же не мешает сделать.
Я правильно понимаю, что это работать будет примерно так: юнит применяет способность и активирует триггер, если это нужная сопосбности то идёт работа. На юнита навешивается щит и записывается его показатель как реальная, потом (я до конца не понял как) высчитывается урон, который проходит в момент нанесения, а не в момент "юнит атакова" после чего даются бонусные за, а потом восстанавливаются до нужного размера.поэтому осталось всего пара вопросов. Первый, я так и не понял, как высчитать урон в момент атаки. Второй хватит ли одного события, что бы заработали все триггеры, или же нужно несколько событий, но как указать, что бы выполнялись конкретные действия?
0
32
4 года назад
0
Стас Орлов, мда, Тебе бы как следует статьи почитать на эту тему, ниче ты не понимаешь, даже как твоя способность должна работать.
Для начала нужен триггер с событием - юнит приводит способность в действие, ну и условие как ты правильно заметил что это нужная способность.
Далее в действиях этого триггера уже и нужно делать то, что тебя нужно от спелла.
У одного триггера может быть бесчисленное количество разных событий, условий и действий.
Ты хочешь щит на блок урона, это считай кастомный бафф. (все баффы способностей и есть внутри игровые триггеры, но описаны внутри движка), т.к ни одна из стандартных способностей тебя не устраивает - твоя задача на языке JASS описать кастомный бафф который тебя устроит.
Что нам нужно, ну во первых нам нужно узнать когда юнит получил урон, верно? создаем новый триггер и записываем на него через хт юнита, вешаем на триггер событие что юнит получил урон, далее нам нужно узнать что способность.

Так же не мешает узнать случаи альтернативного завершения способности, яркий пример - юнит умер, щит рассеили.
Ну и соответствующие действия.
Тут много тонкостей по которые лучше почитать в статьях.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.