diff options
Diffstat (limited to 'gamemode/core/npc/sh_npcsystem.lua')
| -rw-r--r-- | gamemode/core/npc/sh_npcsystem.lua | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/gamemode/core/npc/sh_npcsystem.lua b/gamemode/core/npc/sh_npcsystem.lua new file mode 100644 index 0000000..501f21c --- /dev/null +++ b/gamemode/core/npc/sh_npcsystem.lua @@ -0,0 +1,160 @@ +---Various functions for npcs. +-- Helps you spawn monsters, townies, and shopkeepers +--@server sv_npcsystem.lua +--@alias n + +local f = nrequire("concommands.lua") +local log = nrequire("log.lua") +local n = {} +local npcs = {} --Master table of npcs +local autocompletef + +---Registers an NPC. +-- Adds an npc to the global table. NPC's should have unique .Name fields, if they don't, this function will error. +--@see npctbl +--@tparam table npc The npc's table. +function n.RegisterNPC(npc) + assert(npc ~= nil, "Attempted to register a nil npc") + assert(type(npc) == "table", "Attempted to regsiter an npc that was not a table, it was a " .. type(npc)) + assert(npc.Name ~= nil, "Attempted to register an npc without a name") + npcs[npc.Name] = npc + autocompletef = f.AutocompleteFunction(npcs) +end + +function n.GetNPC(name) + assert(npcs[name] ~= nil, "Tried to get npc without name") + return npcs[name] +end + +--Ents to remove when refreshing the npc map +local removeents = {"art_npc", "info_townienode", "npc_shop"} + +if SERVER then + ---Creates an NPC. + -- Creates an npc, by name + --@tparam string npcname The npc's name + --@tparam vector3 pos The position to spawn the npc + function n.CreateNPCByName(npcname, pos) + assert(npcs[npcname],string.format("No npc named %q, valid names are:\n%s",npcname,table.concat(table.GetKeys(npcs),"\n"))) + --print("Createing a ", npcname, " at ", pos) + local npctbl = npcs[npcname] + local npc = ents.Create("npc_huntable") + npc:SetPos(pos) + + for k, v in pairs(npctbl) do + npc[k] = v + end + + npc:Spawn() + + return npc + end + + ---Creats a shop npc. + -- Creates a shop npc from a shop npc table + --@see shopnpctbl + --@tparam table npc The shop npc's table. + function n.CreateShop(npc) + --print("Createing shop npc") + local npcent = ents.Create("art_npc") + local shopkeep = n.GetNPC("Shopkeep") + setmetatable(npc,{__index = function(self,key) + return shopkeep[key] or npcent[key] + end}) + npc:Spawn() + --print("Called spawn") + end + + ---Creates a townie. + -- Creates a new townie that wanders around his areas of intrest + --@see townienpctbl + --@tparam table npc The townie npc's table. + function n.CreateTownie(tbl) + local npcent = ents.Create("art_npc") + local townie = n.GetNPC("Townie") + setmetatable(tbl,{__index = function(self,key) + return townie[key] or npcent[key] + end}) + tbl:Spawn() + end + + ---Create an area of intrest. + -- Creates an point that you can use in a townie's locations of intrest. + --@see navnodetbl + --@tparam table tbl The table for the nav node + function n.CreateNavNode(tbl) + local nodeent = ents.Create("info_townienode") + assert(tbl ~= nil, "Tried to create a nil navnode") + for k, v in pairs(tbl) do + nodeent[k] = v + end + nodeent:Spawn() + end + + for k, v in pairs(removeents) do + local eot = ents.FindByClass(v) + for i, j in pairs(eot) do + j:Remove() + end + end +end + +local function ExecuteOnFolder(dir, recursive, func) + local path = "" + local fpath = table.concat({path,dir,"/*"}) + local files, directories = file.Find(fpath,"DATA") + for k,v in pairs(files) do + local callpath = table.concat({path,dir,"/",v}) + func(callpath) + end + if not recursive then return end + for k,v in pairs(directories) do + local npath = table.concat({dir,"/",v}) + ExecuteOnFolder(npath,true,func) + end +end + +local function loadMap() + local mapname = game.GetMap() + + local foldername = "artery/maps/" .. mapname + ExecuteOnFolder(foldername,true,function(path) + print("I want to run",path) + local filetxt = file.Read(path,"DATA") + --print("File text is", filetxt) + CompileString(filetxt,path)() + --print("I want to execute",path) + end) +end + +hook.Add("InitPostEntity", "artery_spawnmapnpcs", function() + loadMap() +end) + +---Reloads the entities on the map. +-- Removes and then reload all of the entities on the level +--@concommand artery_reloadmap +concommand.Add("artery_reloadmap", function(ply,cmd,args) + if not ply:IsAdmin() then return end + for k, v in pairs(removeents) do + local eot = ents.FindByClass(v) + + for i, j in pairs(eot) do + j:Remove() + end + end + + loadMap() +end) + +---Create a new npc. +-- Creates a new npc a the point the player is looking +--@usage artery_makenpc <npc_name> +--@concommand artery_makenpc +concommand.Add("artery_makenpc", function(ply, cmd, args) + if not ply:IsAdmin() then return end + local na = args[1] + n.CreateNPCByName(na, ply:GetEyeTrace().HitPos) +end, autocompletef) + +return n |
