Как можно сделать это с помощью одного таймера? Чтобы каждый раз не создавался таймер, а использовался 1 на всю игру.
public function DestroyLightningTimed_TimerCallback takes nothing returns nothing
        local timer t = GetExpiredTimer( )

        call DestroyLightning( LoadLightningHandle( HASHTABLE, GetHandleId( t ), 0 ) )

        call FlushChildHashtable( HASHTABLE, GetHandleId( t ) )
        call DestroyTimer( t )
        set t = null
    endfunction

    function DestroyLightningTimed takes lightning whichBolt, real delay returns nothing
        local timer t = CreateTimer( )

        call SaveLightningHandle( HASHTABLE, GetHandleId(t), 0, whichBolt )
        call TimerStart( t, delay, false, function DestroyLightningTimed_TimerCallback )

        set t = null
    endfunction

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

Делается таймер с относительно низким периодом, к каждой молнии лепится float, и каждый тик таймер проходится по списку структур и уменьшает все эти float на свой период. Если после уменьшения float <= 0, то структура вместе с молнией исключается из списка обходимых таймером и уничтожается.

Sergey105, советую почитать какие-нибудь общепринятые гайдлайны по оформлению кода. Так как cJass эмулирует C++, сойдёт общий набор рекомендаций по нему от Google.

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

ответ
Занеси в переменную , а то так не катит .
ответ
Стремись к использованию одного единственного таймера(по крайней мере это пропагандируется с давних пор. конкретных чисел по производительности дать не могу). Каждый тик таймера увеличиваешь целочисленные переменные, выделенные по одной для каждого игрока. По событию отданного приказа обнуляешь эти переменные. Если переменная > скольки-то, предлагаешь прописать сообщение в чат для кика. Правда в дотке там таймер по получению опыта вроде.
ответ
способ 1
вешать структуру на таймер с помощью эксплойта (для тех кто не знает структура это число) а потом этим таймером вызывать нужную функцию спустя 0 секунд
плюсы:
простота
минусы:
требует добавлять иф на каждую новую функцию
второй способ
тоже самое что и 1 только на таймер вешается вдобавок название функции и таймер вызывает её экзекутом
вот моя библиотека по 2 способу и карта с примером
в библиотеке в самом верху есть небольшой док по 3 функциям
ответ
XGM Bot:
Похожие вопросы:

ответ
оказывается, во втором триггере я использовал ту же переменную индекса, что и в первом. Melissa и naxim , спасибо вам =)
ответ
Всё, разобрался, вопрос снимаю)
ответ
Tapper, не ,не помогает.
Если ты конечно про
//! nocjass

//! endnocjass
В общем, такая проблема возникает только на JNGP Requiem.
ответ
Сейчас попробую integer SHV_N = 0 . Это единственное чо я смог предположить
ответ
Проблема возникает также при переносе вот этого вот в инициализацию триггера тест.
Но при этом если вместо строки вроде "12345" использовать, например, GetAbilityName('Aloc') - то все работает.
Это какой-то баг со строками?
Еще у меня почему-то происходит фантомный клик по центру карты в начале игры
Вобщем не стоит юзать имена функций напрямую в экзекуте и вообще таймеры лучше

ответ
Чето совершенно непонятно что вам нужно, найти тот таймер и его индекс в массиве, который истек и запустил триггер?
Ну очень просто , перебором в цикле всех таймеров и смотреть кто истек, тот кто истек того индекс вы и получите, считая шаги цикла.
В чем проблема?.
(100+ таймеров и массив по мне идиотия, неужели нельзя было воспользоваться хештаблицей и создавать\удалять таймеры по мере надобности)

0
7
7 лет назад
0
ScopteRectuS, могу показать как сделать со структурой такое
0
21
7 лет назад
0
Sergey105, да, хотелось бы посмотреть.
0
7
7 лет назад
Отредактирован Clamp
0
struct  ordered_struct {
            unit ord 
            unit ord_targ
            location ord_targ_loc
    //----------------------------------------------------------
    private static timer t = CreateTimer();
    private static int count = 0x00;
    private static bool TB = false;
    //----------------------------------------------------------
    private static void UpdateOD(){}
    private static void AddUpdateOrder(unit ord, unit ord_targ){
            ordered_struct OD = 0x00;
            if FindIdClassByUnit(ord)!= 0 { RemoveUnitFromUpdate(ord) };
            count++;
            OD = ordered_struct.create();
            OD.ord = ord; 
            OD.ord_targ = ord_targ;
            
            if TB == false{
               TB = true;
               TimerStart(t, 0.05, true, function ordered_struct.UpdateOD)
            }
    }
    private static void RemoveUnitFromUpdate(unit ord){
            ordered_struct OD = 0x00;
            OD = FindIdClassByUnit(ord);
            if OD > 0 {
               OD.ord = null;
               OD.destroy()
            }  count--;
    }//endfunction
    private static ordered_struct FindIdClassByUnit(unit ord){
            ordered_struct OD = 0x00;
            while(OD <= count){
                if OD.ord == ord { ord = null; return OD }
            OD++;
            }
            ord = null; return 0;
    }//endfunction
    }//endstruct
ну учти это в библиотеке и за этого private
что непонятно пиши
и да это пример с юнитами
ну можно переделать по своему
0
32
7 лет назад
0
Эх можно бы было узнать хендл triggeraction'a в потоке триггера...
2
23
7 лет назад
2
Sergey105, ставь бб код jass иначе не удобно читать
2
30
7 лет назад
Отредактирован Clamp
2
Делается таймер с относительно низким периодом, к каждой молнии лепится float, и каждый тик таймер проходится по списку структур и уменьшает все эти float на свой период. Если после уменьшения float <= 0, то структура вместе с молнией исключается из списка обходимых таймером и уничтожается.

Sergey105, советую почитать какие-нибудь общепринятые гайдлайны по оформлению кода. Так как cJass эмулирует C++, сойдёт общий набор рекомендаций по нему от Google.

Sergey105, касательно кода замечу, что перезапускать таймер при каждом добавлении структуры нецелесообразно, лучше запустить его единожды и просто бегать по статическому массиву структур.
Принятый ответ
0
4
7 лет назад
0
Копипастишь либу из OneTimer или добавляешь через #include
Здесь пример
Загруженные файлы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.