using Barotrauma.Networking; using System.Collections.Generic; namespace Barotrauma { partial class Voting { public enum VoteState { None = 0, Started = 1, Running = 2, Passed = 3, Failed = 4 }; private static IReadOnlyDictionary GetVoteCounts(VoteType voteType, IEnumerable voters) { Dictionary voteList = new Dictionary(); foreach (Client voter in voters) { T vote = voter.GetVote(voteType); if (vote == null) continue; if (!voteList.ContainsKey(vote)) { voteList.Add(vote, 1); } else { voteList[vote]++; } } return voteList; } public static T HighestVoted(VoteType voteType, IEnumerable voters) { return HighestVoted(voteType, voters, out _); } public static T HighestVoted(VoteType voteType, IEnumerable voters, out int voteCount) { voteCount = 0; if (voteType == VoteType.Sub && !GameMain.NetworkMember.ServerSettings.AllowSubVoting) { return default; } if (voteType == VoteType.Mode && !GameMain.NetworkMember.ServerSettings.AllowModeVoting) { return default; } IReadOnlyDictionary voteList = GetVoteCounts(voteType, voters); T selected = default; int highestVotes = 0; foreach (KeyValuePair votable in voteList) { if (voteType == VoteType.Sub && votable.Key is SubmarineInfo subInfo && GameMain.NetworkMember.ServerSettings.HiddenSubs.Contains(subInfo.Name)) { //This sub is hidden so it can't be voted for, skip continue; } if (selected == null || votable.Value > highestVotes) { highestVotes = votable.Value; selected = votable.Key; } } voteCount = highestVotes; return selected; } } }