Hello! I have been trying to replicate the placing system from the game Raft and it works, but the object is offset by a few studs
My Placing: https://i.imgur.com/tCenwu9.png
Raft's Placing: https://i.imgur.com/aQQeHOe.png
I'm ONLY asking about the placing, not anything else
My Client Sided Code:
wait()
print("RUNNING")
local m = game.Players.LocalPlayer:GetMouse()
local rotateAmount = 1.5707963267949 -- 90 degree rotation
--local looseRotationAmount = 0.00017453292519943 -- 0.01 (very small rotation) (For Misc Item Placement)
local turnDegress = rotateAmount
local cframe
m.KeyDown:Connect(function(k)
print(k)
if k == "r" then
if turnDegress > 6.2 then
turnDegress = 0
end
turnDegress = turnDegress + rotateAmount
end
end)
function roundBy7x7Grid(cf)
local x,y,z = cf.X,cf.Y,cf.Z
return (CFrame.new(x-(x%7),y-(y%7),z-(z%7)))
end
--[[
Okay, so, for now, I'm just using the "Foundation" blueprint
I will use a different blueprint but this one is just for testing purposes
--]]
local bPrintValue = script.Parent.Blueprint
bPrintValue.Value = game.ReplicatedStorage.RaftParts.Foundation.Object.Model
local blueprint = bPrintValue.Value:Clone()
blueprint.Parent = workspace.CurrentCamera
m.TargetFilter = blueprint
--local animTrack = game.Players.LocalPlayer.Character.Humanoid:LoadAnimation(script.Parent.Swing)
local playingAnim = false
--animTrack.KeyframeReached:Connect(function(kf)
-- if kf == "Stop" then
-- playingAnim = false
-- end
--end)
script.Parent.Blueprint:GetPropertyChangedSignal("Value"):Connect(function()
print("ERROR?")
if bPrintValue.Value then
blueprint:Destroy()
blueprint = bPrintValue.Value:Clone()
blueprint.Parent = workspace.CurrentCamera
m.TargetFilter = blueprint
else
game.Players.LocalPlayer:Kick("Blueprint Error. Please Rejoin\n\nData did save")
end
end)
game.Players.LocalPlayer.Character.Humanoid.Died:Connect(function()
blueprint:Destroy()
-- while wait(1e7) do end
end)
function check(cf)
for i,v in pairs(game.ReplicatedStorage._POSITIONS:GetChildren()) do
if v.Value == cf then
return false
end
end
return true
end
spawn(function()
while wait() do
while script.Parent.Enabled do
print("YES")
if check() then
print("YESYES")
if game.Players.LocalPlayer:DistanceFromCharacter(m.Hit.p) < 12 then
print("DISTANCE")
cframe = roundBy7x7Grid(m.Hit) * CFrame.Angles(0,turnDegress,0)
print("CFRAME = "..tostring(cframe))
if blueprint.PrimaryPart then
print("YES")
if cframe.Y < 0 then
print("ROUNDING ERROR")
cframe = cframe * CFrame.new(0,7,0)
end
print("PLACING")
cframe = cframe * CFrame.new(-7,0,0)
blueprint:SetPrimaryPartCFrame(cframe)
end
else
if blueprint.PrimaryPart then
blueprint:SetPrimaryPartCFrame(CFrame.new(0,-100,0))
end
end
wait()
end
end
end
end)
local down = false
local db = false
--function Animation()
-- if not playingAnim then
-- playingAnim = true
-- animTrack:Play()
-- end
--end
spawn(function()
while wait() do
if down then
print("BUILDING")
print(#blueprint.PrimaryPart:GetTouchingParts())
-- if #blueprint.PrimaryPart:GetTouchingParts() == 0 then
-- Animation()
script.Parent.RaftEvent:FireServer(game.ReplicatedStorage.RaftParts.Foundation.Object.Model,cframe)
-- end
end
end
end)
script.Parent.Activated:Connect(function()
-- animTrack:Play()
down = true
end)
script.Parent.Deactivated:Connect(function()
down = false
end)
If you need the server code, ask me and I'll update the message

2 comments
ooo i love raft. best of luck on your project.
thanks :3