Пытаюсь в массиве создать 24 триггера, к этим 24 триггерам добавляю действие, но не задача, ругается и говорит мол лишняя скобка, когда я пытаюсь передать целочисленный параметр в функцию. Посмотрите, пожалуйста:
function mk takes integer i returns nothing
    set udg_kills_m[i] = 0
endfunction

//===========================================================================
function InitTrig_mk1 takes nothing returns nothing
    local trigger array trig
    local integer a = 0
    set trig[0] = null
    set a =1
    loop
          set trig[a] = CreateTrigger(  )
          call TriggerRegisterTimerExpireEventBJ( trig[a], udg_kills_t[a] )
          call TriggerAddAction(trig[a], function mk(a))
          set a = a + 1
          exitwhen a ==24+1
    endloop
    set a = 0  
endfunction

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

В жассе нельзя передавать параметры в функции-каллбеки.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
29
5 лет назад
Отредактирован nazarpunk
0
TriggerAddAction принимает функцию, а вы туда ещё и параметр запихнули. Не говоря уже о том, что создавать 24 триггера глупо.
3
24
5 лет назад
3
В жассе нельзя передавать параметры в функции-каллбеки.
Принятый ответ
0
16
5 лет назад
0
NazarPunk, "глупо", а вы бы как сделали?
мне нужно 24 таймера, который поддерживают актуальность стрика убийства дабл-килл, трипл-кил и так далее, соотвественно у каждого игрока свой таймер (это я так думаю)
prog, оххх, как трудно на это переходит после c#, ох какие вещи я бы здесь вытворял со списками xDDD
0
24
5 лет назад
0
оххх, как трудно на это переходит после c#, ох какие вещи я бы здесь вытворял со списками xDDD
Ну так переходи на 1.31 и Lua, там можно много чего вытворять.
1
29
5 лет назад
Отредактирован nazarpunk
1
"глупо", а вы бы как сделали?
Запускаем один таймер, который инкриментит переменную SECOND раз в секунду. В массиве по индексу игрока держим время последнего убийства.
3
24
5 лет назад
Отредактирован prog
3
Что касается задачи отлова килл-стриков - все можно реализовать на массивах, циклах и одном таймере с периодом в одну секунду и никто не заметит разницы. Ну и не через таймер-триггер, а через CreateTimer и TimerStart напрямую, раз уж на то пошло дело.
0
16
5 лет назад
0
prog, да 24 триггера, но они довольно простые, просто обнуляют переменные. я куда больше боюсь периодических триггеров, тем более (возможно я еще пока мало знаю), как я понимаю для отлова реального времени, мне надо будет переводить игровое время в реальное. в плане реализации 24 триггера гораздо проще и приятнее, в плане оптимизация - я не знаю
0
24
5 лет назад
0
TeX13, еще раз повторюсь, таймеры-триггеры штука корявая, вместо этого нормальные люди пользуются CreateTimer и TimerStart.
3
29
5 лет назад
3
как я понимаю для отлова реального времени, мне надо будет переводить игровое время в реальное
Зачем?
в плане реализации 24 триггера гораздо проще и приятнее
24 таймера в 24 раза больше чем один таймер, который довольно просто реализовать. А если вам приятней использовать кривой подход, то я уже и незнаю...

Чтоб не мучаться, можете вообще взять готовую систему.
0
16
5 лет назад
0
prog, я прислушился. Это получается мне нужно при старте создать счетчик, который каждую секунду отсчитывает по 1 секунде? И такой вопрос можно ли повлияеть на время (знаю есть такая функция: добавить время таймеру), через которое выполнится действие в TimerStart?
NazarPunk, ну меня готовое не интересует, все не настроишь в конфиге, надо под себя делать)) тем более так ничему и не научишься
1
24
5 лет назад
Отредактирован prog
1
TeX13, если делать на одном таймере - идея в том чтобы считать время от старта и запоминать его при килах, чтобы было с чем сравнить при следующем киле - если разница меньше чем предел времени между килами для серии, увеличиваем серию, если больше - начинаем новую серию. Все становится чуть сложнее если за успешную серию нужно выдавать какие-то бонусы в конце серии т.к. такой подход не подразумевает простого детекта того что кил был последним в серии, но если достаточно действий после каждого кила, то это один из оптимальных подходов, имхо.
Если же держать по таймеру на каждую начатую серию, то нужно решить несколько проблем
  • привязка номера игрока к таймеру, чтобы таймер знал на кого он работает. В жассе это только через хештаблицы по хендлу таймера делается. В Lua на 1.31 все проще и есть несколько способов это сделать.
  • Продление времени после кила. Если я правильно помню, то можно просто заново сделать TimerStart на том-же таймере, но могу ошибаться т.к. очень давно не делал ничего где мне нужно было бы менять таймер между итерациями
2
29
5 лет назад
2
Все становится чуть сложнее если за успешную серию нужно выдавать какие-то бонусы в конце серии т.к. такой подход не подразумевает простого детекта того что кил был последним в серии
Вообще-то подразумевает. Заводим ещё один массив по индексу игрока и и инкрементим там значение за каждый кил. В момент истечения времени продолжения серии, сбрасываем переменную и выдаём награду за количество килов.
1
24
5 лет назад
1
NazarPunk, я и говорю чуть сложнее становится - нужно перебирать всех игроков для которых активна серия и проверять не пора ли для них закончить серию. Самая простая реализация не требует даже циклов, только проверку времени после каждого кила.
0
16
5 лет назад
0
prog, гораздо легче можно решить. Создаем массив отсчета секунд для 24 игроков second[n]. При старте карты запускаем счетчик секунд и по циклу проверяем все 24, как только у одного игрока счетчик доходит до 30секунд (время на стрик), мы обнуляем переменную, отвечающую за его комбо. А при совершнии нового убийства игроком мы просто обнуляем счетчик его таймера. Так норм?
6
24
5 лет назад
Отредактирован prog
6
TeX13, это один из самых кривых вариантов, но так тоже можно.
Я обычно пользуюсь другим способом:
  • счетчик секунд в одной переменной, без цикла и массива
  • массив lastKill в котором по [номеру игрока] записывается время последнего кила и по [номеру игрока +24] записывается длина серии
  • при киле идет проверка сколько прошло времени с последнего кила, если больше 30, то в длину серии записывается 1, время последнего кила выставляется на текущее значение счетчика
  • если времени прошло меньше 30, то на 1 увеличивается длина серии и время последнего кила выставляется на текущее значение счетчика
  • награда за серию выдается частями, при каждом киле смотрится текущая длина серии и выдается соответствующая часть награды, так чтобы суммарная награда за всю серию достигала того значения которое мне нужно
1
16
5 лет назад
1
prog, у меня в голове была такая последовательность, спасибо за развернутый ответ, сделаю так
Чтобы оставить комментарий, пожалуйста, войдите на сайт.