AddCSLuaFile( "cl_init.lua" ) AddCSLuaFile( "shared.lua" ) include('shared.lua') function ENT:Initialize() self:SetModel( self.partmdl ) self:PhysicsInit( SOLID_VPHYSICS ) self:SetMoveType( MOVETYPE_VPHYSICS ) self:SetSolid( SOLID_VPHYSICS ) self:SetCollisionGroup( COLLISION_GROUP_NONE ) local phys = self:GetPhysicsObject() if not IsValid( phys ) then return end phys:SetMass(50); phys:EnableMotion( true ) self:DrawShadow(false) if self.hp != nil then self:SetHealth(self.hp) else self:SetHealth(250) end if self.removeweld == nil then self.removeweld = true end if self.submaterial == nil then self.submaterial = false end if self.FlexDamagePos == nil then self.FlexDamagePos = false end self:EnableCustomCollisions() self:SetCustomCollisionCheck( true ) constraint.NoCollide( self, self:GetOwner(), 0, 0 ) for k, ent in pairs(ents.GetAll()) do if ent.Base == "dk_damaged_parts_flex_base" or ent.Base == "dk_damaged_parts_base" or ent:IsNPC() then constraint.NoCollide( self, ent, 0, 0 ) end end end local glassimpact = Sound( "Glass.BulletImpact" ) function ENT:PhysicsCollide( data, phys ) local speed = data.Speed local kmh = math.Round(speed * 0.09144,0) if ( kmh >= 30 ) then local d = DamageInfo() d:SetDamage( kmh/20 ) d:SetAttacker( self ) d:SetDamagePosition( data.HitPos ) d:SetDamageType( DMG_DISSOLVE ) self:TakeDamageInfo( d ) end end function ENT:TestCollision() return end function ENT:OnTakeDamage( dmg ) self:TakePhysicsDamage( dmg ) local Damage = dmg:GetDamage() local flex_rand = math.random(0,self.flexmax) if self:Health() <= 0 then if self.removeweld then constraint.RemoveAll( self ) timer.Simple(120, function() if IsValid(self) then self:Remove() end end) end else self:SetHealth(self:Health()-Damage) end if self.submaterial then if self:GetFlexWeight(0) >= 0.5 or self:GetFlexWeight(1) >= 0.5 or self:GetFlexWeight(2) >= 0.5 then self:SetSubMaterial(self.matid,self.matstring) end end if self.FlexDamagePos then local hitpos = self:WorldToLocal(dmg:GetDamagePosition()) local boxmin, boxmax = self.FlexDamageVecMin, self.FlexDamageVecMax if hitpos:WithinAABox(boxmin, boxmax) then if self:GetFlexWeight(0) < 1 then if Damage <= 1 then self:SetFlexWeight( 0, self:GetFlexWeight(0)+Damage) else self:SetFlexWeight( 0, self:GetFlexWeight(0)+Damage/100) end end end if self.flexmax >= 1 then local boxmin1, boxmax1 = self.FlexDamageVecMin1, self.FlexDamageVecMax1 if hitpos:WithinAABox(boxmin1, boxmax1) then if self:GetFlexWeight(1) < 1 then if Damage <= 1 then self:SetFlexWeight( 1, self:GetFlexWeight(1)+Damage) else self:SetFlexWeight( 1, self:GetFlexWeight(1)+Damage/100) end end end end if self.flexmax >= 2 then local boxmin2, boxmax2 = self.FlexDamageVecMin2, self.FlexDamageVecMax2 if hitpos:WithinAABox(boxmin2, boxmax2) then if self:GetFlexWeight(2) < 1 then if Damage <= 1 then self:SetFlexWeight( 2, self:GetFlexWeight(2)+Damage) else self:SetFlexWeight( 2, self:GetFlexWeight(2)+Damage/100) end end end end else if self:GetFlexWeight(flex_rand) < 1 then if Damage <= 1 then self:SetFlexWeight( flex_rand, self:GetFlexWeight(flex_rand)+Damage) elseif Damage/2 <= 1 then self:SetFlexWeight( flex_rand, self:GetFlexWeight(flex_rand)+Damage/10) else self:SetFlexWeight( flex_rand, self:GetFlexWeight(flex_rand)+Damage/20) end end end --self:SetBodygroup( 0,self:GetBodygroup(0)+1 ) --sound.Play(glassimpact, Vector(0,0,0), 75) end function ENT:Think() end function ENT:SpawnFunction( ply, tr, ClassName ) if ( !tr.Hit ) then return end local SpawnPos = tr.HitPos + tr.HitNormal * 1 local ent = ents.Create( ClassName ) ent:SetPos( SpawnPos ) ent:Spawn() return ent end