Итак, немного о вэйпоинтинге(далее вп или WP):
WP - это движения бота по определенным точкам(х;y) в игровом пространстве.
Я рассмотрю простенькую версию WP на примере ММОРПГ AION. Свои наблюдения я строю на чтении памяти процесса Aion.bin, который делается видимым после обхода FROST'a.
Итак, положим, вы обошли FROST и получили доступ к памяти процесса. Что теперь делать? )
1) Ищем оффсеты на положение камеры персонажа
2) Ищем оффсеты на координаты чара в игровом мире
3) Ищем направление осей X;Y. Сделать это можно весьма просто:
Пишем в чате /локация и получаем свои координаты. Теперь нам необходимо установить угол поворота камеры в значение 0 градусов.
Теперь перемещаем персонажа вперед или назад на некоторое расстояние, опять замеряем координаты с помощью /локация. Итак, посмотрели какая ось изменилась? Правильно, изменилась ось X. Соответственно, ось Y перпендикулярна оси X и смотрит на N-S(Север-Юг).
Что же теперь? А теперьжопа самое забавное: рассчеты:
4) Мысленно(а лучше на листке бумаги) мы создаем оси координат, привязываем из центр к персонажу(важно помнить, что координаты персонажа и нужной нам точки привязаны к общей системе айона, а не к нашим виртуальным осям). Далее мы навскидку ставим 1 рандомную точку в нашей системе - пускай это будет точка, в сторону которой нам нужно повернуть камеру.
5) Теперь ищем расстояние от чара до точки: это будет гипотенуза прямоугольного треугольника. Нашли? Молодцы, 5 вам по математике за 8 класс. Что дальше? А дальше мы ищем угол от 0(я говорю про угол поворота) до нашей гипотенузы. Простите, что без картинок, фотик разряжен. Итак, я искал синус этого угла, можете искать косинус, я не против(но скрипты дам только для синуса). Синус угла от оси до гипотенузы равен модулю длинны Y от оси до конца гипотенузы. Короче говоря, это У цели - У чара или У чара - У цели(при условии, что У цели меньше У чара). Хм, уже посчитали? Здорово! теперь надо определить в какой четверти у нас находится точка(это, я думаю и так понятно, не глупые надеюсь, разбиретесь, 8 класс все-таки). Такс, а теперь выстраиваем наш искомый угол поворота камеры относительно нуля.
Пример: наш угол, который мы нашли, равен 30 градусам. Цель(точка в пространстве, монстр) находится сзади и справа(относительно наших осей это 3 четверть). В айоне всё через пятую точку, поэтому угол поворота камеры по часовой стрелке имеет знак минус, а против часовой плюс. Следовательно, если цель справа и сзади, то это будет -180 градусов + наш угол.
Для наглядности, выложу бета-версию кода:
Ссылки добавлю вечером.
WP - это движения бота по определенным точкам(х;y) в игровом пространстве.
Я рассмотрю простенькую версию WP на примере ММОРПГ AION. Свои наблюдения я строю на чтении памяти процесса Aion.bin, который делается видимым после обхода FROST'a.
Итак, положим, вы обошли FROST и получили доступ к памяти процесса. Что теперь делать? )
1) Ищем оффсеты на положение камеры персонажа
2) Ищем оффсеты на координаты чара в игровом мире
3) Ищем направление осей X;Y. Сделать это можно весьма просто:
Пишем в чате /локация и получаем свои координаты. Теперь нам необходимо установить угол поворота камеры в значение 0 градусов.
Дам подсказку - в айоне 0 градусов - это запад.
Теперь перемещаем персонажа вперед или назад на некоторое расстояние, опять замеряем координаты с помощью /локация. Итак, посмотрели какая ось изменилась? Правильно, изменилась ось X. Соответственно, ось Y перпендикулярна оси X и смотрит на N-S(Север-Юг).
Что же теперь? А теперь
4) Мысленно(а лучше на листке бумаги) мы создаем оси координат, привязываем из центр к персонажу(важно помнить, что координаты персонажа и нужной нам точки привязаны к общей системе айона, а не к нашим виртуальным осям). Далее мы навскидку ставим 1 рандомную точку в нашей системе - пускай это будет точка, в сторону которой нам нужно повернуть камеру.
5) Теперь ищем расстояние от чара до точки: это будет гипотенуза прямоугольного треугольника. Нашли? Молодцы, 5 вам по математике за 8 класс. Что дальше? А дальше мы ищем угол от 0(я говорю про угол поворота) до нашей гипотенузы. Простите, что без картинок, фотик разряжен. Итак, я искал синус этого угла, можете искать косинус, я не против(но скрипты дам только для синуса). Синус угла от оси до гипотенузы равен модулю длинны Y от оси до конца гипотенузы. Короче говоря, это У цели - У чара или У чара - У цели(при условии, что У цели меньше У чара). Хм, уже посчитали? Здорово! теперь надо определить в какой четверти у нас находится точка(это, я думаю и так понятно, не глупые надеюсь, разбиретесь, 8 класс все-таки). Такс, а теперь выстраиваем наш искомый угол поворота камеры относительно нуля.
Пример: наш угол, который мы нашли, равен 30 градусам. Цель(точка в пространстве, монстр) находится сзади и справа(относительно наших осей это 3 четверть). В айоне всё через пятую точку, поэтому угол поворота камеры по часовой стрелке имеет знак минус, а против часовой плюс. Следовательно, если цель справа и сзади, то это будет -180 градусов + наш угол.
Для наглядности, выложу бета-версию кода:
Код:
Func Pathing($x, $y)
WinActivate("AION Client")
;_MemoryWrite("0x"&Hex($baseADDR+"0xA27B28"), $DllInformation, 0, 'float')
ShowStats()
$l_x = $char_x - $x
$l_y = $char_y - $y
$l = sqrt($l_x*$l_x + $l_y*$l_y)
if (($l_x > 0) and ($l_y < 0)) Then
; Если моб находится во II четверти
if ($l_x > $l_y*(-1)) Then
$sin_a = -$l_y / $l
$a = ASin($sin_a)
$f = -180 + $a
Else
$sin_a = $l_x / $l
$a = ASin($sin_a)
$f = -90 - $a
EndIf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ElseIf (($l_x < 0) and ($l_y < 0)) Then
; Если моб находится в I четверти
if ($l_x > $l_y*(-1)) Then
$sin_a = -$l_y / $l
$a = ASin($sin_a)
$f = -$a
Else
$sin_a = $l_x / $l
$a = ASin($sin_a)
$f = $a - 90
EndIf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Elseif (($l_x > 0) and ($l_y > 0)) Then
; Если моб находится во III четверти
if ($l_x > $l_y) Then
$sin_a = $l_y / $l
$a = ASin($sin_a)
$f = 180 - $a
Else
$sin_a = $l_x / $l
$a = ASin($sin_a)
$f = 90 + $a
EndIf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ElseIf (($l_x < 0) and ($l_y > 0)) Then
; Если моб находится в IV четверти
if ($l_x > $l_y) Then
$sin_a = $l_y / $l
$a = ASin($sin_a)
$f = $a
Else
$sin_a = $l_x / $l
$a = ASin($sin_a)
$f = 90 - $a
EndIf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EndIf
_MemoryWrite("0x"&Hex($baseADDR+"0xA27B28"), $DllInformation, $f, 'float')
EndFunc
Ссылки добавлю вечером.