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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
26
TriggerSleepAction это и есть вэйт.
DopaMine, не все знают как и когда нужно пользоваться вэйтом, поэтому у них ростёт опухоль связанная с тем что вэйты вообще нельзя использовать... Так что можешь сразу забивать, если тебе начинают доказывать что всё не работает тупо из-за вейта, и не объясняют почему именно и что/куда уходит.
11
DopaMine, не все знают как и когда нужно пользоваться вэйтом, поэтому у них ростёт опухоль связанная с тем что вэйты вообще нельзя использовать... Так что можешь сразу забивать, если тебе начинают доказывать что всё не работает тупо из-за вейта, и не объясняют почему именно и что/куда уходит.
Поясните плз кто-нибудь, о чём речь хотя бы. Я хочу сам решить, чем мне пользоваться, а чем - нет:D
26
если вам нужны рандомные десинхронизации в мультиплеере
грохнутый поток в фильтрах и кондишенах
неточный отсчет времени при каждом запуске функции
а в сингле еще и его отсчет при паузах
то
native TriggerSleepAction takes real timeout returns nothing
для вас
когда станет совсем невмоготу, перейдете на таймеры
28
Паузы хороши для синематиков, для мультиплеера же лучше использовать таймеры.

DopaMine, ты опять делаешь действия после возврата из функции.
22
в чем смысл функции в ОП? тип попытка написать свой собственный PolledWait?
абилки делайте через таймеры
на таймер как раз можно и сохранять данные в хеш, а не на какого то TriggeringUnit
11
Я не могу понять, почему из лупа выгружается инфа каждые 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
27
очень сложно понять, что вы хотите сделать. зачем такая сложная конструкция, что у вас не работает не понятна.
Если я вызову функцию из таймера, то в ней опять нельзя будет использовать GetTriggerUnit(), а у меня в этой функции объявлен старт ещё одного таймера...
константы варика вроде GetTriggerUnit вызывают и передают аргументы через события
см. в теме 7 сообщение тебе уж объясняли в этой теме
см в теме 16 сообщение и скачай текстовый файл
ты же сам хранишь этот параметр "True/False" в хэше. И изменяешь в зависимости от срабатывания события вроде юза абилити, таймера истек GetExpiredTimer().
При том, что я в нём каждые 0.05 секунд загружаю булин. А в основной функции написано, что если этот булин тру, то делать дальше.
Зачем тебе создавать лишний таймер, и периодически проверять => лишняя работа. Можно напрямую узнать в хэше. Если значение изменится, ты сам узнаешь через сработки события юза абилити или завершения таймера
11
очень сложно понять, что вы хотите сделать. зачем такая сложная конструкция, что у вас не работает не понятна.
Проще сделать нельзя, так как я делаю сложную механику скиллов. Очень надеюсь, что так можно сделать.
Скилл первый - ударить. Работает так: в области перед кастером выбирается отряд, в нём выбирается(pick) ближайший юнит к кастеру, у кастера проигрывается анимация удара со скоростью, зависящей от ловкости кастера, и через время анимации цели наносится урон, зависящий от силы кастера.
Скилл второй - уворот от первого скилла.(из наруто - каварими но дзюцу. Уже описывал подобное в другом вопросе, но там я делал уворот от автоатак, а щас делаю от "Ударить").
Он работает так: кастер жмёт кнопку(каварими но дзюцу)(направленная на точку) - и если в течение секунды после нажатия кастер становится (pick)-юнитом( из предыдущей способности), то кастер мгновенно(в момент становления PICK-юнитом из первой абилки) прячется(hide), и через 1.5 секунды появляется в точке - цель заклинания. Если же кастер просто нажал абилку и так и не стал выбранным юнитом предыдущей абилки, то просто пойдёт кулдаун. Это для того, чтоб надо было микрить и доджить, успевать нажать за время анимации врага. А если тот прокачен и у него анимация 0.2 секунды, то типо не поможет навык микроконтроля, так как враг КРУТОй НИНДЯ)))))))))))))))))))0
Второе я сделал. Правда, корявенько, надо переписывать, чтоб устранить все утечки(предварительно найдя, как именно это делается, а то мне писали здесь, что я обнуляю переменную после возврата из функции).
А вот с первой абилкой беда - пока у меня урон наносится сразу после того, как определилась цель(pick) и со скоростью анимации я не работал и не знаю даже, можно ли влиять на скорость проигрывания анимации. Если узнаю, что нельзя - я удалю варкрафт.)
Steal nerves:
Зачем тебе создавать лишний таймер, и периодически проверять => лишняя работа. Можно напрямую узнать в хэше. Если значение изменится, ты сам узнаешь через сработки события юза абилити или завершения таймера
В том и дело, что мне надо узнать это не перед нажатием абилки, а в течение секунды после этого.
DopaMine:
в течение секунды после этого.
Узнать в течение секунды, а среагировать на изменение булина как можно быстрее.
DopaMine:
Если узнаю, что нельзя - я удалю варкрафт.)
АФИГЕТЬ, так можно, оказывается))) в моём случае это даже легче, чем во время автоатаки изменить)) ВАРКРАФТ ФОРЕВЕР)
28
Поясните плз. Я делаю действия после возврата из функции. Ну так я заполняю переменную "unit u" значением о юните, так ведь? И в конце я просто обнуляю переменную u, в чём ошибка?
Вот это разве не обнуление ради устранения утечек?
После возврата из функции никакие дальнейшие действия не выполняются. Я говорил про это.
Загруженные файлы
15
не все знают как и когда нужно пользоваться вэйтом, поэтому у них ростёт опухоль связанная с тем что вэйты вообще нельзя использовать...
В текущем патче проблемы вейта решаются переопределением соответствующих функций в Lua. MUI способности становятся доступными с использованием вейтов.
28
DopaMine, создаёшь таймер
сохраняешь на этот таймер всю необходимую информацию (юнита и прочее)
запускаешь таймер
всё
примеров того как это сделать в статьях куча
открываем и читаем
можешь начать с этой
вообще есть куча статей и готовых систем
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.