Вопрос в следующем. Вот скажем есть триггер, в котором при применении заклинания, воин меняет цвет. Ну, заношу его в локалку, жду вейтом 12 секунд, меняю цвет обратно. Проблема в том, что он не всегда меняет цвет обратно. Хочу попробовать через таймер.
Как сделать это через таймер? Вернее как триггер, который сработает после звонка таймера и будет возвращать цвет, поймет, какому именно юниту нужно вернуть цвет? Если создавать для каждого юнита свой таймер, то как отследить его звонок, ведь в событиях есть ли срабатывание конкретного таймера?

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

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
19
4 года назад
0
Похожие вопросы:

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

2
19
4 года назад
2
Хэш-таблица + эксплоит с таймером.
2
26
4 года назад
2
Ну если у тебя через локалку что-то неправильно иногда работает, значит просто у тебя где-то ошибка (или ты вообще делаешь это не так).
Для того что бы работать парой таймер+юнит впринципе то больше ничего и не нужно - таймер и сам юнит. Но если у тебя должно запускаться параллельно несколько точно таких же таймеров, то тут может подойти массив таймеров (и массив юнитов). При срабатывании одного из таймеров ты можешь ссылаться на юнита записанного под тем же индексом массива ( unit[X] и timer[X] соответственно).
А ещё в триггер можно добавлять события на срабатывания новых таймеров.
Принятый ответ
0
12
4 года назад
0
Смотри, тут всё просто. Ошибка в том, что сам приказ вейт плохо работает(сам на нём много раз попадался. Всё что тебе нужно это хеш таблица в карте.
function Timer takes takes nothing returns nothing
local timer t = GetExpiredTimer() создаём локальную переменную таймера и присваеваем ей истёкший таймер
local integer id = GetHandleId(t) узнаём id этого таймера
local unit test = LoadUnitHandle(udg_hash, id, 1) загружаем юнита-цель, если это нужный таймер(id васё определит)
call UnitAddSleepPerm( test, false ) будим нужного юнита
endfunction
function Trig_Test_Actions takes nothing returns nothing
local timer t = CreateTimer() создаём локальный таймер
local integer id = GetHandleId(t) находим id таймера
local unit test = GetSpellTargetUnit() берём юнита-цель способности
TimerStart(t, 10, false, Timer) создаём таймер на 10 сек и активируем функцию по истечению тайсера
call UnitAddSleepPerm( test, true ) приказваем юнита-цель уснуть
SaveUnitHandle(udg_hash, id, 1, test) сохраняем юнита-цель в таблице по id таймера
endfunction
Примерно так, тебе нужно только поменять приказы и всё. И добавить хеш таблицу, если её нет.
0
13
4 года назад
0
KaneThaumaturge:
Хэш-таблица + эксплоит с таймером.
С использованием эксплоита хэш-таблица не очень-то и нужна в большинстве кейсов.
0
7
4 года назад
Отредактирован Ельнур
0
function Timer takes takes nothing returns nothing
    local timer t = GetExpiredTimer()                   //создаём локальную переменную таймера и присваеваем ей истёкший таймер
   local integer id = GetHandleId(t)                   //узнаём id этого таймера
   local unit test = LoadUnitHandle(udg_hash, id, 1)   //загружаем юнита-цель, если это нужный таймер(id васё определит)     
call UnitAddSleepPerm( test, false )                //будим нужного юнита
call FlushChildHashtable(Hash,GetHandleId(t))  // чистим хеш чтобы не вызывал утечек
call DestroyTimer(t) // удаляем таймер чтобы не было утечек
 endfunction

function Trig_Test_Actions takes nothing returns nothing
     local timer t = CreateTimer()                   //создаём локальный таймер
     local integer id = GetHandleId(t)               //находим id таймера
     local unit test = GetSpellTargetUnit()          //берём юнита-цель способности
    TimerStart(t, 10, false, Timer)                 //создаём таймер на 10 сек и активируем функцию по истечению тайсера
    call UnitAddSleepPerm( test, true )             //приказваем юнита-цель уснуть
     call SaveUnitHandle(udg_hash, id, 1, test)           //сохраняем юнита-цель в таблице по id таймера
 endfunction
Примерно так, тебе нужно только поменять приказы и всё. И добавить хеш таблицу, если её нет.
забыл удалить таймер и очистить хеш иначе через 5 минут все залагает
2
32
4 года назад
2
NekoriDes:
KaneThaumaturge:
Хэш-таблица + эксплоит с таймером.
С использованием эксплоита хэш-таблица не очень-то и нужна в большинстве кейсов.
Этот експлоит нахер не усрался, ибо он не быстрее и ничем не лучше хештаблицы, вы особо ничего не выиграете, да и это дурь ни чуть не удобнее простого хт. Нет такого что хештаблица супер медленная и прочее, да она медленне чем обращение к переменным, но разница не колоссальна, в среднем одно обращение к хештаблице = 2 два обращения к массиву, исходя из этого все эти костыли никак не могут быть быстре чем просто запись значения в хт.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.