202 lines
4.3 KiB
Lua
202 lines
4.3 KiB
Lua
AddCSLuaFile()
|
|
|
|
ENT.Type = "anim"
|
|
ENT.DoNotDuplicate = true
|
|
|
|
function ENT:SetupDataTables()
|
|
self:NetworkVar( "Entity",0, "Base" )
|
|
end
|
|
|
|
if SERVER then
|
|
function ENT:AddToGibList( ent )
|
|
if not istable( self._GibList ) then self._GibList = {} end
|
|
|
|
table.insert( self._GibList, ent )
|
|
end
|
|
|
|
function ENT:GetGibList()
|
|
return self._GibList or {}
|
|
end
|
|
|
|
function ENT:SpawnGib( LeftOrRight )
|
|
local base = self:GetBase()
|
|
|
|
local options = {
|
|
[LVS.WHEELTYPE_LEFT] = "left",
|
|
[LVS.WHEELTYPE_RIGHT] = "right"
|
|
}
|
|
|
|
local side = options[ LeftOrRight ]
|
|
|
|
if not side or not IsValid( base ) or not istable( base.TrackGibs ) or not base.TrackGibs[ side ] then return end
|
|
|
|
local vel = self:GetVelocity()
|
|
|
|
for _, data in pairs( base.TrackGibs[ side ] ) do
|
|
local IsRagdoll = util.IsValidRagdoll( data.mdl )
|
|
|
|
local class = IsRagdoll and "prop_ragdoll" or "prop_physics"
|
|
|
|
local ent = ents.Create( class )
|
|
|
|
if not IsValid( ent ) then continue end
|
|
|
|
ent:SetModel( data.mdl )
|
|
ent:SetPos( self:LocalToWorld( data.pos ) )
|
|
ent:SetAngles( self:LocalToWorldAngles( data.ang ) )
|
|
ent:Spawn()
|
|
ent:Activate()
|
|
ent:SetCollisionGroup( COLLISION_GROUP_DEBRIS )
|
|
|
|
ent:EmitSound("lvs/tracks_break"..math.random(1,3)..".wav")
|
|
|
|
if IsRagdoll then
|
|
for i = 1, (ent:GetPhysicsObjectCount() - 1) do
|
|
local bone = ent:GetPhysicsObjectNum( i )
|
|
|
|
if not IsValid( bone ) then continue end
|
|
|
|
bone:AddVelocity( vel )
|
|
end
|
|
else
|
|
local PhysObj = ent:GetPhysicsObject()
|
|
|
|
if IsValid( PhysObj ) then
|
|
PhysObj:AddVelocity( vel )
|
|
end
|
|
end
|
|
|
|
self:DeleteOnRemove( ent )
|
|
|
|
self:AddToGibList( ent )
|
|
|
|
timer.Simple( 59.5, function()
|
|
if not IsValid( ent ) then return end
|
|
|
|
ent:SetRenderMode( RENDERMODE_TRANSCOLOR )
|
|
ent:SetRenderFX( kRenderFxFadeFast )
|
|
end )
|
|
|
|
timer.Simple( 60, function()
|
|
if not IsValid( ent ) then return end
|
|
|
|
ent:Remove()
|
|
end )
|
|
end
|
|
end
|
|
|
|
function ENT:ClearGib()
|
|
local Gibs = self:GetGibList()
|
|
|
|
for _, ent in pairs( Gibs ) do
|
|
if not IsValid( ent ) then continue end
|
|
|
|
ent:Remove()
|
|
end
|
|
|
|
table.Empty( Gibs )
|
|
end
|
|
|
|
function ENT:Initialize()
|
|
self:SetUseType( SIMPLE_USE )
|
|
self:PhysicsInit( SOLID_VPHYSICS )
|
|
self:AddEFlags( EFL_NO_PHYSCANNON_INTERACTION )
|
|
|
|
-- this is so vj npcs can still see us
|
|
self:AddEFlags( EFL_DONTBLOCKLOS )
|
|
|
|
self:SetCollisionGroup( COLLISION_GROUP_WORLD )
|
|
self:DrawShadow( false )
|
|
|
|
self:SetMaterial( "models/wireframe" )
|
|
|
|
local PhysObj = self:GetPhysicsObject()
|
|
|
|
if not IsValid( PhysObj ) then return end
|
|
|
|
PhysObj:SetMass( 1 )
|
|
PhysObj:EnableDrag( false )
|
|
PhysObj:EnableGravity( false )
|
|
PhysObj:EnableMotion( true )
|
|
PhysObj:SetMaterial( "friction_00" )
|
|
end
|
|
|
|
function ENT:Think()
|
|
return false
|
|
end
|
|
|
|
function ENT:OnTakeDamage( dmginfo )
|
|
local base = self:GetBase()
|
|
|
|
if not IsValid( base ) then return end
|
|
|
|
local Force = dmginfo:GetDamageForce()
|
|
local fLength = Force:Length()
|
|
|
|
-- translate force value to armor penetration value is Force * 0.1
|
|
-- mm to inch is * 0.0393701
|
|
-- so correct value is * 0.00393701
|
|
local pLength = fLength * 0.00393701
|
|
|
|
local startpos = dmginfo:GetDamagePosition()
|
|
local endpos = startpos + Force:GetNormalized() * pLength
|
|
|
|
local trace = util.TraceLine( {
|
|
start = startpos,
|
|
endpos = endpos,
|
|
whitelist = true,
|
|
ignoreworld = true,
|
|
filter = base,
|
|
} )
|
|
|
|
if trace.Hit then
|
|
dmginfo:SetDamagePosition( trace.HitPos )
|
|
else
|
|
dmginfo:SetDamageType( dmginfo:GetDamageType() + DMG_PREVENT_PHYSICS_FORCE )
|
|
end
|
|
|
|
base:OnTakeDamage( dmginfo )
|
|
end
|
|
|
|
function ENT:PhysicsCollide( data, physobj )
|
|
local HitEntity = data.HitEntity
|
|
local HitObject = data.HitObject
|
|
|
|
if not IsValid( HitEntity ) or not IsValid( HitObject ) then return end
|
|
|
|
physobj:SetVelocityInstantaneous( data.OurOldVelocity )
|
|
|
|
if HitObject:IsMotionEnabled() and (HitEntity:GetClass() == "prop_ragdoll" or HitEntity:GetCollisionGroup() == COLLISION_GROUP_WEAPON) then
|
|
HitObject:SetVelocityInstantaneous( data.OurOldVelocity * 2 )
|
|
end
|
|
end
|
|
|
|
function ENT:Use( ply )
|
|
if (ply._lvsNextUse or 0) > CurTime() then return end
|
|
|
|
local base = self:GetBase()
|
|
|
|
if not IsValid( base ) then return end
|
|
|
|
base:Use( ply )
|
|
end
|
|
|
|
function ENT:OnRemove()
|
|
self:ClearGib()
|
|
end
|
|
|
|
return
|
|
end
|
|
|
|
function ENT:Draw()
|
|
if not LVS.DeveloperEnabled then return end
|
|
|
|
self:DrawModel()
|
|
end
|
|
|
|
function ENT:Think()
|
|
end
|
|
|
|
function ENT:OnRemove()
|
|
end
|