162 lines
3.5 KiB
Lua
162 lines
3.5 KiB
Lua
AddCSLuaFile()
|
|
|
|
ENT.Type = "anim"
|
|
|
|
ENT.PrintName = "Spike Strip"
|
|
ENT.Author = "Luna"
|
|
ENT.Information = "Pops Tires"
|
|
ENT.Category = "[LVS]"
|
|
|
|
ENT.Spawnable = true
|
|
ENT.AdminOnly = false
|
|
|
|
ENT.RenderGroup = RENDERGROUP_BOTH
|
|
|
|
ENT.PhysicsSounds = true
|
|
|
|
if SERVER then
|
|
function ENT:SetAttacker( ent ) self._attacker = ent end
|
|
function ENT:GetAttacker() return self._attacker or self end
|
|
|
|
function ENT:SpawnFunction( ply, tr, ClassName )
|
|
if not tr.Hit then return end
|
|
|
|
local ent = ents.Create( ClassName )
|
|
ent:SetPos( tr.HitPos + tr.HitNormal )
|
|
ent:Spawn()
|
|
ent:Activate()
|
|
ent:SetAttacker( ply )
|
|
|
|
return ent
|
|
end
|
|
|
|
function ENT:OnTakeDamage( dmginfo )
|
|
end
|
|
|
|
function ENT:Initialize()
|
|
self:SetModel( "models/diggercars/shared/spikestrip_static.mdl" )
|
|
self:PhysicsInit( SOLID_VPHYSICS )
|
|
self:SetTrigger( true )
|
|
self:SetCollisionGroup( COLLISION_GROUP_WEAPON )
|
|
self:AddEFlags( EFL_NO_PHYSCANNON_INTERACTION )
|
|
end
|
|
|
|
function ENT:UpdateFold()
|
|
end
|
|
|
|
function ENT:Think()
|
|
local PhysObj = self:GetPhysicsObject()
|
|
|
|
if IsValid( PhysObj ) and PhysObj:IsMotionEnabled() then
|
|
if PhysObj:IsAsleep() then
|
|
PhysObj:EnableMotion( false )
|
|
end
|
|
end
|
|
|
|
self:UpdateFold()
|
|
|
|
self:NextThink( CurTime() )
|
|
|
|
return true
|
|
end
|
|
|
|
function ENT:Use( ply )
|
|
end
|
|
|
|
function ENT:OnRemove()
|
|
end
|
|
|
|
function ENT:PhysicsCollide( data, physobj )
|
|
end
|
|
|
|
function ENT:StartTouch( entity )
|
|
end
|
|
|
|
function ENT:EndTouch( entity )
|
|
end
|
|
|
|
function ENT:Touch( entity )
|
|
if not IsValid( entity ) or entity:GetClass() ~= "lvs_wheeldrive_wheel" then return end
|
|
|
|
local Destroy = entity:GetVelocity():Length() > 200
|
|
|
|
if not Destroy then
|
|
for i = 1,3 do
|
|
local L = self:LookupAttachment( "l"..i )
|
|
local R = self:LookupAttachment( "r"..i )
|
|
|
|
local attL = self:GetAttachment( L )
|
|
local attR = self:GetAttachment( R )
|
|
|
|
if not attL or not attR then continue end
|
|
|
|
local trace = util.TraceLine( {
|
|
start = attL.Pos,
|
|
endpos = attR.Pos,
|
|
filter = entity,
|
|
whitelist = true,
|
|
} )
|
|
|
|
if trace.Hit then
|
|
Destroy = true
|
|
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
if not Destroy then return end
|
|
|
|
local T = CurTime()
|
|
|
|
if (entity._LastSpikeStripPop or 0) > T then return end
|
|
|
|
entity._LastSpikeStripPop = T + 2
|
|
|
|
local dmginfo = DamageInfo()
|
|
dmginfo:SetDamage( entity:GetHP() )
|
|
dmginfo:SetAttacker( self:GetAttacker() )
|
|
dmginfo:SetDamageType( DMG_PREVENT_PHYSICS_FORCE )
|
|
|
|
entity:TakeDamageInfo( dmginfo )
|
|
|
|
local base = entity:GetBase()
|
|
|
|
if not IsValid( base ) then return end
|
|
|
|
local PhysObj = base:GetPhysicsObject()
|
|
|
|
if not IsValid( PhysObj ) then return end
|
|
|
|
PhysObj:ApplyTorqueCenter( Vector(0,0, PhysObj:GetVelocity():Length() * 100 * (PhysObj:GetAngleVelocity().z > 0 and 1 or -1) ) )
|
|
end
|
|
|
|
return
|
|
end
|
|
|
|
function ENT:Think()
|
|
end
|
|
|
|
function ENT:Draw( flags )
|
|
self:DrawModel( flags )
|
|
end
|
|
|
|
local spritemat = Material( "sprites/light_glow02_add" )
|
|
local spritecolor = Color( 255, 93, 0, 255)
|
|
|
|
function ENT:DrawTranslucent( flags )
|
|
self:DrawModel( flags )
|
|
|
|
local size1 = 16 * (math.abs( math.cos( CurTime() * 4 ) ) ^ 10)
|
|
local size2 = 16 * (math.abs( math.sin( CurTime() * 4 ) ) ^ 10)
|
|
|
|
render.SetMaterial( spritemat )
|
|
render.DrawSprite( self:LocalToWorld( Vector(8,-116.5,10) ), size1, size1, spritecolor )
|
|
render.DrawSprite( self:LocalToWorld( Vector(-7,-116.5,10) ), size2, size2, spritecolor )
|
|
render.DrawSprite( self:LocalToWorld( Vector(8,118,10) ), size2, size2, spritecolor )
|
|
render.DrawSprite( self:LocalToWorld( Vector(-7,118,10) ), size1, size1, spritecolor )
|
|
end
|
|
|
|
function ENT:OnRemove()
|
|
end
|