Что нового

[AION] Waypointing как таковой

xamd

AION bot developer
Сообщения
66
Репутация
24
Итак, немного о вэйпоинтинге(далее вп или WP):

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(я говорю про угол поворота) до нашей гипотенузы. Простите, что без картинок, фотик разряжен. :smile: Итак, я искал синус этого угла, можете искать косинус, я не против(но скрипты дам только для синуса). Синус угла от оси до гипотенузы равен модулю длинны 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

Ссылки добавлю вечером.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 595
Репутация
938
Респект, берем пример товарищи :smile:
 
Автор
X

xamd

AION bot developer
Сообщения
66
Репутация
24
С удовольствием поделюсь своими знаниями со всеми страждующими.

P.S. Если есть люди, заинтересованные в совместной разработке бота - работы уйма, на добровольной основе готов организовать маленькую группу )

Пишите в пм или в аську(лучше в аську) + линк на ваш профиль на этом форуме.
 

Dador

Новичок
Сообщения
6
Репутация
4
Тожe разбирался с систeмой координат (правда для WoW, но нe суть). Только как я понял тут нeт варианта что надо идти прямо впeрeд т.e. 0, и.т.д. Удобнee дeлать дeлить на 8 частeй.
Т.e. примeрно так (стрeмимся повeрнутся точно в направлeнии линии)
1, 2, 3, 4 -- чeтвeрти
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 595
Репутация
938
Приду домой, выложу вейпоинтинг для FLYFF. Писался в ситуации где была неизвестна ротация, тоесть направление движение чара вычислялось из изменения координат текущей точки относительно пункта назначения, схема такая же как указана выше, тоже на 8 частей вроде делил поле. Дальше бета версии оно не ушло но в целом как работает в коде описано. Вот видео: http://www.youtube.com/watch?v=EnADLAoATCk
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Как то писал бегалку под WoW 2.4.3
Для наглядности сделал себе тогда эту прогу. Может кому интересно будет.
Вводятся собственные координаты, и координаты цели, программа высчитывает угол от направления на север до направления на цель.
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
$gui = GUICreate('winkeltest', 520, 550)
$input1 = GUICtrlCreateInput(Random(-100, 100, 1), 10, 10, 25, 20)
$input2 = GUICtrlCreateInput(Random(-100, 100, 1), 45, 10, 25, 20)
$input3 = GUICtrlCreateInput(Random(-100, 100, 1), 80, 10, 25, 20)
$input4 = GUICtrlCreateInput(Random(-100, 100, 1), 115, 10, 25, 20)
$button1 = GUICtrlCreateButton('go', 150, 10, 40, 20)
$button2 = GUICtrlCreateButton('random', 200, 10, 40, 20)
$button3 = GUICtrlCreateButton('neu', 250, 10, 40, 20)
$graphic = GUICtrlCreateGraphic(10, 40, 500, 500)
GUICtrlSetBkColor(-1, 0x000000)
GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0xFFFFFF, 0x000000)

GUICtrlSetGraphic(-1, $GUI_GR_MOVE, 000, 250)
GUICtrlSetGraphic(-1, $GUI_GR_LINE, 500, 250)

GUICtrlSetGraphic(-1, $GUI_GR_MOVE, 000, 250)
GUICtrlSetGraphic(-1, $GUI_GR_LINE, 010, 245)

GUICtrlSetGraphic(-1, $GUI_GR_MOVE, 000, 250)
GUICtrlSetGraphic(-1, $GUI_GR_LINE, 010, 255)

GUICtrlSetGraphic(-1, $GUI_GR_MOVE, 250, 000)
GUICtrlSetGraphic(-1, $GUI_GR_LINE, 250, 500)

GUICtrlSetGraphic(-1, $GUI_GR_MOVE, 250, 000)
GUICtrlSetGraphic(-1, $GUI_GR_LINE, 245, 010)

GUICtrlSetGraphic(-1, $GUI_GR_MOVE, 250, 000)
GUICtrlSetGraphic(-1, $GUI_GR_LINE, 255, 010)

GUICtrlSetGraphic(-1, $GUI_GR_CLOSE)
GUISetState()
While 1
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $button2
			GUICtrlSetData($input1, Random(-100, 100, 1))
			GUICtrlSetData($input2, Random(-100, 100, 1))
			GUICtrlSetData($input3, Random(-100, 100, 1))
			GUICtrlSetData($input4, Random(-100, 100, 1))
		Case $button3
			If @Compiled Then
				ShellExecute(@ScriptFullPath)
			Else
				ShellExecute(@AutoItExe, '"' & @ScriptFullPath & '"')
			EndIf
			Exit
		Case $button1
			$x1 = Int(GUICtrlRead($input1))
			$y1 = Int(GUICtrlRead($input2))
			$x2 = Int(GUICtrlRead($input3))
			$y2 = Int(GUICtrlRead($input4))

;~ 			$angle = 0

;~ 			$dx = $x2-$x1
;~ 			$dy = $y2-$y1
;~ 			MsgBox(0,'','ATan($dx/$dy) = ' & ATan($dx/$dy) & @CRLF & 'ATan($dy/$dx) = ' & ATan($dy/$dx))
;~ 			If $x1 > $x2 Then
;~ 				$angle += 180
;~ 				If $y1 > $y2 Then
;~ 					$angle += Abs(ATan($dx/$dy)*45/ATan(1))
;~ 				ElseIf $y1 = $y2 Then

;~ 				ElseIf $y1 < $y2 Then
;~ 					$angle += 90
;~ 					$angle += Abs(ATan($dy/$dx)*45/ATan(1))
;~ 				EndIf
;~ 			ElseIf $x1 = $x2 Then
;~ 				If $y1 > $y2 Then
;~ 					$angle += 180

;~ 				ElseIf $y1 = $y2 Then
;~ 					ContinueLoop
;~ 				ElseIf $y1 < $y2 Then

;~ 				EndIf
;~ 			ElseIf $x1 < $x2 Then
;~ 				If $y1 > $y2 Then
;~ 					$angle += 90
;~ 					$angle += Abs(ATan($dy/$dx)*45/ATan(1))
;~ 				ElseIf $y1 = $y2 Then
;~ 					$angle += 90

;~ 				ElseIf $y1 < $y2 Then
;~ 					$angle += Abs(ATan($dx/$dy)*45/ATan(1))
;~ 				EndIf
;~ 			EndIf

			$angle = be_CoordsToRotation($x1, $y1, $x2, $y2)*45/ATan(1)

			$x1z = $x1*-2+249
			$x2z = $x2*-2+249
			$y1z = $y1*-2+249
			$y2z = $y2*-2+249

			GUICtrlSetGraphic($graphic, $GUI_GR_COLOR, 0x00FFFF, 0x00FFFF)
			GUICtrlSetGraphic($graphic, $GUI_GR_ELLIPSE, $x1z-5, $y1z-5, 10, 10)
			GUICtrlSetGraphic($graphic, $GUI_GR_ELLIPSE, $x2z-3, $y2z-3, 5, 5)

			GUICtrlSetGraphic($graphic, $GUI_GR_COLOR, 0x0000FF, $GUI_GR_NOBKCOLOR)
			GUICtrlSetGraphic($graphic, $GUI_GR_MOVE, $x1z, $y1z)
			GUICtrlSetGraphic($graphic, $GUI_GR_LINE, $x2z, $y2z)
			GUICtrlSetGraphic($graphic, $GUI_GR_CLOSE)

			GUICtrlSetGraphic($graphic, $GUI_GR_COLOR, 0xFF0000, $GUI_GR_NOBKCOLOR)
			GUICtrlSetGraphic($graphic, $GUI_GR_MOVE, $x1z, $y1z)
			GUICtrlSetGraphic($graphic, $GUI_GR_LINE, $x2z, $y1z)
			GUICtrlSetGraphic($graphic, $GUI_GR_LINE, $x2z, $y2z)
			GUICtrlSetGraphic($graphic, $GUI_GR_CLOSE)

			GUICtrlSetGraphic($graphic, $GUI_GR_COLOR, 0x00FF00, $GUI_GR_NOBKCOLOR)
			GUICtrlSetGraphic($graphic, $GUI_GR_MOVE, $x1z, $y1z)
			GUICtrlSetGraphic($graphic, $GUI_GR_LINE, $x1z, 0)
			GUICtrlSetGraphic($graphic, $GUI_GR_PIE, $x1z, $y1z, 30, 90, $angle)
			GUICtrlSetGraphic($graphic, $GUI_GR_CLOSE)

			GUICtrlSetGraphic($graphic, $GUI_GR_REFRESH)
			MsgBox(0,'', 'P1 (' & $x1 & ';' & $y1 & ')' & @CRLF & 'P2 (' & $x2 & ';' & $y2 & ')' & @CRLF & 'Winkel: ' & $angle)

;~ 			MsgBox(0,'', $x1z & '/' & $y1z & @CRLF & $x2z & '/' & $y2z)
	EndSwitch
WEnd

Func be_CoordsToRotation($bectr_X1, $bectr_Y1, $bectr_X2, $bectr_Y2)
	Local $bectr_DX = $bectr_X2-$bectr_X1
	Local $bectr_DY = $bectr_Y2-$bectr_Y1
	Local $bectr_AXY = Abs(ATan($bectr_DX/$bectr_DY))
	Local $bectr_AYX = Abs(ATan($bectr_DY/$bectr_DX))
	Local $bectr_hpi = ATan(1)*2
	Local $bectr_Angle = 0

;~ 	MsgBox(0, '', _
;~ 	'$bectr_X1 = ' & $bectr_X1 & @CRLF & _
;~ 	'$bectr_Y1 = ' & $bectr_Y1 & @CRLF & _
;~ 	'$bectr_X2 = ' & $bectr_X2 & @CRLF & _
;~ 	'$bectr_Y2 = ' & $bectr_Y2 & @CRLF & _
;~ 	'$bectr_DX = ' & $bectr_DX & @CRLF & _
;~ 	'$bectr_DY = ' & $bectr_DY & @CRLF & _
;~ 	'$bectr_AXY = ' & $bectr_AXY & @CRLF & _
;~ 	'$bectr_AYX = ' & $bectr_AYX & @CRLF & _
;~ 	'$bectr_hpi = ' & $bectr_hpi & @CRLF & _
;~ 	'$bectr_Angle = ' & $bectr_Angle & @CRLF & _
;~ 	'')

	If $bectr_X1 > $bectr_X2 Then
		$bectr_Angle += 2*$bectr_hpi
		If $bectr_Y1 > $bectr_Y2 Then
			$bectr_Angle += $bectr_AXY
		ElseIf $bectr_Y1 = $bectr_Y2 Then
			$bectr_Angle += $bectr_hpi
		ElseIf $bectr_Y1 < $bectr_Y2 Then
			$bectr_Angle += $bectr_hpi
			$bectr_Angle += $bectr_AYX
		EndIf
	ElseIf $bectr_X1 = $bectr_X2 Then
		If $bectr_Y1 > $bectr_Y2 Then
			$bectr_Angle += 2*$bectr_hpi
;~ 		ElseIf $bectr_Y1 = $bectr_Y2 Then
;~ 		ElseIf $bectr_Y1 < $bectr_Y2 Then
		EndIf
	ElseIf $bectr_X1 < $bectr_X2 Then
		If $bectr_Y1 > $bectr_Y2 Then
			$bectr_Angle += $bectr_hpi
			$bectr_Angle += $bectr_AYX
		ElseIf $bectr_Y1 = $bectr_Y2 Then
			$bectr_Angle += $bectr_hpi
		ElseIf $bectr_Y1 < $bectr_Y2 Then
			$bectr_Angle += $bectr_AXY
		EndIf
	EndIf
	Return $bectr_Angle
EndFunc
 

nonenicks

Новичок
Сообщения
18
Репутация
3
Столкнулся с прогулами школы=)
В игре система координат содержится в типе float как и камера.
Так вот положение камеры от -1 до 1 ...итого получаются числа что-то вроде _XpositionCamera = 0,5432123... как привисти такой тип данных к более простому? Или может он и так простой, а я не умею его готовить=) ?

Простому - это чтобы мозг смог понять как вычислять положение камеры для движения к точке на карте.
 

greshnik77

Новичок
Сообщения
27
Репутация
0
Что есть простой тип? В нете есть готовые вейпоинты посмотри как там написано.
 

nonenicks

Новичок
Сообщения
18
Репутация
3
вобщем разобрался ...всмысле понял что это векторы.
 
Верх