コード例 #1
0
        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;
        }
コード例 #2
0
 public ServerStatusEventArgs(ArmaServerStatus currentStatus)
 {
     // TODO: Complete member initialization
     m_Status = currentStatus;
 }
コード例 #3
0
        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);
            }
        }