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
|