У меня есть луп, который ожидает условия. В функции для этого лупа необходимо загружать данные из основной функции. Как я понял,
local unit u = GetTrigerUnit()
local integer h = GetHandleId(u)
Не сработает...А как ещё - не знаю, это же не таймер. Подскажите, что делать.
function WaitForAttack takes nothing returns boolean 
    
    local unit u = GetTriggerUnit()
    local integer h = GetHandleId(u)
    local real i = LoadReal(udg_hash,h,StringHash("stop"))
    if (i < 1) then
        return LoadBoolean(udg_hash,h,StringHash("attackedUnit")) == true
        call SaveReal(udg_hash,h,StringHash("stop"),i + 0.10)
    else
        call SaveBoolean(udg_hash,h,StringHash("attackedUnit"), false)
        call DisplayTimedTextToForce( GetPlayersAll(), 30, "фолс")
        set u = null
        return false
    endif
endfunction 
И вот тот луп:
loop
	exitwhen ( WaitForAttack()  )
    call TriggerSleepAction(RMaxBJ(bj_WAIT_FOR_COND_MIN_INTERVAL, 0.1))
endloop

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

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
11
5 лет назад
0
Я не могу понять, почему из лупа выгружается инфа каждые 0.1 секунду и дальше происходить что-то в зависимости от этой инфы. Я когда через таймер жду условия, оно НЕ передаётся в основную функцию так же мгновенно, как из лупа.
Если я вызову функцию из таймера, то в ней опять нельзя будет использовать GetTriggerUnit(), а у меня в этой функции объявлен старт ещё одного таймера...
Как тогда быть, нихрена не понимаю.
biridius:
в чем смысл функции в ОП? тип попытка написать свой собственный PolledWait?
абилки делайте через таймеры
на таймер как раз можно и сохранять данные в хеш, а не на какого то TriggeringUnit
Мне нужно отловить момент одной абилки при нажании на другую(проверка длится 1 секунду). Через зацикленный таймер не работает. При том, что я в нём каждые 0.05 секунд загружаю булин. А в основной функции написано, что если этот булин тру, то делать дальше.
А когда булин у меня становится тру, функция сразу не срабатывает. Она срабатывает при следующем нажатии на абилку, которая зависит от этого тру
Логика в том, что если в функции события триггера написано "юнит атакован", то это событие проверяется постоянно. А у меня событие "ЖМЁТСЯ КНОПКА"(проверка булина другой абилки). И типо на момент нажатия кнопки проверяется булин другой абилки. А мне надо, чтоб в течение секунды проверялся булин и если он за эту секунду становится тру, то выполнить дальше. А этот булин становится трушным, но так как абилка-проверка работает по нажатии на эту абилку, то в момент изменения булина с фолс на тру ничего не происходит, если это таймер, а не ЛУП.
function TimerUdar takes nothing returns nothing
    local    timer TimerForAttack = GetExpiredTimer()
    local integer ta = GetHandleId(TimerForAttack)
    local      unit u = LoadUnitHandle(udg_hash,ta,9)
    local integer h = GetHandleId(u)
    local real i = LoadReal(udg_hash,h,StringHash("stop"))
    if (i <= 1) then
        if (LoadBoolean(udg_hash,h,StringHash("attackedUnit")) == true) then
            call SaveBoolean(udg_hash,h,StringHash("attackedUnit"), true)
            
            call DisplayTimedTextToForce( GetPlayersAll(), 30, "true")
            call DestroyTimer(TimerForAttack)
        else
        call SaveReal(udg_hash,h,StringHash("stop"),i + 0.05)
        endif
    else
        call SaveBoolean(udg_hash,h,StringHash("attackedUnit"), false)
        call DisplayTimedTextToForce( GetPlayersAll(), 30, "false")
    
        call DestroyTimer(TimerForAttack) 
        call FlushChildHashtable(udg_hash,h) 
        call FlushChildHashtable(udg_hash,ta) 
    endif
endfunction
Это таимер, которыи ловит булин
Из другого тригера по хэндлу юнита
РЕБЯТА, ВСЁ ЗАРАБОТАЛО! Оказывается, из этого таймера, как только становится булин == тру, можно было вызвать старт ещё одного таймера. Щас буду всё писать с нуля, оптимизируя.
PT153:
DopaMine, ты опять делаешь действия после возврата из функции.
Поясните плз. Я делаю действия после возврата из функции. Ну так я заполняю переменную "unit u" значением о юните, так ведь? И в конце я просто обнуляю переменную u, в чём ошибка?
Вот это разве не обнуление ради устранения утечек?
local unit u = GetTriggerUnit()
...
...
set u = null
0
27
5 лет назад
Отредактирован MpW
0
очень сложно понять, что вы хотите сделать. зачем такая сложная конструкция, что у вас не работает не понятна.
Если я вызову функцию из таймера, то в ней опять нельзя будет использовать GetTriggerUnit(), а у меня в этой функции объявлен старт ещё одного таймера...
константы варика вроде GetTriggerUnit вызывают и передают аргументы через события
см. в теме 7 сообщение тебе уж объясняли в этой теме
см в теме 16 сообщение и скачай текстовый файл
ты же сам хранишь этот параметр "True/False" в хэше. И изменяешь в зависимости от срабатывания события вроде юза абилити, таймера истек GetExpiredTimer().
При том, что я в нём каждые 0.05 секунд загружаю булин. А в основной функции написано, что если этот булин тру, то делать дальше.
Зачем тебе создавать лишний таймер, и периодически проверять => лишняя работа. Можно напрямую узнать в хэше. Если значение изменится, ты сам узнаешь через сработки события юза абилити или завершения таймера
0
11
5 лет назад
Отредактирован DopaMine
0
очень сложно понять, что вы хотите сделать. зачем такая сложная конструкция, что у вас не работает не понятна.
Проще сделать нельзя, так как я делаю сложную механику скиллов. Очень надеюсь, что так можно сделать.
Скилл первый - ударить. Работает так: в области перед кастером выбирается отряд, в нём выбирается(pick) ближайший юнит к кастеру, у кастера проигрывается анимация удара со скоростью, зависящей от ловкости кастера, и через время анимации цели наносится урон, зависящий от силы кастера.
Скилл второй - уворот от первого скилла.(из наруто - каварими но дзюцу. Уже описывал подобное в другом вопросе, но там я делал уворот от автоатак, а щас делаю от "Ударить").
Он работает так: кастер жмёт кнопку(каварими но дзюцу)(направленная на точку) - и если в течение секунды после нажатия кастер становится (pick)-юнитом( из предыдущей способности), то кастер мгновенно(в момент становления PICK-юнитом из первой абилки) прячется(hide), и через 1.5 секунды появляется в точке - цель заклинания. Если же кастер просто нажал абилку и так и не стал выбранным юнитом предыдущей абилки, то просто пойдёт кулдаун. Это для того, чтоб надо было микрить и доджить, успевать нажать за время анимации врага. А если тот прокачен и у него анимация 0.2 секунды, то типо не поможет навык микроконтроля, так как враг КРУТОй НИНДЯ)))))))))))))))))))0
Второе я сделал. Правда, корявенько, надо переписывать, чтоб устранить все утечки(предварительно найдя, как именно это делается, а то мне писали здесь, что я обнуляю переменную после возврата из функции).
А вот с первой абилкой беда - пока у меня урон наносится сразу после того, как определилась цель(pick) и со скоростью анимации я не работал и не знаю даже, можно ли влиять на скорость проигрывания анимации. Если узнаю, что нельзя - я удалю варкрафт.)
Steal nerves:
Зачем тебе создавать лишний таймер, и периодически проверять => лишняя работа. Можно напрямую узнать в хэше. Если значение изменится, ты сам узнаешь через сработки события юза абилити или завершения таймера
В том и дело, что мне надо узнать это не перед нажатием абилки, а в течение секунды после этого.
DopaMine:
в течение секунды после этого.
Узнать в течение секунды, а среагировать на изменение булина как можно быстрее.
DopaMine:
Если узнаю, что нельзя - я удалю варкрафт.)
АФИГЕТЬ, так можно, оказывается))) в моём случае это даже легче, чем во время автоатаки изменить)) ВАРКРАФТ ФОРЕВЕР)
0
28
5 лет назад
Отредактирован PT153
0
Поясните плз. Я делаю действия после возврата из функции. Ну так я заполняю переменную "unit u" значением о юните, так ведь? И в конце я просто обнуляю переменную u, в чём ошибка?
Вот это разве не обнуление ради устранения утечек?
После возврата из функции никакие дальнейшие действия не выполняются. Я говорил про это.
Загруженные файлы
0
17
5 лет назад
0
не все знают как и когда нужно пользоваться вэйтом, поэтому у них ростёт опухоль связанная с тем что вэйты вообще нельзя использовать...
В текущем патче проблемы вейта решаются переопределением соответствующих функций в Lua. MUI способности становятся доступными с использованием вейтов.
2
28
5 лет назад
2
DopaMine, создаёшь таймер
сохраняешь на этот таймер всю необходимую информацию (юнита и прочее)
запускаешь таймер
всё
примеров того как это сделать в статьях куча
открываем и читаем
можешь начать с этой
вообще есть куча статей и готовых систем
Принятый ответ
0
11
5 лет назад
0
Спасибо)) я с этим уже разобрался, понятно про таймеры)
PT153:
После возврата из функции никакие дальнейшие действия не выполняются. Я говорил про это.
Смотрел и долго не мог понять, моё ли это))))
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.