Files
VnUtest/garrysmod/addons/lvs_base/lua/entities/lvs_item_ammo.lua
2026-03-31 10:27:04 +03:00

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