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

Why isn't this digging tool working with Filtering Enabled?

Asked by 7 years ago
Edited 7 years ago

This digging tool digs out a small area of the terrain your mouse is on when you hold down the left mouse button.

With Filtering Enabled on, I have noticed that what the player digs out, is only visible to one player; the player who dug the terrain.

I can't seem to get it to work, no matter what I try.

The coding is this:

wait(1)
enabled = true
Tool = script.Parent
down = false -- Mouse isn't down
gui = script.LoadBar:clone() -- Displays your process in digging

-- auto-wedge fcn:
--sets cell x, y, z to default material if parameter is provided, if not sets cell x, y, z to be whatever material it previously was
--returns true if made a wedge, false if the cell remains a block
function MakeWedge(x, y, z, defaultmaterial)
    local c = game.Workspace.Terrain
    --gather info about all the cells around x, y, z
    surroundings = {} --surroundings is a 3 x 3 x 3 array of the material of the cells adjacent to x, y, z
    for i = x - 1, x + 1 do
        surroundings[i] = {}
        for j = y - 1, y + 1 do
            surroundings[i][j] = {}
            for k = z - 1, z + 1 do
                local material, wedge, rotation = c:GetCell(i, j, k)
                surroundings[i][j][k] = material.Value
            end
        end
    end
    --make some useful arrays and counters
    local sides = {} --sides is an array of the material of the 4 adjacent sides
    sides[0] = surroundings[x - 1][y][z]
    sides[1] = surroundings[x][y][z + 1]
    sides[2] = surroundings[x + 1][y][z]
    sides[3] = surroundings[x][y][z - 1]
    local adjacentSides = 0
    for n = 0, 3 do
        if sides[n] > 0 then
            adjacentSides = adjacentSides + 1
        end
    end
    local sidesAbove = {} --sides is an array of the material of the 4 adjacent sides 1 height above
    sidesAbove[0] = surroundings[x - 1][y + 1][z]
    sidesAbove[1] = surroundings[x][y + 1][z + 1]
    sidesAbove[2] = surroundings[x + 1][y + 1][z]
    sidesAbove[3] = surroundings[x][y + 1][z - 1]
    local adjacentSidesAbove = 0
    for n = 0, 3 do
        if sidesAbove[n] > 0 then
            adjacentSidesAbove = adjacentSidesAbove + 1
        end
    end
    local corners = {} --corners is an array of the material of the 4 adjacent corners
    corners[0] = surroundings[x - 1][y][z - 1]
    corners[1] = surroundings[x - 1][y][z + 1]
    corners[2] = surroundings[x + 1][y][z + 1]
    corners[3] = surroundings[x + 1][y][z - 1]
    local adjacentCorners = 0
    for n = 0, 3 do
        if corners[n] > 0 then
            adjacentCorners = adjacentCorners + 1
        end
    end
    local cornersAbove = {} --corners is an array of the material of the 4 adjacent corners 1 height above
    cornersAbove[0] = surroundings[x - 1][y + 1][z - 1]
    cornersAbove[1] = surroundings[x - 1][y + 1][z + 1]
    cornersAbove[2] = surroundings[x + 1][y + 1][z + 1]
    cornersAbove[3] = surroundings[x + 1][y + 1][z - 1]
    local adjacentCornersAbove = 0
    for n = 0, 3 do
        if cornersAbove[n] > 0 then
            adjacentCornersAbove = adjacentCornersAbove + 1
        end
    end
    --determine what type of wedge to make
    local material = nil
    local wedge = nil
    local rotation = nil 
    if defaultmaterial then
        material = defaultmaterial
    else
        material, wedge, rotation = c:GetCell(x, y, z) --start with the existing material, wedge, and rotation
    end
    wedge = 0 --default wedge is a block
    rotation = 0 --default rotation is 0
    --type 1: 45 degree ramp //must not have a block on top and must have a block under, and be surrounded by 1 side; or 3 sides and the 2 corners between them
    if surroundings[x][y + 1][z] == 0 and surroundings[x][y - 1][z] > 0 then
        if adjacentSides == 1 then
            for n = 0, 3 do
                if sides[n] > 0 then
                    wedge = 1
                    rotation = (n + 1) % 4
                    c:SetCell(x, y, z, material, wedge, rotation)
                    return true
                end
            end
        elseif  adjacentSides == 3 then
            for n = 0, 3 do
                if sides[n] > 0 and corners[(n + 1) % 4] > 0 and sides[(n + 1) % 4] > 0 and corners[(n + 2) % 4] > 0 and sides[(n + 2) % 4] > 0 then
                    wedge = 1
                    rotation = (n + 2) % 4
                    c:SetCell(x, y, z, material, wedge, rotation)
                    return true
                end
            end
        end
    end
    --type 2: 45 degree corner //must not have a block on top and must have a block under, and be surrounded by 2 sides and the 1 corner between them; or 3 sides and 1 corner between 2 of them (facing towards that corner)
    if surroundings[x][y + 1][z] == 0 and surroundings[x][y - 1][z] > 0 then
        for n = 0, 3 do
            if sides[n] > 0 and corners[(n + 1) % 4] > 0 and sides[(n + 1) % 4] > 0 and (adjacentSides == 2 or (adjacentSides == 3 and (corners[(n + 3) % 4] > 0 or (sides[(n + 2) % 4] > 0 and corners[(n + 2) % 4] > 0) or (sides[(n + 3) % 4] > 0 and corners[n] > 0)))) then
                wedge = 2
                rotation = (n + 2) % 4
                c:SetCell(x, y, z, material, wedge, rotation)
                return true
            end
        end
    end
    --type 3: 45 degree inverse corner //surrounded by three sides or 4 sides and 3 corners, with nothing above or else a block on top surrounded on 2 sides and the corner between them
    if adjacentSides == 3 and surroundings[x][y + 1][z] > 0 then
        if adjacentCorners > 1 then
            for n = 0, 3 do
                if (corners[n] == 0 or cornersAbove[n] == 0) and (sides[(n - 1) % 4] == 0 or sides[n] == 0) and (sidesAbove[n] == 0 and sidesAbove[(n + 1) % 4] > 0 and sidesAbove[(n + 2) % 4] > 0 and sidesAbove[(n + 3) % 4] == 0) then 
                    wedge = 3
                    rotation = (n + 3) % 4
                    c:SetCell(x, y, z, material, wedge, rotation)
                    return true
                end
            end
        end
    elseif adjacentSides == 4 and adjacentCorners == 3 then
        for n = 0, 3 do
            if corners[n] == 0 and (surroundings[x][y + 1][z] == 0 or (sidesAbove[n] == 0 and sidesAbove[(n + 1) % 4] > 0 and cornersAbove[(n + 2) % 4] > 0 and sidesAbove[(n + 2) % 4] > 0 and sidesAbove[(n + 3) % 4] == 0)) then
                wedge = 3
                rotation = (n + 3) % 4
                c:SetCell(x, y, z, material, wedge, rotation)
                return true
            end
        end
    end
    --type 4: half a cube, as if it were cut diagonally from front to back //surrounded by 2 sides
    if adjacentSides == 2 and adjacentCorners < 4 then
        for n = 0, 3 do
            if sides[n] == 0 and sides[(n + 1) % 4] == 0 and (surroundings[x][y + 1][z] == 0 or (sidesAbove[n] == 0 and sidesAbove[(n + 1) % 4] == 0 and sidesAbove[(n + 2) % 4] > 0 and sidesAbove[(n + 3) % 4] > 0)) then
                wedge = 4
                rotation = n
                c:SetCell(x, y, z, material, wedge, rotation)
                return true
            end
        end
    end
    c:SetCell(x, y, z, material, wedge, rotation)
    return false
end

function updateMouseRadius(mouse) -- Makes sure that while the player is digging he doesn't go move his mouse somewhere else going outside our magnitude
p = game.Players.LocalPlayer
if (mouse.Hit.p - p.Character.Torso.Position).magnitude > 20 then -- YOU RULE BREAKER!!!
onDeselect() -- Acts as if they stopped holding the mouse down
end
end



function onClick(mouse)
    h = game.Players.LocalPlayer.Character.Humanoid
    if not enabled or down or h == nil then
        return
    end
        p = game.Players.LocalPlayer
        if (p == nil) then return end
        if (p.Character == nil) then return end
        if (mouse.Hit.p - p.Character.Torso.Position).magnitude > 20 then return end
        down = true
        enabled = false
        c = game.Workspace.Terrain
        while down do
            Tool.Dirt.Smoke.Enabled = true
            if not p.PlayerGui:findFirstChild("LoadBar") then
                local l = gui:clone()
                l.Parent = p.PlayerGui
                script.Parent.guiObject.Value = l
            end
            local guivalue = p.PlayerGui:findFirstChild("LoadBar").Frame.LoadBarPercentage
            updateMouseRadius(mouse) -- Checks radius
            guivalue.Value = guivalue.Value + 3
            if guivalue.Value >= 100 then
                local cellPos = c:WorldToCellPreferSolid(Vector3.new(mouse.Hit.x, mouse.Hit.y, mouse.Hit.z))
                local x = cellPos.x
                local y = cellPos.y
                local z = cellPos.z     
                c:SetCell(x, y, z, 0, 0, 0)
                for i = x - 1, x + 1 do
                    for j = y - 1, y + 1 do
                        for k = z - 1, z + 1 do
                            MakeWedge(i, j, k)
                        end
                    end
                end
                Tool.Dirt.Smoke.Enabled = false
                onDeselect(mouse) -- Kills GUI
                enabled = false
                mouse.Icon = "rbxasset://textures\\GunWaitCursor.png"
                wait(0.5)
                mouse.Icon = "rbxasset://textures\\GunCursor.png"
                enabled = true
            end
        wait()
        end
end

function onClickOff(mouse)
Tool.Dirt.Smoke.Enabled = false
enabled = true
down = false
    if script.Parent.guiObject.Value ~= nil then
        script.Parent.guiObject.Value:remove()
    end
    if Tool.DiggyDiggyHole.Value ~= nil then
        Tool.DiggyDiggyHole.Value:Stop()
        Tool.DiggyDiggyHole.Value:remove()
    end
    Tool.GripForward = Vector3.new(0,0,-1)
    Tool.GripRight = Vector3.new(0,0,0)
    Tool.GripUp = Vector3.new(0, 1, 0)
    Tool.Animate.Disabled = true -- The script seems to crash after digging due to the animation becoming nil. Just restart it.
    Tool.Animate.Disabled = false
end

function onDeselect(mouse)
Tool.Dirt.Smoke.Enabled = false
enabled = true
down = false
    if script.Parent.guiObject.Value ~= nil then
        script.Parent.guiObject.Value:remove()
    end
    if Tool.DiggyDiggyHole.Value ~= nil then
        Tool.DiggyDiggyHole.Value:Stop()
        Tool.DiggyDiggyHole.Value:remove()
    end
    Tool.GripForward = Vector3.new(0,0,-1)
    Tool.GripRight = Vector3.new(0,0,0)
    Tool.GripUp = Vector3.new(0, 1, 0)
    Tool.Animate.Disabled = true -- The script seems to crash after digging due to the animation becoming nil. Just restart it.
    Tool.Animate.Disabled = false
end

function onSelect(mouse)
        mouse.Icon = "rbxasset://textures\\GunCursor.png"
        mouse.Button1Down:connect(function () onClick(mouse) end)
        mouse.Button1Up:connect(function () onClickOff(mouse) end)
end



script.Parent.Equipped:connect(onSelect)
script.Parent.UnEquipped:connect(onDeselect)

Any help is greatly appreciated!

0
251 lines... Shawnyg 4330 — 7y

1 answer

Log in to vote
1
Answered by 7 years ago
Edited 7 years ago

LocalScripts on FilteringEnabled will only affect the player, and not the game server. To fix this, you might want to look at this guide to FilteringEnabled.

(The Remote Functions and Remote Events helpful link is broken in that tutorial, so I put it here for you.)

Sorry to say, but you might have to change lots of what you already have to have FilteringEnabled in your game.

Ad

Answer this question