internal static ArmaServerStatus ParseStatus(byte[] response) { ArmaServerStatus status = new ArmaServerStatus(); //Skip headers int index = 6; status.Name = response.ReadNextString(ref index); //Skip empty byte index++; status.MapName = response.ReadNextString(ref index); index++; status.GameType = response.ReadNextString(ref index); index++; status.GameMode = response.ReadNextString(ref index); //skip more empty bytes index += 3; status.CurrentPlayers = response[index]; status.MaximumPlayers = response[++index]; return status; }
public ServerStatusEventArgs(ArmaServerStatus currentStatus) { // TODO: Complete member initialization m_Status = currentStatus; }
void UpdateServerStatus(int retryCount = 0) { try { ArmaServerStatus currentStatus = m_Client.GetStatus(); List<ArmaPlayer> currentPlayers = m_Client.GetPlayerStatus(); if (m_Status != null) { if (m_Status.MapName != currentStatus.MapName && MapChanged != null) MapChanged(this, new ServerStatusEventArgs(currentStatus)); if (m_Status.GameMode != currentStatus.GameMode && MissionChanged != null) MissionChanged(this, new ServerStatusEventArgs(currentStatus)); if (m_Status.CurrentPlayers == 0 && currentStatus.CurrentPlayers > 0) { if (ServerNoLongerEmpty != null) ServerNoLongerEmpty(this, new ServerStatusEventArgs(currentStatus)); SendToRegisteredUsers(m_Status.Name + " is now active with players!"); } if (m_Status.CurrentPlayers > 0 && currentStatus.CurrentPlayers == 0 && ServerNowEmpty != null) ServerNowEmpty(this, new ServerStatusEventArgs(currentStatus)); } if (m_Players != null) { List<ArmaPlayer> playersJoined = new List<ArmaPlayer>(currentPlayers.Where(p => !m_Players.Any(j => j.Name == p.Name) && p.Name != "")); List<ArmaPlayer> playersDeparted = new List<ArmaPlayer>(m_Players.Where(p => !currentPlayers.Any(j => j.Name == p.Name) && p.Name != "")); if (playersJoined.Count > 0 && PlayersJoined != null) PlayersJoined(this, new PlayerListEventArgs(playersJoined)); if (playersDeparted.Count > 0 && PlayersLeft != null) PlayersLeft(this, new PlayerListEventArgs(playersDeparted)); } m_Status = currentStatus; m_Players = currentPlayers; if (retryCount >= RETRY_ATTEMPTS && ServerRestored != null) ServerRestored(this, new EventArgs()); } catch (Exception ex) { if (retryCount == RETRY_ATTEMPTS && ServerNotResponding != null) { ServerNotResponding(this, new EventArgs()); } retryCount++; UpdateServerStatus(retryCount); Thread.Sleep(RETRY_WAIT); } }