CreateTimer
Подскажите плз, как сделать на 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. Создаётся триггер
событие — юнит атакован (то есть был отдан приказ атаки с этим юнитом в качестве цели и он находится в пределах дальности атаки атакующего)
условие — атакованный юнит имеет эту абилку
действия — сохранить на юнита-цель флаг "сейчас можно применить Каварими но Дзюцу" (как я понимаю, это ты и делаешь в коде в посте), затем создать таймер и запустить его на функцию, в которой этот флаг поменяется на обратное значение/удалится (больше ничего).
  1. Создаётся ещё один триггер
событие — юнит применяет способность Каварими но Дзюцу
условие — для применяющего юнита сохранён флаг "сейчас можно применить Каварими но Дзюцу"
действия — скрыть кастера, создать таймер, сохранить на этот таймер кастера и целевые координаты применённой способности, затем запустить его с задержкой 1.5 секунды на функцию, в которой из таймера будут выгружены координаты с юнитом, юнит будет в них перемещён (кстати, перемещать ничто не мешает сразу, разницы в игре не будет, а данных меньше таскать/хранить) и раскрыть кастера.



Просмотров: 384



Hodor #51 - 1 неделю назад (отредактировано ) 0
структурировать надо код всегда
и по возможности на каждый вид события один триггер
иначе при дальнейших модификациях карты будет получаться всё более жесткое месиво из кода
и в один день настанет момент когда уже нереально будет контроллировать ~10к строк перемешанного кода, всплывет вопрос об оптимизации
любой человек без склонностей к мазохизму придет к выводу что надо переписывать с нуля всё
хотяяяя, оно тоже мазохизм, но меньший)))
Clamp #52 - 1 неделю назад 0
и по возможности на каждый вид события один триггер
Пишешь ты такой систему движения на WASD (то бишь на касте абилок) и какие-нибудь абилки, и для всех нужно одно событие. Красиво будет выглядеть такая "оптимизация"? Легко ли поддерживать такой код?

Тут у тебя ещё замечание про 1000 потоков было, ты его удалил, но я замечу, что вар вообще однопоточный.

иначе при дальнейших модификациях карты будет получаться всё более жесткое месиво из кода
Карта с одной из самых сильных модификаций игрового процесса, которые я знаю (tcx aside), называвшаяся Combat Zone, имела в своём коде меньше тысячи строк просто потому что писал её скиловый программист. Месиво из кода всегда характеризует не столько платформу, сколько её пользователя (/разработчика на ней).

Ну и даже если у тебя 10к+ строк кода, этот код же можно нормально структурировать, а не тупо приписывать в Map Custom Script каждый раз внизу.


Алсо оффтоп, закругляемся.
Hodor #53 - 1 неделю назад (отредактировано ) 0
про 1000 потоков было
да просто почти все карты на гуи имеют на одно и тоже событие (например юнит атакован) около 50 триггеров
а во всяких петробалансах вообще лютейшая дичь, тупо событие на вход в регион имеет около двухста триггеров

Ну и даже если у тебя 10к+ строк кода, этот код же можно нормально структурировать, а не тупо приписывать в Map Custom Script каждый раз внизу.
так я и не говорил что нельзя переписывать)
я прямо так и подчеркнул что с нуля
хотяяяя, оно тоже мазохизм, но меньший)))

Алсо оффтоп, закругляемся.
ладно, пойду посплю
Clamp #54 - 1 неделю назад 0
так я и не говорил что нельзя переписывать)
Структуризация кода подразумевает его перемещение, но не пересоздание, насколько я могу помнить.
Hodor #55 - 1 неделю назад 0
Clamp, ну и то и другое, кое где надо переписать натыкать пробелов название поменять, кое где переместить

ладно всё, я ушёл
DopaMine #56 - 1 неделю назад 0
действия — скрыть кастера, создать таймер, сохранить на этот таймер кастера и целевые координаты применённой способности, затем запустить его с задержкой 1.5 секунды на функцию, в которой из таймера будут выгружены координаты с юнитом, юнит будет в них перемещён (кстати, перемещать ничто не мешает сразу, разницы в игре не будет, а данных меньше таскать/хранить) и раскрыть кастера.
Да, так меньше данных сохранять придётся, спасибо за совет) так и сделаю щас