public MyMwcObjectBuilder_FactionEnum ChooseFaction(MyMwcObjectBuilder_FactionEnum preferredFaction = MyMwcObjectBuilder_FactionEnum.None) { if (IsStory()) { Debug.Assert(IsHost); return(MySession.Static.Player.Faction); } else { m_factions.Clear(); foreach (var k in m_respawnPoints) { m_factions[k.Key] = 0; } foreach (var p in Peers.Players) { if (m_factions.ContainsKey((int)p.Faction)) { m_factions[(int)p.Faction]++; } } if (m_factions.ContainsKey((int)MySession.Static.Player.Faction)) { m_factions[(int)MySession.Static.Player.Faction]++; } m_possibleFactionCache.Clear(); int minFactionCount = int.MaxValue; foreach (var f in m_factions) { if (f.Value < minFactionCount) { m_possibleFactionCache.Clear(); m_possibleFactionCache.Add(f.Key); minFactionCount = f.Value; } else if (f.Value == minFactionCount) { m_possibleFactionCache.Add(f.Key); } } if (m_possibleFactionCache.Contains((int)preferredFaction)) { return(preferredFaction); } else if (m_possibleFactionCache.Count > 0) { return((MyMwcObjectBuilder_FactionEnum)MyMwcUtils.GetRandomItem(m_possibleFactionCache)); } else { return(MyMwcObjectBuilder_FactionEnum.Euroamerican); // Default faction } } }