aboutsummaryrefslogtreecommitdiff
path: root/gamemode/npcsystem
diff options
context:
space:
mode:
authorApickx <Apickx@cogarr.org>2015-12-28 19:10:44 -0500
committerApickx <Apickx@cogarr.org>2015-12-28 19:10:44 -0500
commit5c4ebc932d8c02522802c842d43d863d89aca162 (patch)
tree6be7ad664bdf060127e6df6baa72beaf508aa149 /gamemode/npcsystem
downloadwintersurvival2-5c4ebc932d8c02522802c842d43d863d89aca162.tar.gz
wintersurvival2-5c4ebc932d8c02522802c842d43d863d89aca162.tar.bz2
wintersurvival2-5c4ebc932d8c02522802c842d43d863d89aca162.zip
Initial commit
Diffstat (limited to 'gamemode/npcsystem')
-rw-r--r--gamemode/npcsystem/aidirector.lua36
-rw-r--r--gamemode/npcsystem/loadnpcs.lua60
-rw-r--r--gamemode/npcsystem/npcs/base.lua57
-rw-r--r--gamemode/npcsystem/npcs/bird.lua101
-rw-r--r--gamemode/npcsystem/npcs/zombie.lua47
5 files changed, 301 insertions, 0 deletions
diff --git a/gamemode/npcsystem/aidirector.lua b/gamemode/npcsystem/aidirector.lua
new file mode 100644
index 0000000..bcaa63b
--- /dev/null
+++ b/gamemode/npcsystem/aidirector.lua
@@ -0,0 +1,36 @@
+--Lol i dunno, spawn some npc's or something
+
+concommand.Add("ws_spawnbird",function(ply, cmd, args)
+ SpawnNpcByName("Bird",ply:GetPos())
+ end
+)
+
+function SpawnNpcByName(name, position)
+ entdata = GetNpcByName(name)
+ ent = ents.Create("ws_npc_ambient")
+ ent:SetPos(position)
+
+
+ if(entdata.Speed) then
+ ent.Speed = entdata.Speed
+ end
+ if(entdata.Model) then
+ ent.Model = entdata.Model
+ end
+ if(entdata.vitality) then
+ ent:SetHealth(entdata.vitality)
+ 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
+ ent:Spawn()
+end
diff --git a/gamemode/npcsystem/loadnpcs.lua b/gamemode/npcsystem/loadnpcs.lua
new file mode 100644
index 0000000..2db2aae
--- /dev/null
+++ b/gamemode/npcsystem/loadnpcs.lua
@@ -0,0 +1,60 @@
+local Folder = GM.Folder:gsub("gamemodes/","").."/gamemode/npcsystem/npcs"
+local insert = table.insert
+
+function GM:LoadNPCS()
+ local Items = file.Find(Folder.."/*.lua","LUA")
+ local BaseItem = {}
+
+ GAMEMODE.Npcs = {}
+
+ NPC = {}
+
+ AddCSLuaFile(Folder.."/base.lua")
+ include(Folder.."/base.lua")
+
+ BaseItem = table.Copy(NPC)
+
+ for k,v in pairs(Items) do
+ if (v != "base.lua") then
+ AddCSLuaFile(Folder.."/"..v)
+ include(Folder.."/"..v)
+
+ insert(GAMEMODE.Npcs,NPC)
+
+ NPC = table.Copy(BaseItem)
+
+ end
+ end
+end
+
+hook.Add("Initialize","Loadnpcs",function()
+ GAMEMODE:LoadNPCS()
+end)
+
+function GetNpcByName(name)
+ for k,v in pairs( GAMEMODE.Npcs ) do
+ if (v.Name == name) then return v end
+ end
+
+ return nil
+end
+
+--[[
+function GetRecipeForItem(name)
+ for k,v in pairs( GAMEMODE.Recipes ) do
+ if (v.Name == name) then return v.Recipe,v end
+ end
+
+ return nil
+end
+]]--
+--[[
+function GetItemsByClass(class)
+ local Dat = {}
+ for k,v in pairs( GAMEMODE.Items ) do
+ if (v.Class == class) then table.insert(Dat,v) end
+ end
+
+ return Dat
+end
+]]--
diff --git a/gamemode/npcsystem/npcs/base.lua b/gamemode/npcsystem/npcs/base.lua
new file mode 100644
index 0000000..7afb4fe
--- /dev/null
+++ b/gamemode/npcsystem/npcs/base.lua
@@ -0,0 +1,57 @@
+NPC.Name = "Winter Survival 2 Base NPC"
+NPC.Desc = "Why the hell did I write this? No one will read it anyways!!"
+NPC.Class = "Other" --Ambient, Agressive, Boss
+NPC.Model = "models/props_combine/breenlight.mdl"
+NPC.Icon = Material("wintersurvival2/hud/ws1_icons/icon_rock")
+
+NPC.Social = "Pack" --Solo, Pack
+
+NPC.Vitality = 0
+NPC.Speed = 0
+--Drops should be formated as [index]={["item name"], percent_drop} where percent_drop is a number from 0 to 100
+NPC.Drops = nil
+
+--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
+NPC.Target = nil
+
+--All enemies that this NPC is aware of
+NPC.AwareEnemies = nil
+
+--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.
+/*
+--What to replace the ENT:BehaveAct with
+function NPC:Act()
+end
+
+--What to replace RunBehaviour with
+function NPC:Behaviour()
+end
+
+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
+*/
diff --git a/gamemode/npcsystem/npcs/bird.lua b/gamemode/npcsystem/npcs/bird.lua
new file mode 100644
index 0000000..d5cd1e0
--- /dev/null
+++ b/gamemode/npcsystem/npcs/bird.lua
@@ -0,0 +1,101 @@
+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_FLY ) -- walk anims
+ self.loco:SetDesiredSpeed( 100 ) -- walk speeds
+ self:MoveToPos( self:GetPos() + Vector( math.Rand( -1, 1 ), math.Rand( -1, 1 ), 0 ) * 200 ) -- walk to a random place within about 200 units (yielding)
+
+
+ self:StartActivity( ACT_IDLE ) -- revert to idle activity
+
+
+ self:PlaySequenceAndWait( "Idle01" ) -- Sit on the floor
+ --Check if there are any players nearby
+ local players = ents.FindByClass("Player")
+ for k,v in pairs(players) do
+ print(k)
+ print(v)
+ 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
+ self:PlaySequenceAndWait( "Fly01" ) -- 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
+*/
diff --git a/gamemode/npcsystem/npcs/zombie.lua b/gamemode/npcsystem/npcs/zombie.lua
new file mode 100644
index 0000000..0980cdc
--- /dev/null
+++ b/gamemode/npcsystem/npcs/zombie.lua
@@ -0,0 +1,47 @@
+NPC.Name = "Zombie"
+NPC.Desc = "Ahh! The Undead!!"
+NPC.Class = "Other" --Ambient, Agressive, Boss
+NPC.Model = "models/props_combine/breenlight.mdl"
+NPC.Icon = Material("wintersurvival2/hud/ws1_icons/icon_rock")
+
+NPC.Vitality = 100
+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 = nil
+
+--Attacks should be formated as [range]={index = function doattack(target)}
+--Where range is the range of the target, and doattack(target) is the function called to attack
+NPC.Attacks = nil
+
+--A function that takes a position and returns true if this is an acceptable place to spawn
+NPC.SpawnLocations = function(pos) return true end
+
+--The entity that is this npc's current target, if it has one
+NPC.Target = nil
+
+--All enemies that this NPC is aware of
+NPC.AwareEnemies = nil
+--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
+*/