- 25 Фев 2018
- 50
- 1
- Проект
- Humans vs Zombie
Ребят, что то разобраться не могу. Менял код, вылезла ошибка. Вернул всё назад а ошибка осталась.
Ошибка:
Попытался запринтовать print "unit:SetControllableByPlayer(playerID, true)" в gamemode.
Ошибка исчезла, а юнит так и не заспавнился.
Ошибка:
Код:
[ 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
Ошибка исчезла, а юнит так и не заспавнился.