Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Server script activity very high when using spell move?

Asked by 2 years ago
Edited 2 years ago

Hello, I am developing a element type game with my friends and I played around with loops and I suddenly realized that the loop is causing intense server lag if many people use the move, which is a problem because it's meant for many people to be in a server and i don't want it to lag and the players having a bad experience. When one person uses it the activity goes up to something like 6% which is not ideal with many players. The lag is coming from line 92, and seems to increase the more i do the move Here is the script :

local Debris = game:GetService("Debris")
local TweenService = game:GetService("TweenService")
local RunService = game:GetService("RunService")

local Connection4
local Connection5
local Connection6
game.ReplicatedStorage.Fire.Events.Move2.OnServerEvent:Connect(function(Player)
    local function GetMouse()
        local MS
        local Num = math.random(1,10)..math.random(1,10)..math.random(1,10)..math.random(1,10)
        game.ReplicatedStorage.GetMouse:FireClient(Player,Num)
        game.ReplicatedStorage.GetMouse.OnServerEvent:Connect(function(Player,M,N)
            if N == Num then
                MS = M
            end
        end)
        repeat wait() until MS
        return MS
    end 
    local AlreadyHit = {}
    local Burning = {}
    local FlamePart = Instance.new("Part")
    local Duration = true
    local Anim = Instance.new("Animation",Player.Character)
    Anim.AnimationId = "rbxassetid://10545496514"
    Anim = Player.Character.Humanoid.Animator:LoadAnimation(Anim)
    Anim:Play()

    FlamePart.Parent = workspace.Debris
    FlamePart:SetNetworkOwner(Player)
    FlamePart.Size = Vector3.new(1,1,1)
    FlamePart.Anchored = true
    FlamePart.CanCollide = false
    FlamePart.Transparency = 1
    local HitPart =  Instance.new("Part")
    HitPart.Parent = workspace.Debris
    HitPart.Anchored = true
    HitPart.Transparency = 1
    HitPart.CanCollide = false
    HitPart.Size = Vector3.new(4.5,4.5,40)
    HitPart.CFrame = CFrame.new((Player.Character.HumanoidRootPart.CFrame * CFrame.new(0,0,-2)).Position,GetMouse()) * CFrame.new(0,0,-(HitPart.Size.Z/2 + 2))
    local Sound = game.ReplicatedStorage.Fire.SoundEffects.Flamethrower:Clone()
    Sound.Parent = Player.Character.HumanoidRootPart
    Sound:Play()
    HitPart.Touched:Connect(function(t)
        if t.Parent:FindFirstChild("Humanoid") then
            if table.find(AlreadyHit,t.Parent) == nil and not t:IsDescendantOf(Player.Character) then
                table.insert(AlreadyHit,t.Parent)
                table.insert(Burning,t.Parent)
                for i, v in pairs(t.Parent:GetChildren()) do
                    if v:IsA("Part") or v:IsA("MeshPart") then
                        coroutine.wrap(function()
                            for l,k in pairs(game.ReplicatedStorage.Fire.ParticleEmitters.BurningEffect:GetChildren()) do
                                k = k:Clone()
                                k.Parent = v
                                k.Enabled = true
                                coroutine.wrap(function()
                                    wait(3)
                                    for i, v in pairs(Burning) do
                                        if v == t.Parent then
                                            table.remove(Burning,i)
                                        end
                                    end
                                    for i, v in pairs(AlreadyHit) do
                                        if v == t.Parent then
                                            table.remove(AlreadyHit,i)
                                        end
                                    end
                                    k.Enabled = false
                                    Debris:AddItem(k,1)
                                end)()
                            end
                        end)()
                    end
                end
                coroutine.wrap(function()
                     while true do
                        wait(.5)
                        if table.find(Burning,t.Parent) ~= nil then
                            t.Parent:FindFirstChild("Humanoid"):TakeDamage(4.5783)
                        end
                        if Duration == false or table.find(Burning,t.Parent) == nil then
                            break
                        end
                    end
                end)()
            end
        end
    end)
    coroutine.wrap(function()
     Connection4 = RunService.Stepped:Connect(function()
            if HitPart ~= nil then
            HitPart.CFrame = CFrame.new((Player.Character.HumanoidRootPart.CFrame * CFrame.new(0,0,-2)).Position,GetMouse()) * CFrame.new(0,0,-(HitPart.Size.Z/2 + 2))
            else
                Connection4:Disconnect()
            end
            end)
    end)()
    for i, v in pairs(game.ReplicatedStorage.Fire.ParticleEmitters.Flamethrower:GetChildren()) do
        v = v:Clone()
        v.Parent = FlamePart
        v.Enabled = true
        spawn(function()
            wait(5)
            v.Enabled = false
        end)
    end
    coroutine.wrap(function()
    Connection5 = RunService.Heartbeat:Connect(function()
     if Duration == true then
        FlamePart.CFrame = CFrame.new((Player.Character.HumanoidRootPart.CFrame * CFrame.new(0,0,-2)).Position,GetMouse())
    end
    end)
    end)()
    spawn(function()
    wait(5)
    Connection4:Disconnect()
    Connection5:Disconnect()
    Anim = nil
    Debris:AddItem(FlamePart,1)
    HitPart:Destroy()
    HitPart = nil
    Duration = false
    end)    
end)


Answer this question