Files
wnsrc/lua/weapons/gmod_tool/stools/item_ammo_crate.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

163 lines
5.9 KiB
Lua

--[[
| 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/
--]]
TOOL.Category = "Half-Life 2"
TOOL.Name = "#tool.item_ammo_crate"
TOOL.ClientConVar[ "type" ] = "0"
local ToolModels = {}
ToolModels[ 0 ] = "models/items/ammocrate_pistol.mdl"
ToolModels[ 1 ] = "models/items/ammocrate_smg1.mdl"
ToolModels[ 2 ] = "models/items/ammocrate_ar2.mdl"
ToolModels[ 3 ] = "models/items/ammocrate_rockets.mdl"
ToolModels[ 4 ] = "models/items/ammocrate_buckshot.mdl"
ToolModels[ 5 ] = "models/items/ammocrate_grenade.mdl"
ToolModels[ 6 ] = "models/items/ammocrate_357.mdl"
ToolModels[ 7 ] = "models/items/ammocrate_crossbow.mdl"
ToolModels[ 8 ] = "models/items/ammocrate_ar2.mdl"
ToolModels[ 9 ] = "models/items/ammocrate_smg2.mdl"
ToolModels[ 10 ] = "models/items/ammocrate_smg1.mdl"
cleanup.Register( "item_ammo_crates" )
if ( SERVER ) then
local rb655_force_downloads = CreateConVar( "rb655_force_downloads", "0", FCVAR_ARCHIVE )
if ( rb655_force_downloads:GetFloat() > 0 ) then
resource.AddFile( "models/items/ammocrate_357.mdl" )
resource.AddFile( "models/items/ammocrate_crossbow.mdl" )
end
CreateConVar( "sbox_maxitem_ammo_crates", 10, FCVAR_ARCHIVE + FCVAR_REPLICATED + FCVAR_NOTIFY )
function MakeAmmoCrate( ply, model, pos, ang, type )
if ( IsValid( ply ) and !ply:CheckLimit( "item_ammo_crates" ) ) then return nil end
type = tonumber( type ) or 0
local item_ammo_crate = ents.Create( "item_ammo_crate" )
if ( !IsValid( item_ammo_crate ) ) then return nil end
item_ammo_crate:SetPos( pos )
item_ammo_crate:SetAngles( ang )
item_ammo_crate:SetKeyValue( "AmmoType", math.Clamp( type, 0, 9 ) )
item_ammo_crate:Spawn()
item_ammo_crate:Activate()
item_ammo_crate:SetModel( model )
table.Merge( item_ammo_crate:GetTable(), {
ply = ply,
type = type
} )
if ( IsValid( ply ) ) then
ply:AddCount( "item_ammo_crates", item_ammo_crate )
ply:AddCleanup( "item_ammo_crates", item_ammo_crate )
end
DoPropSpawnedEffect( item_ammo_crate )
return item_ammo_crate
end
duplicator.RegisterEntityClass( "item_ammo_crate", MakeAmmoCrate, "model", "pos", "ang", "type" )
end
function TOOL:LeftClick( trace )
if ( trace.HitSky or !trace.HitPos or trace.HitNormal.z < 0.7 ) then return false end
if ( IsValid( trace.Entity ) and ( trace.Entity:GetClass() == "item_ammo_crate" or trace.Entity:IsPlayer() or trace.Entity:IsNPC() ) ) then return false end
if ( CLIENT ) then return true end
local ply = self:GetOwner()
local ang = trace.HitNormal:Angle()
ang.p = ang.p - 270
if ( trace.HitNormal.z > 0.9999 ) then ang.y = ply:GetAngles().y + 180 end
local type = self:GetClientNumber( "type" )
if ( type == 10 ) then type = math.random( 0, 9 ) end
local item_ammo_crate = MakeAmmoCrate( ply, ToolModels[ type ], trace.HitPos + trace.HitNormal * 16, ang, type )
undo.Create( "item_ammo_crate" )
undo.AddEntity( item_ammo_crate )
undo.SetPlayer( ply )
undo.Finish()
return true
end
function TOOL:UpdateGhostEntity( ent, ply )
if ( !IsValid( ent ) ) then return end
local trace = ply:GetEyeTrace()
if ( !trace.Hit or trace.HitNormal.z < 0.7 ) then ent:SetNoDraw( true ) return end
if ( IsValid( trace.Entity ) and ( trace.Entity:GetClass() == "item_ammo_crate" or trace.Entity:IsPlayer() ) ) then ent:SetNoDraw( true ) return end
local ang = trace.HitNormal:Angle()
ang.p = ang.p - 270
if ( trace.HitNormal.z > 0.9999 ) then ang.y = ply:GetAngles().y + 180 end
local min = ent:OBBMins()
ent:SetPos( trace.HitPos - trace.HitNormal * min.z )
ent:SetAngles( ang )
ent:SetNoDraw( false )
end
function TOOL:Think()
if ( !IsValid( self.GhostEntity ) or self.GhostEntity:GetModel() != ToolModels[ self:GetClientNumber( "type" ) ] ) then
self:MakeGhostEntity( ToolModels[ self:GetClientNumber( "type" ) ], Vector( 0, 0, 0 ), Angle( 0, 0, 0 ) )
end
self:UpdateGhostEntity( self.GhostEntity, self:GetOwner() )
end
list.Set( "AmmoCrateTypes", "#Pistol_ammo", { item_ammo_crate_type = "0" } )
list.Set( "AmmoCrateTypes", "#Buckshot_ammo", { item_ammo_crate_type = "4" } )
list.Set( "AmmoCrateTypes", "#SMG1_grenade_ammo", { item_ammo_crate_type = "9" } )
list.Set( "AmmoCrateTypes", "#SMG1_ammo", { item_ammo_crate_type = "1" } )
list.Set( "AmmoCrateTypes", "#AR2_ammo", { item_ammo_crate_type = "2" } )
list.Set( "AmmoCrateTypes", "#RPG_round_ammo", { item_ammo_crate_type = "3" } )
list.Set( "AmmoCrateTypes", "#Buckshot_ammo", { item_ammo_crate_type = "4" } )
list.Set( "AmmoCrateTypes", "#Grenade_ammo", { item_ammo_crate_type = "5" } )
list.Set( "AmmoCrateTypes", "#357_ammo", { item_ammo_crate_type = "6" } )
list.Set( "AmmoCrateTypes", "#XBowBolt_ammo", { item_ammo_crate_type = "7" } )
list.Set( "AmmoCrateTypes", "#AR2AltFire_ammo", { item_ammo_crate_type = "8" } )
list.Set( "AmmoCrateTypes", "#SMG1_grenade_ammo", { item_ammo_crate_type = "9" } )
list.Set( "AmmoCrateTypes", "#tool.item_ammo_crate.random", { item_ammo_crate_type = "10" } )
if ( SERVER ) then return end
TOOL.Information = { { name = "left" } }
language.Add( "tool.item_ammo_crate", "Ammo Crates" )
language.Add( "tool.item_ammo_crate.name", "Ammo Crate Tool" )
language.Add( "tool.item_ammo_crate.desc", "Spawn crates full of ammo for resupply" )
language.Add( "tool.item_ammo_crate.left", "Spawn an ammo crate" )
language.Add( "tool.item_ammo_crate.type", "Ammo Crate Type" )
language.Add( "tool.item_ammo_crate.random", "Random" )
language.Add( "Cleanup_item_ammo_crates", "Ammo Crates" )
language.Add( "Cleaned_item_ammo_crates", "Cleaned up all Ammo Crates" )
language.Add( "SBoxLimit_item_ammo_crates", "You've hit the Ammo Crate limit!" )
language.Add( "Undone_item_ammo_crate", "Ammo Crate undone" )
language.Add( "max_item_ammo_crates", "Max Ammo Crates:" )
function TOOL.BuildCPanel( panel )
panel:AddControl( "ListBox", { Label = "#tool.item_ammo_crate.type", Options = list.Get( "AmmoCrateTypes" ), Height = 204 } )
end