152 lines
3.0 KiB
Lua
152 lines
3.0 KiB
Lua
AddCSLuaFile()
|
|
|
|
ENT.Type = "anim"
|
|
|
|
ENT.PrintName = "Ammo"
|
|
ENT.Author = "Luna"
|
|
ENT.Category = "[LVS]"
|
|
|
|
ENT.Spawnable = true
|
|
ENT.AdminOnly = false
|
|
|
|
ENT.PhysicsSounds = true
|
|
|
|
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/misc/88mm_shell.mdl" )
|
|
self:PhysicsInit( SOLID_VPHYSICS )
|
|
self:PhysWake()
|
|
self:SetCollisionGroup( COLLISION_GROUP_WEAPON )
|
|
end
|
|
|
|
function ENT:Think()
|
|
if self.MarkForRemove then
|
|
self:Remove()
|
|
|
|
return false
|
|
end
|
|
|
|
self:NextThink( CurTime() + 0.1 )
|
|
|
|
return true
|
|
end
|
|
|
|
function ENT:AddSingleRound( entity )
|
|
local AmmoIsSet = false
|
|
|
|
for PodID, data in pairs( entity.WEAPONS ) do
|
|
for id, weapon in pairs( data ) do
|
|
local MaxAmmo = weapon.Ammo or -1
|
|
local CurAmmo = weapon._CurAmmo or MaxAmmo
|
|
|
|
if CurAmmo == MaxAmmo then continue end
|
|
|
|
entity.WEAPONS[PodID][ id ]._CurAmmo = math.min( CurAmmo + 1, MaxAmmo )
|
|
|
|
AmmoIsSet = true
|
|
end
|
|
end
|
|
|
|
if AmmoIsSet then
|
|
entity:SetNWAmmo( entity:GetAmmo() )
|
|
|
|
for _, pod in pairs( entity:GetPassengerSeats() ) do
|
|
local weapon = pod:lvsGetWeapon()
|
|
|
|
if not IsValid( weapon ) then continue end
|
|
|
|
weapon:SetNWAmmo( weapon:GetAmmo() )
|
|
end
|
|
end
|
|
|
|
return AmmoIsSet
|
|
end
|
|
|
|
function ENT:Refil( entity )
|
|
if self.MarkForRemove then return end
|
|
|
|
if not IsValid( entity ) then return end
|
|
|
|
if not entity.LVS then return end
|
|
|
|
if self:AddSingleRound( entity ) then
|
|
entity:OnMaintenance()
|
|
|
|
entity:EmitSound("items/ammo_pickup.wav")
|
|
|
|
self.MarkForRemove = true
|
|
end
|
|
end
|
|
|
|
function ENT:ShootBullet( attacker )
|
|
if self.BeenFired then return end
|
|
|
|
self.BeenFired = true
|
|
|
|
local hit_decal = ents.Create( "lvs_armor_bounce" )
|
|
hit_decal:SetPos( self:GetPos() )
|
|
hit_decal:SetAngles( self:GetAngles() )
|
|
hit_decal:Spawn()
|
|
hit_decal:Activate()
|
|
hit_decal:EmitSound("ambient/explosions/explode_4.wav", 75, 120, 1)
|
|
hit_decal:SetCollisionGroup( COLLISION_GROUP_NONE )
|
|
|
|
if IsValid( attacker ) then
|
|
hit_decal:SetPhysicsAttacker( attacker, 10 )
|
|
end
|
|
|
|
local PhysObj = hit_decal:GetPhysicsObject()
|
|
if IsValid( PhysObj ) then
|
|
PhysObj:SetMass( 50 )
|
|
PhysObj:EnableDrag( false )
|
|
PhysObj:SetVelocityInstantaneous( self:GetForward() * 4000 )
|
|
PhysObj:SetAngleVelocityInstantaneous( VectorRand() * 250 )
|
|
end
|
|
|
|
self:SetModel("models/misc/88mm_casing.mdl")
|
|
end
|
|
|
|
function ENT:PhysicsCollide( data, physobj )
|
|
if data.Speed > 60 and data.DeltaTime > 0.2 then
|
|
local VelDif = data.OurOldVelocity:Length() - data.OurNewVelocity:Length()
|
|
|
|
if VelDif > 700 then
|
|
self:ShootBullet()
|
|
end
|
|
end
|
|
|
|
self:Refil( data.HitEntity )
|
|
end
|
|
|
|
function ENT:OnTakeDamage( dmginfo )
|
|
self:ShootBullet( dmginfo:GetAttacker() )
|
|
end
|
|
end
|
|
|
|
if CLIENT then
|
|
function ENT:Draw()
|
|
self:DrawModel()
|
|
end
|
|
|
|
function ENT:OnRemove()
|
|
end
|
|
|
|
function ENT:Think()
|
|
end
|
|
end
|
|
|
|
function ENT:GetCrosshairFilterEnts()
|
|
return {self}
|
|
end
|