/// <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; } }