aboutsummaryrefslogtreecommitdiff
path: root/gamemode/core/npc/sv_npcsystem.lua
blob: 1abbc6758706efe3bc25c5537222c989203888e6 (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
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