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
|
--Lol i dunno, spawn some npc's or something
concommand.Add("ws_spawnzomb",function(ply, cmd, args)
SpawnNpcByName("Zombie",ply:GetPos())
end)
concommand.Add("ws_spawnbird",function(ply,cmd,args)
SpawnNpcByName("Bird",ply:GetPos())
end)
concommand.Add("ws_spawnnpc",function(ply,cmd,args)
if(!args[1]) then print("You must enter the name of an npc")
return end
local npc = GetNpcByName(args[1])
if(npc == nil) then print("Not a valid name!")
return end
SpawnNpcByName(args[1],ply:GetPos())
end)
function SpawnNpcByName(name, position)
if(CLIENT) then return end
entdata = GetNpcByName(name)
if not entdata then
print("Could not find npc data for name " .. name)
return
end
ent = ents.Create("ws_npc_ambient")
ent:SetPos(position)
if(entdata.Model) then
ent.Model = entdata.Model
end
if(entdata.Drops) then
ent.Drops = entdata.Drops
end
if(entdata.OnDammage) then
ent.OnDammage = entdata.OnDammage
end
if(entdata.Behave) then
ent.Behave = entdata.Behave
end
if(entdata.Act) then
ent.Act = entdata.Act
end
if(entdata.Stats) then
ent.Stats = entdata.Stats
end
if(entdata.IdleSequences) then
ent.IdleSequences = entdata.IdleSequences
end
if(entdata.Attacks) then
ent.Attacks = entdata.Attacks
end
if(entdata.AttackPriority) then
ent.AttackPriority = entdata.AttackPriority
end
if(entdata.AwareEnemies) then
ent.AwareEnemies = entdata.AwareEnemies
end
ent:Spawn()
end
local random = math.random
local traceline = util.TraceLine
local contents = util.PointContents
local Up = Vector(0,0,1)
--Randomly spawn npc's around?
local ambientnpcs = {
[0] = "Bird",
[1] = "Zombie",
[2] = "Antlion Scout",
[3] = "Antlion Pouncer"
}
local Tick = CurTime()
hook.Add("Tick","SpawnAmbient",function()
if(CLIENT) then return end
if (Tick < CurTime()) then
--Assume most players are about ground level
--Spawn 1 bird for each player on the server
local areas = {}
for k,v in pairs(player.GetAllHumans()) do
for i,area in pairs(ents.FindByClass("info_target")) do
if (area:GetName() == "survival_spawn") then
local parent = area:GetParent()
if (IsValid(parent)) then
areas[area] = parent
end
end
end
--SpawnNpcByName("Bird",v:GetPos() + (v:GetUp()*500))
end
for pAe,pBe in pairs(areas) do
local pA,pB = pAe:GetPos(),pBe:GetPos()
local Dis = pA:Distance(pB)
local V = Vector(random(pB.x,pA.x),random(pB.y,pA.y),random(pB.z,pA.z))
local Tr = traceline({start=V,endpos=V-Up*40000})
local Pos = Tr.HitPos+Up*20
local C = contents(Pos)
if (C != CONTENTS_WATER and C != CONTENTS_WATER+CONTENTS_TRANSLUCENT) then
--print("Appropriate place found, spawning bird)")
local randnpcnum = math.Round(math.Rand(0, #ambientnpcs))
local npc = GetNpcByName(ambientnpcs[randnpcnum])
if(npc:SpawnLocations(Pos)) then
SpawnNpcByName(ambientnpcs[randnpcnum],Pos)
end
break
end
end
Tick = CurTime()+30
end
end)
|