mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
315 lines
15 KiB
Lua
315 lines
15 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_item_crate"
|
|
|
|
TOOL.Models = {}
|
|
TOOL.Models[ "models/items/item_item_crate.mdl" ] = 0
|
|
TOOL.Models[ "models/items/item_beacon_crate.mdl" ] = 1
|
|
|
|
TOOL.ClientConVar[ "model" ] = "models/items/item_item_crate.mdl"
|
|
TOOL.ClientConVar[ "item" ] = "item_healthkit"
|
|
TOOL.ClientConVar[ "amount" ] = "3"
|
|
TOOL.ClientConVar[ "health" ] = "25"
|
|
|
|
TOOL.ClientConVar[ "desired_health" ] = "100"
|
|
TOOL.ClientConVar[ "desired_armor" ] = "30"
|
|
TOOL.ClientConVar[ "desired_pistol" ] = "50"
|
|
TOOL.ClientConVar[ "desired_smg1" ] = "50"
|
|
TOOL.ClientConVar[ "desired_smg1_alt" ] = "10"
|
|
TOOL.ClientConVar[ "desired_ar2" ] = "40"
|
|
TOOL.ClientConVar[ "desired_shotgun" ] = "50"
|
|
TOOL.ClientConVar[ "desired_rpg" ] = "0"
|
|
TOOL.ClientConVar[ "desired_grenade" ] = "10"
|
|
TOOL.ClientConVar[ "desired_357" ] = "0"
|
|
TOOL.ClientConVar[ "desired_crossbow" ] = "0"
|
|
TOOL.ClientConVar[ "desired_ar2_alt" ] = "0"
|
|
|
|
cleanup.Register( "item_item_crates" )
|
|
|
|
if ( SERVER ) then
|
|
CreateConVar( "sbox_maxitem_item_crates", 8, FCVAR_ARCHIVE + FCVAR_REPLICATED + FCVAR_NOTIFY )
|
|
|
|
function MakeItemCrate( ply, pos, ang, appearance, class, amount, health, dynamic_values )
|
|
if ( IsValid( ply ) and !ply:CheckLimit( "item_item_crates" ) ) then return nil end
|
|
|
|
local item_item_crate = ents.Create( "item_item_crate" )
|
|
if ( !IsValid( item_item_crate ) ) then return false end
|
|
item_item_crate:SetPos( pos )
|
|
item_item_crate:SetAngles( ang )
|
|
|
|
-- Map placed entity fix
|
|
class = class or "item_dynamic_ressuply"
|
|
appearance = appearance or 0
|
|
amount = tonumber( amount ) or 1
|
|
dynamic_values = dynamic_values or {}
|
|
|
|
if ( class == "item_dynamic_resupply" ) then
|
|
local item_dynamic_resupply = ents.Create( "item_dynamic_resupply" )
|
|
item_dynamic_resupply:SetKeyValue( "targetname", "rb655_item_dynamic_resupply" .. item_dynamic_resupply:EntIndex() )
|
|
for i, n in pairs( dynamic_values ) do
|
|
item_dynamic_resupply:SetKeyValue( i, n )
|
|
end
|
|
item_item_crate:SetKeyValue( "SpecificResupply", "rb655_item_dynamic_resupply" .. item_dynamic_resupply:EntIndex() )
|
|
item_item_crate:DeleteOnRemove( item_dynamic_resupply )
|
|
end
|
|
|
|
item_item_crate:SetKeyValue( "CrateAppearance", appearance )
|
|
item_item_crate:SetKeyValue( "ItemClass", class )
|
|
item_item_crate:SetKeyValue( "ItemCount", math.Clamp( amount , 1, 25 ) )
|
|
|
|
item_item_crate:Spawn()
|
|
item_item_crate:Activate()
|
|
|
|
if ( health ) then item_item_crate:Fire( "SetHealth", math.Clamp( health, 1, 100 ) ) end
|
|
|
|
if ( appearance and appearance == 1 ) then -- Episode 2 Jalopy radar thingy
|
|
local t = ents.Create( "info_radar_target" )
|
|
t:SetPos( item_item_crate:GetPos() )
|
|
t:SetKeyValue( "mode", 0 )
|
|
t:SetKeyValue( "type", 0 )
|
|
t:SetKeyValue( "radius", 1200 )
|
|
t:Spawn()
|
|
t:Activate()
|
|
t:Fire( "Enable" )
|
|
t:SetParent( item_item_crate )
|
|
end
|
|
|
|
table.Merge( item_item_crate:GetTable(), {
|
|
ply = ply,
|
|
appearance = appearance,
|
|
class = class,
|
|
amount = amount,
|
|
health = health,
|
|
dynamic_values = dynamic_values,
|
|
} )
|
|
|
|
if ( IsValid( ply ) ) then
|
|
ply:AddCount( "item_item_crates", item_item_crate )
|
|
ply:AddCleanup( "item_item_crates", item_item_crate )
|
|
end
|
|
|
|
DoPropSpawnedEffect( item_item_crate )
|
|
|
|
return item_item_crate
|
|
end
|
|
|
|
duplicator.RegisterEntityClass( "item_item_crate", MakeItemCrate, "pos", "ang", "appearance", "class", "amount", "health", "dynamic_values" )
|
|
end
|
|
|
|
function TOOL:LeftClick( trace )
|
|
if ( trace.HitSky or !trace.HitPos or IsValid( trace.Entity ) and ( 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.pitch = ang.pitch - 270
|
|
|
|
if ( trace.HitNormal.z > 0.9999 ) then ang.y = ply:GetAngles().y + 90 end
|
|
|
|
local item = self:GetClientInfo( "item" )
|
|
if ( item == "" ) then
|
|
local t = {}
|
|
for k, v in pairs( list.Get( "ItemCrateItems" ) ) do
|
|
if ( k == "#tool.item_item_crate.random" ) then continue end
|
|
table.insert( t, v.item_item_crate_item )
|
|
end
|
|
|
|
item = t[ math.random( 1, #t ) ]
|
|
end
|
|
|
|
local contains = false
|
|
for k, v in pairs( list.Get( "ItemCrateItems" ) ) do
|
|
if ( !v.item_item_crate_item ) then continue end
|
|
if ( item != v.item_item_crate_item ) then continue end
|
|
contains = true
|
|
end
|
|
|
|
if ( !contains ) then return end
|
|
|
|
local dynamic_values = {
|
|
DesiredHealth = self:GetClientInfo( "desired_health" ) / 100,
|
|
DesiredArmor = self:GetClientInfo( "desired_armor" ) / 100,
|
|
DesiredAmmoPistol = self:GetClientInfo( "desired_pistol" ) / 100,
|
|
DesiredAmmoSMG1 = self:GetClientInfo( "desired_smg1" ) / 100,
|
|
DesiredAmmoSMG1_Grenade = self:GetClientInfo( "desired_smg1_alt" ) / 100,
|
|
DesiredAmmoAR2 = self:GetClientInfo( "desired_ar2" ) / 100,
|
|
DesiredAmmoBuckshot = self:GetClientInfo( "desired_shotgun" ) / 100,
|
|
DesiredAmmoRPG_Round = self:GetClientInfo( "desired_rpg" ) / 100,
|
|
DesiredAmmoGrenade = self:GetClientInfo( "desired_grenade" ) / 100,
|
|
DesiredAmmo357 = self:GetClientInfo( "desired_357" ) / 100,
|
|
DesiredAmmoCrossbow = self:GetClientInfo( "desired_crossbow" ) / 100,
|
|
DesiredAmmoAR2_AltFire = self:GetClientInfo( "desired_ar2_alt" ) / 100
|
|
}
|
|
|
|
local item_item_crate = MakeItemCrate( ply, trace.HitPos, ang, self.Models[ self:GetClientInfo( "model" ) ], item, self:GetClientNumber( "amount" ), self:GetClientNumber( "health" ), dynamic_values )
|
|
|
|
undo.Create( "item_item_crate" )
|
|
undo.AddEntity( item_item_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 ) then return end
|
|
if ( IsValid( trace.Entity ) and ( trace.Entity:GetClass() == "item_item_crate" or trace.Entity:IsPlayer() ) ) then ent:SetNoDraw( true ) return end
|
|
|
|
local ang = trace.HitNormal:Angle()
|
|
ang.pitch = ang.pitch - 270
|
|
|
|
if ( trace.HitNormal.z > 0.9999 ) then ang.y = ply:GetAngles().y + 90 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() != self:GetClientInfo( "model" ) ) then
|
|
self:MakeGhostEntity( self:GetClientInfo( "model" ), Vector( 0, 0, 0 ), Angle( 0, 0, 0 ) )
|
|
end
|
|
|
|
self:UpdateGhostEntity( self.GhostEntity, self:GetOwner() )
|
|
end
|
|
|
|
list.Set( "ItemCrateModels", "models/items/item_item_crate.mdl", {} )
|
|
list.Set( "ItemCrateModels", "models/items/item_beacon_crate.mdl", {} )
|
|
|
|
list.Set( "ItemCrateItems", "#item_ammo_pistol", { item_item_crate_item = "item_ammo_pistol" } )
|
|
list.Set( "ItemCrateItems", "#item_ammo_pistol_large", { item_item_crate_item = "item_ammo_pistol_large" } )
|
|
list.Set( "ItemCrateItems", "#item_ammo_smg1", { item_item_crate_item = "item_ammo_smg1" } )
|
|
list.Set( "ItemCrateItems", "#item_ammo_smg1_large", { item_item_crate_item = "item_ammo_smg1_large" } )
|
|
list.Set( "ItemCrateItems", "#item_ammo_smg1_grenade", { item_item_crate_item = "item_ammo_smg1_grenade" } )
|
|
list.Set( "ItemCrateItems", "#item_ammo_ar2", { item_item_crate_item = "item_ammo_ar2" } )
|
|
list.Set( "ItemCrateItems", "#item_ammo_ar2_large", { item_item_crate_item = "item_ammo_ar2_large" } )
|
|
list.Set( "ItemCrateItems", "#item_ammo_ar2_altfire", { item_item_crate_item = "item_ammo_ar2_altfire" } )
|
|
list.Set( "ItemCrateItems", "#item_ammo_357", { item_item_crate_item = "item_ammo_357" } )
|
|
list.Set( "ItemCrateItems", "#item_ammo_357_large", { item_item_crate_item = "item_ammo_357_large" } )
|
|
list.Set( "ItemCrateItems", "#item_ammo_crossbow", { item_item_crate_item = "item_ammo_crossbow" } )
|
|
list.Set( "ItemCrateItems", "#item_rpg_round", { item_item_crate_item = "item_rpg_round" } )
|
|
list.Set( "ItemCrateItems", "#item_box_buckshot", { item_item_crate_item = "item_box_buckshot" } )
|
|
list.Set( "ItemCrateItems", "#item_battery", { item_item_crate_item = "item_battery" } )
|
|
list.Set( "ItemCrateItems", "#item_healthvial", { item_item_crate_item = "item_healthvial" } )
|
|
list.Set( "ItemCrateItems", "#item_healthkit", { item_item_crate_item = "item_healthkit" } )
|
|
list.Set( "ItemCrateItems", "#item_grubnugget", { item_item_crate_item = "item_grubnugget" } )
|
|
list.Set( "ItemCrateItems", "#item_dynamic_resupply", { item_item_crate_item = "item_dynamic_resupply" } )
|
|
list.Set( "ItemCrateItems", "#tool.item_item_crate.random", { item_item_crate_item = "" } )
|
|
|
|
list.Set( "ItemCrateItems", "#weapon_crowbar", { item_item_crate_item = "weapon_crowbar" } )
|
|
list.Set( "ItemCrateItems", "#weapon_stunstick", { item_item_crate_item = "weapon_stunstick" } )
|
|
list.Set( "ItemCrateItems", "#weapon_physcannon", { item_item_crate_item = "weapon_physcannon" } )
|
|
list.Set( "ItemCrateItems", "#weapon_physgun", { item_item_crate_item = "weapon_physgun" } )
|
|
list.Set( "ItemCrateItems", "#weapon_pistol", { item_item_crate_item = "weapon_pistol" } )
|
|
list.Set( "ItemCrateItems", "#weapon_357", { item_item_crate_item = "weapon_357" } )
|
|
list.Set( "ItemCrateItems", "#weapon_smg1", { item_item_crate_item = "weapon_smg1" } )
|
|
list.Set( "ItemCrateItems", "#weapon_ar2", { item_item_crate_item = "weapon_ar2" } )
|
|
list.Set( "ItemCrateItems", "#weapon_shotgun", { item_item_crate_item = "weapon_shotgun" } )
|
|
list.Set( "ItemCrateItems", "#weapon_crossbow", { item_item_crate_item = "weapon_crossbow" } )
|
|
list.Set( "ItemCrateItems", "#weapon_rpg", { item_item_crate_item = "weapon_rpg" } )
|
|
list.Set( "ItemCrateItems", "#weapon_frag", { item_item_crate_item = "weapon_frag" } )
|
|
|
|
if ( SERVER ) then return end
|
|
|
|
TOOL.Information = { { name = "left" } }
|
|
|
|
concommand.Add( "item_item_crate_reset", function()
|
|
RunConsoleCommand( "item_item_crate_desired_health", "100" )
|
|
RunConsoleCommand( "item_item_crate_desired_armor", "30" )
|
|
RunConsoleCommand( "item_item_crate_desired_pistol", "50" )
|
|
RunConsoleCommand( "item_item_crate_desired_smg1", "50" )
|
|
RunConsoleCommand( "item_item_crate_desired_smg1_alt", "10" )
|
|
RunConsoleCommand( "item_item_crate_desired_ar2", "40" )
|
|
RunConsoleCommand( "item_item_crate_desired_shotgun", "50" )
|
|
RunConsoleCommand( "item_item_crate_desired_rpg", "0" )
|
|
RunConsoleCommand( "item_item_crate_desired_grenade", "10" )
|
|
RunConsoleCommand( "item_item_crate_desired_357", "0" )
|
|
RunConsoleCommand( "item_item_crate_desired_crossbow", "0" )
|
|
RunConsoleCommand( "item_item_crate_desired_ar2_alt", "0" )
|
|
end )
|
|
|
|
local ConVarsDefault = TOOL:BuildConVarList()
|
|
|
|
language.Add( "tool.item_item_crate", "Item Crates" )
|
|
language.Add( "tool.item_item_crate.name", "Item Crate Tool" )
|
|
language.Add( "tool.item_item_crate.desc", "Spawn item crates" )
|
|
language.Add( "tool.item_item_crate.left", "Spawn an item crate" )
|
|
|
|
language.Add( "tool.item_item_crate.model", "Crate Model" )
|
|
|
|
language.Add( "tool.item_item_crate.contents", "Crate Contents" )
|
|
language.Add( "tool.item_item_crate.random", "Random Item" )
|
|
|
|
language.Add( "tool.item_item_crate.amount", "Content Amount:" )
|
|
language.Add( "tool.item_item_crate.amount.help", "The amount of items to put into item crate." )
|
|
language.Add( "tool.item_item_crate.health", "Crate Health:" )
|
|
language.Add( "tool.item_item_crate.health.help", "Amount of damage the item crate can take before it will break." )
|
|
|
|
language.Add( "tool.item_item_crate.edit", "Edit Dynamic Resupply Item Values" )
|
|
language.Add( "tool.item_item_crate.back", "Return back" )
|
|
language.Add( "tool.item_item_crate.reset", "Reset to defaults" )
|
|
|
|
language.Add( "Cleanup_item_item_crates", "Item Crates" )
|
|
language.Add( "Cleaned_item_item_crates", "Cleaned up all Item Crates" )
|
|
language.Add( "SBoxLimit_item_item_crates", "You've hit the Item Crates limit!" )
|
|
language.Add( "Undone_item_item_crate", "Item Crate undone" )
|
|
|
|
language.Add( "max_item_item_crates", "Max Item Crates:" )
|
|
|
|
language.Add( "tool.item_item_crate.desired_health", "Health:" )
|
|
language.Add( "tool.item_item_crate.desired_armor", "Armor:" )
|
|
language.Add( "tool.item_item_crate.desired_pistol", "Pistol ammo:" )
|
|
language.Add( "tool.item_item_crate.desired_smg1", "SMG1 ammo:" )
|
|
language.Add( "tool.item_item_crate.desired_smg1_alt", "SMG1 Grenades:" )
|
|
language.Add( "tool.item_item_crate.desired_ar2", "AR2 ammo:" )
|
|
language.Add( "tool.item_item_crate.desired_shotgun", "Shotgun Ammo:" )
|
|
language.Add( "tool.item_item_crate.desired_rpg", "RPG Rounds:" )
|
|
language.Add( "tool.item_item_crate.desired_grenade", "Grenades:" )
|
|
language.Add( "tool.item_item_crate.desired_357", ".357 Ammo:" )
|
|
language.Add( "tool.item_item_crate.desired_crossbow", "Crossbow Ammo:" )
|
|
language.Add( "tool.item_item_crate.desired_ar2_alt", "AR2 Energy Balls:" )
|
|
language.Add( "tool.item_item_crate.desired_ar2_alt.help", "A dynamic ressuply item. When the player enters the PVS of this entity, it will determine the item most needed by the player, spawn one of those items, and remove itself. To determine which item the player most needs, it calculates which of the Desired Health/Armor/Ammo ratios the player is farthest from.\n\nIf the player is above all the desired levels, then no item will be spawned." )
|
|
|
|
function TOOL.BuildCPanel( panel )
|
|
panel:AddControl( "ComboBox", { MenuButton = 1, Folder = "item_item_crate", Options = { [ "#preset.default" ] = ConVarsDefault }, CVars = table.GetKeys( ConVarsDefault ) } )
|
|
|
|
panel:AddControl( "PropSelect", { Label = "#tool.item_item_crate.model", Height = 1, ConVar = "item_item_crate_model", Models = list.Get( "ItemCrateModels" ) } )
|
|
panel:AddControl( "ListBox", { Label = "#tool.item_item_crate.contents", Height = 256, Options = list.Get( "ItemCrateItems" ) } )
|
|
|
|
panel:AddControl( "Slider", { Label = "#tool.item_item_crate.amount", Min = 1, Max = 25, Command = "item_item_crate_amount", Help = true } )
|
|
panel:AddControl( "Slider", { Label = "#tool.item_item_crate.health", Min = 1, Max = 100, Command = "item_item_crate_health", Help = true } )
|
|
|
|
panel:Help( "#tool.item_item_crate.desired_ar2_alt.help" )
|
|
|
|
panel:AddControl( "Slider", { Label = "#tool.item_item_crate.desired_health", Max = 100, Command = "item_item_crate_desired_health" } )
|
|
panel:AddControl( "Slider", { Label = "#tool.item_item_crate.desired_armor", Max = 100, Command = "item_item_crate_desired_armor" } )
|
|
panel:AddControl( "Slider", { Label = "#tool.item_item_crate.desired_pistol", Max = 100, Command = "item_item_crate_desired_pistol" } )
|
|
panel:AddControl( "Slider", { Label = "#tool.item_item_crate.desired_smg1", Max = 100, Command = "item_item_crate_desired_smg1" } )
|
|
panel:AddControl( "Slider", { Label = "#tool.item_item_crate.desired_smg1_alt", Max = 100, Command = "item_item_crate_desired_smg1_alt" } )
|
|
panel:AddControl( "Slider", { Label = "#tool.item_item_crate.desired_ar2", Max = 100, Command = "item_item_crate_desired_ar2" } )
|
|
panel:AddControl( "Slider", { Label = "#tool.item_item_crate.desired_shotgun", Max = 100, Command = "item_item_crate_desired_shotgun" } )
|
|
panel:AddControl( "Slider", { Label = "#tool.item_item_crate.desired_rpg", Max = 100, Command = "item_item_crate_desired_rpg" } )
|
|
panel:AddControl( "Slider", { Label = "#tool.item_item_crate.desired_grenade", Max = 100, Command = "item_item_crate_desired_grenade" } )
|
|
panel:AddControl( "Slider", { Label = "#tool.item_item_crate.desired_357", Max = 100, Command = "item_item_crate_desired_357" } )
|
|
panel:AddControl( "Slider", { Label = "#tool.item_item_crate.desired_crossbow", Max = 100, Command = "item_item_crate_desired_crossbow" } )
|
|
panel:AddControl( "Slider", { Label = "#tool.item_item_crate.desired_ar2_alt", Max = 100, Command = "item_item_crate_desired_ar2_alt" } )
|
|
|
|
panel:Button( "#tool.item_item_crate.reset", "item_item_crate_reset" )
|
|
end
|