local f = nrequire("concommands.lua") local n = {} local npcs = {} --Master table of npcs local autocompletef 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 function n.CreateNPCByName(npcname, pos) 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 --Creates a shop npc with this tbl 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 npc with this tbl function n.CreateTownie(tbl) local npcent = ents.Create("npc_townie") for k, v in pairs(tbl) do npcent[k] = v end npcent:Spawn() end --Creates a new navigation node for npc's 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 mapfields = {"navnodes", "npcs"} -- "chests", local function loadMap() for k, v in ipairs(mapfields) do local mapname = game.GetMap() local fpath = string.format("artery/maps/%s/%s/*", mapname, v) local files, dirs = file.Find(fpath, "DATA") for i, j in pairs(files) do if string.GetExtensionFromFilename(j) ~= "lua" then continue end local itempath = string.format("artery/maps/%s/%s/%s", mapname, v, j) local itemtxt = file.Read(itempath, "DATA") assert(itemtxt ~= nil, "Found a file, but it looks like it can't be compiled:" .. itempath) CompileString(itemtxt, itempath)() end end end hook.Add("InitPostEntity", "artery_spawnmapnpcs", function() loadMap() end) concommand.Add("artery_reloadmap", function() 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) 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