예제 #1
0
파일: Client.cs 프로젝트: gmriggs/ACE.Diag
        /// <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);
        }
예제 #2
0
파일: Client.cs 프로젝트: gmriggs/ACE.Diag
        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;
            }
        }
예제 #3
0
파일: Server.cs 프로젝트: gmriggs/ACE.Diag
        /// <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);
            }
        }
예제 #4
0
파일: Client.cs 프로젝트: gmriggs/ACE.Diag
        /// <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;
        }
예제 #5
0
파일: Client.cs 프로젝트: gmriggs/ACE.Diag
        /// <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);
        }