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

317 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 = "#Smoke"
TOOL.Command = nil
TOOL.ConfigName = ""
//Default values
TOOL.ClientConVar["color_r"] = 0
TOOL.ClientConVar["color_g"] = 0
TOOL.ClientConVar["color_b"] = 0
TOOL.ClientConVar["color_a"] = 21
TOOL.ClientConVar["material"] = "particle/smokesprites_0001.vmt"
TOOL.ClientConVar["spreadbase"] = 6
TOOL.ClientConVar["spreadspeed"] = 8
TOOL.ClientConVar["speed"] = 32
TOOL.ClientConVar["startsize"] = 32
TOOL.ClientConVar["endsize"] = 32
TOOL.ClientConVar["roll"] = 8
TOOL.ClientConVar["numparticles"] = 32
TOOL.ClientConVar["jetlength"] = 256
TOOL.ClientConVar["twist"] = 6
TOOL.ClientConVar["key"] = 5
TOOL.ClientConVar["numpadcontrol"] = 0
TOOL.ClientConVar["toggle"] = 0
//List of all spawned fire entities
TOOL.Smokes = {}
//Add language descriptions
if (CLIENT) then
language.Add("Tool.smoke.name", "Smoke Tool")
language.Add("Tool.smoke.desc", "Creates customizable smoke")
language.Add("Tool.smoke.0", "Left-Click: Create smoke Right-Click: Remove smoke")
language.Add("Cleanup_Smokes", "Smoke")
language.Add("Cleaned_Smoke", "Cleaned up all Smoke")
language.Add("SBoxLimit_Smokes", "You've hit the Smoke limit!")
language.Add("Undone_Smoke", "Smoke undone")
end
//Sandbox-related stuff
cleanup.Register("Smokes")
CreateConVar("sbox_maxsmokes", 10000, FCVAR_NOTIFY)
//Create smoke
function TOOL:LeftClick(trace)
//Clients don't need to know about any of this
if (CLIENT) then return true end
//Check current spawnlimits
if (!self:GetSWEP():CheckLimit("smokes")) then return false end
//Retreive settings
local color_r = math.Round(math.Clamp(self:GetClientNumber("color_r"), 0, 255))
local color_g = math.Round(math.Clamp(self:GetClientNumber("color_g"), 0, 255))
local color_b = math.Round(math.Clamp(self:GetClientNumber("color_b"), 0, 255))
local color_a = math.Round(math.Clamp(self:GetClientNumber("color_a"), 0, 255))
local basespread = math.Clamp(self:GetClientNumber("spreadbase"), 0, 1024)
local spreadspeed = math.Round(math.Clamp(self:GetClientNumber("spreadspeed"), 0, 1024))
local speed = math.Round(math.Clamp(self:GetClientNumber("speed"), 0, 2048))
local startsize = math.Clamp(self:GetClientNumber("startsize"), 0, 512)
local endsize = math.Clamp(self:GetClientNumber("endsize"), 0, 512)
local roll = math.Clamp(self:GetClientNumber("roll"), 0, 1024)
local rate = math.Round(math.Clamp(self:GetClientNumber("numparticles"), 0, 512))
local jetlength = math.Round(math.Clamp(self:GetClientNumber("jetlength"), 0, 4096))
local twist = math.Clamp(self:GetClientNumber("twist"), 0, 1024)
//Create smoke and assign settings
local smoke = ents.Create("env_smokestack")
if !smoke || !smoke:IsValid() then return false end
smoke:SetPos(trace.HitPos)
if self:GetClientNumber("numpadcontrol") == 0 then smoke:SetKeyValue("InitialState", "1") else smoke:SetKeyValue("InitialState", "0") end
smoke:SetKeyValue("WindAngle", "0 0 0")
smoke:SetKeyValue("WindSpeed", "0")
smoke:SetKeyValue("rendercolor", "" .. tostring(color_r) .. " " .. tostring(color_g) .. " " .. tostring(color_b) .. "")
smoke:SetKeyValue("renderamt", "" .. tostring(color_a) .. "")
smoke:SetKeyValue("SmokeMaterial", self:GetClientInfo("material"))
smoke:SetKeyValue("BaseSpread", tostring(basespread))
smoke:SetKeyValue("SpreadSpeed", tostring(spreadspeed))
smoke:SetKeyValue("Speed", tostring(speed))
smoke:SetKeyValue("StartSize", tostring(startsize))
smoke:SetKeyValue("EndSize", tostring(endsize))
smoke:SetKeyValue("roll", tostring(roll))
smoke:SetKeyValue("Rate", tostring(rate))
smoke:SetKeyValue("JetLength", tostring(jetlength))
smoke:SetKeyValue("twist", tostring(twist))
//Spawn smoke
smoke:Spawn()
smoke:Activate()
if trace && trace.Entity && trace.Entity:IsValid() && trace.Entity:GetPhysicsObject():IsValid() && !trace.Entity:IsPlayer() && !trace.Entity:IsWorld() then smoke:SetParent(trace.Entity) end
//Add to relevant lists
self:GetOwner():AddCount("smokes", smoke)
table.insert(self.Smokes, smoke)
//Make sure we can undo
undo.Create("Smoke")
undo.AddEntity(smoke)
undo.SetPlayer(self:GetOwner())
undo.Finish()
cleanup.Add(self:GetOwner(), "Smokes", smoke)
//Make sure we can control it with numpad
if self:GetClientNumber("numpadcontrol") == 1 then
self:SetupNumpadControls(smoke)
end
return true
end
//Setup numpad controls
function TOOL:SetupNumpadControls(smoke)
//Safeguards
if !smoke || !smoke:IsValid() || self:GetClientInfo("key") == nil || self:GetClientInfo("key") == -1 then return false end
//If not toggled
if self:GetClientNumber("toggle") == 0 then
//Create KeyDown numpad functions
local function StartEmitSmoke(ply, smoke)
if !smoke || !smoke:IsValid() then return end
//Start smoke
smoke:Fire("TurnOn", "", 0)
end
//Register KeyDown functions
numpad.Register("StartEmitSmoke", StartEmitSmoke)
numpad.OnDown(self:GetOwner(), self:GetClientNumber("key"), "StartEmitSmoke", smoke)
//Create KeyUp numpad functions
local function StopEmitSmoke(ply, smoke)
if !smoke || !smoke:IsValid() then return end
//Stop smoke
smoke:Fire("TurnOff", "", 0)
end
//Register KeyUp functions
numpad.Register("StopEmitSmoke", StopEmitSmoke)
numpad.OnUp(self:GetOwner(), self:GetClientNumber("key"), "StopEmitSmoke", smoke)
end
//If toggled
if self:GetClientNumber("toggle") == 1 then
smoke.Toggle = false
//Create KeyDown numpad functions
local function ToggleEmitSmoke(ply, smoke)
if !smoke || !smoke:IsValid() then return end
//Start smoke
if !smoke.Toggle then
smoke:Fire("TurnOn", "", 0)
smoke.Toggle = true
return
end
//Stop smoke
if discharge.Toggle then
smoke:Fire("TurnOff", "", 0)
smoke.Toggle = false
return
end
end
//Register KeyDown functions
numpad.Register("ToggleEmitSmoke", ToggleEmitSmoke)
numpad.OnDown(self:GetOwner(), self:GetClientNumber("key"), "ToggleEmitSmoke", smoke)
end
return true
end
//Remove smoke in radius
function TOOL:RightClick(trace)
//Clients don't need to know about any of this
if (CLIENT) then return false end
//Find smoke in radius
local findsmoke = ents.FindInSphere(trace.HitPos, 128)
for _, smoke in pairs(findsmoke) do
//Remove
if smoke && smoke:IsValid() && !smoke:GetPhysicsObject():IsValid() && smoke:GetClass() == "env_smokestack" && !smoke:IsPlayer() && !smoke:IsNPC() && !smoke:IsWorld() then
smoke:Fire("TurnOff", "", 0)
smoke:Fire("Kill", "", 6)
end
end
end
//Remove all smoke
function TOOL:Reload()
//Clients don't need to know about any of this
if (CLIENT) then return false end
//Get all smoke
for x = 1, table.getn(self.Smokes) do
local smoke = self.Smokes[x]
//Remove
if smoke && smoke:IsValid() then
smoke:Fire("TurnOff", "", 0)
smoke:Fire("Kill", "", 6)
end
end
end
//Build Tool Menu
function TOOL.BuildCPanel(panel)
//Header
panel:AddControl( "Header", { Text = "#Tool.smoke.name", Description = "#Tool.smoke.desc" } )
//Build preset menu and declare default preset
local params = { Label = "#Presets", MenuButton = 1, Folder = "smoke", Options = {}, CVars = {} }
//Declare default preset
params.Options.default = {
smoke_color_r = 0,
smoke_color_g = 0,
smoke_color_b = 0,
smoke_color_a = 21,
smoke_material = "particle/smokesprites_0001.vmt",
smoke_spreadbase = 6,
smoke_spreadspeed = 8,
smoke_speed = 32,
smoke_startsize = 32,
smoke_endsize = 32,
smoke_roll = 8,
smoke_numparticles = 32,
smoke_jetlength = 256,
smoke_twist = 6,
}
//Declare console variables
table.insert( params.CVars, "smoke_color_r" )
table.insert( params.CVars, "smoke_color_g" )
table.insert( params.CVars, "smoke_color_b" )
table.insert( params.CVars, "smoke_color_a" )
table.insert( params.CVars, "smoke_material" )
table.insert( params.CVars, "smoke_spreadbase" )
table.insert( params.CVars, "smoke_spreadspeed" )
table.insert( params.CVars, "smoke_speed" )
table.insert( params.CVars, "smoke_startsize" )
table.insert( params.CVars, "smoke_endsize" )
table.insert( params.CVars, "smoke_roll" )
table.insert( params.CVars, "smoke_numparticles" )
table.insert( params.CVars, "smoke_jetlength" )
table.insert( params.CVars, "smoke_twist" )
//All done
panel:AddControl( "ComboBox", params )
//Color picker
panel:AddControl( "Color", { Label = "Smoke color", Red = "smoke_color_r", Green = "smoke_color_g", Blue = "smoke_color_b", Alpha = "smoke_color_a", ShowAlpha = "1", ShowHSV = "1", ShowRGB = "1", Multiplier = "255" } )
//Smoke base size
panel:AddControl( "Slider", { Label = "Smoke base size", Type = "Integer", Min = "0", Max = "64", Command ="smoke_spreadbase" } )
//Spread speed
panel:AddControl( "Slider", { Label = "Spread speed", Type = "Integer", Min = "0", Max = "32", Command ="smoke_spreadspeed" } )
//Particle speed
panel:AddControl( "Slider", { Label = "Particle speed", Type = "Integer", Min = "0", Max = "128", Command ="smoke_speed" } )
//Particle start size
panel:AddControl( "Slider", { Label = "Particle start size", Type = "Integer", Min = "0", Max = "64", Command ="smoke_startsize" } )
//Particle end size
panel:AddControl( "Slider", { Label = "Particle end size", Type = "Integer", Min = "0", Max = "64", Command ="smoke_endsize" } )
//Particle roll
panel:AddControl( "Slider", { Label = "Particle roll", Type = "Integer", Min = "0", Max = "256", Command ="smoke_roll" } )
//Number of particles
panel:AddControl( "Slider", { Label = "Number of particles", Type = "Integer", Min = "0", Max = "64", Command ="smoke_numparticles" } )
//Height
panel:AddControl( "Slider", { Label = "Height", Type = "Integer", Min = "0", Max = "512", Command ="smoke_jetlength" } )
//Twist effect
panel:AddControl( "Slider", { Label = "Twist effect", Type = "Integer", Min = "0", Max = "256", Command ="smoke_twist" } )
//Material Picker
local materials = {"particle/smokesprites_0001.vmt", "particle/particle_smokegrenade.vmt", "particle/SmokeStack.vmt"}
panel:MatSelect( "smoke_material", materials, true, 0.33, 0.33 )
//-------------
panel:AddControl( "Label", { Text = "________________________________________", Description = "" } )
//Numpad menu
panel:AddControl( "Numpad", { Label = "Numpad Key", Command = "smoke_key", ButtonSize = 22 } )
//Use numpad check
panel:AddControl( "CheckBox", { Label = "Use numpad", Description = "", Command = "smoke_numpadcontrol" } )
//Toggle check
panel:AddControl( "CheckBox", { Label = "Toggle", Description = "", Command = "smoke_toggle" } )
end