diff options
Diffstat (limited to 'gamemode/core/npc')
| -rw-r--r-- | gamemode/core/npc/sh_common.lua | 7 | ||||
| -rw-r--r-- | gamemode/core/npc/sh_npcsystem.lua | 160 | ||||
| -rw-r--r-- | gamemode/core/npc/sv_common.lua | 38 | ||||
| -rw-r--r-- | gamemode/core/npc/sv_npcsystem.lua | 150 |
4 files changed, 167 insertions, 188 deletions
diff --git a/gamemode/core/npc/sh_common.lua b/gamemode/core/npc/sh_common.lua new file mode 100644 index 0000000..cd72a61 --- /dev/null +++ b/gamemode/core/npc/sh_common.lua @@ -0,0 +1,7 @@ +--[[ + Some common functions that a lot of npcs use, take out here to make fixing bugs easier. +]] +do return end +local com = {} + +return com 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 diff --git a/gamemode/core/npc/sv_common.lua b/gamemode/core/npc/sv_common.lua deleted file mode 100644 index e37a5f8..0000000 --- a/gamemode/core/npc/sv_common.lua +++ /dev/null @@ -1,38 +0,0 @@ ---[[ - Some common functions that a lot of npcs use, take out here to make fixing bugs easier. -]] - -local com = {} - -com.pausefor10sec = function(npc) - npc.StartActionTime = CurTime() + 10 - npc:SetSequence(npc:LookupSequence("idle")) - npc.loco:FaceTowards(Vector(-343, 148, 565)) - local oyaw,oacc = npc.loco:GetMaxYawRate(), npc.loco:GetAcceleration() - timer.Simple(0,function() - npc.loco:SetMaxYawRate(0) - npc.loco:SetAcceleration(0) - npc.loco:SetVelocity(Vector(0,0,0)) - end) - timer.Simple(10, function() - npc.loco:SetMaxYawRate(oyaw) - npc.loco:SetAcceleration(oacc) - end) -end - -com.is10secdone = function(npc) - return npc.StartActionTime < CurTime() -end - -com.Rumors = { - "This is a rumor!", - "Here is another!", - "And yet another!", -} - -com.GetRumor = function() - local rng = math.random(#com.Rumors) - return com.Rumors[rng] -end - -return com diff --git a/gamemode/core/npc/sv_npcsystem.lua b/gamemode/core/npc/sv_npcsystem.lua deleted file mode 100644 index eb149f2..0000000 --- a/gamemode/core/npc/sv_npcsystem.lua +++ /dev/null @@ -1,150 +0,0 @@ ----Various functions for npcs. --- Helps you spawn monsters, townies, and shopkeepers ---@server sv_npcsystem.lua ---@alias n - -local f = nrequire("concommands.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(npc.Name ~= nil, "Attempted to register an npc without a name") - npcs[npc.Name] = npc - autocompletef = f.AutocompleteFunction(npcs) -end - ----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("npc_shop") - for k,v in pairs(npc) do - npcent[k] = v - end - npcent: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("npc_townie") - for k, v in pairs(tbl) do - npcent[k] = v - end - npcent: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 - ---Ents to remove when refreshing the npc map -local removeents = {"npc_townie", "info_townienode", "npc_shop"} - --- "art_chest", -for k, v in pairs(removeents) do - local eot = ents.FindByClass(v) - for i, j in pairs(eot) do - j:Remove() - 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 |
