Потому что это пустышка, пример без настоящего события.
Тебе надо отловить событие "смены состояния", например так:
Код:
ListenToGameEvent('game_rules_state_change', Dynamic_Wrap(GameMode, 'OnGameRulesStateChange'), self)
Где первый параметр - это событие (game_rules_state_change - игра сменила стадию).
Второй параметр - это ссылка на функцию (Здесь конечная функция называется GameMode:OnGameRulesStateChange())
Третий параметр - какой-то там экземпляр класса, что составляет костяк. Здесь вроде GameMode. Я в подробности не вдавался.
Далее реализуешь указанную функцию, в которой отлавливаешь уже конкретные стадии, например так:
Код:
function GameMode:OnGameRulesStateChange()
local newState = GameRules:State_Get()
if newState == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
GameMode:OnGameInProgress()
end
end
Этот код запустит функцию GameMode:OnGameInProgress() в момент, когда игра перейдет в стадию DOTA_GAMERULES_STATE_GAME_IN_PROGRESS, то есть пойдет время с нуля. Её по такому же принципу реализуешь. Где лежать она будет - не важно, важно чтобы ты подключил скрипт с ней к главному (где ты листенер указывал) и чтобы эта функция была единственной в своем роде, иначе компилятор может в её дубликат полезть, а на эту начхать. Ну и еще я не уверен, что не надо взаимно подключать к скрипту с ней тот, в котором у тебя объявлен класс GameMode, чтобы в последнем функция вообще читалась. Можешь просто сделать так:
Код:
function GameMode:OnGameRulesStateChange()
local newState = GameRules:State_Get()
if newState == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
OnGameInProgress()
end
end
И реализовать в скрипте OnGameInProgress(), а затем его подключить в скрипт со слушателем. Тогда точно не должно быть ошибок.
Смотри примеры на гитхабе, вроде умеешь шевелить мозгами.