aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--content/materials/wintersurvival2/hud/ws2_icons/icon_chitin.pngbin0 -> 9905 bytes
-rw-r--r--entities/entities/ws_npc_ambient/init.lua3
-rw-r--r--gamemode/itemsystem/items/chitin.lua5
-rw-r--r--gamemode/npcsystem/aidirector.lua17
-rw-r--r--gamemode/npcsystem/npcs/antlion1.lua137
-rw-r--r--gamemode/npcsystem/npcs/antlion2.lua164
-rw-r--r--gamemode/npcsystem/npcs/bird.lua2
-rw-r--r--gamemode/npcsystem/npcs/zombie.lua2
8 files changed, 326 insertions, 4 deletions
diff --git a/content/materials/wintersurvival2/hud/ws2_icons/icon_chitin.png b/content/materials/wintersurvival2/hud/ws2_icons/icon_chitin.png
new file mode 100644
index 0000000..a8a05a6
--- /dev/null
+++ b/content/materials/wintersurvival2/hud/ws2_icons/icon_chitin.png
Binary files differ
diff --git a/entities/entities/ws_npc_ambient/init.lua b/entities/entities/ws_npc_ambient/init.lua
index b896726..523333c 100644
--- a/entities/entities/ws_npc_ambient/init.lua
+++ b/entities/entities/ws_npc_ambient/init.lua
@@ -7,7 +7,7 @@ include('shared.lua')
function ENT:Initialize()
--print("NPC spawned!")
--self:SetMoveType(MOVETYPE_STEP)
- --self:SetSolid(SOLID_OBB)
+ self:SetSolid(SOLID_NONE)
--self:SetCollisionGroup(COLLISION_GROUP_INTERACTIVE)
if(self.Model) then self:SetModel(self.Model)
@@ -19,6 +19,7 @@ function ENT:Initialize()
if(self.Stats["Accel"]) then self.loco:SetAcceleration(self.Stats["Accel"])end
if(self.Stats["Decel"]) then self.loco:SetDeceleration(self.Stats["Decel"]) end
if(self.Stats["Step"]) then self.loco:SetJumpHeight(self.Stats["Step"]) end
+ if(self.OnSpawn) then self:OnSpawn() end
--self:SetModel( "models/Humans/Group01/Female_01.mdl" )
--[[
self:SetHullType( HULL_HUMAN );
diff --git a/gamemode/itemsystem/items/chitin.lua b/gamemode/itemsystem/items/chitin.lua
new file mode 100644
index 0000000..3ae082e
--- /dev/null
+++ b/gamemode/itemsystem/items/chitin.lua
@@ -0,0 +1,5 @@
+ITEM.Name = "Chitin"
+ITEM.Class = "resource"
+ITEM.Desc = "Some hard outer-skeleton"
+ITEM.Model = "models/props_junk/Rock001a.mdl"
+ITEM.Icon = Material("wintersurvival2/hud/ws2_icons/icon_chitin.png")
diff --git a/gamemode/npcsystem/aidirector.lua b/gamemode/npcsystem/aidirector.lua
index a78e41e..04e645d 100644
--- a/gamemode/npcsystem/aidirector.lua
+++ b/gamemode/npcsystem/aidirector.lua
@@ -8,6 +8,16 @@ concommand.Add("ws_spawnbird",function(ply,cmd,args)
SpawnNpcByName("Bird",ply:GetPos())
end)
+concommand.Add("ws_spawnnpc",function(ply,cmd,args)
+ if(!args[1]) then print("You must enter the name of an npc")
+ return end
+
+ local npc = GetNpcByName(args[1])
+ if(npc == nil) then print("Not a valid name!")
+ return end
+ SpawnNpcByName(args[1],ply:GetPos())
+end)
+
function SpawnNpcByName(name, position)
if(CLIENT) then return end
entdata = GetNpcByName(name)
@@ -48,6 +58,9 @@ function SpawnNpcByName(name, position)
if(entdata.AwareEnemies) then
ent.AwareEnemies = entdata.AwareEnemies
end
+ if(entdata.OnSpawn) then
+ ent.OnSpawn = entdata.OnSpawn
+ end
ent:Spawn()
end
@@ -59,7 +72,9 @@ local Up = Vector(0,0,1)
--Randomly spawn npc's around?
local ambientnpcs = {
[0] = "Bird",
- [1] = "Zombie"
+ [1] = "Zombie",
+ [2] = "Antlion Scout",
+ [3] = "Antlion Pouncer"
}
local Tick = CurTime()
hook.Add("Tick","SpawnAmbient",function()
diff --git a/gamemode/npcsystem/npcs/antlion1.lua b/gamemode/npcsystem/npcs/antlion1.lua
new file mode 100644
index 0000000..1b0a38f
--- /dev/null
+++ b/gamemode/npcsystem/npcs/antlion1.lua
@@ -0,0 +1,137 @@
+NPC.Name = "Antlion Scout"
+NPC.Desc = "A fearsome monster!"
+NPC.Class = "Agressive" --Ambient, Agressive, Boss
+NPC.Model = "models/antlion.mdl"
+NPC.Icon = Material("wintersurvival2/hud/ws1_icons/icon_rock")
+
+NPC.Social = "Solo" --Solo, Pack
+
+NPC.Stats = {
+ ["Vitality"] = 150,
+ ["Speed"] = 800,
+ ["AwareDist"] = 1000,
+ ["Accel"] = 400,
+ ["Decel"] = 400,
+ ["Step"] = 20, --Step height
+ ["Hull"] = HULL_MEDIUM
+}
+
+--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},
+ [1] = {"Meat",100},
+ [2] = {"Meat",80},
+ [3] = {"Meat",50},
+ [4] = {"Chitin",80},
+ [5] = {"Chitin",50},
+}
+
+--Some npc's like birds have diffent names for their idle sequences
+NPC.IdleSequences = {
+ [0] = "Idle",
+}
+
+--Distance to be made aware of players
+
+--Attacks should be formated as [i]={function (return int dammage) canattack(ply) = function doattack(ply)}
+--NPC will do the most dammage possible per attack
+local checkmele = function(self, ply)
+ if(ply:GetPos():Distance(self:GetPos()) < 100) then return 20 end
+ return -1
+end
+
+local domele = function(self, ply)
+ self:StartActivity(ACT_MELEE_ATTACK1)
+ --Antlion has 6 attack animations
+ local attackanim = math.Round(math.Rand(1,6))
+ coroutine.wait(0.5)
+ --If the player is still in front of us after the animation, they didn't dodge! apply dammage!
+ if(ply:GetPos():Distance(self:GetPos()) < 100) then
+ ply:TakeDamage(20)
+ end
+ --Finish up the animation
+ coroutine.wait(0.25)
+end
+
+local checkrun = function(self, ply) return 0 end
+
+local dorun = function(self, ply)
+ local navarea = navmesh.GetNavArea(self:GetPos(), 100)
+ self.loco:SetDesiredSpeed(self.Stats["Speed"] )
+ if navarea:IsValid() then
+ local moveop = {}
+ moveop.tolerance = 50
+ moveop.repath = 2
+ moveop.lookahead = 3
+ moveop.draw = true
+ self:StartActivity(ACT_WALK)
+ self:MoveToPos(ply:GetPos(),moveop)
+ else
+ print("Could not find valid navmesh, suicideing to prevent server crash!")
+ self:BecomeRagdoll(DamageInfo())
+ end
+end
+
+NPC.Attacks = {
+ [1] = { --A mele attack
+ [checkmele] = domele
+ },
+
+ [2] = {--Move to the player
+ [checkrun] = dorun
+
+ },
+
+
+}
+
+--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)
+ local dist = ply:GetPos():Distance(self:GetPos())
+ return self.Stats["AwareDist"] - dist
+end
+
+--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 = {}
+
+--What to replace the ENT:BehaveAct with
+function NPC:Act()
+end
+
+--What to replace ENT:OnStuck with
+function NPC:Stuck()
+ --If we're stuck, jump backwards
+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/antlion2.lua b/gamemode/npcsystem/npcs/antlion2.lua
new file mode 100644
index 0000000..738bb7e
--- /dev/null
+++ b/gamemode/npcsystem/npcs/antlion2.lua
@@ -0,0 +1,164 @@
+NPC.Name = "Antlion Pouncer"
+NPC.Desc = "A fearsome monster!"
+NPC.Class = "Agressive" --Ambient, Agressive, Boss
+NPC.Model = "models/antlion.mdl"
+NPC.Icon = Material("wintersurvival2/hud/ws1_icons/icon_rock")
+
+NPC.Social = "Solo" --Solo, Pack
+
+NPC.Stats = {
+ ["Vitality"] = 150,
+ ["Speed"] = 800,
+ ["AwareDist"] = 1000,
+ ["Accel"] = 400,
+ ["Decel"] = 400,
+ ["Step"] = 20, --Step height
+ ["Hull"] = HULL_MEDIUM
+}
+
+--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},
+ [1] = {"Meat",100},
+ [2] = {"Meat",80},
+ [3] = {"Meat",50},
+ [4] = {"Chitin",80},
+ [5] = {"Chitin",50},
+}
+
+--Some npc's like birds have diffent names for their idle sequences
+NPC.IdleSequences = {
+ [0] = "Idle",
+}
+
+--Distance to be made aware of players
+
+--Attacks should be formated as [i]={function (return int dammage) canattack(ply) = function doattack(ply)}
+--NPC will do the most dammage possible per attack
+local checkmele = function(self, ply)
+ if(ply:GetPos():Distance(self:GetPos()) < 100) then return 20 end
+ return -1
+end
+
+local domele = function(self, ply)
+ self:StartActivity(ACT_MELEE_ATTACK1)
+ --Antlion has 6 attack animations
+ local attackanim = math.Round(math.Rand(1,6))
+ coroutine.wait(0.5)
+ --If the player is still in front of us after the animation, they didn't dodge! apply dammage!
+ if(ply:GetPos():Distance(self:GetPos()) < 100) then
+ ply:TakeDamage(20)
+ end
+ --Finish up the animation
+ coroutine.wait(0.25)
+end
+
+local checkpounce = function(self, ply)
+ if(ply:GetPos():Distance(self:GetPos())) < 200 then return 15 end
+ return -1
+end
+
+local dopounce = function(self,ply)
+ local randanim = math.Round(math.Rand(0,1))
+ if(randanim) then
+ self:SetSequence("pounce")
+ else
+ self:SetSequence("pounce2")
+ end
+ coroutine.wait(0.23)
+ if(ply:GetPos():Distance(self:GetPos()) < 200) then
+ ply:TakeDamage(15)
+ end
+ coroutine.wait(0.15)
+end
+
+local checkrun = function(self, ply) return 0 end
+
+local dorun = function(self, ply)
+ local navarea = navmesh.GetNavArea(self:GetPos(), 100)
+ self.loco:SetDesiredSpeed(self.Stats["Speed"])
+ if navarea:IsValid() then
+ local moveop = {}
+ moveop.tolerance = 50
+ moveop.repath = 2
+ moveop.lookahead = 3
+ moveop.draw = true
+ self:StartActivity(ACT_WALK)
+ self:MoveToPos(ply:GetPos(),moveop)
+ else
+ print("Could not find valid navmesh, suicideing to prevent server crash!")
+ self:BecomeRagdoll(DamageInfo())
+ end
+end
+
+NPC.Attacks = {
+ [1] = { --A mele attack
+ [checkmele] = domele
+ },
+
+ [2] = {--Move to the player
+ [checkrun] = dorun
+
+ },
+
+ [3] = {
+ [checkpounce] = dopounce
+ },
+
+}
+
+--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)
+ local dist = ply:GetPos():Distance(self:GetPos())
+ return self.Stats["AwareDist"] - dist
+end
+
+--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 = {}
+
+--What to replace the ENT:BehaveAct with
+function NPC:Act()
+end
+
+--What to replace ENT:OnStuck with
+function NPC:Stuck()
+ --If we're stuck, jump backwards
+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()
+ self:SetSkin(2)
+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
index ff4c2f2..7b19457 100644
--- a/gamemode/npcsystem/npcs/bird.lua
+++ b/gamemode/npcsystem/npcs/bird.lua
@@ -32,7 +32,7 @@ NPC.Drops = {
--Attacks should be formated as [i]={function attackpriority() = function doattack()}
local checkrun = function(self,ply)
- --If we're awayre of any enemies, run away!
+ --If we're aware of any enemies, run away!
return 1
end
local dorun = function(self,ply)
diff --git a/gamemode/npcsystem/npcs/zombie.lua b/gamemode/npcsystem/npcs/zombie.lua
index 422080a..5914c04 100644
--- a/gamemode/npcsystem/npcs/zombie.lua
+++ b/gamemode/npcsystem/npcs/zombie.lua
@@ -1,6 +1,6 @@
NPC.Name = "Zombie"
NPC.Desc = "A fearsome monster!"
-NPC.Class = "Ambient" --Ambient, Agressive, Boss
+NPC.Class = "Agressive" --Ambient, Agressive, Boss
NPC.Model = "models/Zombie/Classic.mdl"
NPC.Icon = Material("wintersurvival2/hud/ws1_icons/icon_rock")