From 9ae67530dc4be9eaab7b1243330e810d1d5a6fee Mon Sep 17 00:00:00 2001 From: Alexander Pickering Date: Mon, 24 Oct 2016 19:00:58 -0400 Subject: Added npc system --- gamemode/shared/loadnpcs.lua | 36 ++++++++++++ gamemode/shared/npcsystem/rat.lua | 113 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 gamemode/shared/loadnpcs.lua create mode 100644 gamemode/shared/npcsystem/rat.lua (limited to 'gamemode/shared') diff --git a/gamemode/shared/loadnpcs.lua b/gamemode/shared/loadnpcs.lua new file mode 100644 index 0000000..bff5135 --- /dev/null +++ b/gamemode/shared/loadnpcs.lua @@ -0,0 +1,36 @@ + +local f = include("concommands.lua") + +ART = ART or {} + +local npcs = {} + +function ART.RegisterNPC(npc) + assert(npc ~= nil, "Attempted to register a nil npc") + assert(npc.Name ~= nil, "Attempted to register an npc without a name") + npcs[npc.Name] = npc +end + +function ART.CreateNPCByName(npcname, pos) + print("Createing a " ,npcname ," at ", pos) + local npctbl = npcs[npcname] + local npc = ents.Create("npc_huntable") + npc:SetPos(pos) + for k,v in pairs(npctbl) do + npc[k] = v + end + npc:Spawn() +end + +local autocompletef +if SERVER then + autocompletef = nil +else + autocompletef = f.AutocompleteFunction(npcs) +end +concommand.Add("artery_makenpc",function(ply,cmd,args) + if not ply:IsAdmin() then return end + local n = args[1] + ART.CreateNPCByName(n,ply:GetEyeTrace().HitPos) +end, +autocompletef) diff --git a/gamemode/shared/npcsystem/rat.lua b/gamemode/shared/npcsystem/rat.lua new file mode 100644 index 0000000..d1c5422 --- /dev/null +++ b/gamemode/shared/npcsystem/rat.lua @@ -0,0 +1,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) -- cgit v1.2.3-70-g09d2