mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
Upload
This commit is contained in:
314
lua/entities/gmod_sent_vehicle_fphysics_base/damage.lua
Normal file
314
lua/entities/gmod_sent_vehicle_fphysics_base/damage.lua
Normal file
@@ -0,0 +1,314 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
ENT.DSArmorDamageReduction = 1
|
||||
ENT.DSArmorDamageReductionType = DMG_GENERIC
|
||||
|
||||
ENT.DSArmorIgnoreDamageType = DMG_GENERIC
|
||||
|
||||
function ENT:ApplyDamage( damage, type )
|
||||
if type == DMG_BLAST then
|
||||
damage = damage * 10
|
||||
end
|
||||
|
||||
if type == DMG_BULLET then
|
||||
damage = damage * 2
|
||||
end
|
||||
|
||||
local MaxHealth = self:GetMaxHealth()
|
||||
local CurHealth = self:GetCurHealth()
|
||||
|
||||
local NewHealth = math.max( math.Round(CurHealth - damage,0) , 0 )
|
||||
|
||||
if NewHealth <= (MaxHealth * 0.6) then
|
||||
if NewHealth <= (MaxHealth * 0.3) then
|
||||
self:SetOnFire( true )
|
||||
self:SetOnSmoke( false )
|
||||
else
|
||||
self:SetOnSmoke( true )
|
||||
end
|
||||
end
|
||||
|
||||
if MaxHealth > 30 and NewHealth <= 31 then
|
||||
if self:EngineActive() then
|
||||
self:DamagedStall()
|
||||
end
|
||||
end
|
||||
|
||||
if NewHealth <= 0 then
|
||||
|
||||
self:ExplodeVehicle()
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
self:SetCurHealth( NewHealth )
|
||||
end
|
||||
|
||||
function ENT:OnTakeDamage( dmginfo )
|
||||
if not self:IsInitialized() then return end
|
||||
|
||||
if dmginfo:IsDamageType( self.DSArmorIgnoreDamageType ) then return end
|
||||
|
||||
if dmginfo:IsDamageType( self.DSArmorDamageReductionType ) then
|
||||
if dmginfo:GetDamage() ~= 0 then
|
||||
dmginfo:ScaleDamage( self.DSArmorDamageReduction )
|
||||
|
||||
dmginfo:SetDamage( math.max(dmginfo:GetDamage(),1) )
|
||||
end
|
||||
end
|
||||
|
||||
if dmginfo:IsDamageType( DMG_BLAST ) then
|
||||
local Inflictor = dmginfo:GetInflictor()
|
||||
|
||||
if IsValid( Inflictor ) and isfunction( Inflictor.GetEntityFilter ) then
|
||||
for ents, _ in pairs( Inflictor:GetEntityFilter() ) do
|
||||
if ents == self then return end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local dmgPartsTableOK = true
|
||||
|
||||
if istable( self._dmgParts ) then
|
||||
for _, part in pairs( self._dmgParts ) do
|
||||
if isvector( part.mins ) and isvector( part.maxs ) and isvector( part.pos ) and isangle( part.ang ) then continue end
|
||||
|
||||
dmgPartsTableOK = false
|
||||
|
||||
break
|
||||
end
|
||||
else
|
||||
dmgPartsTableOK = false
|
||||
end
|
||||
|
||||
local CriticalHit = false
|
||||
|
||||
if dmgPartsTableOK then
|
||||
CriticalHit = self:CalcComponentDamage( dmginfo )
|
||||
else
|
||||
print("[LVS] - "..self:GetSpawn_List().." is doing something it shouldn't! DS part has been detected but was registered incorrectly!")
|
||||
end
|
||||
|
||||
if hook.Run( "simfphysOnTakeDamage", self, dmginfo ) then return end
|
||||
|
||||
local Damage = dmginfo:GetDamage()
|
||||
local DamagePos = dmginfo:GetDamagePosition()
|
||||
local Type = dmginfo:GetDamageType()
|
||||
local Driver = self:GetDriver()
|
||||
|
||||
self.LastAttacker = dmginfo:GetAttacker()
|
||||
self.LastInflictor = dmginfo:GetInflictor()
|
||||
|
||||
if simfphys.DamageEnabled then
|
||||
net.Start( "simfphys_spritedamage" )
|
||||
net.WriteEntity( self )
|
||||
net.WriteVector( self:WorldToLocal( DamagePos ) )
|
||||
net.WriteBool( false )
|
||||
net.Broadcast()
|
||||
|
||||
if Type == DMG_AIRBOAT then
|
||||
Type = DMG_DIRECT
|
||||
Damage = Damage * 6
|
||||
end
|
||||
|
||||
local oldHP = self:GetCurHealth()
|
||||
|
||||
self:ApplyDamage( Damage, Type )
|
||||
|
||||
local newHP = self:GetCurHealth()
|
||||
|
||||
if oldHP ~= newHP then
|
||||
local IsFireDamage = dmginfo:IsDamageType( DMG_BURN )
|
||||
|
||||
if IsValid( self.LastAttacker ) and self.LastAttacker:IsPlayer() and not IsFireDamage then
|
||||
net.Start( "lvs_hitmarker" )
|
||||
net.WriteBool( CriticalHit )
|
||||
net.Send( self.LastAttacker )
|
||||
end
|
||||
|
||||
if Damage > 1 and not IsFireDamage then
|
||||
net.Start( "lvs_hurtmarker" )
|
||||
net.WriteFloat( math.min( Damage / 50, 1 ) )
|
||||
net.Send( self:GetEveryone() )
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:ExplodeVehicle()
|
||||
if not IsValid( self ) then return end
|
||||
|
||||
if self.destroyed then return end
|
||||
|
||||
self.destroyed = true
|
||||
|
||||
local Attacker = self.LastAttacker
|
||||
|
||||
if IsValid( Attacker ) and Attacker:IsPlayer() then
|
||||
net.Start( "lvs_killmarker" )
|
||||
net.Send( Attacker )
|
||||
end
|
||||
|
||||
local GibMDL = self.GibModels
|
||||
self.GibModels = nil
|
||||
|
||||
self:OnFinishExplosion()
|
||||
|
||||
self.GibModels = GibMDL
|
||||
GibMDL = nil
|
||||
|
||||
local ply = self.EntityOwner
|
||||
local skin = self:GetSkin()
|
||||
local Col = self:GetColor()
|
||||
Col.r = Col.r * 0.8
|
||||
Col.g = Col.g * 0.8
|
||||
Col.b = Col.b * 0.8
|
||||
|
||||
local Driver = self:GetDriver()
|
||||
if IsValid( Driver ) then
|
||||
if self.RemoteDriver ~= Driver then
|
||||
local dmginfo = DamageInfo()
|
||||
dmginfo:SetDamage( Driver:Health() + Driver:Armor() )
|
||||
dmginfo:SetAttacker( self.LastAttacker or game.GetWorld() )
|
||||
dmginfo:SetInflictor( self.LastInflictor or game.GetWorld() )
|
||||
dmginfo:SetDamageType( DMG_DIRECT )
|
||||
|
||||
Driver:TakeDamageInfo( dmginfo )
|
||||
end
|
||||
end
|
||||
|
||||
if self.PassengerSeats then
|
||||
for i = 1, table.Count( self.PassengerSeats ) do
|
||||
local Passenger = self.pSeat[i]:GetDriver()
|
||||
if IsValid( Passenger ) then
|
||||
local dmginfo = DamageInfo()
|
||||
dmginfo:SetDamage( Passenger:Health() + Passenger:Armor() )
|
||||
dmginfo:SetAttacker( self.LastAttacker or game.GetWorld() )
|
||||
dmginfo:SetInflictor( self.LastInflictor or game.GetWorld() )
|
||||
dmginfo:SetDamageType( DMG_DIRECT )
|
||||
|
||||
Passenger:TakeDamageInfo( dmginfo )
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if self.GibModels then
|
||||
local bprop = ents.Create( "gmod_sent_vehicle_fphysics_gib" )
|
||||
bprop:SetModel( self.GibModels[1] )
|
||||
bprop:SetPos( self:GetPos() )
|
||||
bprop:SetAngles( self:GetAngles() )
|
||||
bprop.MakeSound = true
|
||||
bprop:Spawn()
|
||||
bprop:Activate()
|
||||
bprop:GetPhysicsObject():SetVelocity( self:GetVelocity() + Vector(math.random(-5,5),math.random(-5,5),math.random(150,250)) )
|
||||
bprop:GetPhysicsObject():SetMass( self.Mass * 0.75 )
|
||||
bprop.DoNotDuplicate = true
|
||||
bprop:SetColor( Col )
|
||||
bprop:SetSkin( skin )
|
||||
|
||||
self.Gib = bprop
|
||||
|
||||
simfphys.SetOwner( ply , bprop )
|
||||
|
||||
if IsValid( ply ) then
|
||||
undo.Create( "Gib" )
|
||||
undo.SetPlayer( ply )
|
||||
undo.AddEntity( bprop )
|
||||
undo.SetCustomUndoText( "Undone Gib" )
|
||||
undo.Finish( "Gib" )
|
||||
ply:AddCleanup( "Gibs", bprop )
|
||||
end
|
||||
|
||||
bprop.Gibs = {}
|
||||
for i = 2, table.Count( self.GibModels ) do
|
||||
local prop = ents.Create( "gmod_sent_vehicle_fphysics_gib" )
|
||||
prop:SetModel( self.GibModels[i] )
|
||||
prop:SetPos( self:GetPos() )
|
||||
prop:SetAngles( self:GetAngles() )
|
||||
prop:SetOwner( bprop )
|
||||
prop:Spawn()
|
||||
prop:Activate()
|
||||
prop.DoNotDuplicate = true
|
||||
bprop:DeleteOnRemove( prop )
|
||||
bprop.Gibs[i-1] = prop
|
||||
|
||||
local PhysObj = prop:GetPhysicsObject()
|
||||
if IsValid( PhysObj ) then
|
||||
PhysObj:SetVelocityInstantaneous( VectorRand() * 500 + self:GetVelocity() + Vector(0,0,math.random(150,250)) )
|
||||
PhysObj:AddAngleVelocity( VectorRand() )
|
||||
end
|
||||
|
||||
|
||||
simfphys.SetOwner( ply , prop )
|
||||
end
|
||||
else
|
||||
|
||||
local bprop = ents.Create( "gmod_sent_vehicle_fphysics_gib" )
|
||||
bprop:SetModel( self:GetModel() )
|
||||
bprop:SetPos( self:GetPos() )
|
||||
bprop:SetAngles( self:GetAngles() )
|
||||
bprop.MakeSound = true
|
||||
bprop:Spawn()
|
||||
bprop:Activate()
|
||||
bprop:GetPhysicsObject():SetVelocity( self:GetVelocity() + Vector(math.random(-5,5),math.random(-5,5),math.random(150,250)) )
|
||||
bprop:GetPhysicsObject():SetMass( self.Mass * 0.75 )
|
||||
bprop.DoNotDuplicate = true
|
||||
bprop:SetColor( Col )
|
||||
bprop:SetSkin( skin )
|
||||
for i = 0, self:GetNumBodyGroups() do
|
||||
bprop:SetBodygroup(i, self:GetBodygroup(i))
|
||||
end
|
||||
|
||||
self.Gib = bprop
|
||||
|
||||
simfphys.SetOwner( ply , bprop )
|
||||
|
||||
if IsValid( ply ) then
|
||||
undo.Create( "Gib" )
|
||||
undo.SetPlayer( ply )
|
||||
undo.AddEntity( bprop )
|
||||
undo.SetCustomUndoText( "Undone Gib" )
|
||||
undo.Finish( "Gib" )
|
||||
ply:AddCleanup( "Gibs", bprop )
|
||||
end
|
||||
|
||||
if self.CustomWheels == true and not self.NoWheelGibs then
|
||||
bprop.Wheels = {}
|
||||
for i = 1, table.Count( self.GhostWheels ) do
|
||||
local Wheel = self.GhostWheels[i]
|
||||
if IsValid(Wheel) then
|
||||
local prop = ents.Create( "gmod_sent_vehicle_fphysics_gib" )
|
||||
prop:SetModel( Wheel:GetModel() )
|
||||
prop:SetPos( Wheel:LocalToWorld( Vector(0,0,0) ) )
|
||||
prop:SetAngles( Wheel:LocalToWorldAngles( Angle(0,0,0) ) )
|
||||
prop:SetOwner( bprop )
|
||||
prop:Spawn()
|
||||
prop:Activate()
|
||||
prop:GetPhysicsObject():SetVelocity( self:GetVelocity() + Vector(math.random(-5,5),math.random(-5,5),math.random(0,25)) )
|
||||
prop:GetPhysicsObject():SetMass( 20 )
|
||||
prop.DoNotDuplicate = true
|
||||
bprop:DeleteOnRemove( prop )
|
||||
bprop.Wheels[i] = prop
|
||||
|
||||
simfphys.SetOwner( ply , prop )
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
self:Extinguish()
|
||||
|
||||
self:OnDestroyed()
|
||||
|
||||
hook.Run( "simfphysOnDestroyed", self, self.Gib )
|
||||
|
||||
self:Remove()
|
||||
end
|
||||
Reference in New Issue
Block a user