add sborka
This commit is contained in:
196
garrysmod/addons/lvs_base/lua/entities/lvs_item_smoke.lua
Normal file
196
garrysmod/addons/lvs_base/lua/entities/lvs_item_smoke.lua
Normal file
@@ -0,0 +1,196 @@
|
||||
AddCSLuaFile()
|
||||
|
||||
ENT.Type = "anim"
|
||||
|
||||
ENT.PrintName = "Smoke"
|
||||
ENT.Author = "Luna"
|
||||
ENT.Category = "[LVS]"
|
||||
|
||||
ENT.Spawnable = false
|
||||
ENT.AdminOnly = false
|
||||
|
||||
function ENT:SetupDataTables()
|
||||
self:NetworkVar( "Bool",0, "Active" )
|
||||
|
||||
self:NetworkVar( "Float",0, "Radius" )
|
||||
|
||||
self:NetworkVar( "Float",1, "LifeTime" )
|
||||
|
||||
if SERVER then
|
||||
self:SetLifeTime( 30 )
|
||||
self:SetRadius( 1000 )
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:GetMins()
|
||||
local Radius = self:GetRadius()
|
||||
|
||||
return Vector(-Radius,-Radius,-Radius)
|
||||
end
|
||||
|
||||
function ENT:GetMaxs()
|
||||
local Radius = self:GetRadius()
|
||||
|
||||
return Vector(Radius,Radius,Radius)
|
||||
end
|
||||
|
||||
if SERVER then
|
||||
function ENT:SpawnFunction( ply, tr, ClassName )
|
||||
if not tr.Hit then return end
|
||||
|
||||
local ent = ents.Create( ClassName )
|
||||
ent:SetPos( tr.HitPos + tr.HitNormal * 5 )
|
||||
ent:Spawn()
|
||||
ent:Activate()
|
||||
|
||||
return ent
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
self:SetModel( "models/Items/grenadeAmmo.mdl" )
|
||||
|
||||
self:PhysicsInit( SOLID_VPHYSICS )
|
||||
self:SetMoveType( MOVETYPE_VPHYSICS )
|
||||
self:SetSolid( SOLID_VPHYSICS )
|
||||
self:SetRenderMode( RENDERMODE_TRANSALPHA )
|
||||
self:SetCollisionGroup( COLLISION_GROUP_DEBRIS )
|
||||
|
||||
self.TrailEntity = util.SpriteTrail( self, 0, Color(120,120,120,120), false, 5, 40, 0.2, 1 / ( 15 + 1 ) * 0.5, "trails/smoke" )
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
local T = CurTime()
|
||||
|
||||
self:NextThink( T + 1 )
|
||||
|
||||
if not self.RemoveTime then return true end
|
||||
|
||||
if self.RemoveTime < T then
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function ENT:Enable()
|
||||
if self:GetActive() then return end
|
||||
|
||||
self.RemoveTime = CurTime() + self:GetLifeTime()
|
||||
|
||||
self:SetActive( true )
|
||||
|
||||
self:EmitSound("weapons/flaregun/fire.wav", 65, 100, 0.5)
|
||||
|
||||
if IsValid( self.TrailEntity ) then
|
||||
self.TrailEntity:Remove()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:PhysicsCollide( data, physobj )
|
||||
self:Enable()
|
||||
|
||||
if data.Speed > 60 and data.DeltaTime > 0.2 then
|
||||
local VelDif = data.OurOldVelocity:Length() - data.OurNewVelocity:Length()
|
||||
|
||||
if VelDif > 200 then
|
||||
self:EmitSound( "Grenade.ImpactHard" )
|
||||
else
|
||||
self:EmitSound( "Grenade.ImpactSoft" )
|
||||
end
|
||||
|
||||
physobj:SetVelocity( data.OurOldVelocity * 0.5 )
|
||||
end
|
||||
end
|
||||
else
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
end
|
||||
|
||||
function ENT:StartSound()
|
||||
if self.snd then return self.snd end
|
||||
|
||||
self.snd = CreateSound( self, "weapons/flaregun/burn.wav" )
|
||||
self.snd:PlayEx(1,100)
|
||||
|
||||
return self.snd
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
local T = CurTime()
|
||||
|
||||
if not self:GetActive() then self.DieTime = T + self:GetLifeTime() return end
|
||||
|
||||
local volume = ((self.DieTime or 0) - T) / self:GetLifeTime()
|
||||
local snd = self:StartSound()
|
||||
snd:ChangeVolume( volume, 0.5 )
|
||||
|
||||
self.RemovedEnts = self.RemovedEnts or {}
|
||||
|
||||
local plyPos = LocalPlayer():GetPos()
|
||||
local pos = self:GetPos()
|
||||
|
||||
if (plyPos - pos):Length() < self:GetRadius() then
|
||||
for id, ent in pairs( LVS:GetVehicles() ) do
|
||||
LVS:GetVehicles()[ id ] = nil
|
||||
table.insert( self.RemovedEnts, ent )
|
||||
end
|
||||
else
|
||||
local Mins = self:GetMins()
|
||||
local Maxs = self:GetMaxs()
|
||||
|
||||
for id, ent in pairs( LVS:GetVehicles() ) do
|
||||
local pDelta = ent:GetPos() - plyPos
|
||||
local HitPos, HitNormal, Fraction = util.IntersectRayWithOBB( plyPos, pDelta, pos, angle_zero, Mins, Maxs )
|
||||
|
||||
if HitPos then
|
||||
LVS:GetVehicles()[ id ] = nil
|
||||
|
||||
table.insert( self.RemovedEnts, ent )
|
||||
end
|
||||
end
|
||||
|
||||
for id, ent in pairs( self.RemovedEnts ) do
|
||||
if not IsValid( ent ) then
|
||||
self.RemovedEnts[ id ] = nil
|
||||
|
||||
continue
|
||||
end
|
||||
|
||||
local pDelta = ent:GetPos() - plyPos
|
||||
local HitPos, HitNormal, Fraction = util.IntersectRayWithOBB( plyPos, pDelta, pos, angle_zero, Mins, Maxs )
|
||||
|
||||
if not HitPos then
|
||||
self.RemovedEnts[ id ] = nil
|
||||
table.insert( LVS:GetVehicles(), ent )
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin( self:GetPos() )
|
||||
util.Effect( "lvs_defence_smoke", effectdata, true, true )
|
||||
|
||||
self:SetNextClientThink( T + 0.2 )
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
self.RemovedEnts = self.RemovedEnts or {}
|
||||
|
||||
for id, ent in pairs( self.RemovedEnts ) do
|
||||
self.RemovedEnts[ id ] = nil
|
||||
|
||||
if not IsValid( ent ) then
|
||||
continue
|
||||
end
|
||||
|
||||
table.insert( LVS:GetVehicles(), ent )
|
||||
end
|
||||
|
||||
if not self.snd then return end
|
||||
|
||||
self.snd:Stop()
|
||||
self.snd = nil
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user