Ошибка при запуске скрипта

IntelTwix

Пользователь
25 Фев 2018
50
1
Проект
Humans vs Zombie
Ребят, что то разобраться не могу. Менял код, вылезла ошибка. Вернул всё назад а ошибка осталась.
Ошибка:

Код:
[   VScript ]: scripts\vscripts\gamemode.lua:116: attempt to index global 'npc' (a nil value)
[   VScript ]: stack traceback:
[   VScript ]:     scripts\vscripts\libraries\timers.lua:137: in function '__index'
[   VScript ]:     scripts\vscripts\gamemode.lua:116: in function <scripts\vscripts\gamemode.lua:114>
[   VScript ]:     [C]: in function 'xpcall'
[   VScript ]:     scripts\vscripts\libraries\timers.lua:136: in function <scripts\vscripts\libraries\timers.lua:94>
Код:
-- This is the primary barebones gamemode script and should be used to assist in initializing your game mode
BAREBONES_VERSION = "1.00"

-- Set this to true if you want to see a complete debug output of all events/processes done by barebones
-- You can also change the cvar 'barebones_spew' at any time to 1 or 0 for output/no output
BAREBONES_DEBUG_SPEW = false

if GameMode == nil then
    DebugPrint( '[BAREBONES] creating barebones game mode' )
    _G.GameMode = class({})
end

-- This library allow for easily delayed/timed actions
require('libraries/timers')
-- This library can be used for advancted physics/motion/collision of units.  See PhysicsReadme.txt for more information.
require('libraries/physics')
-- This library can be used for advanced 3D projectile systems.
require('libraries/projectiles')
-- This library can be used for sending panorama notifications to the UIs of players/teams/everyone
require('libraries/notifications')
-- This library can be used for starting customized animations on units from lua
require('libraries/animations')
-- This library can be used for performing "Frankenstein" attachments on units
require('libraries/attachments')
-- This library can be used to synchronize client-server data via player/client-specific nettables
require('libraries/playertables')
-- This library can be used to create container inventories or container shops
require('libraries/containers')
-- This library provides a searchable, automatically updating lua API in the tools-mode via "modmaker_api" console command
require('libraries/modmaker')
-- This library provides an automatic graph construction of path_corner entities within the map
require('libraries/pathgraph')
-- This library (by Noya) provides player selection inspection and management from server lua
require('libraries/selection')

-- These internal libraries set up barebones's events and processes.  Feel free to inspect them/change them if you need to.
require('internal/gamemode')
require('internal/events')

-- settings.lua is where you can specify many different properties for your game mode and is one of the core barebones files.
require('settings')
-- events.lua is where you can specify the actions to be taken when any event occurs and is one of the core barebones files.
require('events')


-- This is a detailed example of many of the containers.lua possibilities, but only activates if you use the provided "playground" map
if GetMapName() == "playground" then
  require("examples/playground")
end

--require("examples/worldpanelsExample")

function GameMode:PostLoadPrecache()
  DebugPrint("[BAREBONES] Performing Post-Load precache")
  --PrecacheItemByNameAsync("item_example_item", function(...) end)
  --PrecacheItemByNameAsync("example_ability", function(...) end)

  --PrecacheUnitByNameAsync("npc_dota_hero_viper", function(...) end)
  --PrecacheUnitByNameAsync("npc_dota_hero_enigma", function(...) end)
end

--[[
  This function is called once and only once as soon as the first player (almost certain to be the server in local lobbies) loads in.
  It can be used to initialize state that isn't initializeable in InitGameMode() but needs to be done before everyone loads in.
]]
function GameMode:OnFirstPlayerLoaded()
  DebugPrint("[BAREBONES] First Player has loaded")
end

--[[
  This function is called once and only once after all players have loaded into the game, right as the hero selection time begins.
  It can be used to initialize non-hero player state or adjust the hero selection (i.e. force random etc)
]]
function GameMode:OnAllPlayersLoaded()
  DebugPrint("[BAREBONES] All Players have loaded into the game")
end

--[[
  This function is called once and only once for every player when they spawn into the game for the first time.  It is also called
  if the player's hero is replaced with a new hero for any reason.  This function is useful for initializing heroes, such as adding
  levels, changing the starting gold, removing/adding abilities, adding physics, etc.

  The hero parameter is the hero entity that just spawned in
]]
function GameMode:OnHeroInGame(hero)
  DebugPrint("[BAREBONES] Hero spawned in game for first time -- " .. hero:GetUnitName())
  -- This line for example will set the starting gold of every hero to 500 unreliable gold
  --hero:SetGold(500, false)

  -- These lines will create an item and add it to the player, effectively ensuring they start with the item
  local item = CreateItem("item_example_item", hero, hero)
  hero:AddItem(item)

  --[[ --These lines if uncommented will replace the W ability of any hero that loads into the game
    --with the "example_ability" ability

  local abil = hero:GetAbilityByIndex(1)
  hero:RemoveAbility(abil:GetAbilityName())
  hero:AddAbility("example_ability")]]
end

--[[
  This function is called once and only once when the game completely begins (about 0:00 on the clock).  At this point,
  gold will begin to go up in ticks if configured, creeps will spawn, towers will become damageable etc.  This function
  is useful for starting any game logic timers/thinkers, beginning the first round, etc.
]]
function GameMode:OnGameInProgress()
  DebugPrint("[BAREBONES] The game has officially begun")

  local playerID = 0
  local hero = PlayerResource:GetPlayer(playerID):GetAssignedHero()

  Timers:CreateTimer(3,
    function()
      local unit = CreateUnitByName('npc_unit_zombi', Vector(258.066, 711.922, 273), true, hero, hero, DOTA_TEAM_BADGUYS)
      unit:SetControllableByPlayer(playerID, false)
      return 60
    end)

  Timers:CreateTimer(30, -- Start this timer 30 game-time seconds later
    function()
      DebugPrint("This function is called 30 seconds after the game begins, and every 30 seconds thereafter")
      return 30.0 -- Rerun this timer every 30 game-time seconds
    end)
end



-- This function initializes the game mode and is called before anyone loads into the game
-- It can be used to pre-initialize any values/tables that will be needed later
function GameMode:InitGameMode()
  GameMode = self
  DebugPrint('[BAREBONES] Starting to load Barebones gamemode...')

  -- Commands can be registered for debugging purposes or as functions that can be called by the custom Scaleform UI
  Convars:RegisterCommand( "command_example", Dynamic_Wrap(GameMode, 'ExampleConsoleCommand'), "A console command example", FCVAR_CHEAT )

  DebugPrint('[BAREBONES] Done loading Barebones gamemode!\n\n')
end

-- This is an example console command
function GameMode:ExampleConsoleCommand()
  print( '******* Example Console Command ***************' )
  local cmdPlayer = Convars:GetCommandClient()
  if cmdPlayer then
    local playerID = cmdPlayer:GetPlayerID()
    if playerID ~= nil and playerID ~= -1 then
      -- Do something here for the player who called this command
      PlayerResource:ReplaceHeroWith(playerID, "npc_dota_hero_undying", 1000, 1000)
    end
  end
  print( '*********************************************' )
end
Код:
TIMERS_VERSION = "1.05"

--[[

  -- A timer running every second that starts immediately on the next frame, respects pauses
  Timers:CreateTimer(function()
      print ("Hello. I'm running immediately and then every second thereafter.")
      return 1.0
    end
  )

  -- The same timer as above with a shorthand call
  Timers(function()
    print ("Hello. I'm running immediately and then every second thereafter.")
    return 1.0
  end)


  -- A timer which calls a function with a table context
  Timers:CreateTimer(GameMode.someFunction, GameMode)

  -- A timer running every second that starts 5 seconds in the future, respects pauses
  Timers:CreateTimer(5, function()
      print ("Hello. I'm running 5 seconds after you called me and then every second thereafter.")
      return 1.0
    end
  )

  -- 10 second delayed, run once using gametime (respect pauses)
  Timers:CreateTimer({
    endTime = 10, -- when this timer should first execute, you can omit this if you want it to run first on the next frame
    callback = function()
      print ("Hello. I'm running 10 seconds after when I was started.")
    end
  })

  -- 10 second delayed, run once regardless of pauses
  Timers:CreateTimer({
    useGameTime = false,
    endTime = 10, -- when this timer should first execute, you can omit this if you want it to run first on the next frame
    callback = function()
      print ("Hello. I'm running 10 seconds after I was started even if someone paused the game.")
    end
  })


  -- A timer running every second that starts after 2 minutes regardless of pauses
  Timers:CreateTimer("uniqueTimerString3", {
    useGameTime = false,
    endTime = 120,
    callback = function()
      print ("Hello. I'm running after 2 minutes and then every second thereafter.")
      return 1
    end
  })


  -- A timer using the old style to repeat every second starting 5 seconds ahead
  Timers:CreateTimer("uniqueTimerString3", {
    useOldStyle = true,
    endTime = GameRules:GetGameTime() + 5,
    callback = function()
      print ("Hello. I'm running after 5 seconds and then every second thereafter.")
      return GameRules:GetGameTime() + 1
    end
  })

]]



TIMERS_THINK = 0.01

if Timers == nil then
  print ( '[Timers] creating Timers' )
  Timers = {}
  setmetatable(Timers, {
    __call = function(t, ...)
      return t:CreateTimer(...)
    end
  })
  --Timers.__index = Timers
end

function Timers:start()
  Timers = self
  self.timers = {}

  --local ent = Entities:CreateByClassname("info_target") -- Entities:FindByClassname(nil, 'CWorld')
  local ent = SpawnEntityFromTableSynchronous("info_target", {targetname="timers_lua_thinker"})
  ent:SetThink("Think", self, "timers", TIMERS_THINK)
end

function Timers:Think()
  --if GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then
    --return
  --end

  -- Track game time, since the dt passed in to think is actually wall-clock time not simulation time.
  local now = GameRules:GetGameTime()

  -- Process timers
  for k,v in pairs(Timers.timers) do
    local bUseGameTime = true
    if v.useGameTime ~= nil and v.useGameTime == false then
      bUseGameTime = false
    end
    local bOldStyle = false
    if v.useOldStyle ~= nil and v.useOldStyle == true then
      bOldStyle = true
    end

    local now = GameRules:GetGameTime()
    if not bUseGameTime then
      now = Time()
    end

    if v.endTime == nil then
      v.endTime = now
    end
    -- Check if the timer has finished
    if now >= v.endTime then
      -- Remove from timers list
      Timers.timers[k] = nil

      Timers.runningTimer = k
      Timers.removeSelf = false
  
      -- Run the callback
      local status, nextCall
      if v.context then
        status, nextCall = xpcall(function() return v.callback(v.context, v) end, function (msg)
                                    return msg..'\n'..debug.traceback()..'\n'
                                  end)
      else
        status, nextCall = xpcall(function() return v.callback(v) end, function (msg)
                                    return msg..'\n'..debug.traceback()..'\n'
                                  end)
      end

      Timers.runningTimer = nil

      -- Make sure it worked
      if status then
        -- Check if it needs to loop
        if nextCall and not Timers.removeSelf then
          -- Change its end time

          if bOldStyle then
            v.endTime = v.endTime + nextCall - now
          else
            v.endTime = v.endTime + nextCall
          end

          Timers.timers[k] = v
        end

        -- Update timer data
        --self:UpdateTimerData()
      else
        -- Nope, handle the error
        Timers:HandleEventError('Timer', k, nextCall)
      end
    end
  end

  return TIMERS_THINK
end

function Timers:HandleEventError(name, event, err)
  print(err)

  -- Ensure we have data
  name = tostring(name or 'unknown')
  event = tostring(event or 'unknown')
  err = tostring(err or 'unknown')

  -- Tell everyone there was an error
  --Say(nil, name .. ' threw an error on event '..event, false)
  --Say(nil, err, false)

  -- Prevent loop arounds
  if not self.errorHandled then
    -- Store that we handled an error
    self.errorHandled = true
  end
end

function Timers:CreateTimer(name, args, context)
  if type(name) == "function" then
    if args ~= nil then
      context = args
    end
    args = {callback = name}
    name = DoUniqueString("timer")
  elseif type(name) == "table" then
    args = name
    name = DoUniqueString("timer")
  elseif type(name) == "number" then
    args = {endTime = name, callback = args}
    name = DoUniqueString("timer")
  end
  if not args.callback then
    print("Invalid timer created: "..name)
    return
  end


  local now = GameRules:GetGameTime()
  if args.useGameTime ~= nil and args.useGameTime == false then
    now = Time()
  end

  if args.endTime == nil then
    args.endTime = now
  elseif args.useOldStyle == nil or args.useOldStyle == false then
    args.endTime = now + args.endTime
  end

  args.context = context

  Timers.timers[name] = args

  return name
end

function Timers:RemoveTimer(name)
  Timers.timers[name] = nil
  if Timers.runningTimer == name then
    Timers.removeSelf = true
  end
end

function Timers:RemoveTimers(killAll)
  local timers = {}
  Timers.removeSelf = true

  if not killAll then
    for k,v in pairs(Timers.timers) do
      if v.persist then
        timers[k] = v
      end
    end
  end

  Timers.timers = timers
end

if not Timers.timers then Timers:start() end

GameRules.Timers = Timers
Попытался запринтовать print "unit:SetControllableByPlayer(playerID, true)" в gamemode.
Ошибка исчезла, а юнит так и не заспавнился.
 

IntelTwix

Пользователь
25 Фев 2018
50
1
Проект
Humans vs Zombie
попробуй удалить строчку с ошибкой , что-нибудь изменится ?
Ну да, я же об этом в первом посте говорил . . . Ошибка исчезает, но юнит все равно не спавнится. Я не удалил а запринтовал. Это одно и тоже.
 

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,147
196
www.dotabuff.com
Проект
Roshan defense
Возможно дело в кавычках 'npc_unit_zombi' за мена на "npc_unit_zombi"
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Лять, что у тебя на 116 строке? И переменную 'npc' скинь. Я не буду весь гейммод шарить и считать строки. К слову кавычки могут быть любыми.
 

IntelTwix

Пользователь
25 Фев 2018
50
1
Проект
Humans vs Zombie
unit:SetControllableByPlayer(playerID, true) (116 строка)
 

IntelTwix

Пользователь
25 Фев 2018
50
1
Проект
Humans vs Zombie
Лять, что у тебя на 116 строке? И переменную 'npc' скинь. Я не буду весь гейммод шарить и считать строки. К слову кавычки могут быть любыми.
unit:SetControllableByPlayer(playerID, true) (116 строка)

Код:
function GameMode:OnGameInProgress()
  DebugPrint("[BAREBONES] The game has officially begun")

  local playerID = 0
  local hero = PlayerResource:GetPlayer(playerID):GetAssignedHero()
  Timers:CreateTimer(2,
    function()
      local unit = CreateUnitByName("npc_unit_zombi", Vector(258.066, 711.922, 273), true, nil, nil, DOTA_TEAM_BADGUYS)
      unit:SetControllableByPlayer(playerID, true)
      return 60
    end)
 
  Timers:CreateTimer(30, -- Start this timer 30 game-time seconds later
    function()
      DebugPrint("This function is called 30 seconds after the game begins, and every 30 seconds thereafter")
      return 30.0 -- Rerun this timer every 30 game-time seconds
    end)
end
 
Последнее редактирование:

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
unit:SetControllableByPlayer(playerID, true) (116 строка)

Код:
function GameMode:OnGameInProgress()
  DebugPrint("[BAREBONES] The game has officially begun")

  local playerID = 0
  local hero = PlayerResource:GetPlayer(playerID):GetAssignedHero()
  Timers:CreateTimer(2,
    function()
      local unit = CreateUnitByName("npc_unit_zombi", Vector(258.066, 711.922, 273), true, nil, nil, DOTA_TEAM_BADGUYS)
      unit:SetControllableByPlayer(playerID, true)
      return 60
    end)

  Timers:CreateTimer(30, -- Start this timer 30 game-time seconds later
    function()
      DebugPrint("This function is called 30 seconds after the game begins, and every 30 seconds thereafter")
      return 30.0 -- Rerun this timer every 30 game-time seconds
    end)
end
Ты где то и что то не то смотришь. Он тебе жалуется, что не может переменную npc вызвать, так как её нет. А здесь в коде у тебя нет npc
 

IntelTwix

Пользователь
25 Фев 2018
50
1
Проект
Humans vs Zombie
Ты где то и что то не то смотришь. Он тебе жалуется, что не может переменную npc вызвать, так как её нет. А здесь в коде у тебя нет npc
Так как я обращаюсь к переменной unit. А переменная unit у меня есть.
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Я могу посоветовать только одно - сначала изучи инструмент, потом его применяй.
 

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,147
196
www.dotabuff.com
Проект
Roshan defense
Целый консилиум собрался для решения проблемы )
 

IntelTwix

Пользователь
25 Фев 2018
50
1
Проект
Humans vs Zombie
Консилиум собрался а проблема так и осталась. Завтра выходной. Береберу весь код заного и пойму в чём проблема)
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Херню ты просто какую то замутил. Я сказал что это за ошибка, тут никакой unit не причем.
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Консоль то на npc ругается, а вот строчку указывает как раз ту, что он говорит: SetControllableByPlayer. Поэтому нифига не понятно. Нужно скинуть всю консоль, быть может, парень что-то неверно понял и кидает левую инфую.


Ну а так вообще попробуй создать дефолтного юнита. Если итак проблемы будут, создай его без таймера. Покумекай там над этим участком кода. Попробуй в другом подобном месте повторить алгоритм. Ищи причину ошибки.
 

EYEOFLIE

Активный
28 Янв 2018
137
4
Если честно, когда прочёл твоё сообщение тоже подумал что вот оно! Но нет, всё так же. Изменений нет. Всё та же ошибка.
Если код вернул на место, дефолтный barebones, верни дефолт timers и возможно у тебя просто нету ЮНИТА в npc_custom_units.
 
Реклама: