aboutsummaryrefslogtreecommitdiff
path: root/gamemode/npcsystem/npcs/bird.lua
blob: d09f1ef9e41f45560357e8b2955d14f64dc79739 (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
115
116
117
118
119
120
121
122
123
124
NPC.Name 			= "Bird"
NPC.Desc 			= "A flappy little guy"
NPC.Class 			= "Ambient" --Ambient, Agressive, Boss
NPC.Model			= "models/pigeon.mdl"
NPC.Icon			= Material("wintersurvival2/hud/ws1_icons/icon_rock")

NPC.Social          = "Pack" --Solo, Pack

NPC.Vitality        = 10
NPC.Speed           = 100
--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},--Birds will drop at least 1 meat, and have a 50% chance of dropping 2
    [1] = {"Meat",50},
    [2] = {"Feather",50},
}

--Attacks should be formated as [i]={function attackpriority() = function doattack()}
NPC.Attacks         = nil

--A function that takes a position and returns true if this is an acceptable place to spawn
NPC.SpawnLocations  = nil

--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    = nil

--What to replace the ENT:BehaveAct with
function NPC:Act()
end

--What to replace ENT:RunBehaviour with
function NPC:Behave()
    print("Going into bird's custom behaviour")
    while ( true ) do
        self:StartActivity( ACT_IDLE  )                            -- walk anims
        self:PlaySequenceAndWait( "Idle01" ) -- Sit on the floor
        --Check if there are any players nearby
        local players = ents.FindByClass("Player")
        local playernearby = false
        for k,v in pairs(players) do
            local fardist = 800
            local closedist = 300
            local removedist = 2000
            local iscrouched = v:Crouching()
            local dist = v:GetPos():Distance(self:GetPos())
            --Remove ourselves if there's noone nearby
            if(dist > 2000) then
                playernearby = true
            end
            --Keep flying away as long as we're being chased
            while((dist < fardist and not iscrouched) or (dist < closedist)) do
                self:StartActivity(ACT_FLY)
                self:SetSequence( "Fly01" )

                --Find a position in roughly the oposite direction of the player
                local tpos = self:GetPos()
                local ppos = v: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
                self:MoveToPos(topos)

                --Check to see if we're being chased
                iscrouched = v:Crouching()
                dist = v:GetPos():Distance(self:GetPos())
            end
        end
        if not playernearby then
            local di = DamageInfo()
            self:BecomeRagdoll(di)
        end
        --self:SetSequence( "sit_ground" )                                            -- Stay sitting
        --coroutine.wait( self:PlayScene( "scenes/eli_lab/mo_gowithalyx01.vcd" ) )    -- play a scene and wait for it to finish before progressing
                                    -- Get up


        -- find the furthest away hiding spot
        --local pos = self:FindSpot( "random", { type = 'hiding', radius = 5000 } )


        -- if the position is valid
        if ( pos ) then
            self:StartActivity( ACT_RUN )                                            -- run anim
            self.loco:SetDesiredSpeed( 200 )                                        -- run speed
            self:PlayScene( "scenes/npc/female01/watchout.vcd" )                    -- shout something while we run just for a laugh
            self:MoveToPos( pos )                                                    -- move to position (yielding)
            self:PlaySequenceAndWait( "fear_reaction" )                                -- play a fear animation
            self:StartActivity( ACT_IDLE )                                            -- when we finished, go into the idle anim
        else
            --print("Bird could not find anywhere to fly to")
            -- some activity to signify that we didn't find shit
        end
    end
    coroutine.yield()
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
*/