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
|
local NPC = {}
NPC.Name = "Rat"
NPC.Desc = "A nasty little guy"
NPC.Class = "Ambient" --Ambient, Agressive, Boss
NPC.Model = "models/headcrab.mdl"
NPC.Stats = {
["Vitality"] = 10,
["Speed"] = 400,
["AwareDist"] = 1000,
["Accel"] = 100,
["Decel"] = 200,
["Step"] = 20, --Step height
["Hull"] = HULL_TINY
}
--Some npc's like birds have diffent names for their idle sequences
NPC.IdleSequences = {
[0] = "lookaround",
[1] = "Idle01",
}
--Drops should be formated as [index]={["item name"], percent_drop} where percent_drop is a number from 0 to 100
NPC.Drops = {
[0] = {"Meat",100},--Rats will drop at least 1 meat, and have a 50% chance of dropping 2
[1] = {"Meat",50},
}
--Attacks should be formated as [i]={function attackpriority() = function doattack()}
local checkrun = function(self,ply)
--If we're aware of any enemies, run away!
return 1
end
local runseq
local dorun = function(self,ply)
if runseq == nil then
runseq = self:LookupSequence("Run1")
end
self:StartActivity(ACT_FLY)
self:SetSequence( runseq )
if(not ply or not ply:IsValid()) then return end
--Find a position in roughly the oposite direction of the player
local tpos = self:GetPos()
local ppos = ply:GetPos()
local direction = Vector(tpos.x - ppos.x, tpos.y - ppos.y, tpos.z - ppos.z)
direction:Normalize()
local addition = direction * 1000
local topos = self:GetPos() + addition
print("I want to go to ", topos)
self.TargetPos = topos
end
NPC.Attacks = {
[1] = {--run away from the player
[checkrun] = dorun
},
}
--A function that takes a position and returns true if this is an acceptable place to spawn
function NPC:SpawnLocations(pos)
return true
end
--The entity that is this npc's current target, if it has one. Nil otherwise
NPC.Target = nil
--All enemies that this NPC is aware of
NPC.AwareEnemies = {}
--Attack priority is a fucntion that takes a player, and returns an int describing it's prority to attack (higher = more important) NPC will always attack the player with the highest priority
function NPC:AttackPriority(ply)
if not ply then return 0 end
local plypos = ply:GetPos()
local mypos = self:GetPos()
if not plypos then return 0 end
local dist = plypos:Distance(mypos)
return self.Stats["AwareDist"] - dist
end
--What to replace the ENT:RunBehaviour with
function NPC:Act(deltat)
end
--What to replace ENT:OnStuck with
function NPC:Stuck()
end
--These are just here to tell the editors/develoeprs what functions are available.. dont un-comment them out, as this could affect all the items.
/*
function NPC:OnSpawn()
end
--If we need to do more than just reduce health on dammage
function NPC:OnDammage(ammount)
end
--If we need to do more than just drop items on death
function NPC:OnDeath()
end
--A particular spell was cast on this npc by player
function NPC:OnSpell(spell, player)
end
function NPC:OnFindEnemy(enemy)
end
--Called when the npc is attacking anything with any attack
function NPC:OnAttack(target)
end
*/
ART.RegisterNPC(NPC)
|