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); }
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; }
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; } } } }
private void Initialize() { structConverter.ConvertStructToBytes(new InitializeData() { id = Id }, DataType.Initialize, out byte[] bytes); connection.Send(bytes); initialTime = DateTime.UtcNow.TimeOfDay.TotalSeconds; }