Уже пять лет задаю вопросы и ответы здесь, как моя личная записная книжка по редактору варика. Спасибо вам, люди)

Все постоянно ругают вейт, даже как то кто то кидал мне наработку, чтобы вейт не глючил, только наработка не работает.
Все твердят заменять таймером, как я понял, это то же самый таймер что только на локалках и без окна? Если вас хватит скиньте пример такого таймера, если возможно без использования хэш таблицы( я не понимаю ее смысл)
Буду заменять вейты))

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

SсRealm:
То есть я пишу этот код и вейты больше не глючат?
Нет)) это так не работает.
Если ты хотя бы немного понимаешь как работает Jass, то просто используй это вместо вэйта.
Вот так. В данном случае 10. это 10 секунд.

SсRealm:
но если вейты так глючны, то почему бы просто не сделать отчет на локалках или глобалках?
Ответ на твой вопрос - таймер.
Хочешь записывай его в локалку, а потом ищи что и с кем делать (на это надо записать).
Хочешь записывай его в глобалку, а потом ... точно так же ищи что и с кем делать.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
3 года назад
0
Похожие вопросы:

ответ
Юзать структуры, свои собственные системы хранения данных.
Если вы только решили слезть с гуи+ вейты на jass, то вам рано думать о таком.
Таймер + хештаблицы в помощь, в статьях есть много информации на эту тему.
Что вам еще непонятно?
ImbaStyle, что есть TriggerSleepActions и timer вам известно?
ответ
Нельзя просто использовать таймер вместо вейта посередине триггера (гуишный вейт именно так и работает - запускает таймер и проверяет циклом каждые 0.1 сек пока он не пройдет).
Но если так уж нужно узнать истек ли таймер:
Real comparison - Обратный отсчет - Remaining time for timer (оставшееся время таймера)
ответ
Ну если у тебя через локалку что-то неправильно иногда работает, значит просто у тебя где-то ошибка (или ты вообще делаешь это не так).
Для того что бы работать парой таймер+юнит впринципе то больше ничего и не нужно - таймер и сам юнит. Но если у тебя должно запускаться параллельно несколько точно таких же таймеров, то тут может подойти массив таймеров (и массив юнитов). При срабатывании одного из таймеров ты можешь ссылаться на юнита записанного под тем же индексом массива ( unit[X] и timer[X] соответственно).
А ещё в триггер можно добавлять события на срабатывания новых таймеров.

2
26
3 года назад
2
За 5 лет уже можно было найчиться и на джассе писать, и хеш-таблицами пользоваться, и всем остальным.
Вейт на длинных периодах нормально работает. Только для передачи данных придется использовать локалки.
2
32
3 года назад
2
Вот пример отсроченного действия и работы с таймером
Вот допустим у тебя вот так, юнит при появлении на карте, постоит 2 секунды и отправить в центр карты, допустим эта зачаток системы движения крипов, зачем тут вейт, ну например для создания эффекта какого-то, это уже не важно, просто вейт и всё.
Вот допустим переделываем это всё на таймер.
Опять таки в чистом гуи ты так не сделаешь, ну я просто не знаю как показать, поэтому покажу сразу как умею - на lua, джасс если вспомню то вспомню.
Сначала переведём всё это на код, на луа это будет выглядить примерно вот так
function Trig_Gui_Actions()
    TriggerSleepAction(2)
    IssuePointOrderLocBJ(GetTriggerUnit(), "move", GetRectCenter(GetPlayableMapRect()))
end

function InitTrig_Gui()
    gg_trg_Gui = CreateTrigger()
    TriggerRegisterEnterRectSimple(gg_trg_Gui, GetPlayableMapRect())
    TriggerAddAction(gg_trg_Gui, Trig_Gui_Actions)
end
На джасе также + появятся всякий лишний мусор
В целом перепишем всё это в 1 блок
do
    TimerStart(CreateTimer(), 0.12, false, function() -- это нужно чтоб сборщик не прибрал наше событие
        InitEvent()
    end)
    function InitEvent()
        local thisTrig = CreateTrigger()
        TriggerRegisterEnterRectSimple(thisTrig, GetPlayableMapRect())
        TriggerAddAction(thisTrig, function() -- в аот и первая анонимная функци
            local unit=GetTriggerUnit() -- вот он наш юнит
            TimerStart(CreateTimer(), 2, false, function() -- а вот и наша 2 анонимная функция
                IssuePointOrderLocBJ(unit, "move", GetRectCenter(GetPlayableMapRect())) -- а наше действие из гуи триггера
            end)
        end)
    end
end
всё, мы сделали тоже самое, на луа через таймер, без хештаблиц, сразу муи сразу без утечек, вру (тут таймер надо запаузить и уничтожить, чтобы прям идеально, но я этим принебрегаю)
Но ты скорее всего ничего не понял, и да я просто выделывался. Теперь же попробуем тоже самое сделать на JASS, будут писать прототип идо наизусьь джасс не помню, да что там, вообще его не помню
globals
	global unit GUNIT = null
endglobals

function Trig_Gui_Actions takes nothing returns nothing
   local timer t = CreateTimer() // создаём таймер
   call TimerStart( t, 2, false, function myTimer) // запускаем таймер
   set t = null // обнуляем локалку
endfunction

function myTimer takes nothing returns nothing //это функция  которую запускает таймер, в неё ничего нельзя передать, это это не луа, а убогий джасс тут нужны хештаблицы, я же использовал глобалку GUNIT 
	call IssuePointOrderLocBJ(GUNIT , "move", GetRectCenter(GetPlayableMapRect())) // тот же самый приказ идти в центр карты
	call PauseTimer(GetExpiderTimer()) // паузим
    call DestroyTimer(GetExpiderTimer()) // и убираем до конца, в принципи действия не обязательные, как я сказал выше
endfunction
Я тут немного обрезал убрал код action, но он прекрасно конвертится с гуи в джасс и остаётся там, остаётся добавить глобалку GUNIT, так же я спецом использовал локацию и утекающую точку, ибо это уже другая тема
Загруженные файлы
0
26
3 года назад
0
Bergi_Bear, щас бы в коде использовать бж функции лол
0
20
3 года назад
0
С ранних лет невзлюбил понятие "триггеный юнит" то есть тот, отношении которого подпадает действие конкретного триггера, а вариантов могутт быть миллионы. Варик может тупануть. Поэтому стараюсь конкретно использовать глобалку типтбоевая единица с его именем ваня там, маша, пися.
Центр области , приходться, хотя опять же говорили утечна область и лучше конкретно к какому то предмету идти или зданию.
Спасибо тебе, бергибир, только что я из того спообен понять?
Ну, щас сяду и попробую накидать вот это вот все в custom script, скорее всего работать не будет и я без понятия, зачем паузить запущеный таймер?! Как он посчитает, сколько времени мне нужно подождать?
Итог: это разбираться, зачем нужна хеш таблица и на примере ткакого нибудь заклинания где я уже видел таймер с хэшем , Как он отсрачивает события вместо вейта.
Опять же рефордж отдаютт аутсорсерам и может он ещё вернётся. Там видно будет, а пока только так
1
32
3 года назад
1
Рефордж я показывал просто для примера, на сколько там просто и не нужна никакие заморочки. Паузить и уничтожать одноразовый таймер, это обязательно иначе будет небольшая утечка в памяти (ибо это древний баг варкрафта), если таймер периодический, то разумеется его тоже надо будет остановить, дабы он не болтался без дела
0
20
3 года назад
0
Bergi_Bear:
Рефордж я показывал просто для примера, на сколько там просто и не нужна никакие заморочки. Паузить и уничтожать одноразовый таймер, это обязательно иначе будет небольшая утечка в памяти (ибо это древний баг варкрафта), если таймер периодический, то разумеется его тоже надо будет остановить, дабы он не болтался без дела
А Почему событие таймер истекает не срабатывает?
0
27
3 года назад
0
Та го помогу с джассом что-ли
пройдёмся по основам и дальше сам разберёшься
2
32
3 года назад
2
ты видишь что то у меня тут подобное?
давай ещё раз
вот это строчкой мы создаём таймер, тут понятно?
local timer t = CreateTimer()
Таймер сидит в локальной переменной t больше тут ничего нет
Вот вторая строчка
call TimerStart( t, 2, false, function myTimer) 
call - вызвать фунцию TimerStart
t, 2, false, function myTimer - это её параметры, или же аргументы
где
t - таймер который мы создали
2 - время в секундах через которое он отработает
false - таймер одноразовый, там может быть ещё true - это периодический, всего 2 значения, это булева
function myTimer - непосредсвенно сама функция, оно же действие, которое произойдёт, когда пройдёт 2 секунды
и в неё нельзя ничего передать на чистом джасе, для этого и использовалась глобалка, чтобы работало и используются хештаблицы, чтобы посадить на хендл таймера например юнита, и каждый юнит будет привязан к своему таймеру. Опять же на lua не надо ничего этого делать вообще там просто из коробки работает, сразу как нужно. Собственно function myTimer takes nothing returns nothing это и есть гуишная функция "таймер истекает", до бишь это действие, которое произайдёт, когда время таймера tпришло.
Я уже одно и тоже говорю, просто если не понял, читай ещё несколько раз

rsfghd, ты должен был бороться со злом, а не примкнуть к нему
0
27
3 года назад
0
Bergi_Bear, вот за это я тебя и обожаю
0
26
3 года назад
Отредактирован Extremator
0
SсRealm:
Варик может тупануть.
Не может. У всего происходящего есть своя последовательность. Затереть юнита инициировавшего ивент не так уж и просто, но способы есть. В основном все проблемы с потерей такого юнита сводятся к тому что сам вэйт ни при чём, а всему виной каша идущая до/после.
По поводу вэйта - если уж не нравится стандартный, то как вариант, сварганить и юзать что-то на подобии этого:
function WAIT_EX takes real s returns nothing
	local timer t = CreateTimer()
	call TimerStart(t,s,false,null)
	loop
		call TriggerSleepAction(s)
		exitwhen TimerGetRemaining(t) == 0.
	endloop
	call DestroyTimer(t)
	set t = null
endfunction
0
20
3 года назад
0
Слухайте, че!Я тут конечно дико извиняюсь, что лезу со своей триггерной мордой, но если вейты так глючны, то почему бы просто не сделать отчет на локалках или глобалках?
И все. Тоесть для коротких и быстрых периодов это не годится, но раз уж вейт такой глючный!
Я могу и на локалках попробовать через custom script )))
Почему нет?!😊

Extremator:
SсRealm:
Варик может тупануть.
Не может. У всего происходящего есть своя последовательность. Затереть юнита инициировавшего ивент не так уж и просто, но способы есть. В основном все проблемы с потерей такого юнита сводятся к тому что сам вэйт ни при чём, а всему виной каша идущая до/после.
По поводу вэйта - если уж не нравится стандартный, то как вариант, сварганить и юзать что-то на подобии этого:
function WAIT_EX takes real s returns nothing
	local timer t = CreateTimer()
	call TimerStart(t,s,false,null)
	loop
		call TriggerSleepAction(s)
		exitwhen TimerGetRemaining(t) == 0.
	endloop
	call DestroyTimer(t)
	set t = null
endfunction
Это означает,что каждый раз когда я использую вейт, включается таймер равный этому вейту?
То есть я пишу этот код и вейты больше не глючат?
0
26
3 года назад
Отредактирован Extremator
0
SсRealm:
То есть я пишу этот код и вейты больше не глючат?
Нет)) это так не работает.
Если ты хотя бы немного понимаешь как работает Jass, то просто используй это вместо вэйта.
Вот так. В данном случае 10. это 10 секунд.

SсRealm:
но если вейты так глючны, то почему бы просто не сделать отчет на локалках или глобалках?
Ответ на твой вопрос - таймер.
Хочешь записывай его в локалку, а потом ищи что и с кем делать (на это надо записать).
Хочешь записывай его в глобалку, а потом ... точно так же ищи что и с кем делать.
Загруженные файлы
Принятый ответ
0
20
3 года назад
0
Extremator:
SсRealm:
То есть я пишу этот код и вейты больше не глючат?
Нет)) это так не работает.
Если ты хотя бы немного понимаешь как работает Jass, то просто используй это вместо вэйта.
Вот так. В данном случае 10. это 10 секунд.

SсRealm:
но если вейты так глючны, то почему бы просто не сделать отчет на локалках или глобалках?
Ответ на твой вопрос - таймер.
Хочешь записывай его в локалку, а потом ищи что и с кем делать (на это надо записать).
Хочешь записывай его в глобалку, а потом ... точно так же ищи что и с кем делать.
Extremator:
SсRealm:
То есть я пишу этот код и вейты больше не глючат?
Нет)) это так не работает.
Если ты хотя бы немного понимаешь как работает Jass, то просто используй это вместо вэйта.
Вот так. В данном случае 10. это 10 секунд.

SсRealm:
но если вейты так глючны, то почему бы просто не сделать отчет на локалках или глобалках?
Ответ на твой вопрос - таймер.
Хочешь записывай его в локалку, а потом ищи что и с кем делать (на это надо записать).
Хочешь записывай его в глобалку, а потом ... точно так же ищи что и с кем делать.
Extremator:
SсRealm:
То есть я пишу этот код и вейты больше не глючат?
Нет)) это так не работает.
Если ты хотя бы немного понимаешь как работает Jass, то просто используй это вместо вэйта.
Вот так. В данном случае 10. это 10 секунд.

SсRealm:
но если вейты так глючны, то почему бы просто не сделать отчет на локалках или глобалках?
Ответ на твой вопрос - таймер.
Хочешь записывай его в локалку, а потом ищи что и с кем делать (на это надо записать).
Хочешь записывай его в глобалку, а потом ... точно так же ищи что и с кем делать.
Extremator:
SсRealm:
То есть я пишу этот код и вейты больше не глючат?
Нет)) это так не работает.
Если ты хотя бы немного понимаешь как работает Jass, то просто используй это вместо вэйта.
Вот так. В данном случае 10. это 10 секунд.

SсRealm:
но если вейты так глючны, то почему бы просто не сделать отчет на локалках или глобалках?
Ответ на твой вопрос - таймер.
Хочешь записывай его в локалку, а потом ищи что и с кем делать (на это надо записать).
Хочешь записывай его в глобалку, а потом ... точно так же ищи что и с кем делать.
Extremator:
SсRealm:
То есть я пишу этот код и вейты больше не глючат?
Нет)) это так не работает.
Если ты хотя бы немного понимаешь как работает Jass, то просто используй это вместо вэйта.
Вот так. В данном случае 10. это 10 секунд.

SсRealm:
но если вейты так глючны, то почему бы просто не сделать отчет на локалках или глобалках?
Ответ на твой вопрос - таймер.
Хочешь записывай его в локалку, а потом ищи что и с кем делать (на это надо записать).
Хочешь записывай его в глобалку, а потом ... точно так же ищи что и с кем делать.
От души! просто заменю все старые триггреные вейты на костом скрипт!)))
1
27
3 года назад
Отредактирован MpW
1
SсRealm, все что щас делаешь немного глупо. Лишняя работа.
вэйт не глючный, немного дольше работает, чем таймер. Пример, таймер в 0.00 сек моментально срабатывает, а вэйт в 0.00 сек заметно дольше кажется 1 сек ушла у него. Может эти вещи не очевидны, но в некоторые моментах заметно. Не могу просто вспомнить хорошие примеры. Только с приказом, и то дурацкий метод. Пример, когда нужно было отменить приказ:
  • с вэйтом в 0.00 сек от полученного юнит успевает повернуться.
  • с таймером в 0.00 сек юнит уже стоит, будто и не получал приказ.
А вспомнил, короче нужно спрятать иконку сразу же, но при событии он не сразу создается. Пример юнит начал строительство, здания еще как бы не существует. Поэтому делаем задержку. Вообще во многих событиях происходят так: нас уведомляют что произойдет. Ну вот мне нужно спрятать иконку:
  • вэйт с 0.00 сек - видно на на доле секунд иконку прежде чем исчезает. это как-то не красиво.
  • с таймером 0.00 сек - я вообще ничего не вижу. что вообще то хорошо
видна же разница.
Но не хочу говорить что вэйт плохой. И прочее. Он может быть и полезным. К примеру задержку между приказами. Пример продажа всех итемов с инвентаря в магазин. Там можно замутить авто-продажу. Продажа происходит мгновенная, но чтобы выполнить все приказы нужна задержка. Можно было и на таймер, но код длиннее был бы
0
20
3 года назад
0
function WAIT_EX takes real s returns nothing
local timer t = CreateTimer()
call TimerStart(t,s,false,null)
loop
call TriggerSleepAction(s)
exitwhen TimerGetRemaining(t) == 0.
endloop
call DestroyTimer(t)
set t = null
endfunction
МрачныйВорон:
SсRealm, все что щас делаешь немного глупо. Лишняя работа.
вэйт немного дольше работает, чем таймер. Пример, таймер в 0.00 сек моментально срабатывает, а вэйт в 0.00 сек заметно дольше кажется 1 сек ушла у него. Может эти вещи не очевидны, но в некоторые моментах заметно. Не могу просто вспомнить хорошие примеры. Только с приказом, и то дурацкий метод. Пример, когда нужно было отменить приказ:
  • с вэйтом от полученного юнит успевает повернуться.
  • с таймером юнит уже стоит, будто и не получал приказ.
А вспомнил, короче нужно спрятать иконку сразу же, но при событии он не сразу создается. Пример юнит начал строительство, здания еще как бы не существует. Поэтому делаем задержку. Вообще во многих событиях происходят так: нас уведомляют что произойдет. Ну вот мне нужно спрятать иконку:
  • вэйт с 0.00 сек - видно на на доле секунд иконку прежде чем исчезает. это как-то не красиво.
  • с таймером 0.00 сек - я вообще ничего не вижу. что вообще то хорошо
видна же разница.
Но не хочу говорить что вэйт плохой. И прочее. Он может быть и полезным. К примеру задержку между приказами. Пример продажа всех итемов с инвентаря в магазин. Там можно замутить авто-продажу. Продажа происходит мгновенная, но чтобы выполнить все приказы нужна задержка. Можно было и на таймер, но код длиннее был бы
function WAIT_EX takes real s returns nothing
А вот этот код нельзя на custom script записать, а то я е пойму как мне выйти на этот таймер?
local timer t = CreateTimer()
call TimerStart(t,s,false,null)
loop
call TriggerSleepAction(s)
exitwhen TimerGetRemaining(t) == 0.
endloop
call DestroyTimer(t)
set t = null
endfunction

У меня call WAIT_EX( 20. ) не работает(
0
26
3 года назад
0
МрачныйВорон:
а вэйт в 0.00 сек заметно дольше кажется 1 сек ушла у него.
Данная информация совершенно не соответсвует действительности.
У меня бывают момент когда мне надо заставить триггер прождать МГНОВЕНИЕ, что бы не сбить что-то, и вот вэйт в 0.00 не помогает, т.к. срабатывает мгновенно, т.е. слишком быстро.
SсRealm:
А вот этот код нельзя на custom script записать, а то я е пойму как мне выйти на этот таймер?
Можно, обычно туда его и кидают.
Мб я по памяти не совсем правильно что-то написал, надо проверить самому.
1
27
3 года назад
1
Extremator, а я про что говорю?) что вэйт немного медлителен.
0
26
3 года назад
0
МрачныйВорон:
а я про что говорю?) что вэйт немного медлителен.
Ты бы ещё запятые расставлял в нужных местах )

SсRealm:
У меня call WAIT_EX( 20. ) не работает(
Мб ты не так сделал. Вот здесь работает.
К тому моменту когда ты найдёшь в чём реальный косяк такого вэйта, тебе уже не нужен будет вэйт.
Загруженные файлы
0
20
3 года назад
0
Extremator:
МрачныйВорон:
а я про что говорю?) что вэйт немного медлителен.
Ты бы ещё запятые расставлял в нужных местах )

SсRealm:
У меня call WAIT_EX( 20. ) не работает(
Мб ты не так сделал. Вот здесь работает.
К тому моменту когда ты найдёшь в чём реальный косяк такого вэйта, тебе уже не нужен будет вэйт.
Я сейчас сижу на UMSWE на сборке редактора от FNWE здесь эта функция не работает почему то
Загруженные файлы
0
26
3 года назад
Отредактирован Extremator
0
SсRealm:
функция не работает
Он же тебе пишет, что функция с этим названием не объявлена.
Т.е. ты не занёс её в шапку или в другое место, где она должна объявляться раньше чем упоминается.
Я тебе в сообщении выше пример прилепил.
0
21
3 года назад
Отредактирован scopterectus
0
Extremator, разве функция, которую ты скинул не есть стандартный гуишный вейт? В гуи не используется TriggerSleepAction( ), там используется BJ-шная функция PolledWait( ):
globals
    constant real      bj_POLLED_WAIT_INTERVAL          =  0.10
    constant real      bj_POLLED_WAIT_SKIP_THRESHOLD    =  2.00
endglobals

function PolledWait takes real duration returns nothing
    local timer t
    local real  timeRemaining

    if (duration > 0) then
        set t = CreateTimer()
        call TimerStart(t, duration, false, null)
        loop
            set timeRemaining = TimerGetRemaining(t)
            exitwhen timeRemaining <= 0

            // If we have a bit of time left, skip past 10% of the remaining
            // duration instead of checking every interval, to minimize the
            // polling on long waits.
            if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) then
                call TriggerSleepAction(0.1 * timeRemaining)
            else
                call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL)
            endif
        endloop
        call DestroyTimer(t)
    endif
endfunction
UPD: В гуи, окзывается, есть два вида вейта: TriggerSleepAction и PolledWait. Находятся прямо друг за дружкой.
0
26
3 года назад
0
ScopteRectuS:
Extremator, разве функция, которую ты скинул не есть стандартный гуишный вейт?
Кэп?
0
21
3 года назад
0
По поводу вэйта - если уж не нравится стандартный, то как вариант, сварганить и юзать что-то на подобии этого:
так ты и сварганил стандартный, который уже есть?
0
26
3 года назад
0
И ты продолжаешь спрашивать?
- Вот тебе красный.
- Это красный?
- У него цвет как у красного.
- Ну так это красный?
Чтобы оставить комментарий, пожалуйста, войдите на сайт.