Implement feature to properly handle incompatible clients in Network (and Online) match rooms
Currently players in Network room cannot see whether or not other players are match compatible. If not all clients are compatible, then runtime mismatch can occur.
We need a feature to block game from starting when at least one peer client is not compatible with host client. Perhaps incompatible peers should be unable to join game room. On the other hand perhaps it is ok if all players can join any game room, and just show incompatible Icon/Hash/Version next to player name. This way players can still chat and communicate organizational matters at their own discretion. Originally, incompatible players are blocked from match entry in GameSpy Lobby, but not in Network lobby.
Technically, game needs to generate game hash from all relevant files - Code and Data. Game hash is expected to be identical across all clients using the same kind of game version install. (Caution: Different executable for different Operating System). Using a different Mod or critically modified INI, W3D will change hash. Hash can then be compared with peers.
Hash itself is not easily human readable. Generally, single hash can only be associated with local game version. To recognize peer hashes as game version names, we need database of hash to names relations. This perhaps needs Patch Loader support. Patch Loader can provide list of known mods to game process (Thyme). And game client can then recognize different remote hashes with that list. Or remote clients send sufficient metadata alongside client hash, then Patch Loader integration is not required.
~~GenTool: Implement game hash in Network Player Table to allow players to see whether or not other players are compatible for a given match session. If players's game hashes are not matching, then match session eventually will mismatch after match start sooner or later.~~
~~We need GenTool player table for network room and encode information about game hash. Then in turn we can read the game hash of other GenTool players and present it to user. For that we need to copy the String class implementation and everything related to that from Thyme to GenTool, because it would be a definite requirement to be able to allocate Game Strings.~~
~~The result should be ok enough to at least be able to see whether or not all players are compatible before pressing the START GAME button - IF these players use GenTool. So Game Host could kick all non compatible players which is very suitable for a Network like Hamachi or Radmin. In case of GameRanger, players would need to quit the game and wait for new players to join, which would be a bit more hassle, but there is nothing else we can do. Other mods would benefit from this implementation too in turn if kept generic.~~
Feature text updated. I think this should be driven via Thyme (+ Patch Loader) in modular fashion.
Thinking this further, it would be good if player did not just have control to select game version in external program, but also within game client itself. If there was a match room for an alien mod, then ideally client could hot switch to that without first manually restarting the game client. The advantage of that would be that players can freely join different game versions within the same Multiplayer lobby without worrying about compatibility problems.
The complication is implementation. Reloading all game data should technically be possible, however there can be significant complications in regards to active game data, such as Menus and Shell Map. Plus it would not work for mods using custom executables. Perhaps a full game client restart is inevitable. In that case a way to fast forward the player through the lobbies into the designated match room would be good.
We could deploy different implementation strategies depending on state. If game menu does not run Shell Map, then there would only be the Menu left to worry about. And if Mod does not have a mismatching executable, then client restart would not be strictly necessary.
I think it would be a good idea to separate Menus and UI from gameplay files, so that you don't have to restart the game just for the menus and UI and only reload the necessary gameplay files so that restart is not needed.
Also think it would be a good idea if the host of the match forces the patch on his clients automatically as soon as they enter the room, and there be an option to switch mods within the lobby itself, same way you change limit super weapons.
A mod selector in Match Room would be ideal. Is difficult to anticipate how this can be achieved. It needs full reload of game assets. If shell map was running then that would have to be reloaded too. As far as I am aware there is no video game that can do that, so this would be a remarkable feature. I don't think we will be able to have this for a first release.