Not really - because it was a pain the ass for me too
![biggrin.gif](style_emoticons/default/biggrin.gif)
Although, because traffic between UI and Engine is low, and of the lowest priority, I actually just send the messages as delimited strings.. ie:
KAI_CLIENT_PING;Initial;50;
etc.
I suppose it would be "cleaner" to use proper byte packed structs with everything in - but as you say, it's a pain in the ass, especially when going up to server and back. It also makes sense to other people more easily. For example, that line above is absolutely obvious, even to a fledgling coder - give him a simple int parseMessage(char* sMessage); and he can make a UI.
While the players state is always stored on the orbital, we try to keep as much cached in the engine as possible - for example, if the UI needs to ask what arena he's in, we go UI <--> Engine <--> UI, as opposed to UI <--> Engine <--> Orb <--> Engine <--> UI.... even though the players arena state is only *really* known by the server.
My biggest headache with the thing was getting the orbitals talking to each other properly - imagine one guy signing in on Orb A. He has 23 contacts - they are all on one of 13 other orbs.. the orbs must a.) Find them, b.) Check if you're meant to be on their list, c.) Get their IP info and d.) Get that back to the calling engine. Given that these boxes are not dependant on the main TX server, and everything must be 100% guaranteed coordinated (or we start seeing artefacts like wrong arena counts, etc.) - it's a pig of a thing to code.
TD