This commit is contained in:
lifestorm
2024-08-04 23:54:45 +03:00
parent 8064ba84d8
commit 6a58f406b1
7522 changed files with 4011896 additions and 15 deletions

View File

@@ -0,0 +1,756 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
CreateConVar("dog_friendly_fire","0",{FCVAR_ARCHIVE,FCVAR_REPLICATED,FCVAR_SERVER_CAN_EXECUTE})
CreateConVar("dog_follows","1",{FCVAR_ARCHIVE,FCVAR_REPLICATED,FCVAR_SERVER_CAN_EXECUTE})
CreateConVar("dog_healths","2100",{FCVAR_ARCHIVE,FCVAR_REPLICATED,FCVAR_SERVER_CAN_EXECUTE})
CreateConVar("dog_campaignfixs","0",{FCVAR_ARCHIVE,FCVAR_REPLICATED,FCVAR_SERVER_CAN_EXECUTE})
function FindNearestEntity( className, pos, range )
local nearestEnt
range = range ^ 2
for _, ent in pairs( ents.FindByClass( className ) ) do
if IsValid(ent) and !ent.IsThrown and !(ent:OBBMaxs().x > 140 or ent:OBBMaxs().y > 140 or ent:OBBMaxs().z > 140) and IsValid(ent:GetPhysicsObject()) and ent:GetPhysicsObject():GetMass() >= 10 then
local distance = (pos - ent:GetPos()):LengthSqr()
if( distance <= range ) then
nearestEnt = ent
range = distance
end
end
end
return nearestEnt
end
function FindNearestEntity2( className, pos, range )
local nearestEnt
range = range ^ 2
for _, ent in pairs( ents.FindByClass( className ) ) do
if IsValid(ent) then
local distance = (pos - ent:GetPos()):LengthSqr()
if( distance <= range ) then
nearestEnt = ent
range = distance
end
end
end
return nearestEnt
end
local function Spawn_lightning(owner,victim)
local bone = owner:LookupBone("Dog_Model.Hand_R")
local m = owner:GetBoneMatrix(bone)
if (m) then
pos, ang = m:GetTranslation() , m:GetAngles()
end
local teslaStart = ents.Create( "info_target" )
teslaStart:SetPos( pos )
teslaStart:SetName( "teslaStart" .. owner:EntIndex() )
local teslaEnd = ents.Create( "info_target" )
teslaEnd:SetPos( victim:GetPos() )
teslaEnd:SetName( "teslaEnd" .. owner:EntIndex() )
teslaEnd:Spawn( )
teslaEnd:SetParent(victim)
local teslaBeam = ents.Create( "env_beam" )
teslaBeam:SetPos(pos)
teslaBeam:SetName( "teslaBeam" )
teslaBeam:SetKeyValue( "texture", "sprites/physcannon_bluelight1.vmt")
teslaBeam:SetKeyValue( "renderamt", "255" )
teslaBeam:SetKeyValue( "rendercolor", "255 255 255" )
teslaBeam:SetKeyValue( "life", "0" )
teslaBeam:SetKeyValue( "damage", "0" )
teslaBeam:SetKeyValue( "LightningStart", "teslaStart" .. owner:EntIndex() )
teslaBeam:SetKeyValue( "LightningEnd", "teslaEnd" .. owner:EntIndex() )
teslaBeam:SetKeyValue( "spawnflags", "1" )
teslaBeam:SetKeyValue( "TouchType", 0 )
teslaBeam:SetKeyValue( "framestart", 0 )
teslaBeam:SetKeyValue( "framerate", 0 )
teslaBeam:SetKeyValue( "NoiseAmplitude", 5 )
teslaBeam:SetKeyValue( "TextureScroll", 35 )
teslaBeam:SetKeyValue( "BoltWidth", 4 )
teslaBeam:SetKeyValue( "Radius", 256 )
teslaBeam:SetKeyValue( "StrikeTime", 1 )
teslaStart:Spawn( )
teslaBeam:Spawn( )
teslaBeam:Activate( )
teslaBeam:Fire( "TurnOn", "", 0)
teslaBeam:Fire("kill", "", 1.8)
teslaStart:Fire( "kill", "", 1.8 )
teslaEnd:Fire( "kill", "", 1.8 )
teslaStart:SetParent(owner)
end
hook.Add("OnNPCKilled","DOGGSS_Hide_Weapon",function(npc,attacker,inflictor)
if IsValid(npc:GetActiveWeapon()) and npc:GetClass()=="npc_vj_hl2_dog" then
npc:GetActiveWeapon():Remove()
end
if GetConVar("dog_campaignfixs"):GetBool() and npc:GetClass()=="npc_vj_hl2_dog" and !npc.SpawnedForCampaign then
return
end
if npc:GetClass()=="npc_vj_hl2_dog" then
npc:EmitSound("NPC_dog.Scared_1")
end
end)
hook.Add("PreCleanupMap","DOGGSS_Fix",function()
for k,v in pairs(hook.GetTable().Think) do
if string.find(k,"bigdoggsattac") then
hook.Remove("Think",k)
end
end
for k,v in pairs(hook.GetTable().EntityTakeDamage) do
if string.find(k,"bigdoggsattac_func") then
hook.Remove("EntityTakeDamage",k)
end
end
end)
function FollowDoggs( ply, key )
if (key == IN_USE) then
if !GetConVar("dog_follows"):GetBool() then
return
end
local tr = util.TraceLine( {
start = ply:EyePos( ),
endpos = ply:EyePos( ) + ply:GetAimVector( ) * 100,
filter = ply })
if GetConVar("dog_campaignfixs"):GetBool() and IsValid(tr.Entity) and tr.Entity:GetClass() == "npc_vj_hl2_dog" and !tr.Entity.SpawnedForCampaign then
return
end
if IsValid(tr.Entity) and tr.Entity:GetClass() == "npc_vj_hl2_dog" and (tr.Entity:Disposition(ply) == D_LI or tr.Entity:Disposition(ply) == D_NU) and tr.Entity:GetNWFloat("next_follow_wait") < CurTime() and SERVER then
if !tr.Entity.FollowFreeman then
tr.Entity:EmitSound("NPC_dog.Playful_5")
tr.Entity.FollowFreeman = true
tr.Entity.FollowEnt = ply
tr.Entity:SetNWFloat("next_follow_wait",(tr.Entity:SequenceDuration( tr.Entity:LookupSequence("excitedpound") )) + CurTime())
tr.Entity:AddGestureSequence( tr.Entity:LookupSequence("excitedpound"), true )
tr.Entity:SetSchedule(SCHED_WAIT_FOR_SCRIPT)
tr.Entity.Attac = true
timer.Create("doggs_stop_excite" .. tr.Entity:EntIndex(),tr.Entity:SequenceDuration( tr.Entity:LookupSequence("excitedpound") ),1, function()
if IsValid(tr.Entity) then
tr.Entity.Attac = false
tr.Entity:SetSchedule(SCHED_COMBAT_FACE)
end
end)
else
tr.Entity.FollowFreeman = false
tr.Entity.FollowEnt = nil
tr.Entity:EmitSound("NPC_dog.Dissapointed_1")
tr.Entity:SetNWFloat("next_follow_wait",(tr.Entity:SequenceDuration( tr.Entity:LookupSequence("disappointed") )) + CurTime())
tr.Entity:AddGestureSequence( tr.Entity:LookupSequence("disappointed"), true )
tr.Entity:SetSchedule(SCHED_WAIT_FOR_SCRIPT)
tr.Entity.Attac = true
timer.Create("doggs_stop_excite" .. tr.Entity:EntIndex(),tr.Entity:SequenceDuration( tr.Entity:LookupSequence("disappointed") ),1, function()
if IsValid(tr.Entity) then
tr.Entity.Attac = false
tr.Entity:SetSchedule(SCHED_COMBAT_FACE)
end
end)
end
end
end
end
hook.Add( "KeyPress", "FollowDoggs", FollowDoggs )
hook.Add("PlayerSpawnedNPC","DOGGSS_SpawnMode",function(ply,ent)
if GetConVar("dog_campaignfixs"):GetBool() then
if ent:GetClass()=="npc_vj_hl2_dog" then
ent.SpawnedForCampaign = true
end
end
end)
hook.Add("OnEntityCreated","DOGGSS_he_attac",function(ent)
if ent:GetClass()=="npc_hunter" then
local entidx2 = "hate_doggs" .. ent:EntIndex()
timer.Create(entidx2,1,0,function()
if IsValid(ent) then
local findent = FindNearestEntity("npc_vj_hl2_dog",ent:GetPos(), 1000)
if IsValid(findent) then
ent:ClearEnemyMemory()
ent:SetEnemy(findent)
end
else
timer.Remove(entidx2)
end
end)
end
if string.find(ent:GetClass(),"npc_helicopter") or string.find(ent:GetClass(),"npc_combinegunship") or string.find(ent:GetClass(),"prop_vehicle_apc") or string.find(ent:GetClass(),"npc_hunter") then
for k,v in pairs(ents.GetAll()) do
if string.find(v:GetClass(),"npc_vj_hl2_dog") then
v:AddEntityRelationship(ent,1,99)
end
end
end
if string.find(ent:GetClass(),"npc_strider") then
for k,v in pairs(ents.GetAll()) do
if string.find(v:GetClass(),"npc_vj_hl2_dog") then
v:AddEntityRelationship(ent,2,99)
end
end
end
timer.Simple(GetConVar("dog_campaignfixs"):GetBool() and 0.02 or 0,function()
if IsValid(ent) then
if ent:GetClass()=="npc_vj_hl2_dog" then
if GetConVar("dog_campaignfixs"):GetBool() and !ent.SpawnedForCampaign then
return
end
timer.Simple(0.05,function()
if IsValid(ent) then
ent:SetMaxHealth( GetConVarNumber("dog_healths") )
ent:SetHealth( GetConVarNumber("dog_healths") )
end
end)
ent:Give("weapon_crowbar")
ent:GetActiveWeapon():SetNoDraw(true)
for k,v in pairs(ents.GetAll()) do
if string.find(v:GetClass(),"npc_helicopter") or string.find(v:GetClass(),"npc_combinegunship") or string.find(v:GetClass(),"prop_vehicle_apc") or string.find(v:GetClass(),"npc_hunter") then
ent:AddEntityRelationship(v,1,99)
end
if string.find(v:GetClass(),"npc_strider") then
ent:AddEntityRelationship(v,2,99)
end
end
local entidx = ent:EntIndex()
hook.Add( "EntityTakeDamage", "bigdoggsattac_func" .. entidx, function( target, dmginfo )
if dmg_doggsattac then return end
dmg_doggsattac = true
local ent = Entity(entidx)
if target == ent and IsValid(dmginfo:GetAttacker()) and dmginfo:GetAttacker():IsPlayer() and (target:Disposition(dmginfo:GetAttacker()) == D_LI or target:Disposition(dmginfo:GetAttacker()) == D_NU) and GetConVar("dog_friendly_fires"):GetBool() then
target:AddEntityRelationship(dmginfo:GetAttacker(),1,0)
end
if target == ent and IsValid(dmginfo:GetAttacker()) and (dmginfo:GetAttacker():GetClass()=="npc_headcrab_black" or dmginfo:GetAttacker():GetClass()=="npc_headcrab_poison") then
target:SetHealth(target:Health() + 100)
end
if target == ent and IsValid(dmginfo:GetAttacker()) and (dmginfo:GetAttacker():GetClass()=="npc_antlionguard" ) then
dmginfo:SetDamage(math.Clamp(dmginfo:GetDamage(),0,22))
target:TakeDamageInfo(dmginfo)
end
if IsValid(target) and target == ent and IsValid(dmginfo:GetAttacker()) and dmginfo:GetAttacker() == target then
dmginfo:SetDamage(0)
target:TakeDamageInfo(dmginfo)
end
if IsValid(target) and target == ent and IsValid(dmginfo:GetAttacker()) and dmginfo:GetAttacker():IsRagdoll() then
dmginfo:SetDamage(0)
target:TakeDamageInfo(dmginfo)
end
if IsValid(dmginfo:GetAttacker()) and dmginfo:GetAttacker() == ent and (target:IsNPC() or target:IsPlayer()) then
if IsValid(target) and IsValid(ent) and target != ent and (ent:Disposition(target) == D_LI or ent:Disposition(target) == D_NU) then
dmginfo:SetDamage(0)
target:TakeDamageInfo(dmginfo)
end
end
dmg_doggsattac = false
end)
hook.Add("Think", "bigdoggsattac" .. entidx,function()
local ent = Entity(entidx)
if !IsValid(ent) then
hook.Remove("Think","bigdoggsattac" .. entidx)
hook.Remove("EntityTakeDamage","bigdoggsattac_func" .. entidx)
return
end
if ent.FollowFreeman and IsValid(ent.FollowEnt) and !ent.Attac then
if ent:GetNWFloat("next_follow_wait") < CurTime() and ent:GetNWFloat("next_follow") < CurTime() and ((!IsValid(ent:GetEnemy())) or (IsValid(ent:GetEnemy()) and (ent:GetPos():Distance(ent:GetEnemy():GetPos()) >= 600))) then
ent:SetNWFloat("next_follow",1 + CurTime())
if (ent:GetPos():Distance(ent.FollowEnt:GetPos()) > 150) then
ent:SetLastPosition(ent.FollowEnt:GetPos() + Vector(math.Rand(-80,80),math.Rand(-80,80),0))
ent:SetSchedule(SCHED_FORCED_GO_RUN)
else
if ent:IsCurrentSchedule(SCHED_FORCED_GO_RUN) then
ent:ClearSchedule()
ent:StopMoving()
end
end
end
end
if !IsValid(ent:GetEnemy()) then
local nearent
nearent = FindNearestEntity2("prop_vehicle_apc",ent:GetPos(), 7000)
if IsValid(nearent) and ent:GetNWFloat("search_for_prop") < CurTime() and !ent:IsCurrentSchedule(SCHED_WAIT_FOR_SCRIPT) then
ent:SetNWFloat("search_for_prop",5 + CurTime())
if (ent:GetPos():Distance(nearent:GetPos()) > 100) then
ent:SetLastPosition(nearent:GetPos())
ent:SetSchedule(SCHED_FORCED_GO_RUN)
end
end
local nearent
nearent = FindNearestEntity2("prop_vehicle_apc",ent:GetPos(), 7000)
if IsValid(nearent) and (ent:GetPos():Distance(nearent:GetPos()) <= math.Clamp(nearent:OBBMaxs().x/1.5 + nearent:OBBMaxs().y/1.5 + nearent:OBBMaxs().z/1.5,75,135)) and !ent.Attac then
if ent:IsCurrentSchedule(SCHED_FORCED_GO_RUN) then
ent:ClearSchedule()
ent:StopMoving()
ent:SetNWFloat("next_attac",ent:SequenceDuration( ent:LookupSequence("apc_throw") ) + CurTime())
ent:AddGestureSequence( ent:LookupSequence("apc_throw"), true )
ent:SetSchedule(SCHED_WAIT_FOR_SCRIPT)
ent.ThrowEnt = nearent
ent.Attac = true
--ent.ThrowEnt:SetPos(ent:GetAttachment(ent:LookupAttachment( "chestTarget" )).Pos)
--ent.ThrowEnt:SetParent(ent)
--ent.ThrowEnt:Fire("setparentattachment", "chestTarget", 0.01)
local WPos = ent.ThrowEnt:GetPos()
local PPos = ent:GetPos()
local Ang = WPos - PPos
Ang = Ang:Angle()
ent:SetAngles(Angle(0,Ang.yaw,Ang.roll))
timer.Create("doggs_attac_lauch_attach" .. ent:EntIndex(),ent:SequenceDuration( ent:LookupSequence("apc_throw") )/5,1, function()
if IsValid(ent) and IsValid(ent.ThrowEnt) then
ent:EmitSound("NPC_dog.Angry_2")
ent.Throw = true
constraint.NoCollide( ent.ThrowEnt, ent, 0, 0 )
local bone = ent:LookupBone("Dog_Model.forward")
local m = ent:GetBoneMatrix(bone)
if (m) then
pos, ang = m:GetTranslation() , m:GetAngles()
end
ent.ThrowEnt:SetPos(ent:EyePos() + ent:GetForward()*-10 + ent:GetUp()*-60)
ent.ThrowEnt:FollowBone( ent, ent:LookupBone("Dog_Model.forward") )
ent.ThrowEnt.Anglebone = ent.ThrowEnt:GetAngles()
end
end)
timer.Create("doggs_attac_lauch" .. ent:EntIndex(),ent:SequenceDuration( ent:LookupSequence("apc_throw") )/1.3,1, function()
if IsValid(ent) then
ent.Throw = false
if IsValid(ent.ThrowEnt) then
ent.ThrowEnt:FollowBone(NULL,0)
ent.ThrowEnt:SetAngles(ent.ThrowEnt.Anglebone)
ent.ThrowEnt:GetPhysicsObject():EnableMotion(true)
ent.ThrowEnt:GetPhysicsObject():SetVelocity(ent:GetForward()*20000 + Vector(0,0,1000))
ent.ThrowEnt.Owner = ent
ent.ThrowEnt.IsThrown = true
ent.ThrowEnt.CollGroup = ent.ThrowEnt:GetCollisionGroup()
ent.ThrowEnt:SetCollisionGroup( COLLISION_GROUP_WORLD )
local entthrou = ent.ThrowEnt
timer.Simple(0.02,function()
if IsValid(entthrou) then
entthrou:SetCollisionGroup( COLLISION_GROUP_NONE )
end
end)
timer.Simple(1,function()
if IsValid(entthrou) and entthrou:GetClass() == "prop_vehicle_apc" then
entthrou:Fire("Destroy","",0)
end
end)
ent.ThrowEnt:AddCallback( "PhysicsCollide", function( obj, data )
if obj:GetClass()=="prop_vehicle_apc" then
obj:Fire("Destroy","",0)
end
if data.HitEntity:GetClass() == "npc_strider" or data.HitEntity:GetClass() == "npc_hunter" or data.HitEntity:GetClass() == "npc_antlionguard" then
data.HitEntity:TakeDamage(data.Speed)
end
if data.Speed >= 200 and obj:GetPhysicsObject():GetMass() >= 50 then
for k,v in pairs(ents.FindInSphere(obj:GetPos(),350)) do
if v:GetClass()=="npc_strider" then
v:TakeDamage(data.Speed)
end
if (v:GetClass()=="npc_helicopter" or v:GetClass()=="npc_combinegunship") then
v:Fire("SelfDestruct","",0)
end
end
end
end)
end
ent.ThrowEnt.IsThrown = false
ent.ThrowEnt = nil
end
end)
timer.Create("doggs_attac_lauch_stop" .. ent:EntIndex(),ent:SequenceDuration( ent:LookupSequence("apc_throw") ),1, function()
if IsValid(ent) then
ent.Throw = false
if IsValid(ent.ThrowEnt) then
ent.ThrowEnt.IsThrown = false
end
ent.ThrowEnt = nil
ent.Attac = false
ent:SetSchedule(SCHED_COMBAT_FACE)
end
end)
end
end
end
if !IsValid(ent:GetEnemy()) then
return
end
if IsValid(ent) then
local enemy = ent:GetEnemy()
--[[
if IsValid(enemy) then
if ent:GetNWFloat("next_attac") < CurTime() then
ent:SetNWFloat("next_attac",1 + CurTime())
if (ent:GetPos():Distance(enemy:GetPos()) > 50) then
ent:SetLastPosition(enemy:GetPos() + Vector(math.Rand(-50,50),math.Rand(-50,50),0))
ent:SetSchedule(SCHED_FORCED_GO_RUN)
else
if ent:IsCurrentSchedule(SCHED_FORCED_GO_RUN) then
ent:ClearSchedule()
ent:StopMoving()
end
end
end
end
--]]
if (ent:GetPos():Distance(enemy:GetPos()) >= 300) then
local nearent
nearent = FindNearestEntity2("prop_vehicle_apc",ent:GetPos(), enemy:GetClass()=="npc_strider" and 7000 or 700)
if !IsValid(nearent) then
nearent = FindNearestEntity("prop_physics",ent:GetPos(),enemy:GetClass()=="npc_strider" and 7000 or 700)
end
if IsValid(nearent) and (ent:GetPos():Distance(nearent:GetPos()) <= math.Clamp(nearent:OBBMaxs().x/1.5 + nearent:OBBMaxs().y/1.5 + nearent:OBBMaxs().z/1.5,75,135)) and !ent.Attac then
if ent:IsCurrentSchedule(SCHED_FORCED_GO_RUN) then
ent:ClearSchedule()
ent:StopMoving()
ent:SetNWFloat("next_attac",ent:SequenceDuration( ent:LookupSequence("apc_throw") ) + CurTime())
ent:AddGestureSequence( ent:LookupSequence("apc_throw"), true )
ent:SetSchedule(SCHED_WAIT_FOR_SCRIPT)
ent.ThrowEnt = nearent
ent.Attac = true
if ent.ThrowEnt:GetClass() != "prop_vehicle_apc" then
ent.ThrowEnt:GetPhysicsObject():EnableMotion(false)
end
--ent.ThrowEnt:SetPos(ent:GetAttachment(ent:LookupAttachment( "chestTarget" )).Pos)
--ent.ThrowEnt:SetParent(ent)
--ent.ThrowEnt:Fire("setparentattachment", "chestTarget", 0.01)
local WPos = ent.ThrowEnt:GetPos()
local PPos = ent:GetPos()
local Ang = WPos - PPos
Ang = Ang:Angle()
ent:SetAngles(Angle(0,Ang.yaw,Ang.roll))
timer.Create("doggs_attac_lauch_attach" .. ent:EntIndex(),ent:SequenceDuration( ent:LookupSequence("apc_throw") )/5,1, function()
if IsValid(ent) and IsValid(ent.ThrowEnt) then
ent:EmitSound("NPC_dog.Angry_2")
ent.Throw = true
constraint.NoCollide( ent.ThrowEnt, ent, 0, 0 )
local bone = ent:LookupBone("Dog_Model.forward")
local m = ent:GetBoneMatrix(bone)
if (m) then
pos, ang = m:GetTranslation() , m:GetAngles()
end
ent.ThrowEnt:SetPos(ent:EyePos() + ent:GetForward()*-10 + ent:GetUp()*-60)
ent.ThrowEnt:FollowBone( ent, ent:LookupBone("Dog_Model.forward") )
ent.ThrowEnt.Anglebone = ent.ThrowEnt:GetAngles()
end
end)
timer.Create("doggs_attac_lauch" .. ent:EntIndex(),ent:SequenceDuration( ent:LookupSequence("apc_throw") )/1.3,1, function()
if IsValid(ent) and IsValid(enemy) then
ent.Throw = false
if IsValid(ent.ThrowEnt) then
local vecup = enemy:GetClass()=="npc_strider" and 40 or 0
ent.ThrowEnt:FollowBone(NULL,0)
ent.ThrowEnt:SetAngles(ent.ThrowEnt.Anglebone)
ent.ThrowEnt:GetPhysicsObject():EnableMotion(true)
ent.ThrowEnt:GetPhysicsObject():SetVelocity((ent.ThrowEnt:GetPos() - (enemy:EyePos() + Vector(0,0,vecup)))*-200)
ent.ThrowEnt.Owner = ent
ent.ThrowEnt.IsThrown = true
ent.ThrowEnt.CollGroup = ent.ThrowEnt:GetCollisionGroup()
ent.ThrowEnt:SetCollisionGroup( COLLISION_GROUP_WORLD )
local entthrou = ent.ThrowEnt
timer.Simple(0.02,function()
if IsValid(entthrou) then
entthrou:SetCollisionGroup( COLLISION_GROUP_NONE )
end
end)
timer.Simple(1,function()
if IsValid(entthrou) and entthrou:GetClass() == "prop_vehicle_apc" then
entthrou:Fire("Destroy","",0)
end
end)
ent.ThrowEnt:AddCallback( "PhysicsCollide", function( obj, data )
if obj:GetClass()=="prop_vehicle_apc" then
obj:Fire("Destroy","",0)
end
if data.HitEntity:GetClass() == "npc_strider" or data.HitEntity:GetClass() == "npc_hunter" or data.HitEntity:GetClass() == "npc_antlionguard" then
data.HitEntity:TakeDamage(data.Speed)
end
if data.Speed >= 200 and obj:GetPhysicsObject():GetMass() >= 50 then
for k,v in pairs(ents.FindInSphere(obj:GetPos(),350)) do
if v:GetClass()=="npc_strider" then
v:TakeDamage(data.Speed)
end
if (v:GetClass()=="npc_helicopter" or v:GetClass()=="npc_combinegunship") then
v:Fire("SelfDestruct","",0)
end
end
end
end)
end
ent.ThrowEnt.IsThrown = false
ent.ThrowEnt = nil
end
end)
timer.Create("doggs_attac_lauch_stop" .. ent:EntIndex(),ent:SequenceDuration( ent:LookupSequence("apc_throw") ),1, function()
if IsValid(ent) then
ent.Throw = false
if IsValid(ent.ThrowEnt) then
ent.ThrowEnt.IsThrown = false
end
ent.ThrowEnt = nil
ent.Attac = false
ent:SetSchedule(SCHED_COMBAT_FACE)
end
end)
end
end
end
if ent.Throw and IsValid(ent.ThrowEnt) then
local bone = ent:LookupBone("Dog_Model.Hand_L")
local m = ent:GetBoneMatrix(bone)
if (m) then
pos, ang = m:GetTranslation() , m:GetAngles()
end
--ent.ThrowEnt:SetPos(LocalToWorld( Vector(30,ent.ThrowEnt:OBBMaxs().z/3,50), Angle(0,0,0), pos, ang ))
local WPos = enemy:GetPos()
local PPos = ent:GetPos()
local Ang = WPos - PPos
Ang = Ang:Angle()
ent:SetAngles(Angle(0,Ang.yaw,Ang.roll))
end
if ent.Attac then
ent:SetSchedule(SCHED_WAIT_FOR_SCRIPT)
end
if IsValid(enemy) then
local nearent
nearent = FindNearestEntity2("prop_vehicle_apc",ent:GetPos(), ent:GetClass()=="npc_strider" and 7000 or 700)
if !IsValid(nearent) then
nearent = FindNearestEntity("prop_physics",ent:GetPos(),ent:GetClass()=="npc_strider" and 7000 or 700)
end
if IsValid(nearent) and (ent:GetPos():Distance(enemy:GetPos()) >= 300) and ent:GetNWFloat("search_for_prop") < CurTime() and !ent:IsCurrentSchedule(SCHED_WAIT_FOR_SCRIPT) then
ent:SetNWFloat("search_for_prop",5 + CurTime())
if (ent:GetPos():Distance(nearent:GetPos()) > 100) then
ent:SetLastPosition(nearent:GetPos())
ent:SetSchedule(SCHED_FORCED_GO_RUN)
end
end
if !(enemy:Health() <= 0) and (ent:GetPos():Distance(enemy:GetPos()) <= 250) and !(ent:GetPos():Distance(enemy:GetPos()) <= 100) and ent:GetNWFloat("next_pull") < CurTime() then
if !ent:IsCurrentSchedule(SCHED_WAIT_FOR_SCRIPT) then
if math.random(1,3) == 3 then
ent:ClearSchedule()
ent:StopMoving()
ent:AddGestureSequence( ent:LookupSequence("pick_up"), true )
ent:SetNWFloat("next_pull",7 + CurTime())
ent:SetSchedule(SCHED_WAIT_FOR_SCRIPT)
ent.Attac = true
local WPos = enemy:GetPos()
local PPos = ent:GetPos()
local Ang = WPos - PPos
Ang = Ang:Angle()
ent:SetAngles(Angle(0,Ang.yaw,Ang.roll))
local oldenemy = enemy
timer.Create("doggs_pull_start" .. ent:EntIndex(),ent:SequenceDuration( ent:LookupSequence("pick_up") )/2,1, function()
if IsValid(ent) and IsValid(oldenemy) then
local WPos = oldenemy:GetPos()
local PPos = ent:GetPos()
local Ang = WPos - PPos
Ang = Ang:Angle()
ent:SetAngles(Angle(0,Ang.yaw,Ang.roll))
ent:AddGestureSequence( ent:LookupSequence("idle_holding"), true )
ent:EmitSound("Weapon_PhysCannon.Pickup")
local vecpull = (oldenemy:IsPlayer()) and -1 or (oldenemy:GetClass()=="npc_antlionguard") and -0.1 or -0.15
local vecup = oldenemy:IsPlayer() and 700 or 500
local vecforward = (oldenemy:IsPlayer()) and 70 or (oldenemy:GetClass()=="npc_antlionguard") and 40 or 20
local plydown = (oldenemy:IsPlayer()) and -10 or 0
oldenemy:SetVelocity(Vector(0,0,vecup))
timer.Create("doggs_pull_fixvel" .. ent:EntIndex(),0.1,10, function()
if IsValid(ent) and IsValid(oldenemy) then
oldenemy:SetVelocity((oldenemy:GetPos() - (ent:GetPos() + ent:GetForward()*vecforward + Vector(0,0,-50)))*vecpull + Vector(0,0,plydown))
end
end)
Spawn_lightning(ent,oldenemy)
timer.Create("doggs_pull_stop" .. ent:EntIndex(),1.8,1, function()
if IsValid(ent) then
--ent:AddGestureSequence( ent:LookupSequence("throw"), true )
ent.Attac = false
ent:SetSchedule(SCHED_COMBAT_FACE)
end
end)
end
end)
else
ent:SetNWFloat("next_pull",7 + CurTime())
end
end
end
if !(enemy:Health() <= 0) and (ent:GetPos():Distance(enemy:GetPos()) <= (enemy:GetClass()=="npc_antlionguard" and 120 or 70)) and ent:GetNWFloat("next_attac") < CurTime() then
if !ent:IsCurrentSchedule(SCHED_WAIT_FOR_SCRIPT) then
ent:ClearSchedule()
ent:StopMoving()
if math.random(1,20) > 18 then
ent:SetNWFloat("next_attac",ent:SequenceDuration( ent:LookupSequence("pound") ) + CurTime())
ent:AddGestureSequence( ent:LookupSequence("pound"), true )
ent:SetSchedule(SCHED_WAIT_FOR_SCRIPT)
ent.Attac = true
local WPos = enemy:GetPos()
local PPos = ent:GetPos()
local Ang = WPos - PPos
Ang = Ang:Angle()
ent:SetAngles(Angle(0,Ang.yaw,Ang.roll))
timer.Create("doggs_attac" .. ent:EntIndex(),ent:SequenceDuration( ent:LookupSequence("pound") )/2.5,1, function()
if IsValid(ent) then
local hitpos = ent:GetPos() + ent:GetForward()*35
ParticleEffect( "rock_splinter_stalactite", hitpos + Vector(0,0,10),Angle(0,0,0))
local shake = ents.Create( "env_shake" )
shake:SetPos( hitpos )
shake:SetKeyValue( "amplitude", "50" )
shake:SetKeyValue( "radius", "300" )
shake:SetKeyValue( "duration", "1" )
shake:SetKeyValue( "frequency", "140" )
shake:SetKeyValue( "spawnflags", "4" )
shake:Spawn()
shake:Activate()
shake:Fire( "StartShake", "", 0 )
shake:Fire( "kill", 0, 5 )
ent:EmitSound(Sound("vehicles/v8/vehicle_impact_heavy3.wav"))
for k,v in pairs(ents.FindInSphere(ent:GetPos(),100)) do
if v != ent and !(ent:Disposition(v) == D_FR or ent:Disposition(v) == D_NU) then
local dmg = DamageInfo()
dmg:SetDamage(100)
dmg:SetDamageForce(Vector(0,0,-1000) + VectorRand()*-200)
dmg:SetDamageType(DMG_GENERIC)
dmg:SetAttacker(ent)
if v:IsPlayer() then
v:ViewPunch(Angle( math.Rand(-8,-4)*5, math.Rand(-2,2)*5, math.Rand(-2,2)*5 ) )
end
util.BlastDamageInfo( dmg, hitpos, 150 )
end
end
end
end)
timer.Create("doggs_attac_stop" .. ent:EntIndex(),ent:SequenceDuration( ent:LookupSequence("pound") ),1, function()
if IsValid(ent) then
ent.Attac = false
ent:SetSchedule(SCHED_COMBAT_FACE)
end
end)
elseif math.random(1,20) < 17 then
ent:SetNWFloat("next_attac",ent:SequenceDuration( ent:LookupSequence("throw") ) + CurTime())
ent:AddGestureSequence( ent:LookupSequence("throw"), true )
ent:SetSchedule(SCHED_WAIT_FOR_SCRIPT)
ent.Attac = true
local WPos = enemy:GetPos()
local PPos = ent:GetPos()
local Ang = WPos - PPos
Ang = Ang:Angle()
ent:SetAngles(Angle(0,Ang.yaw,Ang.roll))
ent:EmitSound(Sound("NPC_dog.Pneumatic_1"))
timer.Create("doggs_attac" .. ent:EntIndex(),ent:SequenceDuration( ent:LookupSequence("throw") )/2.5,1, function()
if IsValid(ent) and IsValid(enemy) and (ent:GetPos():Distance(enemy:GetPos()) <= (enemy:GetClass()=="npc_antlionguard" and 120 or 100)) then
local hitpos = enemy:EyePos()
ParticleEffect( "blood_impact_red_01", hitpos,Angle(0,0,0))
local dmg = DamageInfo()
dmg:SetDamage(50)
dmg:SetDamageForce(ent:GetAimVector()*(2000*10)) -- sdsd sdsdsd
dmg:SetDamageType(DMG_GENERIC)
dmg:SetAttacker(ent)
if enemy:IsPlayer() then
enemy:ViewPunch(Angle( math.Rand(8,4)*5, math.Rand(-6,6)*5, math.Rand(-6,6)*5 ) )
end
enemy:TakeDamageInfo(dmg)
enemy:EmitSound("npc/vort/foot_hit.wav")
end
end)
timer.Create("doggs_attac_stop" .. ent:EntIndex(),ent:SequenceDuration( ent:LookupSequence("throw") ),1, function()
if IsValid(ent) then
ent.Attac = false
ent:SetSchedule(SCHED_COMBAT_FACE)
end
end)
elseif math.random(1,20) == 17 or math.random(1,20) == 18 then
ent:SetNWFloat("next_attac",ent:SequenceDuration( ent:LookupSequence("wallpound") ) + CurTime())
ent:AddGestureSequence( ent:LookupSequence("wallpound"), true )
ent:SetSchedule(SCHED_WAIT_FOR_SCRIPT)
ent.Attac = true
local WPos = enemy:GetPos()
local PPos = ent:GetPos()
local Ang = WPos - PPos
Ang = Ang:Angle()
ent:SetAngles(Angle(0,Ang.yaw,Ang.roll))
timer.Create("doggs_attac1" .. ent:EntIndex(),ent:SequenceDuration( ent:LookupSequence("wallpound") )/3.2,1, function()
if IsValid(ent) and IsValid(enemy) then
if (ent:GetPos():Distance(enemy:GetPos()) <= (enemy:GetClass()=="npc_antlionguard" and 120 or 100)) then
local hitpos = enemy:EyePos()
ParticleEffect( "blood_impact_red_01", hitpos,Angle(0,0,0))
local dmg = DamageInfo()
dmg:SetDamage(50)
dmg:SetDamageForce(ent:GetAimVector()*(2000*10)) -- sdsd sdsdsd
dmg:SetDamageType(DMG_GENERIC)
dmg:SetAttacker(ent)
if enemy:IsPlayer() then
enemy:ViewPunch(Angle( math.Rand(8,4)*5, math.Rand(-6,6)*5, math.Rand(-6,6)*5 ) )
end
enemy:TakeDamageInfo(dmg)
enemy:EmitSound("npc/vort/foot_hit.wav")
local WPos = enemy:GetPos()
local PPos = ent:GetPos()
local Ang = WPos - PPos
Ang = Ang:Angle()
ent:SetAngles(Angle(0,Ang.yaw,Ang.roll))
end
end
end)
timer.Create("doggs_attac2" .. ent:EntIndex(),ent:SequenceDuration( ent:LookupSequence("wallpound") )/1.8,1, function()
if IsValid(ent) and IsValid(enemy) then
if (ent:GetPos():Distance(enemy:GetPos()) <= (enemy:GetClass()=="npc_antlionguard" and 120 or 100)) then
local hitpos = enemy:EyePos()
ParticleEffect( "blood_impact_red_01", hitpos,Angle(0,0,0))
local dmg = DamageInfo()
dmg:SetDamage(50)
dmg:SetDamageForce(ent:GetAimVector()*(2000*10)) -- sdsd sdsdsd
dmg:SetDamageType(DMG_GENERIC)
dmg:SetAttacker(ent)
if enemy:IsPlayer() then
enemy:ViewPunch(Angle( math.Rand(8,4)*5, math.Rand(-6,6)*5, math.Rand(-6,6)*5 ) )
end
enemy:TakeDamageInfo(dmg)
enemy:EmitSound("npc/vort/foot_hit.wav")
local WPos = enemy:GetPos()
local PPos = ent:GetPos()
local Ang = WPos - PPos
Ang = Ang:Angle()
ent:SetAngles(Angle(0,Ang.yaw,Ang.roll))
end
end
end)
timer.Create("doggs_attac3" .. ent:EntIndex(),ent:SequenceDuration( ent:LookupSequence("wallpound") )/1.4,1, function()
if IsValid(ent) and IsValid(enemy) then
if (ent:GetPos():Distance(enemy:GetPos()) <= (enemy:GetClass()=="npc_antlionguard" and 120 or 100)) then
local hitpos = enemy:EyePos()
ParticleEffect( "blood_impact_red_01", hitpos,Angle(0,0,0))
local dmg = DamageInfo()
dmg:SetDamage(75)
dmg:SetDamageForce(ent:GetAimVector()*(2000*12)) -- sdsd sdsdsd
dmg:SetDamageType(DMG_GENERIC)
dmg:SetAttacker(ent)
if enemy:IsPlayer() then
enemy:ViewPunch(Angle( math.Rand(8,4)*5, math.Rand(-6,6)*5, math.Rand(-6,6)*5 ) )
end
enemy:TakeDamageInfo(dmg)
enemy:EmitSound("npc/vort/foot_hit.wav")
end
end
end)
timer.Create("doggs_attac_stop" .. ent:EntIndex(),ent:SequenceDuration( ent:LookupSequence("wallpound") ),1, function()
if IsValid(ent) then
ent.Attac = false
ent:SetSchedule(SCHED_COMBAT_FACE)
end
end)
end
end
end
end
end
end)
end
end
end)
end)