//конструктор
        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>
        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;
            }
        }