Сделал таймер, который после ожидания приказывает юнитам использовать таунт, но он не работает, почему?
function Trig_Pet_death_1_Func001A takes nothing returns nothing
    call IssueImmediateOrderBJ( GetEnumUnit(), "taunt" )
endfunction

function smert takes nothing returns nothing
    local timer t = GetExpiredTimer()
    call ForGroupBJ( GetUnitsOfPlayerAll(GetOwningPlayer(GetTriggerUnit())), function Trig_Pet_death_1_Func001A )
endfunction

function Trig_Pet_death_1_Actions takes nothing returns nothing
    local timer t = CreateTimer()
    local integer id = GetHandleId(t)
    call TimerStart(t, 1.00, false, function smert)
endfunction

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

вот почему не работает:
function smert takes nothing returns nothing
    local timer t = GetExpiredTimer()
    call ForGroupBJ( GetUnitsOfPlayerAll(GetOwningPlayer(GetTriggerUnit())), function Trig_Pet_death_1_Func001A )
endfunction
Сюда не передан GetTriggerUnit(), его нужно привязать на хендл таймера через хештаблицу
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
4 года назад
0
Похожие вопросы:

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

Ну и вовсе, тебе нужен не хендл ид юнита а таймера,ибо сохранять ты данные должен на таймер а не на юнита, когда таймер истечет и вызовет функцию, внутри этой функции у тебя будет работать функция GetExpiredTimer() - которая вернет тот таймер, который запустил эту функцию, это единственный обьект связывающий твой триггер и функцию Unholy_Shield_End, и разумеется GetTriggerUnit() - не будет работать в потоке таймера, т.к это функция реакция на событие триггера. Ты походу копипастишь код совершенно не вникая в принципы его работы.
ответ
Ну если у тебя через локалку что-то неправильно иногда работает, значит просто у тебя где-то ошибка (или ты вообще делаешь это не так).
Для того что бы работать парой таймер+юнит впринципе то больше ничего и не нужно - таймер и сам юнит. Но если у тебя должно запускаться параллельно несколько точно таких же таймеров, то тут может подойти массив таймеров (и массив юнитов). При срабатывании одного из таймеров ты можешь ссылаться на юнита записанного под тем же индексом массива ( unit[X] и timer[X] соответственно).
А ещё в триггер можно добавлять события на срабатывания новых таймеров.

0
32
4 года назад
0
Ага, только ты сделал бездумно. Таймер то и течёт, а откуда тебя будет браться GetTriggerUnit?потом ты откуда то копировал этот код, но не разобрался как он работает.
0
12
4 года назад
Отредактирован Стас Орлов
0
quq_CCCP:
Ага, только ты сделал бездумно. Таймер то и течёт, а откуда тебя будет браться GetTriggerUnit?потом ты откуда то копировал этот код, но не разобрался как он работает.
Я копировал из своей карты. Я кинул не весь код триггера, а только кусок с тайиером. До этого там был использован вейтЮ я решил заменить на таймер и запутался.
0
32
4 года назад
0
Нет почитать статьи то, каждый раз приходится объяснять людям как работает таймер и хештаблица, и что как вы делали в гуи уже не получится.
0
32
4 года назад
0
вот почему не работает:
function smert takes nothing returns nothing
    local timer t = GetExpiredTimer()
    call ForGroupBJ( GetUnitsOfPlayerAll(GetOwningPlayer(GetTriggerUnit())), function Trig_Pet_death_1_Func001A )
endfunction
Сюда не передан GetTriggerUnit(), его нужно привязать на хендл таймера через хештаблицу
Принятый ответ
0
37
4 года назад
0
А можно было просто сделать замыкание на lua)
0
32
4 года назад
Отредактирован Берги
0
Вот тоже самое на lua, не планируете перейти?
function Trig_Pet_death_1_Actions()
	local u=GetTriggerUnit()
	TimerStart(CreateTimer(), 1.00, false, function()
		ForGroupBJ( GetUnitsOfPlayerAll(GetOwningPlayer(u)), function()
			IssueImmediateOrderBJ(GetEnumUnit(), "taunt" )
		end)
	end)
end

нет хештаблиц, нет хендлов, нет обнулений, ну я забыл дописать DestroyTimer и сама ForGroupBJ плоха, но не важно
0
2
4 года назад
0
GetTriggerUnit() вернёт null - нужно передать игрока через хэш или указать конкретного.
0
12
4 года назад
0
Bergi_Bear:
Вот тоже самое на lua, не планируете перейти?
function Trig_Pet_death_1_Actions()
	local u=GetTriggerUnit()
	TimerStart(CreateTimer(), 1.00, false, function()
		ForGroupBJ( GetUnitsOfPlayerAll(GetOwningPlayer(u)), function()
			IssueImmediateOrderBJ(GetEnumUnit(), "taunt" )
		end)
	end)
end

нет хештаблиц, нет хендлов, нет обнулений, ну я забыл дописать DestroyTimer и сама ForGroupBJ плоха, но не важно
А где найти туториалы по Луа?
0
32
4 года назад
0
0
32
4 года назад
0
Щяс выяснится что у чувака 1.26..
Чтобы оставить комментарий, пожалуйста, войдите на сайт.