mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
320 lines
14 KiB
Lua
320 lines
14 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.env_headcrabcanister"
|
|
|
|
TOOL.Model = "models/props_combine/headcrabcannister01b.mdl"
|
|
|
|
TOOL.ClientConVar[ "key_fire" ] = "38"
|
|
TOOL.ClientConVar[ "key_open" ] = "39"
|
|
TOOL.ClientConVar[ "key_spawn" ] = "40"
|
|
TOOL.ClientConVar[ "fire_immediately" ] = "0"
|
|
TOOL.ClientConVar[ "headcrab" ] = "0"
|
|
|
|
TOOL.ClientConVar[ "count" ] = "6"
|
|
TOOL.ClientConVar[ "speed" ] = "3000"
|
|
TOOL.ClientConVar[ "time" ] = "5"
|
|
TOOL.ClientConVar[ "height" ] = "0"
|
|
|
|
TOOL.ClientConVar[ "damage" ] = "150"
|
|
TOOL.ClientConVar[ "radius" ] = "750"
|
|
TOOL.ClientConVar[ "duration" ] = "30"
|
|
TOOL.ClientConVar[ "smoke" ] = "0"
|
|
|
|
TOOL.ClientConVar[ "sf1" ] = "0"
|
|
TOOL.ClientConVar[ "sf2" ] = "0"
|
|
TOOL.ClientConVar[ "sf4096" ] = "0"
|
|
TOOL.ClientConVar[ "sf16384" ] = "0"
|
|
TOOL.ClientConVar[ "sf32768" ] = "0"
|
|
TOOL.ClientConVar[ "sf65536" ] = "0"
|
|
TOOL.ClientConVar[ "sf131072" ] = "0"
|
|
TOOL.ClientConVar[ "sf262144" ] = "0"
|
|
TOOL.ClientConVar[ "sf524288" ] = "0"
|
|
|
|
cleanup.Register( "env_headcrabcanisters" )
|
|
|
|
if ( SERVER ) then
|
|
|
|
CreateConVar( "sbox_maxenv_headcrabcanisters", 4, FCVAR_ARCHIVE )
|
|
|
|
numpad.Register( "env_headcrabcanister_fire", function( ply, env_headcrabcanister )
|
|
if ( !IsValid( env_headcrabcanister ) ) then return false end
|
|
env_headcrabcanister:Fire( "FireCanister" )
|
|
end )
|
|
numpad.Register( "env_headcrabcanister_open", function( ply, env_headcrabcanister )
|
|
if ( !IsValid( env_headcrabcanister ) ) then return false end
|
|
env_headcrabcanister:Fire( "OpenCanister" )
|
|
end )
|
|
numpad.Register( "env_headcrabcanister_spawn", function( ply, env_headcrabcanister )
|
|
if ( !IsValid( env_headcrabcanister ) ) then return false end
|
|
env_headcrabcanister:Fire( "SpawnHeadcrabs" )
|
|
end )
|
|
|
|
function MakeHeadcrabCanister( ply, model, pos, ang, keyFire, keyOpen, keySpawn, fire_immediately, headcrab, count, speed, time, height, damage, radius, duration, spawnflags, smoke, mapCreationID )
|
|
if ( IsValid( ply ) and !ply:CheckLimit( "env_headcrabcanisters" ) ) then return false end
|
|
|
|
if ( tobool( smoke ) ) then duration = -1 end
|
|
|
|
fire_immediately = fire_immediately or false
|
|
headcrab = headcrab or 0
|
|
count = count or 6
|
|
speed = speed or 3000
|
|
time = time or 5
|
|
height = height or 0
|
|
damage = damage or 150
|
|
radius = radius or 750
|
|
duration = duration or 30
|
|
spawnflags = spawnflags or 0
|
|
|
|
keyOpen = keyOpen or -1
|
|
keyFire = keyFire or -1
|
|
keySpawn = keySpawn or -1
|
|
|
|
if ( !game.SinglePlayer() ) then
|
|
headcrab = math.Clamp( headcrab, 0, 2 )
|
|
count = math.Clamp( count, 0, 10 )
|
|
time = math.Clamp( time, 0, 30 )
|
|
height = math.Clamp( height, 0, 10240 )
|
|
damage = math.Clamp( damage, 0, 256 )
|
|
radius = math.Clamp( radius, 0, 1024 )
|
|
duration = math.Clamp( duration, 0, 90 )
|
|
end
|
|
|
|
local env_headcrabcanister = ents.Create( "env_headcrabcanister" )
|
|
if ( !IsValid( env_headcrabcanister ) ) then return false end
|
|
env_headcrabcanister:SetPos( pos )
|
|
env_headcrabcanister:SetAngles( ang )
|
|
env_headcrabcanister:SetKeyValue( "HeadcrabType", headcrab )
|
|
env_headcrabcanister:SetKeyValue( "HeadcrabCount", count )
|
|
env_headcrabcanister:SetKeyValue( "FlightSpeed", speed )
|
|
env_headcrabcanister:SetKeyValue( "FlightTime", time )
|
|
env_headcrabcanister:SetKeyValue( "StartingHeight", height )
|
|
env_headcrabcanister:SetKeyValue( "Damage", damage )
|
|
env_headcrabcanister:SetKeyValue( "DamageRadius", radius )
|
|
env_headcrabcanister:SetKeyValue( "SmokeLifetime", duration )
|
|
env_headcrabcanister:SetKeyValue( "spawnflags", spawnflags )
|
|
env_headcrabcanister:Spawn()
|
|
env_headcrabcanister:Activate()
|
|
|
|
env_headcrabcanister.NumpadFire = numpad.OnDown( ply, keyFire, "env_headcrabcanister_fire", env_headcrabcanister )
|
|
env_headcrabcanister.NumpadOpen = numpad.OnDown( ply, keyOpen, "env_headcrabcanister_open", env_headcrabcanister )
|
|
env_headcrabcanister.NumpadSpawn = numpad.OnDown( ply, keySpawn, "env_headcrabcanister_spawn", env_headcrabcanister )
|
|
|
|
if ( tobool( fire_immediately ) ) then env_headcrabcanister:Fire( "FireCanister" ) end
|
|
|
|
table.Merge( env_headcrabcanister:GetTable(), {
|
|
ply = ply,
|
|
keyFire = keyFire,
|
|
keyOpen = keyOpen,
|
|
keySpawn = keySpawn,
|
|
fire_immediately = fire_immediately,
|
|
headcrab = headcrab,
|
|
count = count,
|
|
speed = speed,
|
|
time = time,
|
|
height = height,
|
|
damage = damage,
|
|
radius = radius,
|
|
duration = duration,
|
|
spawnflags = spawnflags,
|
|
smoke = smoke,
|
|
MapCreationID = mapCreationID
|
|
} )
|
|
|
|
if ( IsValid( ply ) ) then
|
|
ply:AddCount( "env_headcrabcanisters", env_headcrabcanister )
|
|
ply:AddCleanup( "env_headcrabcanisters", env_headcrabcanister )
|
|
end
|
|
|
|
DoPropSpawnedEffect( env_headcrabcanister )
|
|
|
|
if ( Wire_CreateOutputs and !mapCreationID ) then
|
|
env_headcrabcanister.Inputs = Wire_CreateInputs( env_headcrabcanister, { "Open", "Spawn" } )
|
|
|
|
function env_headcrabcanister:TriggerInput( name, value )
|
|
if ( name == "Open" and value > 0 ) then self:Fire( "OpenCanister" ) end
|
|
if ( name == "Spawn" and value > 0 ) then self:Fire( "SpawnHeadcrabs" ) end
|
|
end
|
|
|
|
rb655_hl2_CopyWireModMethods( env_headcrabcanister )
|
|
end
|
|
|
|
return env_headcrabcanister
|
|
end
|
|
|
|
duplicator.RegisterEntityClass( "env_headcrabcanister", MakeHeadcrabCanister, "model", "pos", "ang", "keyFire", "keyOpen", "keySpawn", "fire_immediately", "headcrab", "count", "speed", "time", "height", "damage", "radius", "duration", "spawnflags", "smoke", "MapCreationID" )
|
|
|
|
end
|
|
|
|
function TOOL:IntrnlGetSF( str )
|
|
return math.Clamp( self:GetClientNumber( str ), 0, 1 )
|
|
end
|
|
|
|
function TOOL:LeftClick( trace )
|
|
|
|
if ( trace.HitSky or !trace.HitPos or trace.HitNormal.z < 0 ) then return false end
|
|
if ( IsValid( trace.Entity ) and ( trace.Entity:GetClass() == "env_headcrabcanister" or trace.Entity:IsPlayer() or trace.Entity:IsNPC() ) ) then return false end
|
|
if ( CLIENT ) then return true end
|
|
|
|
local ply = self:GetOwner()
|
|
|
|
local spawnflags = 0
|
|
spawnflags = self:IntrnlGetSF( "sf1" ) + self:IntrnlGetSF( "sf2" ) * 2 + self:IntrnlGetSF( "sf4096" ) * 4096 + self:IntrnlGetSF( "sf16384" ) * 16384
|
|
spawnflags = spawnflags + self:IntrnlGetSF( "sf32768" ) * 32768 + self:IntrnlGetSF( "sf65536" ) * 65536 + self:IntrnlGetSF( "sf131072" ) * 131072
|
|
spawnflags = spawnflags + self:IntrnlGetSF( "sf262144" ) * 262144 + self:IntrnlGetSF( "sf524288" ) * 524288
|
|
|
|
local ang = Angle( math.sin( CurTime() ) * 16 - 55, trace.HitNormal:Angle().y, 0 )
|
|
if ( trace.HitNormal.z > 0.9999 ) then ang.y = ply:GetAngles().y end
|
|
|
|
local env_headcrabcanister = MakeHeadcrabCanister(
|
|
ply,
|
|
self.Model,
|
|
trace.HitPos,
|
|
ang,
|
|
self:GetClientNumber( "key_fire" ),
|
|
self:GetClientNumber( "key_open" ),
|
|
self:GetClientNumber( "key_spawn" ),
|
|
self:GetClientNumber( "fire_immediately" ),
|
|
self:GetClientNumber( "headcrab" ),
|
|
self:GetClientNumber( "count" ),
|
|
self:GetClientNumber( "speed" ),
|
|
self:GetClientNumber( "time" ),
|
|
self:GetClientNumber( "height" ),
|
|
self:GetClientNumber( "damage" ),
|
|
self:GetClientNumber( "radius" ),
|
|
self:GetClientNumber( "duration" ),
|
|
spawnflags,
|
|
self:GetClientNumber( "smoke" )
|
|
)
|
|
|
|
undo.Create( "env_headcrabcanister" )
|
|
undo.AddEntity( env_headcrabcanister )
|
|
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 ) then ent:SetNoDraw( true ) return end
|
|
if ( IsValid( trace.Entity ) and ( trace.Entity:GetClass() == "env_headcrabcanister" or trace.Entity:IsPlayer() or trace.Entity:IsNPC() ) ) then ent:SetNoDraw( true ) return end
|
|
|
|
local min = ent:OBBMins()
|
|
local ang = Angle( math.sin( CurTime() ) * 16 - 55, trace.HitNormal:Angle().y, 0 )
|
|
if ( trace.HitNormal.z > 0.9999 ) then
|
|
ang.y = ply:GetAngles().y
|
|
ent:SetPos( trace.HitPos - trace.HitNormal * min.z - Vector( 0, 0, 16 ) )
|
|
else
|
|
ent:SetPos( trace.HitPos - trace.HitNormal )
|
|
end
|
|
|
|
ent:SetAngles( ang )
|
|
ent:SetNoDraw( false )
|
|
end
|
|
|
|
function TOOL:Think()
|
|
if ( !IsValid( self.GhostEntity ) or self.GhostEntity:GetModel() != self.Model ) then
|
|
self:MakeGhostEntity( self.Model, Vector( 0, 0, 0 ), Angle( 0, 0, 0 ) )
|
|
end
|
|
|
|
self:UpdateGhostEntity( self.GhostEntity, self:GetOwner() )
|
|
end
|
|
|
|
|
|
list.Set( "HeadcrabModels", "#npc_headcrab", { env_headcrabcanister_headcrab = "0" } )
|
|
list.Set( "HeadcrabModels", "#npc_headcrab_fast", { env_headcrabcanister_headcrab = "1" } )
|
|
list.Set( "HeadcrabModels", "#npc_headcrab_poison", { env_headcrabcanister_headcrab = "2" } )
|
|
|
|
if ( SERVER ) then return end
|
|
|
|
TOOL.Information = { { name = "left" } }
|
|
|
|
language.Add( "tool.env_headcrabcanister", "Headcrab Canisters" )
|
|
language.Add( "tool.env_headcrabcanister.name", "Headcrab Canister Tool" )
|
|
language.Add( "tool.env_headcrabcanister.desc", "Spawn headcrab canisters" )
|
|
language.Add( "tool.env_headcrabcanister.left", "Spawn a headcrab canister" )
|
|
|
|
language.Add( "tool.env_headcrabcanister.fire", "Fire Headcrab Canister" )
|
|
language.Add( "tool.env_headcrabcanister.fire_immediately", "Fire on spawn" )
|
|
|
|
language.Add( "tool.env_headcrabcanister.open", "Open The Canister" )
|
|
language.Add( "tool.env_headcrabcanister.spawn", "Spawn headcrabs" )
|
|
|
|
language.Add( "tool.env_headcrabcanister.headcrab", "Headcrab Type" )
|
|
language.Add( "tool.env_headcrabcanister.count", "Headcrab count:" )
|
|
language.Add( "tool.env_headcrabcanister.speed", "Flight speed:" )
|
|
language.Add( "tool.env_headcrabcanister.time", "Flight time:" )
|
|
language.Add( "tool.env_headcrabcanister.height", "Starting height:" )
|
|
language.Add( "tool.env_headcrabcanister.damage", "Impact damage:" )
|
|
language.Add( "tool.env_headcrabcanister.radius", "Damage radius:" )
|
|
language.Add( "tool.env_headcrabcanister.duration", "Smoke duration:" )
|
|
language.Add( "tool.env_headcrabcanister.smoke", "Always smoke" )
|
|
|
|
language.Add( "tool.env_headcrabcanister.sf1", "No impact sound" )
|
|
language.Add( "tool.env_headcrabcanister.sf2", "No launch sound" )
|
|
language.Add( "tool.env_headcrabcanister.sf4096", "Start impacted" )
|
|
language.Add( "tool.env_headcrabcanister.sf16384", "Wait for input to open" )
|
|
language.Add( "tool.env_headcrabcanister.sf32768", "Wait for input to spawn headcrabs" )
|
|
language.Add( "tool.env_headcrabcanister.sf65536", "No smoke" )
|
|
language.Add( "tool.env_headcrabcanister.sf131072", "No shake" )
|
|
language.Add( "tool.env_headcrabcanister.sf262144", "Remove on impact" )
|
|
language.Add( "tool.env_headcrabcanister.sf524288", "No impact effects" )
|
|
|
|
language.Add( "Cleanup_env_headcrabcanisters", "Headcrab Canisters" )
|
|
language.Add( "Cleaned_env_headcrabcanisters", "Cleaned up all Headcrab Canisters" )
|
|
language.Add( "SBoxLimit_env_headcrabcanisters", "You've hit the Headcrab Canisters limit!" )
|
|
language.Add( "Undone_env_headcrabcanister", "Headcrab Canister undone" )
|
|
|
|
language.Add( "max_env_headcrabcanisters", "Max Headcrab Canisters:" )
|
|
|
|
local ConVarsDefault = TOOL:BuildConVarList()
|
|
|
|
function TOOL.BuildCPanel( panel )
|
|
panel:AddControl( "ComboBox", { MenuButton = 1, Folder = "env_headcrabcanister", Options = { [ "#preset.default" ] = ConVarsDefault }, CVars = table.GetKeys( ConVarsDefault ) } )
|
|
|
|
panel:AddControl( "Numpad", { Label = "#tool.env_headcrabcanister.fire", Command = "env_headcrabcanister_key_fire" } )
|
|
panel:AddControl( "Checkbox", { Label = "#tool.env_headcrabcanister.fire_immediately", Command = "env_headcrabcanister_fire_immediately" } )
|
|
|
|
panel:AddControl( "Numpad", { Label = "#tool.env_headcrabcanister.open", Command = "env_headcrabcanister_key_open", Label2 = "#tool.env_headcrabcanister.spawn", Command2 = "env_headcrabcanister_key_spawn" } )
|
|
panel:AddControl( "Checkbox", { Label = "#tool.env_headcrabcanister.sf16384", Command = "env_headcrabcanister_sf16384" } )
|
|
panel:AddControl( "Checkbox", { Label = "#tool.env_headcrabcanister.sf32768", Command = "env_headcrabcanister_sf32768" } )
|
|
|
|
panel:AddControl( "ListBox", { Label = "#tool.env_headcrabcanister.headcrab", Height = 68, Options = list.Get( "HeadcrabModels" ) } )
|
|
|
|
panel:AddControl( "Slider", { Label = "#tool.env_headcrabcanister.count", Max = 10, Command = "env_headcrabcanister_count" } )
|
|
|
|
panel:AddControl( "Slider", { Label = "#tool.env_headcrabcanister.speed", Type = "Float", Min = 1, Max = 8192, Command = "env_headcrabcanister_speed" } )
|
|
panel:AddControl( "Slider", { Label = "#tool.env_headcrabcanister.time", Type = "Float", Max = 30, Command = "env_headcrabcanister_time" } )
|
|
|
|
panel:AddControl( "Slider", { Label = "#tool.env_headcrabcanister.height", Type = "Float", Max = 10240, Command = "env_headcrabcanister_height" } )
|
|
|
|
panel:AddControl( "Slider", { Label = "#tool.env_headcrabcanister.damage", Type = "Float", Max = 256, Command = "env_headcrabcanister_damage" } )
|
|
panel:AddControl( "Slider", { Label = "#tool.env_headcrabcanister.radius", Type = "Float", Max = 1024, Command = "env_headcrabcanister_radius" } )
|
|
|
|
panel:AddControl( "Slider", { Label = "#tool.env_headcrabcanister.duration", Type = "Float", Max = 90, Command = "env_headcrabcanister_duration" } )
|
|
panel:AddControl( "Checkbox", { Label = "#tool.env_headcrabcanister.smoke", Command = "env_headcrabcanister_smoke" } )
|
|
|
|
panel:AddControl( "Checkbox", { Label = "#tool.env_headcrabcanister.sf2", Command = "env_headcrabcanister_sf2" } )
|
|
panel:AddControl( "Checkbox", { Label = "#tool.env_headcrabcanister.sf1", Command = "env_headcrabcanister_sf1" } )
|
|
panel:AddControl( "Checkbox", { Label = "#tool.env_headcrabcanister.sf65536", Command = "env_headcrabcanister_sf65536" } )
|
|
panel:AddControl( "Checkbox", { Label = "#tool.env_headcrabcanister.sf131072", Command = "env_headcrabcanister_sf131072" } )
|
|
|
|
panel:AddControl( "Checkbox", { Label = "#tool.env_headcrabcanister.sf524288", Command = "env_headcrabcanister_sf524288" } )
|
|
panel:AddControl( "Checkbox", { Label = "#tool.env_headcrabcanister.sf4096", Command = "env_headcrabcanister_sf4096" } )
|
|
panel:AddControl( "Checkbox", { Label = "#tool.env_headcrabcanister.sf262144", Command = "env_headcrabcanister_sf262144" } )
|
|
end
|