Datastores are just big tables of key & value pairs so you just need to get the PlayerID and use it as a key.
Also, yes. It would work better if you used a separate place to manage the player farms. DataStores are shared through all places in a game so this should still work.
Then you wouldn’t even have to reserve a server to get back to the town. All you have to do is TeleportService:Teleport(placeID for the hub, player). I believe that’s what it is but I’m back on my phone and doing it from memory.
I think I didn’t test this yet the best way to make single-player regions would be to change the fog end to something like 600, and then but player farms 600-700 studs away from each other. The way would be to load in/out the other players’ character and farm in Replicated Storage.
If you want a central hub/town you can make this your main (root) place. Then you can create a new place under the same Game (aka Universe) to have your singleplayer zones in, and it can have its own code to load in everything for the player. Since they’d be a part of the same game, you can share DataStore data pretty easily for example.
You can also pass in extra data through TeleportService and get this data on the server safely. That would allow you to tell your singeplayer place to do different things (e.g. loading a specific area)
You can use the TeleportService to teleport a player into this secondary place. You can basically reserve a server for every player who wants to join a singleplayer world and teleport them there and you won’t need to worry about MaxPlayers since Roblox queues a new server every time you reserve one. You could do this for every player that joins and keep the key the whole time, or you could do this every time you are about to teleport them. (I’d recommend the first way as it would allow you to teleport other players into their server, and you can simply specify the “owner” user id in the teleport data for which player’s world to load)
If you’re worried about Roblox’s loading GUI being put in the middle, you can actually customize this UI for teleports using ReplicatedFirst. The function to disable the default loading GUI is a part of ReplicatedFirst, and you can use it in the secondary place and add your own GUI (it is a little finicky, but it’s not too difficult).