I made a few Projects with networking and stuff, also on work i have alot to do with sockets and network streams, so i think and hope i picked a good setup for my task.
The Client is made with Unity by using its onboard Tilemap and Sprite system.
I decided for unity because i wanted to be able to reuse code from the server, specially the network code and some stuff.
Authentication is managed via an extra Authserver that accepts Rest API calls on an HTTPS address, after authentication is done, the client will connect to a World server, the address of this server and some kind of token to identify the client is in the response of the API call.
The Authentication server is written in C# by using .net Core 3 and ASP core
The world server is also written in C# with .net Core 3 but without ASP, it shares some database code with the auth server but its an own process.
the database is curently RethinkDB a Document oriented database that i used for some projects and anyhow like alot, i will see how it performs for that task.
But i layered all database code to an Interface, so i could replace the database to any other DBMS, specially if its also document oriented it should be very easy to implement.
The communication between the client and the world server is done with LiteNetLib, because its works on .net core and also in Unity.
currently the netcode is not so well layered of the game or server code, but switching to another network library should also be possible as long as i can write and read bytes from/to the stream.
I dont use any object serialisation for the netcode, because im just not a big fan of all that metadata coming through with serialized objects.
Full authorative Servers
Any player action is executed on the server, so if a player losts connection he cant do anything.
If example a player wants to move from A to B, then just a message preamble and a position is being transferred, and the answer is that the Player Entity is now moving from A to B, if this is even possible.
Same with buy, sell and any other player Actions.
Each world server represents a Game world that can be imagined as a continent or a big Island
If you travel to another continent (by ship) then you technically connect to another world server.
here some image that i just made in mspaint: