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

  • Автор темы Автор темы Statham
  • Дата начала Дата начала

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
 
Эта ошибка из-за чего угодно может быть, откати до предыдущей версии кастомку и ищи ошибку пошагово
 
Эта ошибка из-за чего угодно может быть, откати до предыдущей версии кастомку и ищи ошибку пошагово
Собсна, сама проблема кроется в этом коде, а поскольку программист из меня на уровне "работает и замечательно", то буду рад, если кто-нибудь подскажет мне, где конкретно нужно копать


Код:
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]
 
Последнее редактирование модератором:
Тебе в тексте ошибки пишет название файла, строку и причину, куда еще конкретнее?
Да это я уже понял, теперь суть вопроса в том, что нужно добавить глобальный класс, который GameMode, но чет, я посидел, подумал и все, что я писал, связанное с GameMode - выдавало одну и ту же ошибку. Я, конечно, не спорю, что могу делать что-то не так, но все же, как должна выглядеть сама строчка? Или может, было бы ещё лучше, какой-нибудь гайд/руководство по всей этой теме, вот это реально полезно будет.
 
Тут у тебя проблема с пониманием луа вообще как языка. Не думаю, что ссылки на уроки по луа уместны, так как любая ссылка на первой странице поисковика подходит.
Замени все CAddonTemplateGameMode на GameMode

А еще лучше перенеси строки
Код:
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_GOODGUYS, 3 )
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_BADGUYS, 0 )
в InitGameMode
 
  • Нравится
Реакции: Son1cPr00wer
Тут у тебя проблема с пониманием луа вообще как языка. Не думаю, что ссылки на уроки по луа уместны, так как любая ссылка на первой странице поисковика подходит.
Замени все CAddonTemplateGameMode на GameMode

А еще лучше перенеси строки
Код:
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_GOODGUYS, 3 )
GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_BADGUYS, 0 )
в InitGameMode
Что же, хоть это и не помогло, но все равно спасибо за помощь) Буду сидеть думать дальше, в чем прикол
 
Ну скинь код, который у тебя в итоге получился
Ну, надеюсь я не совсем дурак и все правильно понял :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
 
И что, осталась та же ошибка? Ты файл то сохранил? Я сейчас себе это вставил, у меня никаких ошибок нет.

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

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, но почему у них нулевое значение, вот чего я понять не могу...
 
Код в студию!
Кидай код не только под спойлер, но еще и в блок кода. Вот так:
[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
 
Попробуй ListenToGameEvent('entity_killed', Dynamic_Wrap(GameMode, 'OnEntityKilled'), self) перенести в InitGameMode. И сохранить не забудь.
Хм, в чем-то это даже помогло. Теперь ошибок нет ни при запуске самой кастомки, ни при убийстве крипов. Но если бы все было так хорошо :rolleyes:
С крипов не выпадает дроп. Я посмотрел, дело явно не в kv файле, там все гуд. Видимо, перенос
Код:
ListenToGameEvent('entity_killed', Dynamic_Wrap(GameMode, 'OnEntityKilled'), self)
повлиял на это.
 
Ты так пишешь, как будто при ошибке дроп падал..
Дальше тебе уже самому придется все это исправлять. Используй print, чтобы смотреть какие участки кода выполняются и какие значения принимают те или иные переменные, и у тебя обязательно получится понять в чем проблема и исправить ее.
 
Ты так пишешь, как будто при ошибке дроп падал..
Дальше тебе уже самому придется все это исправлять. Используй print, чтобы смотреть какие участки кода выполняются и какие значения принимают те или иные переменные, и у тебя обязательно получится понять в чем проблема и исправить ее.
Я уже этим занимаюсь, ещё раз спасибо за помощь)
 
Реклама: