I have a solution to this problem, but I am wondering why it does it, here's the code:
Local:
SavePositionEvent:FireServer(SelectionBox.Adornee.Position, Player)
ServerSide:
SavePositionEvent.OnServerEvent:connect(function(Player, Position)
print("X: " ..Position.X.. "Y: " ..Position.Y.. "Z: " ..Position.Z.. "Player: " ..Player.Name)
end)
As you see when I fire it I put Position first then the Player, but when I receive it I have to put the values the other way around otherwise I get this error:
07:45:54.493 - X is not a valid member of Player 07:45:54.495 - Script 'ServerScriptService.Startup', Line 27 07:45:54.496 - Stack End
Otherwise with the two values switched around it works, just wondering why they're messed up?

1 comment
Local scripts send the Player no matter what. You putting Player second on the local script doesn't matter, because the local script always sends the local player as its first argument. Just a theory.