CAddonTemplateGameMode:Name(?)

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
Не могу найти проблему:
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 работает
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
Тебе же игра тыкнула что у тебя ошибка в 63 строке.
Код:
function CAddonTemplateGameMode:Level6Message(eventInfo)
   if eventInfo.level == 6 then
     Say(nil, "Someone just reached level 6", false)
   end
end
Получаемый аргумент(eventInfo) является nil'ом.
 
Последнее редактирование модератором:

Илья

Друзья CG
25 Сен 2015
2,348
41
Странно, почему сама таблица данных нулевая?
Может там нет именно 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
...
 

Илья

Друзья CG
25 Сен 2015
2,348
41
А почему ты источником nil передаешь?

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

Из-за этого никаких данных и нет.
 
Последнее редактирование модератором:

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
[quote author=CryDeS link=topic=1240.msg7438#msg7438 date=1484305208]
Тебе же игра тыкнула что у тебя ошибка в 63 строке.
Код:
function CAddonTemplateGameMode:Level6Message(eventInfo)
   if eventInfo.level == 6 then
     Say(nil, "Someone just reached level 6", false)
   end
end
Получаемый аргумент(eventInfo) является nil'ом.
[/quote]
Он итак работал с нилом, а сейчас ничего не передаёт. ListenToGameEvent("dota_player_gained_level", Dynamic_Wrap(CAddonTemplateGameMode, 'Level6Message'), self ) Тоже не работает
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=EnDronist link=topic=1240.msg7443#msg7443 date=1484310311]
Он итак работал с нилом, а сейчас ничего не передаёт. ListenToGameEvent("dota_player_gained_level", Dynamic_Wrap(CAddonTemplateGameMode, 'Level6Message'), self ) Тоже не работает
[/quote]
Если ты пытаешься индексировать nil то ты получишь краш, что закономерно.
 
Последнее редактирование модератором:

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
Если ты пытаешься индексировать 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)
работает?
198b88d25448413baa00108f7b7fda7c.png
 
Последнее редактирование модератором:

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Местные советчики даже не удосужились посмотреть зачем нужен третий аргумент в функции ListenToGameEvent
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
В функции Activate self == nil, вот у тебя и сломано все
 

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
В функции Activate self == nil, вот у тебя и сломано все
C таким же успехом могу написать, что там и keys == nil, а вот куда (или в какую переменную) тогда инфа передаётся при вызове функции Level6Message, свойственная только для этого ивента?
 
Последнее редактирование модератором:

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Тут самое интересное и происходит
Твоя функция 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)
 
Последнее редактирование модератором:

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
ZLOY, Не вызывается
a56396cb07d34077b298fbd1311a16f9.png

Код:
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
 
Последнее редактирование модератором:

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Код:
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

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
ZLOY, Спасибо, тут eventInfo и было запрогено или рандомное слово (для удобства)?
f23cfa4b78bc43389463fa7be9e340ed.png
 
Реклама: