What I'm having a problem with is that I made a hammer that allows me to build fences, and so far I'm very happy with the progress! However when I tried it on a local server, it just refuses to work, even printing a string of words, you know, print("Something like this!"). I tried connecting it to the server with a RemoteEvent but it still doesn't work, only on the server! I have no idea why! I might just be blind and stupid but oh well.
I just can't seem to spot the fix. I'm also not sure if it's because of the tool itself or the scripts contained inside because I copied the exact tool but changed the script to just place a brick where you click in the workspace, it works like I expected it to without flaws. Be warned that the script you're about to see is long. 202 lines as of now.
THIS IS CLIENT SIDED!
local plr = game.Players.LocalPlayer
local tool = script.Parent
local mouse = plr:GetMouse()
local canSelectOption = true
local canPlaceItem = false
local isHoldingShift = false
local isShowingCantPlace = false
local isSetToGreen = true
local toolIsEquipped = false
local previousAngle = 0
local originalPartColor = {}
local originalPartTransparency = {}
local originalPartMaterial = {}
repeat wait() until plr.PlayerGui.HammerBuildingGui ~= nil
repeat wait() until game.ServerStorage.Fences ~= nil
script.Parent.Print:FireServer("Loaded Hammer Script")
local function resetAllValues()
canSelectOption = true
canPlaceItem = false
isHoldingShift = false
isShowingCantPlace = false
isSetToGreen = true
previousAngle = 0
originalPartColor = {}
originalPartTransparency = {}
originalPartMaterial = {}
end
local function changeFenceToRed()
pcall(function()
script.Parent.Print:FireServer("Changed to red")
for i = 1, #fenceSelected:GetChildren() do
local parts = fenceSelected:GetChildren()
if parts[i]:IsA("BasePart") and parts[i].Name ~= "FenceCollision" then
parts[i].Transparency = 0.5
parts[i].Material = "SmoothPlastic"
parts[i].BrickColor = BrickColor.new(Color3.fromRGB(255,100,100))
end
end
end)
end
local function changeFenceToGreen()
pcall(function()
script.Parent.Print:FireServer("Changed to green")
for i = 1, #fenceSelected:GetChildren() do
local parts = fenceSelected:GetChildren()
if parts[i]:IsA("BasePart") and parts[i].Name ~= "FenceCollision" then
parts[i].Transparency = 0.5
parts[i].Material = "SmoothPlastic"
parts[i].BrickColor = BrickColor.new(Color3.fromRGB(50,255,50))
end
end
end)
end
for i, option in pairs(plr.PlayerGui.HammerBuildingGui.Frame.OptionsScrollingFrame:GetChildren()) do
if option:IsA("TextButton") and game.ServerStorage.Fences:FindFirstChild(option.Name) then
option.MouseButton1Click:connect(function()
script.Parent.Print:FireServer("Clicked option: " .. option.Name)
script.Parent.Build:FireServer(option, canSelectOption)
if canSelectOption == true and toolIsEquipped == true then
local function createFence()
canSelectOption = false
fenceSelected = game.ServerStorage.Fences[option.Name]:Clone()
fenceSelected.FenceCollision.CanCollide = false
fenceSelected.Parent = workspace
for i = 1, #fenceSelected:GetChildren() do
local parts = fenceSelected:GetChildren()
if parts[i]:IsA("BasePart") and parts[i].Name ~= "FenceCollision" then
originalPartColor[i] = parts[i].BrickColor
originalPartTransparency[i] = parts[i].Transparency
originalPartMaterial[i] = parts[i].Material
end
end
changeFenceToGreen()
if isHoldingShift == true then
fenceSelected:SetPrimaryPartCFrame(fenceSelected:GetPrimaryPartCFrame() * CFrame.Angles(0,math.rad(previousAngle),0))
end
mouse.TargetFilter = fenceSelected
repeat
fenceSelected:TranslateBy(Vector3.new(mouse.Hit.p.X,((fenceSelected.Settings.FenceHeight.Value / 2) - 0.2) + mouse.Hit.p.Y, mouse.Hit.p.Z) - fenceSelected:GetPrimaryPartCFrame().p)
if mouse.Target and isShowingCantPlace == false then
if mouse.Target.Name == "PlaceableVisibility" then
canPlaceItem = true
if isSetToGreen == false then
isSetToGreen = true
changeFenceToGreen()
end
else
canPlaceItem = false
if isSetToGreen == true then
isSetToGreen = false
changeFenceToRed()
end
end
end
game:GetService("RunService").RenderStepped:Wait()
until canSelectOption == true
if isHoldingShift == true then
createFence()
end
end
createFence()
end
end)
end
end
tool.Equipped:connect(function()
script.Parent.Print:FireServer("Equipped tool")
toolIsEquipped = true
resetAllValues()
pcall(function()
plr.PlayerGui.HammerBuildingGui.Frame:TweenPosition(UDim2.new(0,5,1,-255), "Out", "Quad", 0.5)
end)
end)
tool.Unequipped:connect(function()
script.Parent.Print:FireServer("Unequipped tool")
toolIsEquipped = false
resetAllValues()
fenceSelected:Destroy()
pcall(function()
plr.PlayerGui.HammerBuildingGui.Frame:TweenPosition(UDim2.new(0,-300,1,-255), "Out", "Quad", 0.5)
end)
end)
mouse.Button1Down:connect(function()
script.Parent.Print:FireServer("Button1Down")
if canSelectOption == false and canPlaceItem == true and plr.leaderstats.Cash.Value >= fenceSelected.Settings.Price.Value and plr.leaderstats.Level.Value >= fenceSelected.Settings.LevelRequired.Value then
canSelectOption = true
script.Parent.UpdateStats:FireServer(plr.leaderstats, fenceSelected.Settings.Price.Value, fenceSelected.Settings.LevelRequired.Value)
script.Parent.Build:FireServer(fenceSelected, originalPartColor, originalPartTransparency, originalPartMaterial)
elseif canSelectOption == false and canPlaceItem == true then
isShowingCantPlace = true
changeFenceToRed()
wait(0.1)
changeFenceToGreen()
isShowingCantPlace = false
end
end)
game:GetService("UserInputService").InputBegan:connect(function(key)
if key.KeyCode == Enum.KeyCode.Q and canSelectOption == false then
canSelectOption = true
canPlaceItem = false
originalPartColor = {}
originalPartTransparency = {}
originalPartMaterial = {}
fenceSelected:Destroy()
elseif key.KeyCode == Enum.KeyCode.R and canSelectOption == false and canPlaceItem == true then
fenceSelected:SetPrimaryPartCFrame(fenceSelected:GetPrimaryPartCFrame() * CFrame.Angles(0,math.rad(45),0))
previousAngle = previousAngle + 45
elseif key.KeyCode == Enum.KeyCode.LeftShift then
isHoldingShift = true
end
end)
game:GetService("UserInputService").InputEnded:connect(function(key)
if key.KeyCode == Enum.KeyCode.LeftShift then
isHoldingShift = false
end
end)
ATTENTION! Okay, now I've got your attention, I'm just telling you that the next script is server sided.
script.Parent.Build.OnServerEvent:connect(function(plr, fenceSelected, originalPartColor, originalPartTransparency, originalPartMaterial)
for i = 1, #fenceSelected:GetChildren() do
local parts = fenceSelected:GetChildren()
if parts[i]:IsA("BasePart") and parts[i].Name ~= "FenceCollision" then
parts[i].BrickColor = originalPartColor[i]
parts[i].Transparency = originalPartTransparency[i]
parts[i].Material = originalPartMaterial[i]
elseif parts[i]:IsA("BasePart") and parts[i].Name == "FenceCollision" then
parts[i].CanCollide = true
end
end
end)
script.Parent.UpdateStats.OnServerEvent:connect(function(plr, stats, price, level)
stats.Cash.Value = stats.Cash.Value - price
end)
script.Parent.Print.OnServerEvent:connect(function(plr, message)
print(message)
end)

2 comments
Any errors?
Nope, no errors at all. Server and client doesn’t show any errors.