Cache GameServer joinable/compatible state across render frames.
This commit is contained in:
@@ -26,42 +26,30 @@ namespace OpenRA.Network
|
||||
public readonly bool Protected = false;
|
||||
public readonly string Started = null;
|
||||
|
||||
public bool CanJoin()
|
||||
public readonly bool IsCompatible = false;
|
||||
public readonly bool IsJoinable = false;
|
||||
|
||||
public readonly string ModLabel = "";
|
||||
public readonly string ModVersion = "";
|
||||
|
||||
public GameServer(MiniYaml yaml)
|
||||
{
|
||||
// "waiting for players"
|
||||
if (State != 1)
|
||||
return false;
|
||||
FieldLoader.Load(this, yaml);
|
||||
|
||||
if (!CompatibleVersion())
|
||||
return false;
|
||||
|
||||
// Don't have the map locally
|
||||
// TODO: We allow joining, then drop on game start if the map isn't available
|
||||
if (Game.modData.MapCache[Map].Status != MapStatus.Available && !Game.Settings.Game.AllowDownloading)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool CompatibleVersion()
|
||||
{
|
||||
// Invalid game listing - we require one entry of id@version
|
||||
ModMetadata mod;
|
||||
var modVersion = Mods.Split('@');
|
||||
if (modVersion.Length != 2)
|
||||
return false;
|
||||
if (modVersion.Length == 2 && ModMetadata.AllMods.TryGetValue(modVersion[0], out mod))
|
||||
{
|
||||
ModLabel = "{0} ({1})".F(mod.Title, modVersion[1]);
|
||||
ModVersion = modVersion[1];
|
||||
|
||||
var mod = Game.modData.Manifest.Mod;
|
||||
IsCompatible = Game.Settings.Debug.IgnoreVersionMismatch || (mod.Id == Game.modData.Manifest.Mod.Id && ModVersion == Game.modData.Manifest.Mod.Version);
|
||||
}
|
||||
else
|
||||
ModLabel = "Unknown mod: {0}".F(Mods);
|
||||
|
||||
// Different mod
|
||||
// TODO: Allow mod switch when joining server
|
||||
if (modVersion[0] != mod.Id)
|
||||
return false;
|
||||
|
||||
// Same mod, but different version
|
||||
if (modVersion[1] != mod.Version && !Game.Settings.Debug.IgnoreVersionMismatch)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
var mapAvailable = Game.Settings.Game.AllowDownloading || Game.modData.MapCache[Map].Status == MapStatus.Available;
|
||||
IsJoinable = IsCompatible && State == 1 && mapAvailable;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user