So I was trying to improve my placement script, now to let it place with the server, this wasn't very easy lol. It works... but there is one thing that makes me a bit frustrated, when you place something it really lags, this isn't something that breaks the script but it's really really hard lag... It dissapears when the placement finished. The scripts are in the tool
Here is the local script that sends mouse data to the srever script
local AMPevent = game:GetService('ReplicatedStorage'):WaitForChild('AskMousePos')
local player = game.Players.LocalPlayer
local mouse = player:GetMouse()
local MouseClickEvent = game:GetService('ReplicatedStorage'):WaitForChild('MouseClick')
button = 1
buttonDebounce = true
function AMPevent.OnClientInvoke()
local mousePos = mouse.Hit.p
return mousePos
end
mouse.Button1Down:connect(function()
if buttonDebounce then
buttonDebounce = false
print('fired')
button = 1
MouseClickEvent:FireServer(button)
wait(1)
buttonDebounce = true
end
end)
mouse.Button2Down:connect(function()
if buttonDebounce then
print('fired')
button = 2
MouseClickEvent:FireServer(button)
buttonDebounce = true
end
end)
This is a server script inside the tool (the local script is also in the tool)
local AMPevent = game:GetService('ReplicatedStorage'):WaitForChild('AskMousePos')
local MouseClickEvent = game:GetService('ReplicatedStorage'):WaitForChild('MouseClick')
local plr = script.Parent.Parent.Parent
print(plr.Name)
local tool = script.Parent
local player = game:GetService("Players").LocalPlayer
Debounce = false
pressed = false
cancelled = false
canPress = false
tool.Equipped:connect(function()
print("Tool equipped!")
MouseClickEvent.OnServerEvent:connect(function(plr, button)
print('client event')
pos = AMPevent:InvokeClient(plr)
print("Mouse pressed!")
if Debounce == false and button == 1 then
Debounce = true
local ray = Ray.new(tool.Handle.CFrame.p, (pos - tool.Handle.CFrame.p).unit * 30)
local part, position = workspace:FindPartOnRay(ray, player.Character, false, true)
PreviewPart = script.Parent.Wooden_Floor:Clone()
PreviewPart.Name = "Preview part"
PreviewPart.Transparency = 0.5
PreviewPart.Anchored = true
PreviewPart.CanCollide = false
PreviewPart.Position = position + Vector3.new(0, 0.375, 0)-- + Vector3.new(0,part.Size.Y/2,0)
PreviewPart.Parent = workspace
customBuild = Instance.new("Part")
customBuild.Transparency = 1
customBuild.Anchored = true
customBuild.CanCollide = false
customBuild.Name = "CustomBuild"
customBuild.Parent = PreviewPart
wait(1)
canPress = true
end
end)
end)
while wait() do
pos = AMPevent:InvokeClient(plr)
if Debounce == true then
MouseClickEvent.OnServerEvent:connect(function(plr, button)
print(tostring(button),tostring(canPress))
if canPress == true and button == 1 then
print('placed')
pressed = true
elseif button == 2 then
print('cancelled')
cancelled = true
else
warn('eror')
end
end)
if cancelled == true then
Debounce = false
cancelled = false
pressed = false
canPress = false
for i,v in pairs(workspace:GetChildren()) do
if v.Name == "Preview part" then
v:Destroy()
end
end
print(cancelled)
elseif pressed == true then
Debounce = false
cancelled = false
pressed = false
canPress = false
for i,v in pairs(workspace:GetChildren()) do
if v.Name == "Preview part" then
v.Transparency = 0
v.Name = "Floor"
v.CanCollide = true
end
end
end
if PreviewPart ~= nil then
local list = {player.Character,PreviewPart}
local Player = game.Players:GetPlayers()
local ray = Ray.new(tool.Handle.CFrame.p, (pos - tool.Handle.CFrame.p).unit * 30)
local part, position = workspace:FindPartOnRayWithIgnoreList(ray, {player.Character,PreviewPart}, false, true)
PreviewPart.Position = position --+ Vector3.new(0, 0.375, 0)
end
end
end
