summaryrefslogtreecommitdiff
path: root/lua/autorun/sv_npc.lua
blob: 2d7322d7dc7fef881133b7134c91bf4b07291f03 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
if CLIENT then return end
include("town.lua")
local f = nrequire("concommands.lua")
local npcs = {} --Master table of npcs
local autocompletef

function 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 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

--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 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)

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