/// <summary> /// Бот просматривает инвентарь на предмет нахождения "Самоцвет зала перерождения" и пишет в чат об этом /// </summary> /// <param name="oph"></param> /// <param name="hwnd"></param> public static Boolean ReadInvent(IntPtr oph, IntPtr hwnd) { Int32 count_cells = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsInventCellsCount); for (Int32 iter = 0; iter < count_cells; iter++) { if (CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsItemInCellID(iter)) == 27422) // id самоцвета зала перерождения { //отправим сообщение в чат Int32[] address_window_1 = CalcMethods.CalcControlAddress(oph, "Win_Chat", "DEFAULT_Txt_Speech", 2); Injects.SetText(oph, "!!Самоцвет найден!", address_window_1[2]); if (address_window_1[0] != 0 && address_window_1[1] != 0) { Injects.GUI_Inject(address_window_1[0], address_window_1[1], oph); } return(true); } } //отправим сообщение в чат Int32[] address_window = CalcMethods.CalcControlAddress(oph, "Win_Chat", "DEFAULT_Txt_Speech", 2); Injects.SetText(oph, "!!Самоцвет не найден!", address_window[2]); if (address_window[0] != 0 && address_window[1] != 0) { Injects.GUI_Inject(address_window[0], address_window[1], oph); } return(false); }
static void KillBoss_1(My_Windows mw) { try { //следуем к первой точке SimonSayMethods.MoveTo(mw.Oph, point_1[0], point_1[1], point_1[2]); SimonSayMethods.Say(mw, "!!начинаю бить босса"); //ищем босса поблизости Int32 bossWid = CalcMethods.MobSearch(mw.Oph, "Повелитель кругов ада"); while (bossWid > 0) { if (mw.ClassID == 0) { //здесь метод для вара } else { //здесь метод для остальных классов } } Thread.Sleep(5000); SimonSayMethods.Say(mw, "!!закончил бить босса"); } catch (Exception ex) { throw ex; } }
/// <summary> /// По указанному дескриптору бот юзает указанный список скиллов /// </summary> /// <param name="skill"></param> /// <param name="oph"></param> public static void UseSkillMassive(List <Skill> skill, IntPtr oph) { try { foreach (Skill s in skill) { int cd_skill = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsToCdSkill(s.Number)); while (cd_skill > 0) { Thread.Sleep(cd_skill); cd_skill = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsToCdSkill(s.Number)); } Injects.Skill_Inject(s.Id, oph); Thread.Sleep(1000); int lock_skill = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsCurrentSkill); while (lock_skill > 0) { Thread.Sleep(100); lock_skill = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsCurrentSkill); } } } catch (Exception ex) { throw ex; } }
/// <summary> /// Выход из пати всех ботов, первым выходит патилидер /// </summary> public static void QuitFromPartyFirstPl() { try { for (int i = 0; i < ListClients.work_collection.Count(); i++) { if (ListClients.work_collection[i] != null) { //узнаем указатель на процесс IntPtr oph = ListClients.work_collection[i].Oph; int partyCount = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsCountParty); //закрываем дескриптор if (partyCount > 0) { //если счетчик людей в пати > 0, то выходим из пати ListClients.work_collection[i].PacketSend.leaveParty(); Thread.Sleep(300); } } } Thread.Sleep(1500); } catch (Exception ex) { throw ex; } }
/// <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 static void AcceptInviteToPartyFromPl() { try { for (int i = 1; i < ListClients.work_collection.Count(); i++) { if (ListClients.work_collection[i] != null) { //узнаем указатель на процесс IntPtr oph = ListClients.work_collection[i].Oph; int inviteCount = CalcMethods.CalcInt32Value(oph, Offsets.InviteCount); if (inviteCount > 0) { //узнаем ID персонажа, отправившего пати int[] inviteIdPlayer = { Offsets.InviteWidPlayer }; int playerId = CalcMethods.ReadInt(oph, Offsets.InviteStruct, inviteIdPlayer); //узнаем ID пати, в которую нас приглашают int[] inviteIdParty = { Offsets.InviteWidParty }; int partyID = CalcMethods.ReadInt(oph, Offsets.InviteStruct, inviteIdParty); //принмаем пати ListClients.work_collection[i].PacketSend.acceptPartyInvite(playerId, partyID); Thread.Sleep(300); } } } Thread.Sleep(1500); } catch (Exception ex) { throw ex; } }
public static Boolean GetCoord(IntPtr oph, float x1, float y1, float z1) { //Расчитываем нынешние коорды персонажа float x2 = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsX); float y2 = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsY); float z2 = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsZ); //Сравниваем, достиг ли персонаж цели return(Math.Round(x1) == Math.Round(x2) && Math.Round(y1) == Math.Round(y2) && Math.Round(z1) == Math.Round(z2)); }
/// <summary> /// Бот пишет в чат заданный текст /// </summary> /// <param name="mw"></param> /// <param name="text"></param> public static void Say(My_Windows mw, String text) { //запишем сообщение в чат Int32[] address_window = CalcMethods.CalcControlAddress(mw.Oph, "Win_Chat", "DEFAULT_Txt_Speech", 2); Injects.SetText(mw.Oph, text, address_window[2]); //нажимаем кнопку отправить if (address_window[0] != 0 && address_window[1] != 0) { Injects.GUI_Inject(address_window[0], address_window[1], mw.Oph); } }
//конструктор public My_Windows(IntPtr handle) { this.handle = handle; //получаем id процесса по хендлу WinApi.GetWindowThreadProcessId(handle, out processID); //запускаем процесс и получаем его дескриптор oph = WinApi.OpenProcess(WinApi.ProcessAccessFlags.All, false, ProcessID); //создаем класс для отправки пакетов packetSend = new Packets(oph); //получаем имя персонажа для данного клиента name = CalcMethods.ReadString(oph, Offsets.BaseAdress, Offsets.OffsetsName); //узнаем wid wid = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsWid); //узнаем класс нашего персонажа classID = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsClassId); //читаем доступные скиллы-бафы int skillCount = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsSkillsCount); for (int s = 0; s < skillCount; s++) { int id = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsToIdSkill(s)); if (skills_for_buf.Contains(id)) { if (id == 112 || id == 518 || id == 519 || id == 1980 || id == 1981 || //танк id == 312 || id == 656 || id == 657 || id == 1984 || id == 1985 || //друид id == 1811 || id == 1869) //прист { changeForm = new Skill(id, s); continue; } if (id == 1824) { shamansCall = new Skill(id, s); continue; } my_skills_for_buf.Add(new Skill(id, s)); } } //узнаем координаты x = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsX) / 10 + 400; y = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsY) / 10 + 550; z = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsZ) / 10; //выбираем картинку для нашего персонажа Select_Image(classID); //указываем состояние stateThread = StateEnum.stop; //создаем поток для окна this.BackgroundWorker5 = new BackgroundWorker(); this.BackgroundWorker5.WorkerSupportsCancellation = true; this.BackgroundWorker5.DoWork += new DoWorkEventHandler(this.backgroundWorker5_DoWork); }
/// <summary> /// Шаман кидает пати, отдает пл, призывает и выходит из пати /// </summary> /// <param name="wid"></param> public static void PartyAndPl(int wid) { try { if (ListClients.work_collection[ListClients.work_collection.Count() - 1] != null) { //узнаем указатель на процесс IntPtr oph = ListClients.work_collection[ListClients.work_collection.Count() - 1].Oph; int partyCount = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsCountParty); if (partyCount > 0) { //если счетчик людей в пати >0, то выходим из пати ListClients.work_collection[ListClients.work_collection.Count() - 1].PacketSend.leaveParty(); } Thread.Sleep(1000); ListClients.work_collection[ListClients.work_collection.Count() - 1].PacketSend.inviteParty(wid); int j = 0; while (j < 40) { Thread.Sleep(500); partyCount = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsCountParty); if (partyCount > 0) { //если счетчик людей в пати >0, то передаем пл, кидаем призыв и выходим из пати int[] temp_mas = { 0x1c, 0x34, 0x820, 0x14, 0x0, 0xc }; //если пересборщик - пл, то передаем пл Int32 temp_int = CalcMethods.ReadInt(oph, Offsets.BaseAdress, temp_mas); if (CalcMethods.ReadInt(oph, Offsets.BaseAdress, temp_mas) == ListClients.work_collection[ListClients.work_collection.Count() - 1].Wid) { ListClients.work_collection[ListClients.work_collection.Count() - 1].PacketSend.ChangePl(wid); Thread.Sleep(1000); } ListClients.work_collection[ListClients.work_collection.Count() - 1].PacketSend.callShamanParty(wid); Thread.Sleep(5000); ListClients.work_collection[ListClients.work_collection.Count() - 1].PacketSend.leaveParty(); Thread.Sleep(500); return; } j++; } } } catch (Exception ex) { throw ex; } }
/// <summary> /// Остановиться /// </summary> /// <param name="processID"></param> public static void Stop(IntPtr oph) { try { //Расчитываем нынешние коорды персонажа float x = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsX); float y = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsY); float z = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsZ); //узнаем состояние: 0 - земля, 1 - вода, 2 - воздух int walk_mode = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsWalkMode); //юзаем инжект Injects.WalkTo(oph, x, y, z, walk_mode); } catch (Exception ex) { throw ex; } }
/// <summary> /// Бот движется по указанному адресу, но не более 60 секунд. /// </summary> /// <param name="oph"></param> /// <param name="x"></param> /// <param name="y"></param> /// <param name="z"></param> public static void MoveTo(IntPtr oph, float x, float y, float z) { try { //узнаем состояние: 0 - земля, 1 - вода, 2 - воздух Int32 walk_mode = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsWalkMode); //юзаем инжект движения Injects.WalkTo(oph, x, y, z, walk_mode); //Расчитываем нынешние коорды персонажа float x_temp = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsX); float y_temp = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsY); float z_temp = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsZ); //в цикле проверяем, достиг ли персонаж цели и не застрял ли он Int32 iter = 0; while (!CalcMethods.GetCoord(oph, x, y, z)) { Thread.Sleep(1000); //если персонаж встал на месте, то подтолкнем его еще раз if (CalcMethods.GetCoord(oph, x_temp, y_temp, z_temp)) { Injects.WalkTo(oph, x, y, z, walk_mode); } //если персонаж двигается, то перезаписываем его координаты else { x_temp = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsX); y_temp = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsY); z_temp = CalcMethods.ReadFloat(oph, Offsets.BaseAdress, Offsets.OffsetsZ); } iter++; //если бот бежит дольше минуты, то прекращаем бежать if (iter > 60) { break; } } } catch (Exception ex) { throw ex; } }
/// <summary> /// Метод для чтения сообщений в чате ботами /// </summary> public void ReadChat_2() { //узнаем начало чата 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.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) { //проверяем, находится ли в образе персонаж и выходим из образа, если это так int buf_count = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsBufsCount); for (int b = 0; b < buf_count; b++) { int buf_id = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsIdBuf(b)); if (buf_id == 75 || buf_id == 47 || buf_id == 225) { int cd_skill = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsToCdSkill(mw.ChangeForm.Number)); while (cd_skill > 0) { Thread.Sleep(cd_skill); cd_skill = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsToCdSkill(mw.ChangeForm.Number)); } Injects.Skill_Inject(mw.ChangeForm.Id, oph); Thread.Sleep(1000); continue; } } //юзаем скиллы из списка разрешенных бафов 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; }
/// <summary> /// Пересборщик (шаман) кидает всем ботам призывы по очереди, боты принимают призыв /// </summary> public static void CallShaman(Skill call_skill) { try { for (int i = 0; i < ListClients.work_collection.Count() - 1; i++) { if (ListClients.work_collection[i] != null) { if (ListClients.work_collection[ListClients.work_collection.Count() - 1] != null) { string location = CalcMethods.ReadString(ListClients.work_collection[i].Oph, Offsets.BaseAdress, Offsets.OffsetsLocationName); while (location.IndexOf("Телепорт в Зал Перерождения") == -1) { //каст призыва ListClients.work_collection[ListClients.work_collection.Count() - 1].PacketSend.callShamanParty(ListClients.work_collection[i].Wid); Thread.Sleep(3000); //принятие призыва ListClients.work_collection[i].PacketSend.acceptCallShamanParty(ListClients.work_collection[ListClients.work_collection.Count() - 1].Wid); //ждем, пока персонаж не сменит локацию после тп Thread.Sleep(10000); location = CalcMethods.ReadString(ListClients.work_collection[i].Oph, Offsets.BaseAdress, Offsets.OffsetsLocationName); } Thread.Sleep(1000); //бот берет квест на заход в нирвану (id взято отсюда http://www.pwdatabase.com/ru/quest/20790 ) TalkToNPC(ListClients.work_collection[i], "Страж Зала Перерождения", 20790); #region старый кусок кода //Int32 mob_wid = CalcMethods.MobSearch(ListClients.work_collection[i].Oph, "Страж Зала Перерождения"); //if (mob_wid != 0) //{ // //Выделяем НПСа // ListClients.work_collection[i].PacketSend.selectNpc(mob_wid); // Thread.Sleep(300); // //Открываем диалоговое окно с НПСом // ListClients.work_collection[i].PacketSend.talkToNpc(mob_wid); // Thread.Sleep(1000); // //Узнаем необходимые данные об окне, так как после взятия кв оно перестанет быть активным // int[] adress_window = CalcMethods.CalcControlAddress(ListClients.work_collection[i].Oph, "Win_NPC", "Btn_Back", 1); // Thread.Sleep(300); // //Берем кв на заход в нирвану (id взято отсюда http://www.pwdatabase.com/ru/quest/20790 ) // ListClients.work_collection[i].PacketSend.takeQuest(20790); // //если адреса считались нормально, то закрываем диалоговое окно с НПСом // if (adress_window[0] != 0 && adress_window[1] != 0) // Injects.GUI_Inject(adress_window[0], adress_window[1], ListClients.work_collection[i].Oph); // else // { // ListClients.work_collection[i].Logging(new FormatText(ListClients.work_collection[i].Name, Brushes.Red, 14, 1), // new FormatText("не смог закрыть окно", Brushes.Red, 14, 1)); // } //} #endregion } //ждем отката призыва //Thread.Sleep(3000); int cd_call = CalcMethods.ReadInt(ListClients.work_collection[0].Oph, Offsets.BaseAdress, Offsets.OffsetsToCdSkill(call_skill.Number)); while (cd_call > 0) { Thread.Sleep(1000); cd_call = CalcMethods.ReadInt(ListClients.work_collection[0].Oph, Offsets.BaseAdress, Offsets.OffsetsToCdSkill(call_skill.Number)); } } } Thread.Sleep(1500); } catch (Exception ex) { throw ex; } }
/// <summary> /// Пересбор пати плом /// </summary> public static void Peresbor() { try { //узнаем указатель на процесс IntPtr oph = ListClients.work_collection[0].Oph; int partyCount = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsCountParty); //узнаем wid всех членов пати int[] party_struct = new int[partyCount - 1]; for (int k = 1; k < partyCount; k++) { party_struct[k - 1] = CalcMethods.ReadInt(oph, Offsets.BaseAdress, new int[] { Offsets.OffsetToGameAdress, Offsets.OffsetToPersStruct, Offsets.OffsetToParty, 0x14, k * 0x4, 0xC }); } //проверка на пээльство хД int pl_wid = CalcMethods.ReadInt(oph, Offsets.BaseAdress, new int[] { Offsets.OffsetToGameAdress, Offsets.OffsetToPersStruct, Offsets.OffsetToParty, 0x14, 0, 0xC }); if (ListClients.work_collection[0].Wid != pl_wid) { bool temp = true; for (int k = 1; k < ListClients.work_collection.Count(); k++) { if (ListClients.work_collection[k] != null) { if (ListClients.work_collection[k].Wid == pl_wid) { ListClients.work_collection[k].PacketSend.ChangePl(ListClients.work_collection[0].Wid); temp = false; Thread.Sleep(1000); for (int l = 1; l < partyCount; l++) { party_struct[l - 1] = CalcMethods.ReadInt(oph, Offsets.BaseAdress, new int[] { Offsets.OffsetToGameAdress, Offsets.OffsetToPersStruct, Offsets.OffsetToParty, 0x14, l * 0x4, 0xC }); } break; } } } if (temp) { return; } Thread.Sleep(1500); } //кикаем всех кроме одного for (int k = 0; k < party_struct.Count() - 1; k++) { ListClients.work_collection[0].PacketSend.kickFromParty(party_struct[k]); Thread.Sleep(300); } //передаем пл последнему (если отмечен чекбокс в настройках) if (HeadViewModel.CheckBoxSettings.ChangePl) { ListClients.work_collection[0].PacketSend.ChangePl(party_struct[party_struct.Count() - 1]); Thread.Sleep(500); } //выходим из пати ListClients.work_collection[0].PacketSend.leaveParty(); Thread.Sleep(1500); //кидаем всем пати for (int k = 0; k < party_struct.Count(); k++) { ListClients.work_collection[0].PacketSend.inviteParty(party_struct[k]); Thread.Sleep(300); } Thread.Sleep(1500); //все боты принимают пати, если они получили приглашение AcceptInviteToPartyFromPl(); Thread.Sleep(1500); } catch (Exception ex) { throw ex; } }
/// <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; }
/// <summary> /// Метод для чтения сообщений в чате плом /// </summary> public void ReadChat_3() { //узнаем начало чата 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) != -1 && messages[j].Type == 2 && messages[j].Wid == 0xFFFFFFFF && temp) { //считаем количество людей в пати и либо собираем новую, либо пересобираем старую пати int partyCount = CalcMethods.ReadInt(oph, Offsets.BaseAdress, Offsets.OffsetsCountParty); if (partyCount > 0) { SimonSayMethods.Peresbor(); } else { SimonSayMethods.QuitFromPartyFirstPl(); SimonSayMethods.InvitetoPartyFromPl(); SimonSayMethods.AcceptInviteToPartyFromPl(); } } } catch (Exception ex) { mw.Logging(new FormatText(ex.Message, Brushes.Red, 20, 1)); } #endregion //временная переменная, чтобы не обрабатывать 1 сообщение более 1 раза ChNold = messageID; } } //делаем true после первой итерации temp = true; }