public void turnCornerVer3(EsoWindow esoWindow, String addrText, IntPtr processHandle, String targetCorner) { Point cursorPosition = new Point(); esoWindow.GetCursorPos(out cursorPosition); var buffer = new byte[8]; var addr = long.Parse(addrText, NumberStyles.HexNumber); IntPtr bytesRead; var result = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addr), buffer, (uint)buffer.Length, out bytesRead); NumberFormatInfo nfi = new NumberFormatInfo(); nfi.NumberDecimalSeparator = ","; //Задаем запятую, как разделитель между числом и дробной частью double trgCorner = Convert.ToDouble(targetCorner, nfi); //Целевой угол double acturalCorner = BitConverter.ToDouble(buffer, 0); //текущий угол int screenX = Screen.PrimaryScreen.Bounds.Width; int numberОfTurns = 0; if (trgCorner > acturalCorner) //Целевой угол больше текущего { int X = AutoItX.MouseGetPos().X; int Y = AutoItX.MouseGetPos().Y; if (((trgCorner - acturalCorner) * 8.7184d) > (Screen.PrimaryScreen.Bounds.Width / 2)) { numberОfTurns = Convert.ToInt32(Math.Truncate(((trgCorner - acturalCorner) * 8.7184d) / (Screen.PrimaryScreen.Bounds.Width / 2))); for (int i = 0; i < numberОfTurns; i++) { AutoItX.MouseMove(X - screenX / 2 + 1, Y, 1); Thread.Sleep(50);; } result = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addr), buffer, (uint)buffer.Length, out bytesRead); acturalCorner = BitConverter.ToDouble(buffer, 0); } Thread.Sleep(500); AutoItX.MouseMove(X - Convert.ToInt32((trgCorner - acturalCorner) * 8.7184d), Y, 1); //8.7184 - коэффициент, полученный эксперементальным расчетным путем } else //Целевой угол меньше текущего { int X = AutoItX.MouseGetPos().X; int Y = AutoItX.MouseGetPos().Y; if (((acturalCorner - trgCorner) * 8.7184d) > (Screen.PrimaryScreen.Bounds.Width / 2)) { numberОfTurns = Convert.ToInt32(Math.Truncate(((acturalCorner - trgCorner) * 8.7184d) / (Screen.PrimaryScreen.Bounds.Width / 2))); for (int i = 0; i < numberОfTurns; i++) { AutoItX.MouseMove(X + screenX / 2 - 1, Y, 1); Thread.Sleep(50); } result = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addr), buffer, (uint)buffer.Length, out bytesRead); acturalCorner = BitConverter.ToDouble(buffer, 0); } Thread.Sleep(500); AutoItX.MouseMove(X + Convert.ToInt32((acturalCorner - trgCorner) * 8.7184d), Y, 1); //8.7184 - коэффициент, полученный эксперементальным расчетным путем } }
//Поворот камеры public void turnCorner(EsoWindow esoWindow, String addrText, IntPtr processHandle, String targetCorner) { Point cursorPosition = new Point(); esoWindow.GetCursorPos(out cursorPosition); var buffer = new byte[8]; var addr = long.Parse(addrText, NumberStyles.HexNumber); IntPtr bytesRead; var result = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addr), buffer, (uint)buffer.Length, out bytesRead); NumberFormatInfo nfi = new NumberFormatInfo(); nfi.NumberDecimalSeparator = ","; //Задаем запятую, как разделитель между числом и дробной частью double trgCorner = Convert.ToDouble(targetCorner, nfi); //Целевой угол double acturalCorner = BitConverter.ToDouble(buffer, 0); //текущий угол double counterCorner = 0; //Счетчик, на сколько повернулся угол double lenghtCorner; //Длина, на которую надо повернуть угол double previousCorner; //Предыдущее значение угла bool rotationCorner; //Определяем, куда поворачивать. True - вперед, False - назад if (trgCorner > acturalCorner) { lenghtCorner = trgCorner - acturalCorner; rotationCorner = true; } else { lenghtCorner = acturalCorner - trgCorner; rotationCorner = false; } if (rotationCorner) { result = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addr), buffer, (uint)buffer.Length, out bytesRead); previousCorner = BitConverter.ToDouble(buffer, 0); while (lenghtCorner > counterCorner) { if (Form1.stopAction) { break; } esoWindow.SetCursorPos(cursorPosition.X - 3, cursorPosition.Y); result = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addr), buffer, (uint)buffer.Length, out bytesRead); counterCorner = BitConverter.ToDouble(buffer, 0) - previousCorner + counterCorner; previousCorner = BitConverter.ToDouble(buffer, 0); Thread.Sleep(10); } } else { result = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addr), buffer, (uint)buffer.Length, out bytesRead); previousCorner = BitConverter.ToDouble(buffer, 0); while (lenghtCorner > counterCorner) { if (Form1.stopAction) { break; } esoWindow.SetCursorPos(cursorPosition.X + 3, cursorPosition.Y); result = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addr), buffer, (uint)buffer.Length, out bytesRead); counterCorner = previousCorner - BitConverter.ToDouble(buffer, 0) + counterCorner; previousCorner = BitConverter.ToDouble(buffer, 0); Thread.Sleep(10); } } }
//Заготовка под бег public void Run(EsoWindow esoWindow, IntPtr processHandle, IntPtr hWnd, String xAddress, String yAdress, String cAdress, String xTarget, String yTarget, String cTarget) { if (Form1.stopAction) { return; //Прекращаем функцию, если нажато F12 } int timeCount = 0; IntPtr bytesRead; NumberFormatInfo nfi = new NumberFormatInfo(); nfi.NumberDecimalSeparator = ","; //Задаем запятую, как разделитель между числом и дробной частью //Создаем массивы, куда будут считываться данные из памяти var bufferX = new byte[8]; var bufferY = new byte[8]; var bufferC = new byte[8]; //Переводим адреса памяти из String в Hex var addrX = long.Parse(xAddress, System.Globalization.NumberStyles.HexNumber); var addrY = long.Parse(yAdress, System.Globalization.NumberStyles.HexNumber); var addrC = long.Parse(cAdress, System.Globalization.NumberStyles.HexNumber); //Читаем текущие значения X, Y, Corner var resultX = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addrX), bufferX, (uint)bufferX.Length, out bytesRead); var resultY = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addrY), bufferY, (uint)bufferY.Length, out bytesRead); var resultC = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addrC), bufferC, (uint)bufferC.Length, out bytesRead); //Переводим текущие значения X, Y, Corner в Double double actualX = BitConverter.ToDouble(bufferX, 0); double actualY = BitConverter.ToDouble(bufferY, 0); double actualC = BitConverter.ToDouble(bufferC, 0); Console.WriteLine("Целевые координаты: " + "X: " + xTarget + " Y: " + yTarget + " C: " + cTarget); Console.WriteLine("Текущие координаты: " + "X: " + Convert.ToString(actualX) + " Y: " + Convert.ToString(actualY) + " C: " + Convert.ToString(actualC)); //Переводим целевые значения из String в Double с использованием заданного double targetX = Convert.ToDouble(xTarget, nfi); double targetY = Convert.ToDouble(yTarget, nfi); //Расчет катетов прямоугольного треугольника double katetX = Math.Abs(targetX - actualX); double katetY = Math.Abs(targetY - actualY); //Находим тангенс угла и угол а double cornerA = Math.Atan(katetY / katetX) * 180 / Math.PI; //Поворачиваем к цели if ((targetX > actualX) && (targetY > actualY)) //Если оба целевых значения больше текущих { turnCornerVer3(esoWindow, cAdress, processHandle, Convert.ToString(270 - cornerA)); tStatus = TargetStatus.X_bigger_Y_bigger; } if ((targetX < actualX) && (targetY < actualY)) //Если оба целевых значения меньше текущих { turnCornerVer3(esoWindow, cAdress, processHandle, Convert.ToString(90 - cornerA)); tStatus = TargetStatus.X_less_Y_less; } if ((targetX > actualX) && (targetY < actualY)) //Если целевой X больше, а Y - меньше { turnCornerVer3(esoWindow, cAdress, processHandle, Convert.ToString(270 + cornerA)); tStatus = TargetStatus.X_bigger_Y_less; } if ((targetX < actualX) && (targetY > actualY)) //Если целевой X меньше, а Y - больше { turnCornerVer3(esoWindow, cAdress, processHandle, Convert.ToString(90 + cornerA)); tStatus = TargetStatus.X_less_Y_bigger; } //Бежим к цели while (ReachTarget(targetX, actualX, targetY, actualY)) { if (Form1.stopAction) { break; } if (timeCount > 30000) { Form1.stopAction = true; break; } if (isFight()) { esoWindow.SendMessage(hWnd, (uint)WindowMessages.WM_KEYUP, new IntPtr((ushort)Keys.W), new IntPtr(0)); Fight(esoWindow, hWnd); //Если в бою, то воюем. } esoWindow.SendMessage(hWnd, (uint)WindowMessages.WM_KEYDOWN, new IntPtr((ushort)System.Windows.Forms.Keys.W), new IntPtr(0)); Thread.Sleep(150); timeCount = timeCount + 150; resultX = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addrX), bufferX, (uint)bufferX.Length, out bytesRead); resultY = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addrY), bufferY, (uint)bufferY.Length, out bytesRead); actualX = BitConverter.ToDouble(bufferX, 0); actualY = BitConverter.ToDouble(bufferY, 0); } esoWindow.SendMessage(hWnd, (uint)WindowMessages.WM_KEYUP, new IntPtr((ushort)Keys.W), new IntPtr(0)); if (!Form1.stopAction && cTarget != null) { if (!cTarget.Equals("")) { turnCornerVer3(esoWindow, cAdress, processHandle, cTarget); } } }
public void turnCornerVer2(EsoWindow esoWindow, String addrText, IntPtr processHandle, String targetCorner) { Point cursorPosition = new Point(); esoWindow.GetCursorPos(out cursorPosition); var buffer = new byte[8]; var addr = long.Parse(addrText, NumberStyles.HexNumber); IntPtr bytesRead; var result = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addr), buffer, (uint)buffer.Length, out bytesRead); NumberFormatInfo nfi = new NumberFormatInfo(); nfi.NumberDecimalSeparator = ","; //Задаем запятую, как разделитель между числом и дробной частью double trgCorner = Convert.ToDouble(targetCorner, nfi); //Целевой угол double acturalCorner = BitConverter.ToDouble(buffer, 0); //текущий угол double previousCorner; //Предыдущее значение угла double targetDistance; //Количество градусов, на которое нужно повернуть взгляд double coveredDistance; //пройденное количесто градусов угла if (trgCorner > acturalCorner) //Целевой угол больше текущего { if ((trgCorner - acturalCorner) < 180) //Если разница меньше 180, то поворачиваем по часовой стрелке { result = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addr), buffer, (uint)buffer.Length, out bytesRead); previousCorner = BitConverter.ToDouble(buffer, 0); targetDistance = trgCorner - acturalCorner; coveredDistance = 0; while (targetDistance > coveredDistance) { if (Form1.stopAction) { return; } esoWindow.SetCursorPos(cursorPosition.X - 3, cursorPosition.Y); result = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addr), buffer, (uint)buffer.Length, out bytesRead); coveredDistance = BitConverter.ToDouble(buffer, 0) - previousCorner + coveredDistance; previousCorner = BitConverter.ToDouble(buffer, 0); Thread.Sleep(10); } } else //Если разница больше 180, то поворачиваем против часовой стрелки { result = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addr), buffer, (uint)buffer.Length, out bytesRead); previousCorner = BitConverter.ToDouble(buffer, 0); targetDistance = CornerDistance(trgCorner, acturalCorner); coveredDistance = 0; while (targetDistance > coveredDistance) { if (Form1.stopAction) { return; } esoWindow.SetCursorPos(cursorPosition.X + 3, cursorPosition.Y); result = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addr), buffer, (uint)buffer.Length, out bytesRead); coveredDistance = CornerDistance(BitConverter.ToDouble(buffer, 0), previousCorner) + coveredDistance; previousCorner = BitConverter.ToDouble(buffer, 0); Thread.Sleep(10); } } } else //Целевой угол меньше текущего { if ((acturalCorner - trgCorner) < 180) //Если разница меньше 180, то поворачиваем против часовой стрелки { result = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addr), buffer, (uint)buffer.Length, out bytesRead); previousCorner = BitConverter.ToDouble(buffer, 0); targetDistance = acturalCorner - trgCorner; coveredDistance = 0; while (targetDistance > coveredDistance) { if (Form1.stopAction) { return; } esoWindow.SetCursorPos(cursorPosition.X + 3, cursorPosition.Y); result = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addr), buffer, (uint)buffer.Length, out bytesRead); coveredDistance = previousCorner - BitConverter.ToDouble(buffer, 0) + coveredDistance; previousCorner = BitConverter.ToDouble(buffer, 0); Thread.Sleep(10); } } else //Если разница больше 180, то поворачиваем по часовой стрелке { result = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addr), buffer, (uint)buffer.Length, out bytesRead); previousCorner = BitConverter.ToDouble(buffer, 0); targetDistance = CornerDistance(acturalCorner, trgCorner); coveredDistance = 0; while (targetDistance > coveredDistance) { if (Form1.stopAction) { return; } esoWindow.SetCursorPos(cursorPosition.X - 3, cursorPosition.Y); result = esoWindow.ReadProcessMemory(processHandle, new IntPtr(addr), buffer, (uint)buffer.Length, out bytesRead); coveredDistance = CornerDistance(BitConverter.ToDouble(buffer, 0), previousCorner) + coveredDistance; previousCorner = BitConverter.ToDouble(buffer, 0); Thread.Sleep(10); } } } }