Try sending {CF.ToEulerAnglesXYZ()}, CF.Position and on the server side, to get the CFrame construct it like this:
game.ReplicatedStorage.remotes.Place.OnServerEvent:Connect(function(player,Angle,Position)
print(CFrame.fromEulerAnglesXYZ(Angle[3], Angle[2], Angle[1])*Position)
end
It’s prolly some weird precision loss issues, which won’t be noticeable. Afaik roblox serializes values that is passed through remotes and even though lua uses 64 bit double numbers, I think the engine uses 32 bit floats internally so the loss might be coming from small changes while rounding.
Now that I checked again yes I can replicate it and it shows the same thing it is 100% float imprecision float values can’t store anything and has blind spots I think that’s what is causing it
well this was 2 years ago so sorry about that but YES, it is very noticable, at least the rotation is basically totally different, im having the same exact issue when raycasting and then sending the CFrame through so my guess is that it has something to do with the raycasting also?
anyway, dont know if you ever found a fix for this other than just sending it the other way around (which i cant do for the reason that im raycasting on the client off of the player wtich isnt perfectly replicated on the server)
im going to try to find a solution this evening and ill report back if i discover anything
Edit: wait a second i just realized i am also using .fromMatrix to construct the CFrame! … and almost the same way you showed… there must be a roblox bug in that somewhere
There appears to be a roblox bug with the instanciation of the CFrame datatype, by making a part on the client first, setting its CFrame to the calculated CFrame (creating a new instance of the CFrame that the client part… has, owns) and then sending the CFrame of that client part to the server, that works! And then you can just delete the client part.