AddCSLuaFile( "cl_init.lua" )
AddCSLuaFile( "shared.lua" )
include( 'shared.lua' )
ENT.radius = 100
ENT.mode = 1
ENT.nextUseTime = CurTime()
ENT.ents = {}
function ENT:SpawnFunction( ply, tr )
if ( !tr.Hit ) then return end
local SpawnPos = tr.HitPos + tr.HitNormal * 16
local ent = ents.Create( "sent_lowgrav" )
ent:SetPos( SpawnPos )
ent:Spawn()
ent:Activate()
return ent
end
/*---------------------------------------------------------
Name: Initialize
---------------------------------------------------------*/
function ENT:Initialize()
// Use the helibomb model just for the shadow (because it's about the same size)
self.Entity:SetModel( "models/Combine_Helicopter/helicopter_bomb01.mdl" )
// Don't use the model's physics - create a sphere instead
self.Entity:PhysicsInitSphere( 16, "metal_bouncy" )
// Wake the physics object up. It's time to have fun!
local phys = self.Entity:GetPhysicsObject()
if (phys:IsValid()) then
phys:Wake()
end
// Set collision bounds exactly
self.Entity:SetCollisionBounds( Vector( -16, -16, -16 ), Vector( 16, 16, 16 ) )
end
/*---------------------------------------------------------
Name: PhysicsCollide
---------------------------------------------------------*/
function ENT:PhysicsCollide( data, physobj )
// Play sound on bounce
if (data.Speed > 80 && data.DeltaTime > 0.2 ) then
self.Entity:EmitSound( "Rubber.BulletImpact" )
end
// Bounce like a crazy bitch
local LastSpeed = data.OurOldVelocity:Length()
local NewVelocity = physobj:GetVelocity()
NewVelocity:Normalize()
LastSpeed = math.max( NewVelocity:Length(), LastSpeed )
local TargetVelocity = NewVelocity * LastSpeed * 0.9
physobj:SetVelocity( TargetVelocity )
end
/*---------------------------------------------------------
Name: OnTakeDamage
---------------------------------------------------------*/
function ENT:OnTakeDamage( dmginfo )
// React physically when shot/getting blown
self.Entity:TakePhysicsDamage( dmginfo )
end
/*---------------------------------------------------------
Name: Use
---------------------------------------------------------*/
function ENT:Use( activator, caller )
if ( activator:IsPlayer() ) then
if self.nextUseTime > CurTime() then return end
self.nextUseTime = CurTime()+0.2
if self.mode == 0 then
activator:PrintMessage(3, "Mode: Disable Gravity")
self.mode = 1
elseif self.mode == 1 then
activator:PrintMessage(3, "Mode: Enable Gravity")
self.mode = 0
end
end
end
function ENT:IsInTable(Table, WhatToFind)
local Return = false
for k,v in pairs(Table) do
if v == WhatToFind then
Return = true
end
end
return Return
end
function ENT:Check()
local find = ents.FindInSphere(self.Entity:GetPos(),self.radius)
for k,v in pairs( self.ents ) do
if not self:IsInTable(find, v) then
if v and v:IsValid() then
local phys = v:GetPhysicsObject();
if phys:IsValid() then
phys:EnableGravity( true )
phys:Wake()
end
end
table.remove(self.ents,k)
end
end
end
function ENT:OnRemove()
for k,v in pairs( self.ents ) do
if v and v:IsValid() then
local phys = v:GetPhysicsObject()
if phys:IsValid() then
phys:EnableGravity(true)
phys:Wake();
end
end
end
end
function ENT:Think()
self:Check()
local find = ents.FindInSphere( self.Entity:GetPos(), self.radius )
for k,v in pairs( find ) do
local entphys = v:GetPhysicsObject();
if entphys:IsValid() then
if self.mode == 1 then
self.Entity:GetPhysicsObject():EnableGravity( false )
self.Entity:GetPhysicsObject():Wake()
if self.ents[k] != v and tostring(v:GetClass()) != "sent_lowgrav" and tostring(v:GetClass()) != "player" then
self.ents[k] = v
end
if tostring(v:GetClass( )) != "sent_lowgrav" and tostring(v:GetClass()) != "player" then
entphys:EnableGravity( false )
entphys:Wake()
end
elseif self.mode == 0 then
self.Entity:GetPhysicsObject():EnableGravity( true )
self.Entity:GetPhysicsObject():Wake()
if tostring(v:GetClass( )) != "sent_lowgrav" and tostring(v:GetClass()) != "player" then
entphys:EnableGravity( true )
entphys:Wake()
end
end
end
end
end