Here's another class diagram of the mhframework.net.client package with several corrections and elaborations.
The heart of the new design is MHAbstractClient. It will contain some useful constants along with basic implementations of common methods.
Derived from that is MHClientModule -- a class that already exists in an incohesive form. The new version will separate the low-level network communications into a new MHNetworkClient class, and will keep the stuff that's specific to a single client. There's no new functionality here; just a better division of labor.
Another subclass of MHAbstractClient is MHLocalClient. I'm not sure if the engine itself will have this implementation, but I included it in the diagram anyway to demonstrate what I had in mind. The idea behind it is that situations where the game server is hosted on a player's machine should not require network communication, so a "dummy" class can take the calls and then just update the local data rather than send actual messages across the network...unless, of course, the update must be broadcast, but that can be handled on a case-by-case basis.
Finally, there's MHObservableClient. This class will take an MHAbstractClient implementation as a parameter to its constructor. This means that any subclass of MHAbstractClient can be made observable. It maintains three different lists of listeners:
- MHSystemMessageListener: A listener for handling messages predefined by the engine. These messages will be handled by the engine, but notifications can be sent to any class who subscribes to them.
- MHChatMessageListener: A listener specifically for chat messages. May also be used to broadcast status messages from the server. The MHGUIChatClient component will implement this interface and provide a method for registering an MHObservableClient object
- MHGameMessageListener: A listener for handling game-specific messages. These messages must be handled by the game code.
I haven't implemented this new design yet, but my goal is to have it in place and utilized by TLC by the end of the month. Stay tuned to see if I can hit that target!