From 5c4ebc932d8c02522802c842d43d863d89aca162 Mon Sep 17 00:00:00 2001 From: Apickx Date: Mon, 28 Dec 2015 19:10:44 -0500 Subject: Initial commit --- gamemode/npcsystem/aidirector.lua | 36 +++++++++++++ gamemode/npcsystem/loadnpcs.lua | 60 ++++++++++++++++++++++ gamemode/npcsystem/npcs/base.lua | 57 +++++++++++++++++++++ gamemode/npcsystem/npcs/bird.lua | 101 +++++++++++++++++++++++++++++++++++++ gamemode/npcsystem/npcs/zombie.lua | 47 +++++++++++++++++ 5 files changed, 301 insertions(+) create mode 100644 gamemode/npcsystem/aidirector.lua create mode 100644 gamemode/npcsystem/loadnpcs.lua create mode 100644 gamemode/npcsystem/npcs/base.lua create mode 100644 gamemode/npcsystem/npcs/bird.lua create mode 100644 gamemode/npcsystem/npcs/zombie.lua (limited to 'gamemode/npcsystem') 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 +*/ -- cgit v1.2.3-70-g09d2