Edit: since nobody else is replying, this has passed to all network discussion, better to be moved to networking, mods?
Sorry for huge posts
I'm trying to pass everything I have learned.
Writing networking took me same amount of time as to write the game itself, but this is all because I started from scratch, didn't know anything about networking and wrote whole thing myself (server, client, and all technical stuff behind it).
It's not that much work when you know what you are doing. Once you figure out how to sync movement of one game object (a player for example) all others can be done is same way probably, because game objects tend to work very similar. If you do movement sync for a player you can easily do it for all other movable objects, since they probably move in same way but with other variables (different maximum speeds and accelerations, but same formulas).
And now about the data itself... basicly for each game object you have to send it's position (2 shorts), direction (a float), speed (a byte) and it's unique status (it's name, weapon, number of kills and such...). This is all highly dependable on your game and I can't tell you how to do it. As you wrote the game engine that process all this data, you'll know best what to send and when. Sometimes you don't need to send data until something changes... sometimes you need to send data every time. I don't know anything about your game (or game type even) so I can't help you with this.
All I can say that I've found it very easier to assign unique ID number for each object and then process received messages by that ID number, instead of putting data in the message some fixed way.
Example: first I've put Team1 players (player1 first, then player2 ...), then Team2 and so on..., so when reading message on the other side I first processed team1 starting at player1 and so on. When I've assigned each player unique ID and processed data on other side on player with same ID it was much easier. I didn't have to care anymore about putting it all nicely in message in some exact order, and reading in the same order. You just get the object with some ID and put data into it. This saved me lot of debugging as if you screwed up with reading or writing 1 byte in the message everything got screwed and it was almost impossible to debug in some short time... and network debugging is hell.
About your concern of duplicating gui code... huh? Server is just a client that tells other clients it's data should be used. When you run game engine, it calculates all bonuses, collisions and such. Server does this and clients connected to it don't have to (more precisly they should be corrected by server on regular basis). When you play single player ... it's like a server with no clients connected
Your model isn't a bad idea. That is how server-client works. Client receives everything from server, it only calculates movement for it's player. Status of other players and enemies (where they are heading, what they are doing) are all from server messages. Client doesn't calculates damage and such things at all... server does and sends results to all clients which display them. In short, clients just do calculation so they can draw data from server best they can, but don't do actual game calculations as damage and collisions. Again this is all highly dependent on your game.
Maybe I should just scrap the network support.
you'll need to learn it someday...