/// <summary> /// бот открывает диалог с НПС /// </summary> /// <param name="mw"></param> /// <param name="npcName"></param> /// <param name="questId"></param> public static void TalkToNPC(My_Windows mw, String npcName, Int32 questId) { //находим wid НПСа по имени Int32 mob_wid = CalcMethods.MobSearch(mw.Oph, npcName); //если НПС нашелся, то берем у него квест и закрываем диалоговое окно if (mob_wid != 0) { //Выделяем НПСа mw.PacketSend.selectNpc(mob_wid); Thread.Sleep(300); //Открываем диалоговое окно с НПСом mw.PacketSend.talkToNpc(mob_wid); Thread.Sleep(1000); //Узнаем необходимые данные об окне, так как после взятия кв оно перестанет быть активным int[] adress_window = CalcMethods.CalcControlAddress(mw.Oph, "Win_NPC", "Btn_Back", 1); Thread.Sleep(300); //Берем кв mw.PacketSend.takeQuest(questId); //если адреса считались нормально, то закрываем диалоговое окно с НПСом if (adress_window[0] != 0 && adress_window[1] != 0) { Injects.GUI_Inject(adress_window[0], adress_window[1], mw.Oph); } else { mw.Logging(new FormatText(mw.Name, Brushes.Red, 14, 1), new FormatText("не смог закрыть окно", Brushes.Red, 14, 1)); } } }
/// <summary> /// Метод для чтения сообщений в чате пересборщиком /// </summary> public void ReadChat() { //узнаем начало чата int ChS = CalcMethods.CalcInt32Value(oph, Offsets.СhatStart); //узнаем количество сообщений в памяти клиента int ChN = CalcMethods.CalcInt32Value(oph, Offsets.СhatNumber); //чистим массив сообщений и заполняем его null messages.Clear(); messages = new List <Message>() { null, null, null, null, null }; //в цикле заполняем массив сообщений последними 5ю сообщениями for (int i = ChN - 5, j = 0; i < ChN; i++, j++) { //id сообщения (каждое следующее имеет +1 к предыдущему) int messageID = CalcMethods.CalcInt32Value(oph, Offsets.OffsetsMsgId(ChS, i)); //уникальный wid человека, оправившего сообщение int wid = CalcMethods.CalcInt32Value(oph, Offsets.OffsetsMsgWid(ChS, i)); //тип сообщения: 1 - мирчат, 2 - группчат, 3 - кланчат, 4 - пм byte messageType = CalcMethods.CalcByteValue(oph, Offsets.OffsetsMsgType(ChS, i)); //адрес и текст первой формы сообщения int message_1_address = CalcMethods.CalcInt32Value(oph, Offsets.OffsetsMsgForm1(ChS, i)); string message_1 = CalcMethods.CalcStringValue(oph, message_1_address); //адрес и текст второй формы сообщения int message_2_address = CalcMethods.CalcInt32Value(oph, Offsets.OffsetsMsgForm2(ChS, i)); string message_2 = CalcMethods.CalcStringValue(oph, message_2_address); //заполняем j-й элемент массива сообщений messages[j] = new Message(i, messageType, messageID, message_1, message_2, (uint)wid); //если сообщение новой и ранее не обрабатывалось, то проверяем его на наличие служебной команды if (messageID > ChNold) { #region Пересбор в нирку try { //реакция на команду "пересбор" if (messages[j].Msg_2.IndexOf(HeadViewModel.CheckBoxSettings.Peresbor_v_nirku) != -1 && messages[j].Type == 4 && messages[j].Wid == ListClients.work_collection[0].Wid && temp) { mw.Logging(new FormatText(mw.Name, Brushes.Red, 14, 2), new FormatText(message_1, Brushes.Black, 14, 2)); //все боты выходят из пати (если они в пати) SimonSayMethods.QuitFromParty(); //пересборщик кидает всем ботам пати SimonSayMethods.InvitetoParty(); //все боты принимают пати SimonSayMethods.AcceptInviteToParty(); //пересборщик отдает патилидера первому боту SimonSayMethods.ChangePl(); //пересборщик кидает всем призыв по очереди и боты его принимают //проверки на класс у пересборщика нет, если пересборщик по каким-то причинам //не может кинуть призыв, то ничего не происходит //все боты, кроме пересборщика заходят в нирвану SimonSayMethods.CallShaman(mw.ShamansCall); } } catch (Exception ex) { mw.Logging(new FormatText(ex.Message, Brushes.Red, 20, 1)); } #endregion #region Физнирка try { //реакция на команду "пересбор" if (messages[j].Msg_2.IndexOf(HeadViewModel.CheckBoxSettings.Fiznirka) != -1 && messages[j].Type == 4 && messages[j].Wid == ListClients.work_collection[0].Wid && temp) { //mw.Logging(new FormatText(mw.Name, Brushes.Red, 14, 2), new FormatText(message_1, Brushes.Black, 13, 2)); ////все боты выходят из пати (если они в пати) //SimonSayMethods.QuitFromParty(); ////пересборщик кидает всем ботам пати //SimonSayMethods.InvitetoParty(); ////все боты принимают пати //SimonSayMethods.AcceptInviteToParty(); ////пересборщик отдает патилидера первому боту //SimonSayMethods.ChangePl(); ////пересборщик кидает всем призыв по очереди и боты его принимают ////проверки на класс у пересборщика нет, если пересборщик по каким-то причинам ////не может кинуть призыв, то ничего не происходит ////все боты, кроме пересборщика заходят в нирвану //SimonSayMethods.CallShaman(mw.ShamansCall); //mw.PacketSend.leaveParty(); //SimonSayMethods.Rebuf(MainWindow.settings.Rebaf); ////дадим время ботам на ребаф //Thread.Sleep(5000); ////проверяем всех ботов на наличие самоцвета и берем квест на открытие //SimonSayMethods.OpenFizNirvana(); //убиваем первого босса KillBoss.KillBossForAll(1); Thread.Sleep(100); } } catch (Exception ex) { mw.Logging(new FormatText(ex.Message, Brushes.Red, 20, 1)); } #endregion #region Пати и пл try { //реакция на команду "пересбор" if (messages[j].Msg_2.IndexOf(HeadViewModel.CheckBoxSettings.Party_and_pl) != -1 && messages[j].Type == 4 && temp) { mw.Logging(new FormatText(mw.Name + " " + message_1, Brushes.Red, 14, 2)); SimonSayMethods.PartyAndPl((int)messages[j].Wid); } } catch (Exception ex) { mw.Logging(new FormatText(ex.Message, Brushes.Red, 20, 1)); } #endregion #region За целью try { //реакция на команду "следовать за целью" if (messages[j].Msg_2.IndexOf(HeadViewModel.CheckBoxSettings.To_him) != -1 && (messages[j].Type == 2 || messages[j].Type == 4) && s && temp) { mw.Logging(new FormatText(mw.Name, Brushes.Red, 14, 2), new FormatText(message_1, Brushes.Black, 13, 2)); //проверим, является ли отправителем сообщения пл if (messages[j].Wid == ListClients.work_collection[0].Wid) { //проверим, находится ли пл рядом bool near_player_state = CalcMethods.SearchPlayerNearby(oph, (int)messages[j].Wid); if (near_player_state) { //возьмем пла в ассист packet.selectNpc((int)messages[j].Wid); Thread.Sleep(300); //узнаем вид в таргете int target_wid = CalcMethods.TargetPlayerWid(oph, messages[j].Wid); //узнаем наш wid int my_wid = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsWid); //проверим, игрок ли это и находится ли он рядом bool near_player_target_state = CalcMethods.SearchPlayerNearby(oph, target_wid); if (near_player_state && target_wid != my_wid) { //возьмем таргет пла в ассист packet.selectNpc(target_wid); Thread.Sleep(300); //запишем в структуру окна wid пла int[] result = CalcMethods.CalcControlAddress(oph, "Win_QuickAction", "Follow", 1); CalcMethods.WriteProcessBytes(oph, target_wid, result[0] + Offsets.OffsetToWidWin_QuickAction); SimonSayMethods.FollowMe(result, oph); } } } } } catch (Exception ex) { mw.Logging(new FormatText(ex.Message, Brushes.Red, 20, 1)); } #endregion #region Стоп try { //реакция на команду "следовать за целью" if (messages[j].Msg_2.IndexOf(HeadViewModel.CheckBoxSettings.Stop) != -1 && (messages[j].Type == 2 || messages[j].Type == 4) && s && temp) { mw.Logging(new FormatText(mw.Name, Brushes.Red, 14, 2), new FormatText(message_1, Brushes.Black, 13, 2)); //проверим, является ли отправителем сообщения пл if (messages[j].Wid == ListClients.work_collection[0].Wid) { SimonSayMethods.Stop(oph); } } } catch (Exception ex) { mw.Logging(new FormatText(ex.Message, Brushes.Red, 20, 1)); } #endregion #region ебаф try { //реакция на команду "бафнуть" if (messages[j].Msg_2.IndexOf(HeadViewModel.CheckBoxSettings.Rebaf) != -1 && (messages[j].Type == 2 || messages[j].Type == 4) && b && temp) { mw.Logging(new FormatText(mw.Name, Brushes.Red, 14, 2), new FormatText(message_1, Brushes.Black, 13, 2)); //проверим, является ли отправителем сообщения пл или Щирое )) if (messages[j].Wid == ListClients.work_collection[0].Wid || messages[j].Msg_2.IndexOf("&Щирое&") != -1) { SimonSayMethods.UseSkillMassive(My_skills_for_buf, oph); } } } catch (Exception ex) { mw.Logging(new FormatText(ex.Message, Brushes.Red, 20, 1)); } #endregion //временная переменная, чтобы не обрабатывать 1 сообщение более 1 раза ChNold = messageID; } } //делаем true после первой итерации temp = true; }