I'm trying to fix this script up to where it acts as a blizzard and not going slow as it is currently. Here's the whole script.
local SnowLevels = { --[[ <-- Change the amount of snow. ]]-- ["Light"] = false; --[[ <-- Barely any. ]]-- ["Medium"] = false; --[[ <-- Some. ]]-- ["Heavy"] = false; --[[ <-- A respectable amount. :P ]]-- ["Blizzard"] = true; --[[ <-- Reccomended ]]-- } local imgs = {"rbxassetid://18867938"} local sp = script.Parent local r = game:service("RunService") local players = game:getService("Players") local sl local rate local vol if SnowLevels.Light then sl = 45 vol = 0 elseif SnowLevels.Medium then sl = 70 vol = 0.10 elseif SnowLevels.Heavy then sl = 95 vol = 0.30 elseif SnowLevels.Blizzard then sl = 120 vol = 0.60 end local q = Instance.new("Part") q.Transparency = 1 q.Anchored = 0 q.formFactor = Enum.FormFactor.Symmetric q.Size = Vector3.new(1, 1, 1) function projection(vector, camera, size) local abs = math.abs local result = camera:toObjectSpace(vector) vector = result.p local rx, ry, rz = result:toEulerAnglesXYZ() if vector.z > 0 then return end local sizex = size/abs(vector.z) local sizey = sizex * abs(math.cos(rx)) local sizex = sizex * abs(math.cos(ry)) return -vector.x / vector.z, vector.y * 1.7071067811865 / vector.z, sizex, sizey end local face = Enum.NormalId.Bottom function getdepth(v) local t = q:clone() t.Parent = workspace t.CFrame = CFrame.new(v) local s = 2^5 local n = 1 for i = 1, 5 do s = s * .5 if t:Resize(face, s) then n = n + s end end t:Destroy() return n end local torso local flakes = {} function remove(flake) flake[1]:Destroy() flakes[flake] = nil end function getFlakes(Num) for i, v in pairs(flakes) do Num = Num+1 end return Num end function spriteWork() local cz = script.Parent.AbsoluteSize local cx, cy = cz.x, cz.y for sprite in pairs(flakes) do sprite[2] = sprite[2] * CFrame.new(0, -.2, 0) * CFrame.Angles(0, .037699111843078, 0) if sprite[2].p.y < sprite[4] then sprite[1]:Destroy() sprite:remove() end local px, py, sx, sy = projection(sprite[2],workspace.CurrentCamera.CoordinateFrame, sprite[3]) local label = sprite[1] if px and sx >= 1 and sy >= 1 then label.Visible = true label.Size = UDim2.new(0,sx,0,sy) label.Position = UDim2.new(0,((px + 1) * cx - sx) * .5,0,((py + 1) * cy - sy) * .5) else label.Visible = false end end end function spawn(char) for flake in pairs(flakes) do flake:Destroy() end while char.Parent do if getFlakes(0) < sl-10 then for i = 1, sl-10 do r.Stepped:wait() if getFlakes(0) < sl-10 then local label = Instance.new("ImageLabel", sp) label.Image = imgs[math.random(1, #imgs)] label.BackgroundTransparency = 1 local dx, dz = (math.random() - .5) * 200, (math.random() - .5) * 200 local pos = char["Torso"].Position + Vector3.new(dx, (30 - math.random() * 20) * (1 - (dx^2 + dz^2)^.5/(1.4142135623731 * 100)) , dz) local sphr = CFrame.new(Vector3.new(),Vector3.new(math.random()-.5,0,math.random()-.5)) + pos local size = 20 * (math.random() * .75 + .25) * 10 local sprite = {label, sphr, size, pos.y - getdepth(pos), remove = remove} local cz = sp.AbsoluteSize local cx, cy = cz.x, cz.y flakes[sprite] = 0 spriteWork() else r.Stepped:wait() spriteWork() break end end else r.Stepped:wait() spriteWork() end end end repeat wait() until players.LocalPlayer.Character spawn(players.LocalPlayer.Character)
I'm pretty sure the focus of it is around here.
function getdepth(v) local t = q:clone() t.Parent = workspace t.CFrame = CFrame.new(v) local s = 2^5 local n = 1 for i = 1, 5 do s = s * .5 if t:Resize(face, s) then n = n + s end end t:Destroy() return n end local torso local flakes = {} function remove(flake) flake[1]:Destroy() flakes[flake] = nil end function getFlakes(Num) for i, v in pairs(flakes) do Num = Num+1 end return Num end function spriteWork() local cz = script.Parent.AbsoluteSize local cx, cy = cz.x, cz.y for sprite in pairs(flakes) do sprite[2] = sprite[2] * CFrame.new(0, -.2, 0) * CFrame.Angles(0, .037699111843078, 0) if sprite[2].p.y < sprite[4] then sprite[1]:Destroy() sprite:remove() end local px, py, sx, sy = projection(sprite[2],workspace.CurrentCamera.CoordinateFrame, sprite[3]) local label = sprite[1] if px and sx >= 1 and sy >= 1 then label.Visible = true label.Size = UDim2.new(0,sx,0,sy) label.Position = UDim2.new(0,((px + 1) * cx - sx) * .5,0,((py + 1) * cy - sy) * .5) else label.Visible = false end end end function spawn(char) for flake in pairs(flakes) do flake:Destroy() end while char.Parent do if getFlakes(0) < sl-10 then for i = 1, sl-10 do r.Stepped:wait() if getFlakes(0) < sl-10 then local label = Instance.new("ImageLabel", sp) label.Image = imgs[math.random(1, #imgs)] label.BackgroundTransparency = 1 local dx, dz = (math.random() - .5) * 200, (math.random() - .5) * 200 local pos = char["Torso"].Position + Vector3.new(dx, (30 - math.random() * 20) * (1 - (dx^2 + dz^2)^.5/(1.4142135623731 * 100)) , dz) local sphr = CFrame.new(Vector3.new(),Vector3.new(math.random()-.5,0,math.random()-.5)) + pos local size = 20 * (math.random() * .75 + .25) * 10 local sprite = {label, sphr, size, pos.y - getdepth(pos), remove = remove} local cz = sp.AbsoluteSize local cx, cy = cz.x, cz.y flakes[sprite] = 0 spriteWork() else r.Stepped:wait() spriteWork() break end end else r.Stepped:wait() spriteWork() end end end
I just don't know what to change and how to do it correctly. If you can just show me how to do so, don't have to write me the code, if you just show me where I need to work on I'd appreciate it!
Here's how the gui works. LINK: http://www.roblox.com/Test-place?id=153890092