mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
317 lines
10 KiB
Lua
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 |