예제 #1
0
    /// <summary>
    /// All incoming packets are handled through this and then directed to the appropriate function
    /// </summary>
    /// <param name="receivedPacket"></param>
    public void ProcessPacket(BasePacket receivedPacket)
    {
        if (connect == null)
        {
        }

        if (receivedPacket == null)
        {
            Debug.Log("tis null");
        }

        if (!isAuthenticated && receivedPacket.isAuthenticated())
        {
            isAuthenticated = true;
        }

        List <SubPacket> subPackets = receivedPacket.GetSubpackets();

        foreach (SubPacket subPacket in subPackets)
        {
            /*  var stdOut = System.Console.Out;
             * var consoleOut = new System.IO.StringWriter();
             * System.Console.SetOut(consoleOut);
             * subPacket.debugPrintSubPacket();
             * Debug.Log(consoleOut.ToString());
             * System.Console.SetOut(stdOut);*/
            DoAuthenticationChecks(receivedPacket, subPacket);
            if (!receivedPacket.isAuthenticated())
            {
                if (subPacket.header.type == (ushort)SubPacketTypes.ErrorPacket)
                {
                    if (subPacket.gameMessage.opcode == (ushort)GamePacketOpCode.AccountError)
                    {
                        ErrorPacket ep = new ErrorPacket();
                        ep.ReadPacket(subPacket.data);
                        string msg = ep.GetErrorMessage();
                        StatusBoxHandler.statusText = msg;
                        Debug.Log("fam error packet");
                        Utils.SetAccountName(null);
                        StatusBoxHandler.readyToClose = true;
                    }
                }

                if (subPacket.gameMessage.opcode == (ushort)GamePacketOpCode.RegisterSuccess)
                {
                    StatusBoxHandler.statusText   = Encoding.Unicode.GetString(subPacket.data);
                    StatusBoxHandler.readyToClose = true;
                    break;
                }
            }
            else
            {
                if (subPacket.header.type == (ushort)SubPacketTypes.ErrorPacket)
                {
                    switch (subPacket.gameMessage.opcode)
                    {
                    case ((ushort)GamePacketOpCode.CreateCharacterError):
                    {
                        StatusBoxHandler.statusText   = "Character name has already been taken";
                        StatusBoxHandler.readyToClose = true;
                        break;
                    }
                    }
                }
                switch (subPacket.gameMessage.opcode)
                {
                //TODO: Refactor statusbox ready to close to use event system
                case ((ushort)GamePacketOpCode.AccountSuccess):
                    StatusBoxHandler.statusText   = Encoding.Unicode.GetString(subPacket.data);
                    isAuthenticated               = true;
                    loggedInSuccessfully          = true;
                    StatusBoxHandler.readyToClose = true;
                    break;

                //TODO: Refactor statusbox ready to close to use event system
                case ((ushort)GamePacketOpCode.CreateCharacter):
                    StatusBoxHandler.statusText   = Encoding.Unicode.GetString(subPacket.data);
                    StatusBoxHandler.readyToClose = true;
                    break;

                //TODO: Refactor statusbox ready to close to use event system
                case ((ushort)GamePacketOpCode.CreateCharacterSuccess):
                    StatusBoxHandler.statusText   = Encoding.Unicode.GetString(subPacket.data);
                    StatusBoxHandler.readyToClose = true;
                    break;

                //TODO: Refactor this to use event system
                case ((ushort)GamePacketOpCode.CharacterListQuery):
                    if (BitConverter.ToInt32(subPacket.data, 0) == -1)
                    {
                        CharacterLoader.serverResponseFinished = true;
                        break;
                    }
                    else
                    {
                        characterLoader.SetCharacterListFromServer(subPacket);
                        //else send each received packet to CharacterLoader to process
                    }

                    break;

                case ((ushort)GamePacketOpCode.CharacterDeleteSuccess):
                    StatusBoxHandler.statusText   = Encoding.Unicode.GetString(subPacket.data);
                    StatusBoxHandler.readyToClose = true;
                    break;

                case ((ushort)GamePacketOpCode.Acknowledgement):
                    Debug.Log("Gets here");
                    AcknowledgePacket ack = new AcknowledgePacket(subPacket.data);
                    GameEventManager.TriggerHandshakeResponseReceived(new GameEventArgs {
                        serverResponse = ack.AckSuccessful
                    });
                    //ackpacket has other data which is useful which i'm currently unsure on how to use atm
                    //anything set here won't be visible when scene is changed to world map.
                    break;


                default:
                    Debug.Log("Unknown or corrupted packet");
                    break;
                }
            }
        }
    }