//Устанавливаем сессию с заданным именем 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); }
// Функция извлекающая пришедшие сообщения работающая в отдельном потоке. 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(); } } }
// Функция извлекающая пришедшие сообщения работающая в отдельном потоке. 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(); } } }