Запуск скрипта Lua после входа/выхода в триггер

.фи

Активный
21 Мар 2018
117
16
Привет всем снова.
Есть одна тян... хотя мы тут не для этого собрались.

Есть у меня первые шаги на пути к созданию своего квест-мода.
Код который я написал/нагло списал включает таймер и ре-спаунит юнитов на указанных точках.

Это прекрасно работает спустя 10 с после запуска триггера и циклично повторяется каждые 100 с.
Lua:
function Spawn1()
local repeat_interval = 100 -- Rerun this timer every *repeat_interval* game-time seconds
local start_after = 10 -- Start this timer *start_after* game-time seconds later
print('[BAREBONES] Script started')

    Timers:CreateTimer(start_after,
        function()
        print('[BAREBONES] TimerReload')
        SpawnCreeps()
        return repeat_interval
    end)
end

Вот только проблема в том, что я хотел бы уничтожать цикл спауна после того как игрок покидает поле триггера.
Потому-что:
Есть баг связанный с многократным входом в триггер.
Он создаёт каждый раз новый таймер и крипы спаунятся всё чаще и чаще.

Я уже слышал что можно таймерам имена выдавать, чтоб потом их убивать.
Но это сложно для меня, покамест.

За примеры буду благодарен!
 

bobi

Активный
24 Июл 2017
99
18
При входе в триггер ты каждый раз вызываешь функцию Spawn1() тем самым запуская новый таймер
ты можешь запустить таймер один раз например на стадии OnGameInProgress() и сделать проверку при срабатывании таймера
что то вроде этого
Lua:
function GameMode:OnGameInProgress()
local repeat_interval = 100 
local start_after = 10
spawn1 = false
Timers:CreateTimer(start_after,
function()
if spawn1 == true then
SpawnCreeps()
end
return repeat_interval
end)
end
при входе в триггер присваиваешь переменной spawn1 значение true
 

.фи

Активный
21 Мар 2018
117
16
Круто.
Вполне понятно.

Но как присвоить новое значение в хаммере?
Это, я так понимаю, Output.

И я так понимаю функции начинающиеся на GameMode: нужно вписывать в addon_game_mode.lua
или их можно вызывать из любого lua-файла?
 
Последнее редактирование:

bobi

Активный
24 Июл 2017
99
18
Круто.
Вполне понятно.

Но как присвоить новое значение в хаммере?
Это, я так понимаю, Output.

И я так понимаю функции начинающиеся на GameMode: нужно вписывать в addon_game_mode.lua
или их можно вызывать из любого lua-файла?
По этому принту я предположил что у тебя уже установлен barebones
Lua:
print('[BAREBONES] Script started')
следовательно у тебя уже есть функция GameMode:OnGameInProgress() в файле gamemode.lua
она вызывается автоматически когда время в игре становится равным 00.00 я просто вписал в нее твой таймер.
Я взял это просто для примера.
Тебе просто нужно вызвать свой таймер один раз и сделать проверку при срабатывании таймера.

я объявил глобальную переменную spawn1 = false (или так _G.spawn1 = false )
и сделал проверку если spawn1 == true тогда вызываем SpawnCreeps()

создаешь где нить новую функцию

Lua:
function MyMegaSpawner()
spawn1 = true
end
и вызываешь ее при входе в триггер
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Lua:
spawn=false -- флаг, переменная, которая означает, стартовал ли таймер или нет.

function Spawn1()
   
    if not spawn then

        local repeat_interval = 100 -- Rerun this timer every *repeat_interval* game-time seconds

        local start_after = 10 -- Start this timer *start_after* game-time seconds later

        local name = "sooqablyat" -- имя таймера
   
        Timers:CreateTimer(name,start_after,

            function()

            print('[BAREBONES] TimerReload')

            SpawnCreeps()

            return repeat_interval

        end)
        spawn = true
    end

end

function removespawn() -- функция должна вызываться по выходу из спавна, подключать нужно в триггере в outputs
    Timers:RemoveTimer("sooqablyat")
end
 

.фи

Активный
21 Мар 2018
117
16
Lua:
spawn=false -- флаг, переменная, которая означает, стартовал ли таймер или нет.

function Spawn1()
 
    if not spawn then

        local repeat_interval = 100 -- Rerun this timer every *repeat_interval* game-time seconds

        local start_after = 10 -- Start this timer *start_after* game-time seconds later

        local name = "sooqablyat" -- имя таймера
 
        Timers:CreateTimer(name,start_after,

            function()

            print('[BAREBONES] TimerReload')

            SpawnCreeps()

            return repeat_interval

        end)
        spawn = true
    end

end

function removespawn() -- функция должна вызываться по выходу из спавна, подключать нужно в триггере в outputs
    Timers:RemoveTimer("sooqablyat")
end

Что-то не так присвоением имени.
Вот что консоль говорит:
... in function 'CreateTimer'
Script Runtime Error: scripts\vscripts\timers.lua:172: attempt to index local 'args' (a number value)
 
Последнее редактирование:

.фи

Активный
21 Мар 2018
117
16
Несколько часов теста, и я напрочь запутался :)

По какой-то неведомой причине, таймер не работает если изначально глобальная переменная имеет значение false.

В случае, когда я меняю переменной значение - таймер не срабатывает.
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Эта ошибка от таймера: неверно задаешь аргументы.
 

.фи

Активный
21 Мар 2018
117
16
Ну я понимаю что он не хочет принимать "sooqablyat" параметр имени.
Даже без кавычек выходит тоже самое.

А есть у кого нормальный пример присваивания значений той или иной переменной через триггер?
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
А, ну соре, вот пример. В файле с таймерами все есть же.
Lua:
Timers:CreateTimer(name, {
    endTime = start_after,
    callback = function()
      SpawnCreeps()
      return repeat_interval
    end
  })
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Как тебе GRIN и написал, в самом скрипте timers.lua есть примеры по работе с функционалом в виде заглавного комментария.
 

.фи

Активный
21 Мар 2018
117
16
Всё верно.
Огромное спасибо, пойду учиться дальше.

И последний вопрос общего характера: На форуме идёт какой-нибудь проект по созданию кастомки?
Хотелось бы, если не по-участвовать, так хоть подсмотреть как делают это мастера :)
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Куча проектов сейчас в разработке ну. Тут у любого автора есть свой проект, который он все еще дорабатывает
 
Реклама: