Пример #1
0
        //Устанавливаем сессию с заданным именем
        public bool LogAndGame(string Char_Name, int Sleep_Interval = 200, int Attempts = 5)
        {
            if (available_port == false)
            {
                Console.WriteLine("[LogAndGame]: UDP client not set"); return(false);
            }

            char_name = Char_Name;

            //Если поток прослушки выключен, запускаем его
            if (thrListen == null)
            {
                thrListen = new Thread(new ThreadStart(Listener));
            }
            try
            {
                listen = true;
                if (!thrListen.IsAlive)
                {
                    thrListen.Start();
                }
            }
            catch (Exception e) { Console.WriteLine("[LogAndGame] Catch:" + e.Message); }

            //Пытаемся начать сессию указанное количество раз
            for (int i = 0; i < Attempts; i++)
            {
                Console.WriteLine("[LogAndGame] Attempt: " + i);
                //Отсылаем сообщение начала сессии
                Send(2, Char_Name, login_addr); // BEGIN
                Thread.Sleep(Sleep_Interval);

                switch (Start_Msg)
                {
                case "STARTED":
                    IsExit     = false;
                    session_ON = true;
                    Console.WriteLine("Started session, my ID: " + Cons.GetData(start_info));
                    Send(5, "OK" + Cons.GetData(start_info), login_addr);
                    return(true);

                case "DENIED": return(false);
                }
            }
            return(false);
        }
Пример #2
0
        // Функция извлекающая пришедшие сообщения работающая в отдельном потоке.
        void Listener()
        {
            byte[] msg = new byte[256];
            try
            {
                while (listen)
                {
                    ipendpoint = null;
                    msg        = client_udp.Receive(ref ipendpoint);

                    //Console.WriteLine("Received:  " + Cons.GetData(msg));

                    //Реакция если сообщение получено только с гейм или лог сервера
                    if ((login_addr.ToString() == ipendpoint.ToString()) && (login_addr.Port == ipendpoint.Port) ||
                        (game_addr.ToString() == ipendpoint.ToString()) && (game_addr.Port == ipendpoint.Port))
                    {
                        switch (msg[0])
                        {
                        //Ответ сервера когда на IsConnectable
                        case 255:
                            rec_msg = "ALIVE";
                            break;

                        //Сервер сообщает о старте Сессии
                        case 254:
                            start_info = msg;
                            start_msg  = "STARTED";
                            Console.WriteLine("Received:  " + Cons.GetData(msg));
                            break;

                        //Отказ сервером начать сессию
                        case 253:
                            Console.WriteLine("Can't start session: " + Cons.GetData(msg));
                            denied_info = Cons.GetData(msg);
                            rec_msg     = "DENIED";
                            break;

                        //Уведомление сервером о том, что сессия успешно завершена
                        case 252:
                            Console.WriteLine("Exit message: " + Cons.GetData(msg));
                            //Проверка, чтобы не завершить сессию по какой-либо ошибке
                            if (IsExit)
                            {
                                exit_status = "SUCCESSFUL";
                            }
                            break;

                        //Сервер присылает координаты всех чаров и их имен
                        case 251:    //CH_XYD
                            // вытаскиваю имя перса из пакета
                            string name = Cons.GetName18b(msg);
                            //Если в пакете есть имя перса клиента
                            if (name == char_name)
                            {
                                ;                       // Cons.Parse_MyXYD(Players[0], msg);
                            }
                            else
                            {
                                Cons.Parse_CharsXYD(ref Players, msg);
                            }
                            break;

                        case 250:    //PLAYER_INFO	| 1[lvl] 2-5[maxHP] 6-end[charname]
                            break;

                        case 249:    // PLAYER_END | [charname]
                            string data = Cons.GetData(msg);
                            Console.WriteLine("Player END: " + data);
                            Send(6, "OK" + data, game_addr);
                            Cons.DeletePlayer(ref Players, data);
                            break;

                        case 248:
                            Cons.Parse_MobsXYD(ref Mobs, msg);
                            break;

                        case 247:
                            Cons.Parse_DropItems(ref Items, msg);
                            break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                //Если произошла ошибка перезапуск
                if (listen)
                {
                    Listener();
                }
            }
        }
Пример #3
0
        // Функция извлекающая пришедшие сообщения работающая в отдельном потоке.
        void Listener()
        {
            byte[] msg = new byte[256];
            try
            {
                while (listen)
                {
                    //ipendpoint = null;
                    msg = client_udp.Receive(ref ipendpoint);
                    //Console.WriteLine("Received:  " + Cons.GetData(msg));

                    //Реакция если сообщение получено только с гейм или лог сервера
                    if ((login_addr.ToString() == ipendpoint.ToString()) && (login_addr.Port == ipendpoint.Port) ||
                        (game_addr.ToString() == ipendpoint.ToString()) && (game_addr.Port == ipendpoint.Port))
                    {
                        switch (msg[0])
                        {
                        //Ответ сервера когда на IsConnectable
                        case 255:
                            Permissions[255] = "ALIVE";
                            //rec_msg = "ALIVE";
                            break;

                        //Сервер сообщает о старте Сессии
                        case 254:
                            if (session_ON == true)
                            {
                                continue;
                            }
                            Console.WriteLine("Received:  " + Cons.GetData(msg));
                            session_ON = true;
                            Send(5, "OK", login_addr);
                            start_info = msg;
                            break;

                        //Отказ сервером начать сессию
                        case 253:
                            if (session_ON == true)
                            {
                                break;
                            }
                            session_ON = false;
                            Console.WriteLine("Can't start session: " + Cons.GetData(msg));
                            denied_info = Cons.GetData(msg);
                            break;

                        //Уведомление сервером о том, что сессия успешно завершена
                        case 252:
                            Console.WriteLine("Exit message: " + Cons.GetData(msg));
                            if (IsExit)
                            {
                                Permissions[252] = "SUCCESSFUL";
                            }
                            break;

                        //Сервер присылает координаты всех чаров и их имен
                        case 251:    //CH_XYD
                            if (!session_ON)
                            {
                                break;
                            }
                            string name = Cons.GetName18b(msg);

                            //Если в пакете есть имя перса клиента
                            if (name != char_name)
                            {
                                Cons.Parse_CharsXYD(ref Players, msg);
                            }
                            break;

                        //PLAYER_INFO	| 1[lvl] 2-5[maxHP] 6-end[charname]
                        case 250:
                            break;

                        //249		PLAYER_END	| 1-end[charname]
                        case 249:
                            if (!session_ON)
                            {
                                break;
                            }
                            string data = Cons.GetData(msg);
                            Console.WriteLine("Player END: " + data);
                            Send(6, msg, game_addr);
                            Cons.DeletePlayer(ref Players, data);
                            break;

                        //248		MOB_XYD		| 1-4[x] 5-8[y] 9-12[rotation] 13[d] 14-17[hp] 18-21[type] 22-end[id]
                        case 248:
                            if (!session_ON)
                            {
                                break;
                            }
                            Cons.Parse_MobsXYD(ref Mobs, msg);
                            break;

                        //247		DROP_SET    | 1-4[x] 5-8[y] 9-12[item] 13-16[quantity] 17-end[id_ex]
                        case 247:
                            if (!session_ON)
                            {
                                break;
                            }
                            string data8 = Cons.GetData(msg);
                            Cons.Parse_DropItems(ref Items, msg);
                            break;

                        //246   SEND_MYXYD	| 1-4[x] 5-8[y] 9-12[rotation] 13[d] 14-17[hp] 17-end[char_name]
                        case 246:
                            if (!session_ON)
                            {
                                break;
                            }
                            Cons.Parse_MyXYD(Players[0], msg);
                            break;

                        //245		PICK_UP_OK	| 1-end["OK"+same_data]
                        case 245:
                            Console.WriteLine("245::" + Cons.GetData(msg));
                            Permissions[245] = Cons.GetData(msg);
                            break;

                        //244     DEL_DROP | 1 - 4[id_ex]
                        case 244:
                            Console.WriteLine("244::" + Cons.GetData(msg));
                            Cons.DeleteItem(ref Items, msg);
                            break;

                        //242     INV_UPDATE  | 1-4[q_all] 5-8[id] 9-12[ex] 13-16[q]...
                        case 242:
                            Console.WriteLine("242: " + Cons.GetData(msg));
                            Send(9, Cons.GetData(msg), game_addr);
                            Cons.UpdateInventory(Players[0], msg);
                            break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Listener exception: " + ex.ToString());
                //Если произошла ошибка перезапуск
                if (listen)
                {
                    Listener();
                }
            }
        }