Пример #1
0
        private bool TryConnect()
        {
            Socket socket = connector.Connect();

            if (socket != null)
            {
                lastId++;
                Tcp    tcp    = new Tcp(socket);
                Player player = new Player(lastId, tcp, shipsInfo, projectilesController);
                player.CreateShip();
                CreateShipActionData[] data = new CreateShipActionData[bots.Count + players.Count + 1];
                data[0] = player.GetCreateShipActionData();
                structConverter.ConvertStructToBytes(data[0], DataType.CreateShipAction, out byte[] bytes);
                foreach (Player pl in players)
                {
                    pl.SendTcpData(bytes);
                }
                for (int i = 0; i < players.Count; i++)
                {
                    data[i + 1] = players[i].GetCreateShipActionData();
                }
                players.Add(player);
                for (int i = 0; i < bots.Count; i++)
                {
                    data[i + players.Count] = bots[i].GetCreateShipActionData();
                }
                structConverter.ConvertStructsToBytes(data, DataType.CreateShipAction, out bytes);
                player.SendTcpData(bytes);
                return(true);
            }
            return(false);
        }
Пример #2
0
        public void Add <T>(DataType type, T obj) where T : struct
        {
            int size = converter.ConvertStructToBytes(obj, type, out byte[] bytes);

            Array.Copy(bytes, 0, buffer, currentBufferSize, size);
            currentBufferSize += size;
        }
Пример #3
0
        private void ReceiveTCPData()
        {
            tcp.Receive(out byte[] bytes);
            if (bytes != null)
            {
                int index = 0;
                while (index < bytes.Length)
                {
                    DataType type = converter.GetDataType(bytes, index);
                    index++;
                    switch (type)
                    {
                    case DataType.Initialize:
                        converter.ConvertStructToBytes(DateTime.UtcNow.TimeOfDay.TotalSeconds, DataType.InitialTime, out byte[] buf);
                        tcp.Send(buf);
                        index += converter.ConvertBytesToStruct(bytes, index, out InitializeData initializeData);
                        id     = initializeData.id;
                        break;

                    case DataType.CreateShipAction:
                        index += converter.ConvertBytesToStruct(bytes, index, out CreateShipActionData createShipActionData);
                        switch (createShipActionData.owner)
                        {
                        case ShipOwner.Player:
                            if (id == createShipActionData.id)
                            {
                                shipControllers.Add(shipsController.CreatePlayerShip(sender, createShipActionData.position, createShipActionData.id, createShipActionData.shipType, createShipActionData.team));
                            }
                            else
                            {
                                shipControllers.Add(shipsController.CreateEnemyPlayerShip(createShipActionData.position, createShipActionData.id, createShipActionData.shipType, createShipActionData.team));
                            }
                            break;

                        case ShipOwner.AI:
                            shipControllers.Add(shipsController.CreateAIShip(createShipActionData.position, createShipActionData.id, createShipActionData.shipType, createShipActionData.team));
                            break;
                        }
                        break;

                    case DataType.DestroyShipAction:
                        index += converter.ConvertBytesToStruct(bytes, index, out DestroyShipActionData destroyShipActionData);
                        for (int i = 0; i < shipControllers.Count; i++)
                        {
                            if (destroyShipActionData.id == shipControllers[i].Id)
                            {
                                shipsController.RemoveShip(shipControllers[i]);
                                shipControllers.RemoveAt(i);
                            }
                        }
                        break;

                    case DataType.CheckConnection:
                        tcp.Send(new byte[] { (byte)DataType.CheckConnection });
                        break;
                    }
                }
            }
        }
Пример #4
0
 private void Initialize()
 {
     structConverter.ConvertStructToBytes(new InitializeData()
     {
         id = Id
     }, DataType.Initialize, out byte[] bytes);
     connection.Send(bytes);
     initialTime = DateTime.UtcNow.TimeOfDay.TotalSeconds;
 }