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

What is the best approach to preventing clones from multiplying per on-clicked event?

Asked by 9 years ago

I've been developing a script where if you press the right button down of the mouse, a clone will be brought into the Workspace; the position depends on what side the Part was clicked on, ex., if the mouse hovers on the top side of the part, the new position of the placement of the clone will be 3 studs higher in the y-direction, for a 3 by 3 by 3 block.

The problem is, that sometimes the function is activated more than once even though it is specified that it should only be cloned per button down. When tested both in Studio and online, the outcome is the same in-game: the clones would be created in sets of two or more, instead of one.

The following is my script:

local Player = game.Players.LocalPlayer
local Mouse = Player:GetMouse()

xBuild= Mouse.Target.Position.X
yBuild= Mouse.Target.Position.Y
zBuild= Mouse.Target.Position.Z

if tostring(Mouse.Target)== "DirtBlockClone" then
if Mouse.TargetSurface== Enum.NormalId.Bottom then
            --print("bottom")
            if Player:DistanceFromCharacter(Mouse.Target.Position)< 16 then
                workspace.numClonedBricks.Value= workspace.numClonedBricks.Value+1

                local clone= workspace.DirtBlock:Clone()
                clone.Name= "DirtBlockClone"
                clone.Parent= workspace.DirtBlockCloneGroup
                clone.Position= Vector3.new(xBuild,yBuild-3,zBuild)
                --workspace.DirtBlockCloneGroup.DirtBlockClone:Destroy()
            end
        end
        if Mouse.TargetSurface== Enum.NormalId.Bottom then
            --print("bottom")
            if Player:DistanceFromCharacter(Mouse.Target.Position)< 16 then
                workspace.numClonedBricks.Value= workspace.numClonedBricks.Value+1

                local clone= workspace.DirtBlock:Clone()
                clone.Name= "DirtBlockClone"
                clone.Parent= workspace.DirtBlockCloneGroup
                clone.Position= Vector3.new(xBuild,yBuild-3,zBuild)
                --workspace.DirtBlockCloneGroup.DirtBlockClone:Destroy()
            end
        end
        if Mouse.TargetSurface== Enum.NormalId.Front then
            --print("front")
            if Player:DistanceFromCharacter(Mouse.Target.Position)< 16 then
                workspace.numClonedBricks.Value= workspace.numClonedBricks.Value+1

                local clone= workspace.DirtBlock:Clone()
                clone.Name= "DirtBlockClone"
                clone.Parent= workspace.DirtBlockCloneGroup
                clone.Position= Vector3.new(xBuild,yBuild,zBuild-3)
                --workspace.DirtBlockCloneGroup.DirtBlockClone:Destroy()
            end
        end
        if Mouse.TargetSurface== Enum.NormalId.Back then
            --print("back")
            if Player:DistanceFromCharacter(Mouse.Target.Position)< 16 then
                workspace.numClonedBricks.Value= workspace.numClonedBricks.Value+1

                local clone= workspace.DirtBlock:Clone()
                clone.Name= "DirtBlockClone"
                clone.Parent= workspace.DirtBlockCloneGroup
                clone.Position= Vector3.new(xBuild,yBuild,zBuild+3)
                --workspace.DirtBlockCloneGroup.DirtBlockClone:Destroy()
            end
        end
        if Mouse.TargetSurface== Enum.NormalId.Left then
            --print("left")
            if Player:DistanceFromCharacter(Mouse.Target.Position)< 16 then
                workspace.numClonedBricks.Value= workspace.numClonedBricks.Value+1

                local clone= workspace.DirtBlock:Clone()
                clone.Name= "DirtBlockClone"
                clone.Parent= workspace.DirtBlockCloneGroup
                clone.Position= Vector3.new(xBuild-3,yBuild,zBuild)
                --workspace.DirtBlockCloneGroup.DirtBlockClone:Destroy()
            end
        end
        if Mouse.TargetSurface== Enum.NormalId.Right then
            --print("right")
            if Player:DistanceFromCharacter(Mouse.Target.Position)< 16 then
                workspace.numClonedBricks.Value= workspace.numClonedBricks.Value+1

                local clone= workspace.DirtBlock:Clone()
                clone.Name= "DirtBlockClone"
                clone.Parent= workspace.DirtBlockCloneGroup
                clone.Position= Vector3.new(xBuild+3,yBuild,zBuild)
                --workspace.DirtBlockCloneGroup.DirtBlockClone:Destroy()
            end
        end
end

One of my attempts to correct the issue was to include some sort of debounce, and prevent it from activating simultaneously in a one-action function (script for one of the sides shown; the other sides follow suit basically):

local rightClicked= false-- debounce initiation

Mouse.Button2Down:connect(
    function()

    if not rightClicked then
        rightClicked= true

        if tostring(Mouse.Target)== "DirtBlockClone" then   
            if Mouse.TargetSurface== Enum.NormalId.Top then
            --print("top")
                if Player:DistanceFromCharacter(Mouse.Target.Position)< 16 then
                    workspace.numClonedBricks.Value= workspace.numClonedBricks.Value+1              

                    local clone= workspace.DirtBlock:Clone()
                    clone.Name= "DirtBlockClone"
                    clone.Parent= workspace.DirtBlockCloneGroup
                    clone.Position= Vector3.new(Mouse.Target.Position.X,Mouse.Target.Position.Y+3,Mouse.Target.Position.Z)

                    rightClicked= false
                end
            end
        end
    end
end)

One of the reasons I've used the Mouse class in preference to a click detector was associated with not having to create the detector object for each clone.

Edit: Building the bricks from top or below seem to be fine, but any side causes error; I feel this has to do with where the mouse is hovering over, or that the pressed event is really firing more than once.

0
In addition, I would also like to note that some of my scripts used to be organized in modular form; however I had some recent setbacks with the 'require' method involving referencing modular scripts with ReplicatedStorage, causing my game to break. Houlardy642 28 — 9y
0
This explains me having to use 'workspace.numClonedBricks.Value' to increment the number of clones instead of simply referencing the function that would perform it instead. Houlardy642 28 — 9y

Answer this question