Решено Ошибка с GameMode

Statham

Пользователь
9 Ноя 2018
29
0
Проект
The story of one knight
Как решить такую проблему и с чем она связана?

Script Runtime Error: ...addons\something\scripts\vscripts\addon_game_mode.lua:36: attempt to index global 'GameMode' (a nil value)
stack traceback:
...addons\something\scripts\vscripts\addon_game_mode.lua:36: in main chunk
Error running script named addon_game_mode
 

NeedWay

Активный
5 Сен 2017
128
9
steamcommunity.com
Проект
MIDDLE HERO WAR
Эта ошибка из-за чего угодно может быть, откати до предыдущей версии кастомку и ищи ошибку пошагово
 

Statham

Пользователь
9 Ноя 2018
29
0
Проект
The story of one knight
Эта ошибка из-за чего угодно может быть, откати до предыдущей версии кастомку и ищи ошибку пошагово
Собсна, сама проблема кроется в этом коде, а поскольку программист из меня на уровне "работает и замечательно", то буду рад, если кто-нибудь подскажет мне, где конкретно нужно копать


Код:
if CAddonTemplateGameMode == nil then
    CAddonTemplateGameMode = class({})  
end

function Precache( context )
    --[[
        Precache things we know we'll 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()
    GameRules.DropTable = LoadKeyValues("scripts/kv/item_drops.kv")
end

-- Begins processing script for the custom game mode.  This "template_example" contains a main OnThink function.
function CAddonTemplateGameMode:InitGameMode()
    print( "The story of one knight loaded." )
end  

    GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_GOODGUYS, 3 )
    GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_BADGUYS, 0 )   

    function GameMode:OnEntityKilled( keys )
    local killedUnit = EntIndexToHScript( keys.entindex_killed )
    if killedUnit:IsCreature() then
        RollDrops(killedUnit)
    end
end

function Activate ()
   ListenToGameEvent('entity_killed', Dynamic_Wrap(GameMode, 'OnEntityKilled'), self)
end
  
function RollDrops(unit)
    local DropInfo = GameRules.DropTable[unit:GetUnitName()]
    if DropInfo then
        for item_name,chance in pairs(DropInfo) do
            if RollPercentage(chance) then
                -- Create the item
                local item = CreateItem(item_name, nil, nil)
                local pos = unit:GetAbsOrigin()
                local drop = CreateItemOnPositionSync( pos, item )
                local pos_launch = pos+RandomVector(RandomFloat(150,200))
                item:LaunchLoot(false, 200, 0.75, pos_launch)
            end
        end
    end
end  

    function CAddonTemplateGameMode:InitGameMode()
    print( "Template addon is loaded." )
    GameRules:GetGameModeEntity():SetThink( "OnThink", self, "GlobalThink", 2 )
end

-- Evaluate the state of the game
function CAddonTemplateGameMode:OnThink()
    if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
        --print( "Template addon script is running." )
    elseif GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then
        return nil
    end
    return 1
end

Помимо [spoiler], используй [code]
 
Последнее редактирование модератором:

Statham

Пользователь
9 Ноя 2018
29
0
Проект
The story of one knight
Тебе в тексте ошибки пишет название файла, строку и причину, куда еще конкретнее?
Да это я уже понял, теперь суть вопроса в том, что нужно добавить глобальный класс, который GameMode, но чет, я посидел, подумал и все, что я писал, связанное с GameMode - выдавало одну и ту же ошибку. Я, конечно, не спорю, что могу делать что-то не так, но все же, как должна выглядеть сама строчка? Или может, было бы ещё лучше, какой-нибудь гайд/руководство по всей этой теме, вот это реально полезно будет.
 
20 Дек 2016
892
170
Тут у тебя проблема с пониманием луа вообще как языка. Не думаю, что ссылки на уроки по луа уместны, так как любая ссылка на первой странице поисковика подходит.
Замени все CAddonTemplateGameMode на GameMode

А еще лучше перенеси строки
Код:
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_GOODGUYS, 3 )
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_BADGUYS, 0 )
в InitGameMode
 
  • Нравится
Реакции: Son1cPr00wer

Statham

Пользователь
9 Ноя 2018
29
0
Проект
The story of one knight
Тут у тебя проблема с пониманием луа вообще как языка. Не думаю, что ссылки на уроки по луа уместны, так как любая ссылка на первой странице поисковика подходит.
Замени все CAddonTemplateGameMode на GameMode

А еще лучше перенеси строки
Код:
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_GOODGUYS, 3 )
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_BADGUYS, 0 )
в InitGameMode
Что же, хоть это и не помогло, но все равно спасибо за помощь) Буду сидеть думать дальше, в чем прикол
 

Statham

Пользователь
9 Ноя 2018
29
0
Проект
The story of one knight
Ну скинь код, который у тебя в итоге получился
Ну, надеюсь я не совсем дурак и все правильно понял :D

if GameMode == nil then
GameMode = class({})
end

function Precache( context )
--[[
Precache things we know we'll 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 = GameMode()
GameRules.AddonTemplate:InitGameMode()
GameRules.DropTable = LoadKeyValues("scripts/kv/item_drops.kv")
end

-- Begins processing script for the custom game mode. This "template_example" contains a main OnThink function.
function GameMode:InitGameMode()
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_GOODGUYS, 3 )
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_BADGUYS, 0 )
print( "The story of one knight loaded." )
end

function GameMode:OnEntityKilled( keys )
local killedUnit = EntIndexToHScript( keys.entindex_killed )
if killedUnit:IsCreature() then
RollDrops(killedUnit)
end
end

function Activate ()
ListenToGameEvent('entity_killed', Dynamic_Wrap(GameMode, 'OnEntityKilled'), self)
end

function RollDrops(unit)
local DropInfo = GameRules.DropTable[unit:GetUnitName()]
if DropInfo then
for item_name,chance in pairs(DropInfo) do
if RollPercentage(chance) then
-- Create the item
local item = CreateItem(item_name, nil, nil)
local pos = unit:GetAbsOrigin()
local drop = CreateItemOnPositionSync( pos, item )
local pos_launch = pos+RandomVector(RandomFloat(150,200))
item:LaunchLoot(false, 200, 0.75, pos_launch)
end
end
end
end

function GameMode:InitGameMode()
print( "Template addon is loaded." )
GameRules:GetGameModeEntity():SetThink( "OnThink", self, "GlobalThink", 2 )
end

-- Evaluate the state of the game
function GameMode:OnThink()
if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
--print( "Template addon script is running." )
elseif GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then
return nil
end
return 1
end
 
20 Дек 2016
892
170
И что, осталась та же ошибка? Ты файл то сохранил? Я сейчас себе это вставил, у меня никаких ошибок нет.

P.S. У тебя Aсtivate 2 раза прописан, выполняться будет только второй из них
 

Statham

Пользователь
9 Ноя 2018
29
0
Проект
The story of one knight
И что, осталась та же ошибка? Ты файл то сохранил? Я сейчас себе это вставил, у меня никаких ошибок нет.

P.S. У тебя Aсtivate 2 раза прописан, выполняться будет только второй из них
Дааа, точно, про Activate я даже не заметил, но с этим уже решил вопрос. И что ты думаешь? Тут вторая ошибочка подъезжает, но она появляется только после того, как убиваешь крипа, вот:

Script Runtime Error: ...addons\thewayoflife\scripts\vscripts\addon_game_mode.lua:38: attempt to index local 'keys' (a nil value)
stack traceback:
...addons\thewayoflife\scripts\vscripts\addon_game_mode.lua:38: in function <...addons\thewayoflife\scripts\vscripts\addon_game_mode.lua:37>

Я так понял, что теперь проблема связана с этими самыми keys, но почему у них нулевое значение, вот чего я понять не могу...
 
20 Дек 2016
892
170
Код в студию!
Кидай код не только под спойлер, но еще и в блок кода. Вот так:
[SPOILER][CODE]
твой код
[/CODE][/SPOILER]
 

Statham

Пользователь
9 Ноя 2018
29
0
Проект
The story of one knight
Код в студию!
Кидай код не только под спойлер, но еще и в блок кода. Вот так:
[SPOILER][CODE]
твой код
[/CODE][/SPOILER]

Да без проблем, вот он код:
Код:
require( "precache" )
require('timers')

if GameMode == nil then
GameMode = class({}) 
end

function Precache( context )
--[[
Precache things we know we'll 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 = GameMode()
GameRules.AddonTemplate:InitGameMode()
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_GOODGUYS, 3 ) 
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_BADGUYS, 0 ) 
GameRules.DropTable = LoadKeyValues("scripts/kv/item_drops.kv")
ListenToGameEvent('entity_killed', Dynamic_Wrap(GameMode, 'OnEntityKilled'), self)
end

-- Begins processing script for the custom game mode. This "template_example" contains a main OnThink function.
function GameMode:InitGameMode()
print( "The story of one knight loaded." )
end 

function GameMode:OnEntityKilled( keys )
local killedUnit = EntIndexToHScript( keys.entindex_killed )
if killedUnit:IsCreature() then
RollDrops(killedUnit)
end
end

function RollDrops(unit)
local DropInfo = GameRules.DropTable[unit:GetUnitName()]
if DropInfo then
for item_name,chance in pairs(DropInfo) do
if RollPercentage(chance) then
-- Create the item
local item = CreateItem(item_name, nil, nil)
local pos = unit:GetAbsOrigin()
local drop = CreateItemOnPositionSync( pos, item )
local pos_launch = pos+RandomVector(RandomFloat(150,200))
item:LaunchLoot(false, 200, 0.75, pos_launch)
end
end
end
end 

function GameMode:InitGameMode()
print( "Template addon is loaded." )
GameRules:GetGameModeEntity():SetThink( "OnThink", self, "GlobalThink", 2 )
end

-- Evaluate the state of the game
function GameMode:OnThink()
if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
--print( "Template addon script is running." )
elseif GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then
return nil
end
return 1
end
 

Statham

Пользователь
9 Ноя 2018
29
0
Проект
The story of one knight
Попробуй ListenToGameEvent('entity_killed', Dynamic_Wrap(GameMode, 'OnEntityKilled'), self) перенести в InitGameMode. И сохранить не забудь.
Хм, в чем-то это даже помогло. Теперь ошибок нет ни при запуске самой кастомки, ни при убийстве крипов. Но если бы все было так хорошо :rolleyes:
С крипов не выпадает дроп. Я посмотрел, дело явно не в kv файле, там все гуд. Видимо, перенос
Код:
ListenToGameEvent('entity_killed', Dynamic_Wrap(GameMode, 'OnEntityKilled'), self)
повлиял на это.
 
20 Дек 2016
892
170
Ты так пишешь, как будто при ошибке дроп падал..
Дальше тебе уже самому придется все это исправлять. Используй print, чтобы смотреть какие участки кода выполняются и какие значения принимают те или иные переменные, и у тебя обязательно получится понять в чем проблема и исправить ее.
 

Statham

Пользователь
9 Ноя 2018
29
0
Проект
The story of one knight
Ты так пишешь, как будто при ошибке дроп падал..
Дальше тебе уже самому придется все это исправлять. Используй print, чтобы смотреть какие участки кода выполняются и какие значения принимают те или иные переменные, и у тебя обязательно получится понять в чем проблема и исправить ее.
Я уже этим занимаюсь, ещё раз спасибо за помощь)
 
Реклама: