I’d say the easiest way to modify what you got is to include a copy of the server side script locally (stick it in replicated storage). Then, modify the original local module to use custom events and function and fire/call them whenever the normal remote events and functions are fired/called. The ship’s ownership and then be given to the server. After these simple changes you’ll probably have something that works half decent.
To complete the solution there should be some updates from the server to the client so the client doesn’t get out of sync. Also, if the client and server are editing the same instance there may be issues (I haven’t experimented though). I’d have the client actually remove the original ship and make a copy of it. To edit the server code to have it send updates back to the client, I’d make a new ship update module which communicates to the server ship module via custom events and functions to make sure that you can have an exact copy of the server ship script on the client. You can even have the custom functions and events for sending updates to the client on the client side, but they wouldn’t be hooked up to the module that actually calculates/sends those updates since it would only exist on the server.
The final question would be how/when to send updates… I like syncing position, velocity, and acceleration, rotation, angular velocity, and torque at a given time using tick(). Given this format a client can stay completely in sync without additional updates using mathematical formulas until the ship is in some way acted upon. Usually acted upon means hit by something, or in response to user input. Since user input is being handled on the client and server, it should be smooth and nice. The server can simply send an update every time input is given or acted upon.
Using this method the user wont be able to cheat by moving their ship fast than possible or colliding with objects owned by the server.
I would have the clients own all objects far from players, and when players get close to objects, change ownership over to the server so it can handle the collision fairly from all player’s perspective. The only problem that should exist is that if player latency is high it may seem like for a second that they missed what they hit, until their ship starts reacting to the hit. But they will have to be cutting it close to see that (1/10th of a second, maybe 1/5th). From all other players perspectives it will be perfect. No cheating with ship movement will be possible.