Basically you just have a scrolling map? I don’t see why this would affect anything for client/server work. If it does, there must be something really wrong in your design.
Ok now, how to make a good client/server where the server is the decision maker (validate every move from the client) and the client doesn’t have any lag? Here is a solution :
You will need to run a simulation of your code on the clients and on the server. Yeah you can’t save this, the server need to run the exact same logic game update code as your client.
On your client you need to have 2 world. One world that is up to date (current time) and another one that lag behind. The world that lag behind is for comparison. You will compare this world with the world that the server will send to you from time to time to see if your client is still sync with the world of the server. If it’s not, you will take the world from the server, send it to the client, update it to the current time and continue your simulation. To do so, you need to keep track of every move that you did and every move that the server told you the other players did.
The world that will be display on the client screen is the up to date world. In this world, when the player make a move (like move forward) the client automatically move forward so there is no lag. Then this event reach the server and the process of validation (as mentioned above start). If everything is perfect, there will be no modification to the client if there is a problem the simulation will be rerun from the point were the problem occurs. But most of the time, there shouldn’t be a problem.
That way you got a client with no lag and it will be synchronize with the server.
Ok, that’s simple to explain like that but it requires a couple of work and things need be done right.
One of the thing that you will see is that the server doesn’t require to have the drawing code so you can remove it to reduce the overhead of running the same simulation on the server.
Another very important thing is that you need to have a fix deltaTime for your update method. If you have a random deltaTime, you can’t synchronize the client and the server with this method. So get a good gameloop. With your fix deltaTime you can assigned each input from the player to a specific update. So if on the client side the player press to move forward on update 213, on the server this client need to be move forward on update 213. You always need to update on the same update number. That bring another problem, the update number on the client and the server need to be roughly the same hence the need of an synchronized clock between the client and the server.
So yeah it’s a lot of work. If you don’t need to have perfect simulation on the client then just make the server decide everything and send message to the client for when to move or do a specific action. The simulation won’t be perfect and you will feel the lag a bit but it’s easier.