/// <summary> /// Only handles response packets atm? /// </summary> /// <param name="responseBytes">The server packet sent as a response from a previous request</param> /// <returns>The parsed packet object</returns> public Packet.Packet GetPacket(byte[] responseBytes) { var packetType = (PacketType)responseBytes[0]; Packet.Packet packet = null; switch (packetType) { case PacketType.ConnectResponse: packet = new ConnectResponse(responseBytes); break; case PacketType.PingRequest: packet = new PingRequest(responseBytes); break; case PacketType.GameState: packet = new Packet.GameState(responseBytes); break; case PacketType.GameStateDiff: packet = new GameStateDiff(responseBytes); break; } ShowResponse(responseBytes); return(packet); }
public void ShowResponse(byte[] responseBytes) { var packetType = (PacketType)responseBytes[0]; Console.WriteLine("Response packet type = " + packetType); switch (packetType) { case PacketType.ConnectResponse: var packet = new ConnectResponse(responseBytes); Console.WriteLine("Connect response type = " + packet.ConnectResponseType); Console.WriteLine("Reason = " + packet.Reason); break; case PacketType.PingRequest: var pingRequest = new PingRequest(responseBytes); Console.WriteLine("Ping request: " + pingRequest.Random); break; case PacketType.GameState: var gameState = new Packet.GameState(responseBytes); Console.WriteLine(string.Format("Game state packet received ({0} bytes, {1} compressed)", gameState.State.StateBytes.Length, gameState.State.StateBytesCompressed.Length)); break; case PacketType.GameStateDiff: var gameStateDiff = new GameStateDiff(responseBytes); Console.WriteLine(string.Format("Game state diff packet received")); break; } }
/// <summary> /// Sends a WorldObject update to all connected clients /// </summary> /// <param name="wo">The WorldObject being added / updated / removed</param> public void SendUpdate(WorldObject wo) { var gameStateDiff = new GameStateDiff(wo); var diffPacket = gameStateDiff.Serialize(); foreach (var client in Clients.Values) { if (client == null || client.ConnectionState != ConnectionState.Connected) { continue; } SendData(diffPacket, client.Endpoint); } }
/// <summary> /// Processes the game state diff packets received in an update frame /// </summary> public void ProcessUpdate(GameStateDiff diff) { var wo = diff.WorldObject; // determine if this is an addition / update / deletion var guid = wo.Guid; var worldObjects = GameState.WorldObjects; worldObjects.TryGetValue(guid, out var existObj); if (existObj == null) { // add new object worldObjects.Add(guid, wo); } else { // update existing object worldObjects[guid] = wo; } IsUpdated = true; }
/// <summary> /// Parses the data sent from the server into a packet /// </summary> /// <param name="data">The request payload data</param> /// <returns>The response packet, or null if no response</returns> public Packet.Packet ParsePacket(byte[] data, IPEndPoint sender) { // first byte is packet type var packetType = (PacketType)data[0]; Packet.Packet packet = null; //Console.WriteLine("Packet received: " + packetType); switch (packetType) { case PacketType.GameStateDiff: var gameStateDiff = new GameStateDiff(data); ProcessUpdate(gameStateDiff); break; } if (packet == null) { return(null); } return(packet.Response); }