add sborka
This commit is contained in:
@@ -0,0 +1,201 @@
|
||||
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
|
||||
Reference in New Issue
Block a user