CustomGames.ru - Dota 2 пользовательские игры

CAddonTemplateGameMode:Name(?)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн EnDronist

  • 222
  • Мощь: 1
  • Перфекционист-максималист
CAddonTemplateGameMode:Name(?)
« : 13-01-2017, 07:22:27 »
Не могу найти проблему:
addon_game_mode.lua
Код
-- Generated from template
require("timers")
if CAddonTemplateGameMode == nil then
CAddonTemplateGameMode = class({})
end
function Precache( context )
--[[
Precache things we know we will use.  Possible file types include (but not limited to):
PrecacheResource( "model", "*.vmdl", context )
PrecacheResource( "soundfile", "*.vsndevts", context )
PrecacheResource( "particle", "*.vpcf", context )
PrecacheResource( "particle_folder", "particles/folder", context )
]]
end
-- Create the game mode when we activate
function Activate()
GameRules.AddonTemplate = CAddonTemplateGameMode()
GameRules.AddonTemplate:InitGameMode()
ListenToGameEvent("game_init", Dynamic_Wrap(CAddonTemplateGameMode, 'ApplyGamemode'), nil)
ListenToGameEvent("dota_player_gained_level", Dynamic_Wrap(CAddonTemplateGameMode, 'Level6Message'), nil)
end
function CAddonTemplateGameMode:InitGameMode()
print( "Template addon is loaded." )
_G.gamemode_done = false
--OnCustomGamemodeChanged(1, 1)
GameRules:GetGameModeEntity():SetThink( "OnThink", self, "GlobalThink", 2 )
CustomGameEventManager:RegisterListener("custom_gamemode", OnCustomGamemodeChanged )
end
-- Evaluate the state of the game
function CAddonTemplateGameMode:OnThink()
if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
if _G.gamemode_done == false then
CAddonTemplateGameMode:ApplyGamemode()
end
elseif GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then
return nil
end
return 1
end
function OnCustomGamemodeChanged(eventSourceIndex, args)
print( "My event: ( ", eventSourceIndex, ", ", args['gamemode'], " )" )
if args['gamemode'] == "1" then
_G.custom_gamemode = 1
elseif args['gamemode'] == "2" then
_G.custom_gamemode = 2
elseif args['gamemode'] == "3" then
_G.custom_gamemode = 3
end
end
function CAddonTemplateGameMode:ApplyGamemode()
if _G.custom_gamemode == 1 then
_G.gamemode_done = true
elseif _G.custom_gamemode == 2 then
_G.gamemode_done = true
elseif _G.custom_gamemode == 3 then
_G.gamemode_done = true
else
print("kek")
end
end
function CAddonTemplateGameMode:Level6Message(eventInfo)
     if eventInfo.level == 6 then
         Say(nil, "Someone just reached level 6", false)
     end
end
Код
[ W VScript ]: Script Runtime Error: ...e\dota_addons\test1\scripts\vscripts\addon_game_mode.lua:63: attempt to index local 'eventInfo' (a nil value)
[ W VScript ]: stack traceback:
[ W VScript ]: ...e\dota_addons\test1\scripts\vscripts\addon_game_mode.lua:63: in function <...e\dota_addons\test1\scripts\vscripts\addon_game_mode.lua:62>
OnCustomGamemodeChanged работает
« Последнее редактирование: 13-01-2017, 12:38:55 от EnDronist »
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]

Оффлайн CryDeS

  • Друзья CG
  • 1211
  • Мощь: 12
Re: CAddonTemplateGameMode:Name(?)
« Ответ #1 : 13-01-2017, 11:00:08 »
Тебе же игра тыкнула что у тебя ошибка в 63 строке.
Код
function CAddonTemplateGameMode:Level6Message(eventInfo)
     if eventInfo.level == 6 then
         Say(nil, "Someone just reached level 6", false)
     end
end
Получаемый аргумент(eventInfo) является nil'ом.

Оффлайн Илья

  • Супермодератор
  • 2080
  • Мощь: 20
Re: CAddonTemplateGameMode:Name(?)
« Ответ #2 : 13-01-2017, 11:20:59 »
Странно, почему сама таблица данных нулевая?
Может там нет именно level?

Я похожую механику реализовывал, но вот так:

Код
function dungeon:OnPlayerGainedLevel(data)
local hero = PlayerResource:GetSelectedHeroEntity(data.player-1)
local level = hero:GetLevel()
if  level == 3 or level == 5 or level == 7  then
...

Оффлайн Илья

  • Супермодератор
  • 2080
  • Мощь: 20
Re: CAddonTemplateGameMode:Name(?)
« Ответ #3 : 13-01-2017, 11:22:58 »
А почему ты источником nil передаешь?

Код
ListenToGameEvent("dota_player_gained_level", Dynamic_Wrap(CAddonTemplateGameMode, 'Level6Message'), nil)

Из-за этого никаких данных и нет.

Оффлайн EnDronist

  • 222
  • Мощь: 1
  • Перфекционист-максималист
Re: CAddonTemplateGameMode:Name(?)
« Ответ #4 : 13-01-2017, 12:25:11 »
Тебе же игра тыкнула что у тебя ошибка в 63 строке.
Код
function CAddonTemplateGameMode:Level6Message(eventInfo)
     if eventInfo.level == 6 then
         Say(nil, "Someone just reached level 6", false)
     end
end
Получаемый аргумент(eventInfo) является nil'ом.
Он итак работал с нилом, а сейчас ничего не передаёт. ListenToGameEvent("dota_player_gained_level", Dynamic_Wrap(CAddonTemplateGameMode, 'Level6Message'), self ) Тоже не работает
« Последнее редактирование: 13-01-2017, 12:28:31 от EnDronist »
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]

Оффлайн CryDeS

  • Друзья CG
  • 1211
  • Мощь: 12
Re: CAddonTemplateGameMode:Name(?)
« Ответ #5 : 13-01-2017, 13:48:01 »
Он итак работал с нилом, а сейчас ничего не передаёт. ListenToGameEvent("dota_player_gained_level", Dynamic_Wrap(CAddonTemplateGameMode, 'Level6Message'), self ) Тоже не работает
Если ты пытаешься индексировать nil то ты получишь краш, что закономерно.

Оффлайн EnDronist

  • 222
  • Мощь: 1
  • Перфекционист-максималист
Re: CAddonTemplateGameMode:Name(?)
« Ответ #6 : 13-01-2017, 14:06:36 »
Если ты пытаешься индексировать nil то ты получишь краш, что закономерно.
Так в чём проблема то? В том, что при
Код
ListenToGameEvent("dota_player_gained_level", Dynamic_Wrap(CAddonTemplateGameMode, 'Level6Message'), self)
и
Код
function CAddonTemplateGameMode:Level6Message(keys)
не работает, а при
Код
ListenToGameEvent("dota_player_gained_level", Level6Message, nil)
и
Код
function Level6Message(keys)
работает?
« Последнее редактирование: 13-01-2017, 14:29:11 от EnDronist »
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]

Онлайн ZLOY

  • Супермодератор
  • 432
  • Мощь: 5
Re: CAddonTemplateGameMode:Name(?)
« Ответ #7 : 13-01-2017, 14:15:34 »
Местные советчики даже не удосужились посмотреть зачем нужен третий аргумент в функции ListenToGameEvent

Онлайн ZLOY

  • Супермодератор
  • 432
  • Мощь: 5
Re: CAddonTemplateGameMode:Name(?)
« Ответ #8 : 13-01-2017, 14:25:40 »
В функции Activate self == nil, вот у тебя и сломано все

Оффлайн EnDronist

  • 222
  • Мощь: 1
  • Перфекционист-максималист
Re: CAddonTemplateGameMode:Name(?)
« Ответ #9 : 13-01-2017, 14:34:05 »
В функции Activate self == nil, вот у тебя и сломано все
C таким же успехом могу написать, что там и keys == nil, а вот куда (или в какую переменную) тогда инфа передаётся при вызове функции Level6Message, свойственная только для этого ивента?
« Последнее редактирование: 13-01-2017, 14:36:02 от EnDronist »
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]

Онлайн ZLOY

  • Супермодератор
  • 432
  • Мощь: 5
Re: CAddonTemplateGameMode:Name(?)
« Ответ #10 : 13-01-2017, 14:51:58 »
Тут самое интересное и происходит
Твоя функция Level6Message должна принимать 2 аргумента - объект в контексте которого она вызывается(self) и данные ивента.
В ListenToGameEvent третий аргумент обозначает что будет передано в качестве этого самого self.
Если этот аргумент nil - то вызов происходит как-то так(с учетом что я пишу на Lua, а не на С++)
Код: (Вызов твоей функции где-то в глубинах движка)
Level6Message(eventData)
Но твоя функция Level6Message это метод.
И первый аргумент стает self. Второй аргумент(eventInfo) закономерно стал nil.
Код: (А вот так все будет работать в данном случае)
function CAddonTemplateGameMode:Level6Message(eventInfo)
     if self.level == 6 then
         Say(nil, "Someone just reached level 6", false)
     end
end

Но лучше сделать вот так

Код
ListenToGameEvent("dota_player_gained_level", Dynamic_Wrap(CAddonTemplateGameMode, 'Level6Message'), CAddonTemplateGameMode)
« Последнее редактирование: 13-01-2017, 14:56:36 от ZLOY »

Оффлайн EnDronist

  • 222
  • Мощь: 1
  • Перфекционист-максималист
Re: CAddonTemplateGameMode:Name(?)
« Ответ #11 : 13-01-2017, 15:50:22 »
ZLOY, Не вызывается

Код
function Activate()
   GameRules.AddonTemplate = CAddonTemplateGameMode()
   GameRules.AddonTemplate:InitGameMode()
   ListenToGameEvent("game_init", Dynamic_Wrap(CAddonTemplateGameMode, 'ApplyGamemode'), nil)
   ListenToGameEvent("dota_player_gained_level", Dynamic_Wrap(CAddonTemplateGameMode, 'Level6Message'), CAddonTemplateGameMode)
end
Код
function CAddonTemplateGameMode:Level6Message(eventInfo)
     if self.level == 6 then
         Say(nil, "Someone just reached level 6", false)
     end
end
« Последнее редактирование: 13-01-2017, 15:52:58 от EnDronist »
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]

Онлайн ZLOY

  • Супермодератор
  • 432
  • Мощь: 5
Re: CAddonTemplateGameMode:Name(?)
« Ответ #12 : 13-01-2017, 16:07:32 »
Код
function Activate()
   GameRules.AddonTemplate = CAddonTemplateGameMode()
   GameRules.AddonTemplate:InitGameMode()
   ListenToGameEvent("game_init", Dynamic_Wrap(CAddonTemplateGameMode, 'ApplyGamemode'), nil)
   ListenToGameEvent("dota_player_gained_level", Dynamic_Wrap(CAddonTemplateGameMode, 'Level6Message'), CAddonTemplateGameMode)
end

function CAddonTemplateGameMode:Level6Message(eventInfo)
     if eventInfo.level == 6 then
         Say(nil, "Someone just reached level 6", false)
     end
end

Оффлайн EnDronist

  • 222
  • Мощь: 1
  • Перфекционист-максималист
Re: CAddonTemplateGameMode:Name(?)
« Ответ #13 : 13-01-2017, 16:13:46 »
ZLOY,  Спасибо, тут eventInfo и было запрогено или рандомное слово (для удобства)?
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]

Онлайн ZLOY

  • Супермодератор
  • 432
  • Мощь: 5
Re: CAddonTemplateGameMode:Name(?)
« Ответ #14 : 13-01-2017, 16:16:46 »
Рандомное слово