diff options
| -rw-r--r-- | content/materials/wintersurvival2/hud/ws2_icons/icon_chitin.png | bin | 0 -> 9905 bytes | |||
| -rw-r--r-- | entities/entities/ws_npc_ambient/init.lua | 3 | ||||
| -rw-r--r-- | gamemode/itemsystem/items/chitin.lua | 5 | ||||
| -rw-r--r-- | gamemode/npcsystem/aidirector.lua | 17 | ||||
| -rw-r--r-- | gamemode/npcsystem/npcs/antlion1.lua | 137 | ||||
| -rw-r--r-- | gamemode/npcsystem/npcs/antlion2.lua | 164 | ||||
| -rw-r--r-- | gamemode/npcsystem/npcs/bird.lua | 2 | ||||
| -rw-r--r-- | gamemode/npcsystem/npcs/zombie.lua | 2 |
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 Binary files differnew file mode 100644 index 0000000..a8a05a6 --- /dev/null +++ b/content/materials/wintersurvival2/hud/ws2_icons/icon_chitin.png 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")
|
