aboutsummaryrefslogtreecommitdiff
path: root/gamemode/npcsystem/sv_rat.lua
blob: fadbc8d93dda7cdb6969ad7ecfd817adcca1e5e7 (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
111
112
113
114
local n = nrequire("sv_npcsystem.lua")
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] = {"Rat Meat",100},--Rats will drop at least 1 meat, and have a 50% chance of dropping 2
    [1] = {"Rat 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
*/

n.RegisterNPC(NPC)