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
|