mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
312 lines
10 KiB
Lua
312 lines
10 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 = "Matrix_'s Effects"
|
|
TOOL.Name = "#Energy ball"
|
|
TOOL.Command = nil
|
|
TOOL.ConfigName = ""
|
|
|
|
//Default values
|
|
TOOL.ClientConVar["scale"] = 2
|
|
TOOL.ClientConVar["emitparticles"] = 1
|
|
TOOL.ClientConVar["sound"] = 0
|
|
TOOL.ClientConVar["key"] = 5
|
|
TOOL.ClientConVar["numpadcontrol"] = 0
|
|
TOOL.ClientConVar["toggle"] = 0
|
|
|
|
//List of all spawned fire entities
|
|
TOOL.EnergyBalls = {}
|
|
|
|
//Add language descriptions
|
|
if (CLIENT) then
|
|
language.Add("Tool.energyball.name", "Combine Energy Ball Tool")
|
|
language.Add("Tool.energyball.desc", "Creates customizable ball of energy")
|
|
language.Add("Tool.energyball.0", "Left-Click: Create energy ball Right-Click: Remove energy balls")
|
|
language.Add("Cleanup_Energyballs", "Energy Balls")
|
|
language.Add("Cleaned_Energyballs", "Cleaned up all Energy Balls")
|
|
language.Add("SBoxLimit_Energyballs", "You've hit the Energy Balls limit!")
|
|
language.Add("Undone_EnergyBall", "Energy Ball undone")
|
|
end
|
|
|
|
|
|
cleanup.Register("EnergyBalls")
|
|
CreateConVar("sbox_maxenergyballs", 10000, FCVAR_NOTIFY)
|
|
|
|
|
|
|
|
function TOOL:LeftClick(trace)
|
|
|
|
if (CLIENT) then return true end
|
|
|
|
|
|
local scale = math.Round(math.Clamp(self:GetClientNumber("scale"), .32, 15)) //Let's just retreive this here
|
|
local findenergyballs = ents.FindInSphere( trace.HitPos, scale * scale )
|
|
local success = false
|
|
for _, energyball in pairs(findenergyballs) do
|
|
|
|
|
|
if energyball && energyball:IsValid() && !energyball:GetPhysicsObject():IsValid() && energyball:GetClass() == "env_citadel_energy_core" && !energyball:IsPlayer() && !energyball:IsNPC() && !energyball:IsWorld() then
|
|
|
|
local DontRunTwice = false
|
|
|
|
|
|
if !energyball.Charged then
|
|
energyball:Fire("StartCharge", "4", 0)
|
|
energyball.Charged = true
|
|
DontRunTwice = true
|
|
if energyball.Sound then
|
|
energyball.Sound:Stop()
|
|
sound.Play( "HL1/ambience/port_suckout1.wav", trace.HitPos, 72, 100 )
|
|
timer.Simple( 2.62, function() if energyball && energyball.Sound then energyball.Sound:Stop() energyball.Sound = CreateSound(energyball, Sound("npc/combine_gunship/dropship_onground_loop1.wav")) energyball.Sound:PlayEx(0.72, 100) end end )
|
|
end
|
|
end
|
|
|
|
|
|
if !DontRunTwice && energyball.Charged then
|
|
energyball:Fire("StartDischarge", "2", 0)
|
|
energyball.Charged = false
|
|
if energyball.Sound then
|
|
energyball.Sound:Stop()
|
|
sound.Play( "HL1/ambience/port_suckin1.wav", trace.HitPos, 72, 100 )
|
|
energyball.Sound = CreateSound(energyball, Sound("npc/combine_gunship/engine_rotor_loop1.wav"))
|
|
energyball.Sound:PlayEx(0.62, 100)
|
|
end
|
|
end
|
|
|
|
success = true
|
|
|
|
end
|
|
|
|
end
|
|
if success then return true end
|
|
|
|
|
|
if (!self:GetSWEP():CheckLimit("energyballs")) then return false end
|
|
|
|
|
|
local spawnflags
|
|
if self:GetClientNumber("numpadcontrol") == 0 then spawnflags = 2 end
|
|
if math.Round(math.Clamp(self:GetClientNumber("emitparticles"), 0, 1)) == 0 then spawnflags = spawnflags + 1 end
|
|
|
|
|
|
local energyball = ents.Create("env_citadel_energy_core")
|
|
if !energyball || !energyball:IsValid() then return false end
|
|
energyball:SetPos(trace.HitPos)
|
|
energyball:SetKeyValue("angles", tostring(trace.HitNormal:Angle()))
|
|
energyball:SetKeyValue("scale", tostring(scale))
|
|
if spawnflags then energyball:SetKeyValue("spawnflags", tostring(spawnflags)) end
|
|
|
|
|
|
energyball:Spawn()
|
|
energyball:Activate()
|
|
energyball.Charged = false
|
|
if trace && trace.Entity && trace.Entity:IsValid() && trace.Entity:GetPhysicsObject():IsValid() && !trace.Entity:IsPlayer() && !trace.Entity:IsWorld() then energyball:SetParent(trace.Entity) end
|
|
|
|
|
|
if math.Round(math.Clamp(self:GetClientNumber("sound"), 0, 1)) == 1 then
|
|
if self:GetClientNumber("numpadcontrol") == 0 then sound.Play( "weapons/physcannon/superphys_small_zap" .. math.random(1,4) .. ".wav", trace.HitPos, 52, 100 ) end
|
|
energyball.Sound = CreateSound(energyball, Sound("npc/combine_gunship/engine_rotor_loop1.wav"))
|
|
if self:GetClientNumber("numpadcontrol") == 0 then energyball.Sound:PlayEx(0.62, 100) end
|
|
end
|
|
|
|
|
|
self:GetOwner():AddCount("energyballs", energyball)
|
|
table.insert(self.EnergyBalls, energyball)
|
|
|
|
|
|
undo.Create("EnergyBall")
|
|
undo.AddEntity(energyball)
|
|
undo.SetPlayer(self:GetOwner())
|
|
undo.Finish()
|
|
cleanup.Add(self:GetOwner(), "EnergyBalls", energyball)
|
|
|
|
//Make sure we can control it with numpad
|
|
if self:GetClientNumber("numpadcontrol") == 1 then
|
|
self:SetupNumpadControls(energyball)
|
|
end
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
|
|
|
|
function TOOL:SetupNumpadControls(energyball)
|
|
|
|
|
|
if !energyball || !energyball:IsValid() || self:GetClientInfo("key") == nil || self:GetClientInfo("key") == -1 then return false end
|
|
|
|
|
|
if self:GetClientNumber("toggle") == 0 then
|
|
|
|
|
|
local function StartEmitPlasma(ply, energyball)
|
|
if !energyball || !energyball:IsValid() then return end
|
|
|
|
|
|
if energyball.Charged then energyball:Fire("StartCharge", "1", 0) end
|
|
if !energyball.Charged then energyball:Fire("StartDischarge", "1", 0) end
|
|
|
|
|
|
if energyball.Sound then
|
|
energyball.Sound:Stop()
|
|
if !energyball.Charged then energyball.Sound = CreateSound(energyball, Sound("npc/combine_gunship/engine_rotor_loop1.wav")) energyball.Sound:PlayEx(0.62, 100) end
|
|
if energyball.Charged then energyball.Sound = CreateSound(energyball, Sound("npc/combine_gunship/dropship_onground_loop1.wav")) energyball.Sound:PlayEx(0.72, 100) end
|
|
end
|
|
|
|
end
|
|
|
|
//Register KeyDown functions
|
|
numpad.Register("StartEmitPlasma", StartEmitPlasma)
|
|
numpad.OnDown(self:GetOwner(), self:GetClientNumber("key"), "StartEmitPlasma", energyball)
|
|
|
|
//Create KeyUp numpad functions
|
|
local function StopEmitPlasma(ply, energyball)
|
|
if !energyball || !energyball:IsValid() then return end
|
|
|
|
//Stop energy discharge and related sounds
|
|
if energyball.Sound then energyball.Sound:Stop() end
|
|
energyball:Fire("Stop", "0.32", 0)
|
|
|
|
end
|
|
|
|
//Register KeyUp functions
|
|
numpad.Register("StopEmitPlasma", StopEmitPlasma)
|
|
numpad.OnUp(self:GetOwner(), self:GetClientNumber("key"), "StopEmitPlasma", energyball)
|
|
|
|
end
|
|
|
|
//If toggled
|
|
if self:GetClientNumber("toggle") == 1 then
|
|
|
|
energyball.Toggle = false
|
|
|
|
//Create KeyDown numpad functions
|
|
local function ToggleEmitPlasma(ply, energyball)
|
|
if !energyball || !energyball:IsValid() then return end
|
|
|
|
//Start energy discharge
|
|
if !energyball.Toggle then
|
|
|
|
//Energy discharge
|
|
if energyball.Charged then energyball:Fire("StartCharge", "1", 0) end
|
|
if !energyball.Charged then energyball:Fire("StartDischarge", "1", 0) end
|
|
|
|
//Related sounds
|
|
if energyball.Sound then
|
|
energyball.Sound:Stop()
|
|
if !energyball.Charged then energyball.Sound = CreateSound(energyball, Sound("npc/combine_gunship/engine_rotor_loop1.wav")) energyball.Sound:PlayEx(0.62, 100) end
|
|
if energyball.Charged then energyball.Sound = CreateSound(energyball, Sound("npc/combine_gunship/dropship_onground_loop1.wav")) energyball.Sound:PlayEx(0.72, 100) end
|
|
end
|
|
|
|
energyball.Toggle = true
|
|
return
|
|
end
|
|
|
|
//Stop energy discharge and related sounds
|
|
if energyball.Toggle then
|
|
if energyball.Sound then sound.Play( "HL1/ambience/port_suckin1.wav", energyball:GetPos(), 62, 100 ) energyball.Sound:Stop() end
|
|
energyball:Fire("Stop", "0.32", 0)
|
|
energyball.Toggle = false
|
|
return
|
|
end
|
|
|
|
end
|
|
|
|
//Register KeyDown functions
|
|
numpad.Register("ToggleEmitPlasma", ToggleEmitPlasma)
|
|
numpad.OnDown(self:GetOwner(), self:GetClientNumber("key"), "ToggleEmitPlasma", energyball)
|
|
|
|
end
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
|
|
//Remove energy balls in radius
|
|
function TOOL:RightClick(trace)
|
|
|
|
//Clients don't need to know about any of this
|
|
if (CLIENT) then return false end
|
|
|
|
//Find energy balls in radius
|
|
local scale = math.Round(math.Clamp(self:GetClientNumber("scale"), .32, 15))
|
|
local findenergyballs = ents.FindInSphere(trace.HitPos, scale * scale)
|
|
for _, energyball in pairs(findenergyballs) do
|
|
|
|
//Remove
|
|
if energyball && energyball:IsValid() && !energyball:GetPhysicsObject():IsValid() && energyball:GetClass() == "env_citadel_energy_core" && !energyball:IsPlayer() && !energyball:IsNPC() && !energyball:IsWorld() then
|
|
if energyball.Sound then energyball.Sound:Stop() sound.Play( "HL1/ambience/port_suckin1.wav", energyball:GetPos(), 62, 100 ) end
|
|
energyball:Fire("StartCharge", "2", 0)
|
|
energyball:Fire("Kill", "", 0.21)
|
|
//energyball:Fire("Stop", "0.21", 0)
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
|
|
//Remove all energy balls
|
|
function TOOL:Reload()
|
|
|
|
//Clients don't need to know about any of this
|
|
if (CLIENT) then return false end
|
|
|
|
//Get all energy balls
|
|
for x = 1, table.getn(self.EnergyBalls) do
|
|
local energyball = self.EnergyBalls[x]
|
|
|
|
//Remove
|
|
if energyball && energyball:IsValid() then
|
|
if energyball.Sound then energyball.Sound:Stop() sound.Play( "HL1/ambience/port_suckin1.wav", energyball:GetPos(), 62, 100 ) end
|
|
energyball:Fire("StartCharge", "2", 0)
|
|
energyball:Fire("Kill", "", 0.21)
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
|
|
//Precache all sounds
|
|
function TOOL:Precache()
|
|
util.PrecacheSound("weapons/physcannon/superphys_small_zap1.wav")
|
|
util.PrecacheSound("weapons/physcannon/superphys_small_zap2.wav")
|
|
util.PrecacheSound("weapons/physcannon/superphys_small_zap3.wav")
|
|
util.PrecacheSound("weapons/physcannon/superphys_small_zap4.wav")
|
|
util.PrecacheSound("HL1/ambience/port_suckin1.wav")
|
|
util.PrecacheSound("npc/combine_gunship/dropship_onground_loop1.wav")
|
|
util.PrecacheSound("npc/combine_gunship/engine_rotor_loop1.wav")
|
|
end
|
|
|
|
|
|
//Build Tool Menu
|
|
function TOOL.BuildCPanel(panel)
|
|
|
|
//Header
|
|
panel:AddControl( "Header", { Text = "#Tool.energyball.name", Description = "#Tool.energyball.desc" } )
|
|
//Max delay
|
|
panel:AddControl( "Slider", { Label = "Scale", Type = "Integer", Min = "1", Max = "15", Command ="energyball_scale" } )
|
|
//Emit particles
|
|
panel:AddControl( "CheckBox", { Label = "Particles", Description = "", Command = "energyball_emitparticles" } )
|
|
//Make sounds
|
|
panel:AddControl( "CheckBox", { Label = "Sound", Description = "", Command = "energyball_sound" } )
|
|
|
|
//-------------
|
|
panel:AddControl( "Label", { Text = "________________________________________", Description = "" } )
|
|
|
|
//Numpad menu
|
|
panel:AddControl( "Numpad", { Label = "Numpad Key", Command = "energyball_key", ButtonSize = 22 } )
|
|
//Use numpad check
|
|
panel:AddControl( "CheckBox", { Label = "Use numpad", Description = "", Command = "energyball_numpadcontrol" } )
|
|
//Toggle check
|
|
panel:AddControl( "CheckBox", { Label = "Toggle", Description = "", Command = "energyball_toggle" } )
|
|
|
|
end |