Пример #1
0
        private void HandleCommunication(ManagedClient client)
        {
            CSLogger.Log($"Client {client.Id} connected ");

            while (client.IsConnected())
            {
                Message message = client.GetMessage();


                switch (state.Value)
                {
                case CSState.Listening:
                    ProcessClientMessageDuringListening(message, client);
                    break;

                case CSState.AgentsAccepting:
                    ProcessAgentMessageDuringAgentsAccepting(message, client);
                    break;

                case CSState.GameInProgress:
                    ProcessAgentMessageDuringGameInProgress(message, client);
                    break;
                }
            }

            if (client.IsInGame)
            {
                HandlePlayerDisconnected(client);
            }

            CSLogger.Log($"Client {client.Id} disconnected ");
        }
Пример #2
0
        private void ForwardMessageFromGM(Message msg)
        {
            int id = -1; // Player ID has to be retrieved from the message

            if (typeof(PlayerMsg).IsAssignableFrom(msg.GetType()))
            {
                id = playerGuids.FindIndex(x => x == (msg as PlayerMsg).playerGuid.g) + 1;
            }

            if (msg.GetType() == typeof(ConnectPlayerResMsg))
            {
                if ((msg as ConnectPlayerResMsg).status == "OK")
                {
                    clients[id].IsInGame = true;
                }
            }

            if (id < 0 || id >= clients.Count || id == gmId.Value)
            {
                CSLogger.LogError("CS ForwardMessageFromGM: " + msg.ToString());
                Kill();
            }

            clients[id].SendMessage(msg);
        }
Пример #3
0
 public void Run()
 {
     if (!TryStartListening())
     {
         return;
     }
     while (true)
     {
         try
         {
             IConnectionClient client = server.Accept();
             if (client == null)
             {
                 break;
             }
             ManagedClient managedClient = new ManagedClient(client, nextId++);
             lock (clientsLocker)
             {
                 if (state.Value == CSState.Listening || state.Value == CSState.AgentsAccepting)
                 {
                     clients.Add(managedClient);
                     tasks.Add(Task.Run(() => HandleCommunication(managedClient)));
                 }
             }
         }
         catch (SocketException)
         {
             CSLogger.LogError("Some error with TCPListener occured.\n");
             Kill();
         }
     }
     CSLogger.Log($"Communication Server stopped listening for clients.\n");
     Task.WaitAll(tasks.ToArray());
 }
Пример #4
0
        private void ProcessGmMessageDuringGameInProgress(Message message, ManagedClient client)
        {
            switch (message)
            {
            case ConnectPlayerResMsg _:
            case DiscoverResMsg _:
            case GameStartMsg _:
            case MoveResMsg _:
            case PickUpResMsg _:
            case PlaceResMsg _:
            case ReadyResMsg _:
            case SetupResMsg _:
            case TestResMsg _:
                ForwardMessageFromGM(message);
                break;

            //case GameOver msg:
            //    break;

            default:
                CSLogger.LogMessage(message, state.Value);
                Kill();
                break;
            }
        }
Пример #5
0
        private void ProcessGmMessageDuringGameFinished(Message message, ManagedClient client)
        {
            switch (message)
            {
            //case GameOver msg:
            //    break;

            default:
                CSLogger.LogMessage(message, state.Value);
                Kill();
                break;
            }
        }
Пример #6
0
 private bool TryStartListening()
 {
     try
     {
         server.StartListening(this.ipAddress, this.portNumber);
         state.Value = CSState.Listening;
         CSLogger.Log($"CommunicationServer started listening for clients on {ipAddress}:{portNumber}\n");
         return(true);
     }
     catch (Exception e)
     {
         CSLogger.LogError("TryStartListening: " + e.Message);
     }
     return(false);
 }
Пример #7
0
        private void StartGame()
        {
            state.Value = CSState.GameInProgress;
            server.StopListening();
            CSLogger.Log($"Game started.");

            lock (clientsLocker)
            {
                clients.ForEach(c =>
                {
                    if (!c.IsInGame && c.Id != gmId.Value)
                    {
                        c.Disconnect();
                    }
                });
            }
        }
Пример #8
0
 private bool RegisterGM(ManagedClient client)
 {
     //return false;
     lock (gmRegisteringLocker)
     {
         if (state.Value == CSState.Listening)
         {
             gmId.Value  = client.Id;
             state.Value = CSState.AgentsAccepting;
             CSLogger.Log($"GM registered and agents accepting started.");
             client.SendMessage(new ConnectGMResMsg("127.0.0.1", "OK"));
             return(true);
         }
         else
         {
             client.SendMessage(new ConnectGMResMsg("127.0.0.1", "DENIED"));
             return(false);
         }
     }
 }
Пример #9
0
        private void ProcessAgentMessageDuringAgentsAccepting(Message message, ManagedClient client)
        {
            switch (message)
            {
            case ConnectPlayerMsg msg:
                playerGuids.Add(msg.playerGuid.g);
                clients[0].SendMessage(message);
                //client.SendMessage(new ConnectPlayerResMsg(msg.portNumber, msg.playerGuid, "OK"));
                break;

            case ReadyMsg msg:
                client.SendMessage(new ReadyResMsg(msg.playerGuid, "YES"));
                break;

            default:
                CSLogger.LogMessage(message, state.Value);
                Kill();
                break;
            }
        }
Пример #10
0
        private void ProcessClientMessageDuringListening(Message message, ManagedClient client)
        {
            switch (message)
            {
            case ConnectPlayerMsg _:
                //client.SendMessage(new GmNotConnectedYet());
                break;

            case ConnectGMMsg _:
                if (RegisterGM(client))
                {
                    HandleGmCommunication(client);
                }
                break;

            default:
                CSLogger.LogMessage(message, state.Value);
                Kill();
                break;
            }
        }
Пример #11
0
        private void ProcessAgentMessageDuringGameInProgress(Message message, ManagedClient client)
        {
            switch (message)
            {
            case ConnectPlayerMsg _:
            case DiscoverMsg _:
            case GameStartMsg _:
            case MoveMsg _:
            case PickUpMsg _:
            case PlaceMsg _:
            case ReadyMsg _:
            case SetupMsg _:
            case TestMsg _:
                clients[0].SendMessage(message);
                break;

            default:
                CSLogger.LogMessage(message, state.Value);
                Kill();
                break;
            }
        }
Пример #12
0
        private void ProcessGmMessageDuringAgentsAccepting(Message message, ManagedClient client)
        {
            switch (message)
            {
            case ConnectPlayerResMsg msg:
                ForwardMessageFromGM(msg);
                break;

            case GameStartMsg msg:
                //StartGame();
                ForwardMessageFromGM(msg);
                break;

            case SetupMsg _:
                StartGame();
                break;

            default:
                CSLogger.LogMessage(message, state.Value);
                Kill();
                break;
            }
        }