예제 #1
0
        private static void AddNewGamer(SalutationPacket salutation)
        {
            Gamer gamer = new Gamer(salutation.Name, salutation.SourceIP);

            Gamers.TryAdd(salutation.Name, gamer);
            gamer.ShipID = GameModel.NewShip(gamer.ConnectionID);
            log.Info(gamer.ConnectionID + " has joined the game from " + salutation.SourceIP);
        }
예제 #2
0
        private async Task <NetworkPacket> HandleRequest(StreamSocket socket, NetworkPacket packet)
        {
            AcknowledgePacket acknowledgement = new AcknowledgePacket();

            if (packet != null)
            {
                if (packet.Type == PacketType.Salutation)
                {
                    SalutationPacket salutation = packet as SalutationPacket;
                    await HandlePlayerConnection(socket, salutation);
                }
            }
            return(acknowledgement);
        }
예제 #3
0
        private static void ProcessSalutation(NetworkPacket packet)
        {
            if (NetworkInterface.IsHost)
            {
                SalutationPacket salutation = packet as SalutationPacket;

                AcknowledgePacket ack = new AcknowledgePacket(salutation.Name, salutation.Timestamp);
                ack.Response = DetermineAppropriateResponse(salutation);
                if (ack.Response == AcknowledgePacket.Acknowledgement.OK)
                {
                    AddNewGamer(salutation);
                }
                NetworkInterface.SendPacket(packet.SourceIP, ack);
            }
        }
예제 #4
0
        private static void ProcessAcknowledge(NetworkPacket packet)
        {
            // TODO: work on the joining stuff
            AcknowledgePacket ack = packet as AcknowledgePacket;

            if (ack.Response == AcknowledgePacket.Acknowledgement.OK)
            {
                ConnectionID = ack.Name;
            }
            else if (ack.Response == AcknowledgePacket.Acknowledgement.DuplicateName)
            {
                string           newID         = ack.Name + GameModel.Random.Next(0, 10);
                SalutationPacket newSalutation = new SalutationPacket(newID);
                SendToHost(newSalutation);
            }
        }
예제 #5
0
        private async Task HandlePlayerConnection(StreamSocket socket, SalutationPacket salutation)
        {
            string PlayerID = salutation.Name;

            if (_playerList.ContainsKey(PlayerID))
            {
                PlayerData playerData = _playerList[PlayerID];
                int        shipID     = _gameInstance.GameModel.NewShip(PlayerID);
                playerData.ShipID = shipID;

                StreamSocket clientSocket = await _networkConnection.ConnectToTCP(socket.Information.RemoteAddress.DisplayName, NetworkPorts.GameClientPort);

                playerData.ClientSocket = clientSocket;
                playerData.Connected    = true;
            }
        }
예제 #6
0
        public static void Join(string name)
        {
            SalutationPacket requestToJoin = new SalutationPacket(name);

            SendToHost(requestToJoin);
        }
예제 #7
0
 private static AcknowledgePacket.Acknowledgement DetermineAppropriateResponse(SalutationPacket salutation)
 {
     AcknowledgePacket.Acknowledgement response = AcknowledgePacket.Acknowledgement.OK;
     if (Gamers.ContainsKey(salutation.SourceIP.ToString()))
     {
         response = AcknowledgePacket.Acknowledgement.MultipleConnectionFromOneEndPoint;
     }
     else if (Gamers.Count >= MaximumPlayers)
     {
         response = AcknowledgePacket.Acknowledgement.GameFull;
     }
     else
     {
         foreach (Gamer gamer in Gamers.Values)
         {
             if (gamer.ConnectionID == salutation.Name)
             {
                 response = AcknowledgePacket.Acknowledgement.DuplicateName;
             }
         }
     }
     return(response);
 }