void TCPClientMethod(object clientObj) { int numOfIncomingBytes = 0; Client client = (Client)clientObj; while ((numOfIncomingBytes = client.reader.ReadInt32()) != 0) { byte[] buffer = client.reader.ReadBytes(numOfIncomingBytes); memoryStream.Write(buffer, 0, numOfIncomingBytes); memoryStream.Position = 0; binaryFormatter.Binder = new MyBinder.MyBinder(); PacketData.Packet rawPacket = (PacketData.Packet)binaryFormatter.Deserialize(memoryStream); memoryStream.SetLength(0); switch (rawPacket.type) { case PacketData.PacketType.CHATMESSAGE: PacketData.ChatMessagePacket packet = (PacketData.ChatMessagePacket)rawPacket; if (packet.message.Substring(0, 1) == "/") { Commands(packet, client); } if (client.gameID != -1 && games[client.gameID].state == GameState.GS_ACTIVE) { if (games[client.gameID].type == GameType.GT_RPS) { if (client.id == games[client.gameID].clientID1 && games[client.gameID].client1Input == null) { games[client.gameID].client1Input = packet.message; } if (client.id == games[client.gameID].clientID2 && games[client.gameID].client2Input == null) { games[client.gameID].client2Input = packet.message; } PlayRPS(games[client.gameID].clientID1, games[client.gameID].clientID2); } } else { foreach (Client element in clients) { if (element.gameID == -1) { PacketData.ChatMessagePacket packet1 = new PacketData.ChatMessagePacket(client.name + ": " + packet.message); send(packet1, element); } } } break; case PacketData.PacketType.NICKNAME: PacketData.NickNamePakcet nickNamePacket = (PacketData.NickNamePakcet)rawPacket; PacketData.ChatMessagePacket newPacket = new PacketData.ChatMessagePacket(client.Rename(client, nickNamePacket.nickName)); foreach (Client element in clients) { send(newPacket, element); } break; case PacketData.PacketType.SNAKEGAME: foreach (Game element in games) { if (element.clientID1 == client.id) { PacketData.GameMovement gamePacket = (PacketData.GameMovement)rawPacket; PlaySnake(element.clientID1, element.clientID2, gamePacket.input, "1"); } else if (element.clientID2 == client.id) { PacketData.GameMovement gamePacket = (PacketData.GameMovement)rawPacket; PlaySnake(element.clientID1, element.clientID2, gamePacket.input, "2"); } } break; case PacketData.PacketType.SCORE: foreach (Game element in games) { if (element.clientID1 == client.id || element.clientID2 == client.id) { PacketData.Score scorepacket = (PacketData.Score)rawPacket; SnakeScore(element.clientID1, element.clientID2, scorepacket, client); } } break; case PacketData.PacketType.APPLEPOS: foreach (Game element in games) { if (element.clientID1 == client.id || element.clientID2 == client.id) { SnakeGameApple(element.clientID1, element.clientID2); } } break; case PacketData.PacketType.PLAYER: foreach (Game element in games) { if (element.clientID1 == client.id) { PacketData.Player playerPacket = new PacketData.Player(1); send(playerPacket, client); } else if (element.clientID2 == client.id) { PacketData.Player playerPacket = new PacketData.Player(2); send(playerPacket, client); } } break; case PacketData.PacketType.LOGIN: PacketData.LoginPacket login = (PacketData.LoginPacket)rawPacket; HandlePacket(client, login.endPoint); break; case PacketData.PacketType.STOPGAME: PacketData.StopGame stop = (PacketData.StopGame)rawPacket; send(stop, client); break; case PacketData.PacketType.QUIT: PacketData.QuitPacket quit = (PacketData.QuitPacket)rawPacket; string message = client.name + " " + quit.message; PacketData.ChatMessagePacket newMessage = new PacketData.ChatMessagePacket(message); //PacketData.QuitPacket quitMessage = new PacketData.QuitPacket(client.name + quit.message); //send(quitMessage, client); client.tcpSocket.Close(); clients.Remove(client); foreach (Client element in clients) { send(newMessage, element); } break; } } }
void Commands(PacketData.ChatMessagePacket packet, Client client) { string command; int space = -1; if (packet.message.Contains(" ")) { space = packet.message.IndexOf(" "); command = packet.message.Substring(0, space); } else { command = packet.message; } if (command == "/rps") { string name = packet.message.Substring(space + 1, packet.message.Length - 5); RPS(name, client); } else if (command == "/snakeGame") { string name = packet.message.Substring(space + 1, packet.message.Length - 11); Snake(name, client); } else if (command == "/accept") { if (client.gameID == -1) { PacketData.ChatMessagePacket packet1 = new PacketData.ChatMessagePacket("You have nothing to accept"); send(packet1, client); } else { games[client.gameID].state = GameState.GS_ACTIVE; if (games[client.gameID].type == GameType.GT_RPS) { PlayRPS(games[client.gameID].clientID1, games[client.gameID].clientID2); } else if (games[client.gameID].type == GameType.GT_SNAKE) { StartSnake(games[client.gameID].clientID1, games[client.gameID].clientID2); } } } else if (command == "/decline") { if (client.gameID != -1) { foreach (Client element in clients) { if (element.gameID == client.gameID) { PacketData.ChatMessagePacket packet1 = new PacketData.ChatMessagePacket("Game has been declined"); send(packet1, element); } } if (client.id == games[client.gameID].clientID1) { clients[games[client.gameID].clientID2].gameID = -1; games.Remove(games[client.gameID]); client.gameID = -1; } else if (client.id == games[client.gameID].clientID2) { clients[games[client.gameID].clientID1].gameID = -1; games.Remove(games[client.gameID]); client.gameID = -1; } } else { PacketData.ChatMessagePacket packet1 = new PacketData.ChatMessagePacket("You have nothing to decline"); send(packet1, client); } } else if (command == "/continue") { if (client.gameID != -1) { games[client.gameID].state = GameState.GS_ACTIVE; PlayRPS(games[client.gameID].clientID1, games[client.gameID].clientID2); } else { PacketData.ChatMessagePacket packet1 = new PacketData.ChatMessagePacket("You have noting to continue"); send(packet1, client); } } else if (command == "/stop") { if (client.gameID != -1) { if (games[client.gameID].type == GameType.GT_RPS) { PacketData.ChatMessagePacket packet1 = new PacketData.ChatMessagePacket("You have stopped playing RPS"); send(packet1, client); packet1 = new PacketData.ChatMessagePacket(client.name + " has to stop playing RPS. You have stopped playing RPS"); foreach (Client element in clients) { if (client.gameID == element.gameID && client.id != element.id) { send(packet1, element); } } if (client.id == games[client.gameID].clientID1) { clients[games[client.gameID].clientID2].gameID = -1; games.Remove(games[client.gameID]); client.gameID = -1; } else if (client.id == games[client.gameID].clientID2) { clients[games[client.gameID].clientID1].gameID = -1; games.Remove(games[client.gameID]); client.gameID = -1; } } if (games[client.gameID].type == GameType.GT_SNAKE) { PacketData.ChatMessagePacket packet1 = new PacketData.ChatMessagePacket("You have stopped playing snake"); send(packet1, client); packet1 = new PacketData.ChatMessagePacket(client.name + " has to stop playing snake. You have stopped playing RPS"); foreach (Client element in clients) { if (client.gameID == element.gameID && client.id != element.id) { send(packet1, element); } } PacketData.StopGame stop = new PacketData.StopGame(); send(stop, clients[games[client.gameID].clientID1]); send(stop, clients[games[client.gameID].clientID2]); if (client.id == games[client.gameID].clientID1) { clients[games[client.gameID].clientID2].gameID = -1; games.Remove(games[client.gameID]); client.gameID = -1; } else if (client.id == games[client.gameID].clientID2) { clients[games[client.gameID].clientID1].gameID = -1; games.Remove(games[client.gameID]); client.gameID = -1; } } } else { PacketData.ChatMessagePacket packet1 = new PacketData.ChatMessagePacket("You have nothing to stop"); send(packet1, client); } } else { PacketData.ChatMessagePacket packet1 = new PacketData.ChatMessagePacket("INVALID COMMAND"); send(packet1, client); } }
public void CloseForm() { _client.UdpReaderThread.Abort(); PacketData.StopGame stop = new PacketData.StopGame(); _client.TCPSend(stop); }