Добавлен DopaMine
Подскажите плз, как сделать на JASS такой таймер, чтоб он не периодически что-то выполнял, а чтоб просто обратный отчёт начинался. Чтоб перед его началом я смог написать local boolean check = true. Дальше типо стартует таймер, и когда таймер истечёт( GetExpiredTimer(), как я понял ), чтоб я смог написать local boolean = false. И чтоб это правильно работало.
у меня функции такие:
у меня функции такие:
function CheckTimer takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local integer h = GetHandleId(caster)
local timer t = GetExpiredTimer()
local location point = LoadLocationHandle(udg_hash,h,StringHash("point"))
local boolean check = LoadBoolean(udg_hash,h,StringHash("check"))
call LoadUnitHandle(udg_hash,h,StringHash("caster"))
call SaveInteger(udg_hash,h,StringHash("h"), h )
call SaveBoolean(udg_hash,h,StringHash("check"), false)
set caster = null
set point = null
set t = null
endfunction
function Attack takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local location point = GetSpellTargetLoc()
local timer t = CreateTimer() //Создаём таймер
local integer h = GetHandleId(caster)
local boolean check = true
call SaveUnitHandle(udg_hash,h,StringHash("caster"),caster)
call SaveLocationHandle(udg_hash,h,StringHash("point"),point)
call SaveBoolean(udg_hash,h,StringHash("check"),check)
call TimerStart(t, 1, false, function CheckTimer) //Стартуем таймер (fasle - так как не цикличен, если я правильно понял)
set caster = null
set point = null
set t = null
endfunction
Когда я убираю этот таймер вообще, у меня работает, как надо всё. А мне надо, чтоб у меня включался таймер на секунду и за это время работала верхняя функция.
Принятый ответ
Если это то, о чём идёт речь, то я бы делал так:если юнита бьют, он может нажать кнопку и заменит себя на бревно, исчезнет(hide), появится бревно, эффекты и звук, и через 1.5 секунды появится(unhide) в точке, которая указана, как цель заклинания. А если не бьют, то ничего не произоидёт. Так же эффект работает всего 1 секунду(то есть применять типо надо прям перед ударом)
- Создаётся триггер
событие — юнит атакован (то есть был отдан приказ атаки с этим юнитом в качестве цели и он находится в пределах дальности атаки атакующего)
условие — атакованный юнит имеет эту абилку
действия — сохранить на юнита-цель флаг "сейчас можно применить Каварими но Дзюцу" (как я понимаю, это ты и делаешь в коде в посте), затем создать таймер и запустить его на функцию, в которой этот флаг поменяется на обратное значение/удалится (больше ничего). - Создаётся ещё один триггер
событие — юнит применяет способность Каварими но Дзюцу
условие — для применяющего юнита сохранён флаг "сейчас можно применить Каварими но Дзюцу"
действия — скрыть кастера, создать таймер, сохранить на этот таймер кастера и целевые координаты применённой способности, затем запустить его с задержкой 1.5 секунды на функцию, в которой из таймера будут выгружены координаты с юнитом, юнит будет в них перемещён (кстати, перемещать ничто не мешает сразу, разницы в игре не будет, а данных меньше таскать/хранить) и раскрыть кастера.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Ред. MpW
1)пересохраняем call SaveBoolean(udg_hash,h2,StringHash("check"), false)
2) очищаете ячейку call RemoveSavedHandle(udg_hash,h2,StringHash("check"))
3) по привычке удалить таймер и очистить таблицу по h1 и h2
берем 3 вариант, тк очистим ячейки хэша и удалим таймер.
Поясните плз, для чего нам точка-цель применения способности.
У меня был сохранён кастер-юнит в handl и по нему загружались данные в другом триггере. Щас у меня в другом триггере загружаются данные по тому же юниту. Но теперь в триггере с таймером его нету... Почему это так работает?
Вот код, что у меня. На 3-м скрине мой второй триггер, который загружает всё по хэндлу, в том числе boolean из первого триггера...
Steal nerves:
Ред. Hodor
и зачем на втором скриншоте в действиях триггера записаны обе функции: Attack и CheckTimer?
Ред. DopaMine
Ну то есть, когда юнит жмёт определённую способность, то на секунду(благодаря этому таймеру) второй триггер становится ТРУ, и этот второй триггер сработает при условии, что юнита бьют. И я не понимаю, почему работает, если я раньше сравнивал кастера из первого триггера с атакованным( GetTroggerUnit() ) из второго. И я сохранял всё по хэндлу кастера из первого триггера, а загружал по хэндлу ТриггерЮнита во втором триггере. И типо так как это один и тот же юнит, то всё работало, кроме запуска таймера.
Просто посмотрите на мой ответ Hodor'у и скажите, почему во втором триггере(3 скрин) функции понимают, что этот GetTriggerUnit() - это юнит из первого триггера...
Как вы вообще так шарите, не пойму:DDD
Hodor:
Hodor: