Как найти по градусах в вов

Как ориентироваться по координатам в варкрафт

Map: 1
X: 16222.59961
Y: 16222.59961
Z: 13.2085
_______________________
GM Island [South Seas]

Map: 1
X: -11856.43457
Y: -4743.86084
Z: 7.213507
_______________________
GM Island [Secret Jail]

Map: 1
X: 16228.973633
Y: 16403.376953
Z: -64.380722
_______________________
GM Engineer

Map: 530
X: 2975.022217
Y: 3667.676758
Z: 143.748718

Elwynn Forest «GM» Place
[ Место «ГМ» ]

Map: 0
X: -8261.086914
Y: -211.693695
Z: 268.546936

Dun Morogh «GM» Bay
[ Залив «ГМ» ]

Map:
X: -6376.444824
Y: 1264.107788
Z: 7.188406

Silithus «GM» Camp
[ Лагерь «ГМ» ]

Map: 1
X: -6057.894531
Y: 1216.47229
Z: 145.889465

Silithus «GM» Island
[ Остров «ГМ» ]

Географическая широта и географическая долгота. Географические координаты. Видеоурок по географии

Map: 1
X: -10743.490234
Y: 2426.451904
Z: 7.258235

1. Нужно сесть на маунта
2. Телепортируемся по координатам
3. Слезаем с маунта (при этом не дивигаясь)

Источник: wow-game.ru

Создание несложного бота для WoW, программирование маршрутов (продолжение)

Это вторая часть поста на тему создания несложного бота для игры World of Warcraft. С первой частью можно ознакомиться здесь. Сегодня мы поговорим о

  1. написании Recorder’а клавиш и координат на языке AutoIt
  2. написании Player’a инструкций для бота
  3. математике 2D, как ориентироваться в декартовой системе координат без теоремы косинусов
  4. управлении роботом при недостаточном количестве датчиков
  5. мерах противодействия ботам

Recorder

Наша задача: чтение цветов пикселей, определение нажатий клавиш, фоновая работа с возможностью приостановки, посылка кликов в приложение. Здесь как нельзя лучше подойдет язык AutoIt. Чтобы написать то же самое на Си, пришлось бы заморачиваться с хендлами, девайсами, хуками, событиями Windows… Причем, для каждого из этих действий надо почитать справку, выяснить способ, определиться со структурами, типами, апишками.

Для редактирования скрипта и быстрого запуска я использовал SciTE-Lite, который включает Highlighting, CodeFolding, Autocomplete, Intellisense, ну и SyntaxCheck. Встроенная справка по языку в подарок. Стандартные фишечки.

Горячие клавиши

В каждом скрипте, работающем с вашим рабочим столом и могущим захватить над ним контроль, советую использовать пару обработчиков горячих клавиш

$paused = false HotKeySet(«», «Pause») HotKeySet(«», «Kill») Func Pause() $Paused = NOT $Paused While $Paused Sleep(100) WEnd EndFunc Func Kill() FileClose($hfile) Exit EndFunc

В противном случае вы рискуете впасть в состояние наблюдателя без возможности управлять своей системой. Судный день.

Аддон. TomTom. Координаты, направление

Отмечу, что на F12 и некоторые другие кнопки обработчик повесить нельзя. Я какое-то время не мог понять, почему он не вызывался.

Получение координат

Напомню, что в аддоне мы клали в цветовые компоненты пикселей числа с плавающей запятой, а приезжают они к нам уже в виде целых байтов:

#include Opt(«PixelCoordMode», 2) ;Отсчет координат пикселей от левого верхнего угла клиентской части окна Opt(«MouseCoordMode», 2) ;Отсчет координат мыши от левого верхнего угла клиентской части окна $WinName = «World of Warcraft» $hwnd = WinGetHandle($WinName) Func GetPitch() $pixel2 = _ColorGetRGB(PixelGetColor(10, 0, $hwnd)); Return ($pixel2[2]/255.0-0.5)*4 EndFunc Func GetPos() $pixel1 = _ColorGetRGB(PixelGetColor(0, 0, $hwnd)); $pixel2 = _ColorGetRGB(PixelGetColor(10, 0, $hwnd)); $result[3] = [ ($pixel1[0]+$pixel1[1]/255.0)/255*100, ($pixel2[0]+$pixel2[1]/255.0)/255*100, $pixel1[2]*7.0/255 ] return $result EndFunc

Считав данные, мы производим с ними обратные преобразования. Функции возвращают массивы и массивы записываются в переменные абсолютно прозрачно для программиста.

Логирование клавиш

Читал я где-то, что автор языка AutoIt не хотел, чтобы такой простой и мощный язык использовался злоумышленниками для написания вредоносных программ. Поэтому он убрал возможность создать обработчик нажатия для всех клавиш сразу, чтобы хотя бы Keylogger’ы не клепали.

Что я могу сказать. AutoIt весьма активно используется для написания вредоносов, а перехват нажатия нужных клавиш мы будем делать так:

Таким образом, нам не нужно изобретать свою систему наименования клавиш для сохранения их в файл, достаточно использовать принятую в AutoIT

Если нам понадобится перехватить что-то еще (а при игре мы заранее знаем, что мы будем давить и какими заклинаниями пользоваться), мы просто добавим их в длинный список в начале.

Перехватив нажатие клавиши, нам надо послать его дальше в приложение, для этого мы временно убираем свой обработчик

Такой подход рекомендуется в справке, но на практике при нажатии на комбинации с Alt и другие ощутимо глючит. Я не стал разбираться, а просто избегал использования таких комбинаций.

Логирование мыши
  1. Передвижение персонажа сопряжено с большим количеством нажатий мыши, которые логировать не надо. Плюс, возможны случайные нажатия. Пришлось бы писать логику по отделению мух от котлет.
  2. Использование Hook’ов повышает шансы привлечения к вам внимания «спецслужб». Об этом подробнее в разделе «Противодействие ботам».
Запись координат

Ну и, конечно же, наш Recorder должен в фоне записывать передвижение персонажа

$hfile = FileOpen(«output.txt», 1) $prev = «» While true WinWaitActive($hwnd) local $pos = GetPos() $command = StringFormat(«move %.3f %.3f %.3f», $pos[0], $pos[1], $pos[2]); if $pos[0] + $pos[1] > 0 And $command <> $prev Then FileWriteLine($hfile, $command) EndIf $prev = $command Sleep(100) WEnd

Вы можете спросить, зачем так часто (10 раз в секунду) записывать координаты? Дело в том, что на нашем маршруте навалено препятствий: ящиков, углов, дверных проемов, фонарных столбов, граблей. А персонаж просто «магнитится» к ним. Если где-то, пробегая мимо, он может застрять, он обязательно сделает это. Даже если вы длительное время бежите по прямой, вспомните, азимут движения был задан не идеально, поэтому, возможно, вы давно бежите, упираясь лбом в стенку.

Полный исходный код Recorder’а

Au3Record

Вместе с SciTE4AutoIt3 поставляется AutoIt3ExtrasAu3RecordAu3Record.exe, который позволяет записывать ваши действия с рабочим столом и оформляет это сразу в виде AutoIt-скрипта. Если вам предстоит много раз совершать последовательность машинальных действий без необходимости думать (например, при установке ПО или патчей на большой парк компьютеров), присмотритесь к этому инструменту.

Player

Напомню, что результатом работы Recorder’а, описанного в предыдущей главе, является набор команд вида

mouse left 1892 1021 pause 10000 pitch -0.89 mouse right 942 498 pause 10000 move 83.72 50.03 0.604 key ` pause 1000 key pitch -0.1 move 83.777 50.207 1.235 move 83.777 50.207 2.114 move 83.777 50.207 2.827 move 83.777 50.207 2.855 move 83.754 50.327 2.855

На первый взгляд кажется, что «проиграть» их не составит никакого труда, но давайте детально рассмотрим этот процесс.

Поворот и наклон

Поворот и наклон при помощи нажатия на кнопки дает точность порядка 30 градусов, что неприемлемо для нашей задачи. Поэтому мы будем использовать для этого вторую возможность: движение мыши с зажатой правой кнопкой. Алгоритм следующий:

  1. Зажмем правую кнопку мыши
  2. Игра сама поместит курсор на центр экрана и будет удерживать его там. Это позволит пользователю не упереться в итоге курсором в край экрана при повороте
  3. Сдвигаем курсор налево или направо на определенное число пикселей
  4. Направление персонажа смещается налево или направо. Причем, чем быстрее вы двигаете курсор, тем быстрее вертится персонаж

Как нам попроще определить, в какую сторону выгоднее поворачиваться, если у нас есть два угла: текущий и требуемый?

Можно посмотреть на разницу углов, если она положительна — направо. Но рассмотрим случай: текущий угол — 30 градусов, требуемый — 330 градусов. Разница отрицательна, но нам все равно направо. А еще углы могут быть отрицательными. Чтобы не приходилось выписывать все эти условия, просто воспользуемся синусом разницы углов и будем смотреть только на его знак.

Переменные $want и $current содержат (x, y, azimuth)

Func Turn($want) while true $current = GetPos() $sin = sin($current[2] — $want[2]) ;ToolTip(StringFormat(«(%.2f,%.2f,%.2f) to (%.2f,%.2f,%.2f)», $current[0], $current[1], $sin, $want[0], $want[1], $want[2])) if abs($sin) < 0.05 then return MouseMove(MouseGetPos(0)+50*$sin, MouseGetPos(1), 1) wend EndFunc

Синус же позволяет нам регулировать скорость поворота. Чем меньше угол, тем аккуратнее будет двигаться наш курсор и тем точнее мы повернемся. И наоборот, на большие углы нам хочется поворачиваться побыстрее.

Функция изменения наклона к горизонту полностью аналогична, только сдвигать курсор надо по вертикали.

В приведенном примере кода, есть логическая ошибка, которая может привести к неправильному поведению бота. Предлагаю любопытному читателю самому ее найти.

Движение
  1. Точность позиционирования невысока. Нельзя встать ровно туда, куда вы желаете
  2. Двигаться надо, не поворачиваясь. Из доступных движений есть только бег вперед, шаги назад и strafe (движение вбок без поворота)
  3. Движение должно быть непрерывным, без остановок и рывков
  4. Как можно меньше возвратов и смен направлений движения. Неприятно смотреть на монитор, если персонаж пробежал чуть-чуть, потом попятился, потом снова побежал и так далее
Вперед или назад?

Если вы не любите математику или закончили школу очень давно, вы можете пропустить этот раздел без ущерба для понимания. Но ничего особо сложного тут нет. Пусть персонаж стоит на (ax, ay) и смотрит под углом и ему надо попасть в (bx, by), ему бежать вперед или назад? Для начала слегка перефразируем задачу: пусть персонаж стоит в (0, 0), смотрит в , а надо ему в (dx, dy).

Если решать задачу в лоб, то надо бы вычислить косинус угла между векторами. Если он положительный, то угол острый и бежать вперед. Если отрицательный — тупой, надо пятиться. Косинус можно вычислять по теореме косинусов

Но для этого нам придется вычислять длины каждого из векторов, извлекать корни, очень громоздко.

image

Есть так же формула скалярного произведения

Которое, как известно, в декартовой системе координат может быть вычислено по формуле

Таким образом, вычислив скалярное произведение и посмотрев на его знак, мы сможем определить, бежать нам вперед или назад. А в нашем случае вычислять мы его будем по формуле . Более того, это же самое скалярное произведение показывает нам, сколько именно надо бежать вперед или назад по своему геометрическому определению (проекция одного вектора на другой, помноженная на длину второго).

Влево или вправо?

Аналогичным образом, синус угла между векторами взгляда и направления до цели (dx, dy) определяет, в какой бок идти. Если положительный — цель по правую руку, и наоборот. Тут нам поможет векторное произведение, а если быть более точным, то псевдоскалярное произведение, вычисляемое в декартовых координатах по формуле

Опять-таки величина этого числа определяет, насколько много надо сделать шагов вбок.

Реализация

Запрограммируем наши рассуждения

Func ScalarMult($a, $b, $x, $y) return $a*$x + $b*$y EndFunc Func VectorMult($a, $b, $x, $y) return $a*$y — $b*$x EndFunc Func GetDirection($x, $y, $wx, $wy, $angle) $dx = $x — $wx $dy = $y — $wy local $result[2] = [ ScalarMult(-sin($angle), -cos($angle), $dx, $dy), VectorMult(-sin($angle), -cos($angle), $dx, $dy) ] Return $result EndFunc

Пусть вас не смущает, что в программе синус и косинус поменяны местами и взяты с противоположным знаком. Просто в WoW азимут отсчитывается от севера против часовой стрелки. Эти детали можно просто «попробовать» в реальной программе. И, если вышло наоборот, поиграться со знаками.

Функция GetDirection() возвращает массив из двух значений: сколько идти вперед/назад, сколько идти вбок.

Это поворот!

Некоторые читатели могут воскликнуть: «Да ведь эти умножения на синусы-косинусы — ничто иное, как обыкновенный поворот системы координат,

image

описываемый

Зачем морочить нам головы.»

Верно, но тогда мне было бы сложнее пояснить, почему матрица именно такая.

Остановка

Теперь мы готовы давить кнопки бега

Func Move($want) while true StartMoving() local $pos = GetPos() local $dir = GetDirection($pos[0], $pos[1], $want[0], $want[1], $pos[2]) ;ToolTip(StringFormat(«(%.2f,%.2f,%.2f) to (%.2f,%.2f, %.2f): (%.2f,%.2f)», $pos[0], $pos[1], $pos[2], $want[0], $want[1], $want[2], $dir[0], $dir[1])) if abs($dir[0]) < 0.1 And abs($dir[1]) < 0.1 then ExitLoop if abs($dir[0]) >= abs($dir[1]) Then Send(«») if $dir[0] «) ; forward Else Send(«») ; backward EndIf Else Send(«») if $dir[1] < 0 Then Send(«») ; right Else Send(«») ; left EndIf EndIf wend Send(«») EndFunc

Обратите внимание, мы идем в том направлении, в котором идти дальше всего, и заканчиваем путь, когда мы почти у цели. Это позволяет персонажу «не мельтешить». Кнопка движения вперед не отпускается по достижении точки назначения. Поэтому поворачиваться на требуемый угол нам надо сравнительно быстро.

Код, отвечающий за проигрывание файлов команд, не представляет из себя ничего интересного, и при желании вы можете ознакомиться с ним самостоятельно.

Полный исходный код Player’а

Управление (ро)ботом

Вот, казалось бы, и все. Пробежим по маршруту, запишем координаты, нажатия клавиш и клики, и включим воспроизведение. Но не тут-то было. Здесь начинается самое сложное.

В подземелье живут мобы, которые хоть и не представляют угрозы для жизни нашего персонажа, но норовят оглушить, кинуть «молчанку», отбежать в сторонку как раз тогда, когда вы бы хотели их убить, и бросаются на амбразуру в тот момент, когда вы думали взять в цель совсем другого моба. Иногда ваша цель забегает за спину, иногда — умирает за один удар, хотя должна жить три. В общем, их хаотичное поведение вносит заметный элемент случайности в наш маршрут, и в итоге персонаж может оказаться у запертой двери в самом конце маршрута просто потому, что не смог убить кого-то в самом начале.

Да, можно было написать внутриигровые макросы, которые бы брали в цель нужного моба, и тем самым избавиться от некоторых проблем, но мне хотелось оставить бота как можно более универсальным.

Двери-решетки. На них нужно кликнуть, чтобы открыть. А так как они решетки, то кликнуть вы можете случайно аккуратно в дырку. И персонаж будет биться лбом об дверь в попытке пробежать дальше.

Таким образом, записав маршрут, вы открываете его в блокноте и отлаживаете. Вы наблюдаете за персонажем и при проблемах или возможных проблемах «вбиваете костыли» в маршрут: вставляете дополнительное заклинание для верности (вдруг моб выживет), добегаете до той точки, в которой моб будет точно виден и досягаем независимо от его желания прогуляться. Вы изменяете маршрут, чтобы уж точно не споткнуться об этот злосчастный ящик. После 10 забегов я пришел к выводу, что лучше бы я просто переубивал там всех пауков, чем они потом смогли бы отомстить мне в одном случае из 10 своим внезапным заклинанием. Но, когда персонаж уже бегает сам, вам уже не хочется бежать самому ножками, вам хочется просто смотреть на это.

Я понял, каково это, запускать марсоход, программировать робот-пылесос, идти в полной темноте по квартире или учить роботов играть в футбол. Надо все делать надежно, с запасом. На марсе ямы будут везде, а еще будут нависающие скалы и пещеры. В квартире роботу-пылесосу будут противостоять провода и тапочки повсюду, а еще будет кот, который захочет поиграть.

В полной темноте будут углы, ножки стульев, и даже упавшие на пол ножи. Только на ощупь!

Признаюсь, выполнил я заявленную в прошлой части лишь программу минимум. Бот все еще может не выполнить задачу с вероятностью 1%. Так что оставлять его без контроля на ночь нельзя, застрянет.

Противодействие ботам

Люди, далекие от MMORPG игр, спросят: «А зачем вообще противодействовать ботам? Ведь автоматизация везде приветствуется.» А вот и нет. Если все платят одинаково, то и возможности должны быть равными. Иначе ущемленная часть обижается и перестает играть. Если в игре доступны, например, макросы, то они должны быть понятны и не программистам.

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

Я нередко встречал возгласы, что Blizzard (это разработчик WoW) плохо следит, и боты повсюду. Во-первых, сам я так не считаю, думаю, их доля преувеличена. А во-вторых, давайте обсудим, что же есть в арсенале разработчика. Как не только распознать бота, но еще и иметь подтверждающие факты. Ведь на основе подозрений невежливо банить игрока.

Например, гейм-мастер (внутриигровая поддержка) способен наблюдать за игроком и видеть его глазами. Но даже, увидев явно «нечеловеческое» поведение, как то: длительное вращение на месте, попытки пройти сквозь стену, беспрерывная игра в течение суток (обычно сбор ресурсов), игнорирование попыток общения других игроков, — все это не дает гарантий использования ботов. Быть может, игрок просто заснул на клавиатуре, очень целеустремлен, или просто не хочет общаться, когда «работает».

  1. фоновые программы анализируются
  2. их метаданные отправляются в облако
  3. чит-аналитики принимают решение, что такой-то процесс нечестно взаимодействует с игрой
  4. к пользователям, использовавшим эти программы, применяются санкции
  1. Нужно читать, а главное, писать в память процесса игры
  2. Нужно инжектить туда свои модули
  3. Ваше ПО для получения преимуществ в игре должно быть как можно более популярным
  4. Вам надо использовать руткит-технологии и полиморфизм для обхода систем защиты

Заключение

  1. Программу для перехвата клавиш и записи в файл
  2. Программу для воспроизведения команд из файла и перемещения в мире
  3. Процесс управления персонажем в условиях малой информации о мире
  4. Математику для определения направления движения
  5. Порассуждали на тему противодействия ботам, так ли это легко

Голосуйте, пишите комментарии, не ругайте за спорную тему. Удачи.

Источник: habr.com

MapCoords — аддон для отображения координат

MapCoords покажет вам координаты на главной и мини-карте. При наведении курсора мыши он покажет вам координаты данного местоположения, если вы хотите узнать свои координаты, то просто откройте главную карту и внизу будет надпись Player Coords.

mapcoords

  • Показ ваших координат;
  • Вы сможете узнать координаты любой точки на карте в игре;
  • Аддон не перегрузит компьютер, так как он не ресурсоемкий.

Скачать MapCoords

Ссылка на скачивание Последнее обновление
9.0.5 09.03.2021
1.13.6 13.12.2020
8.3 02.02.2020
1.13.3 02.02.2020
8.2 27.06.2019
8.1.5 17.03.2019
8.1 15.12.2018
8.0.1 18.11.2018
7.3.5 18.01.2018
7.3 01.09.2017
Ссылка на скачивание
7.2 6.2 5.4.8
4.3.4 3.3.5 2.4.3

Источник: wowskill.ru

Map coordinates are numerical references to locations on the WoW maps. You can display your coordinates with many AddOns. They are also called tloc, an abbreviation for “Thottbot location”. It consists of a set of x/y coordinates, which is two numbers ranging from 0 to 100, representing a location on the current zone map.

  • 0,0 represents the top left corner
  • 100,0 represents the top right corner
  • 0,100 represents the bottom left corner
  • 100,100 represents the bottom right corner
  • 50,50 is the exact center of the map

Users of the Cosmos addon can show their current position under the minimap by typing /mntloc.
Various other AddOns are also capable of displaying your current location. Examples include:

  • Titan Panel
  • Map Notes

Checking coordinates without addons

In-game, simply copy the following:

/run z = C_Map.GetBestMapForUnit("player"); pos = C_Map.GetPlayerMapPosition(z,"player"); print(C_Map.GetMapInfo(z).name, math.ceil(pos.x*10000)/100, math.ceil(pos.y*10000)/100)

Go into the game, open a chat box, paste, hit enter. Your present coordinates for the zone will appear in the default chat frame. This code can also be placed in a macro.

Multiple coordinates for the same point

Because the zone maps are always rectangular but the zones themselves are not, your location can sometimes be visible on more than one zone map at different coordinates. Thus, if you’ve manually changed the map to a different zone, or zoomed it out while in a city, you’ll need to change it back before giving coordinates. The above script does this, but some add-ons won’t.

Showing coordinate locations in Wowpedia

You can use the templates {{Zone Map}} and {{Zone Map Note}} to indicate locations on a map using the map coordinates.

Tooltip

You can also add coordinates (with a map tooltip), as a note, to an item or NPC using {{coords}}:

Example: The Rokk[62, 16]

{{coords|62|16|Shattrath City}}

Addons

  • External link Koordinator , an extremely minimalistic coordinate addon which shows your current coordinates in a GUI widget and a status bar on the full-screen map.

  • External link WoWPlotter , an online quest database, it plots quest objectives on a zone map, and can also suggest quests that are close together, to save you time when coming up with your waypoints.

@gerald Игровой мир в World of Warcraft просто огромен – общая площадь составляет около 113 квадратных километров. Естественно, здесь несложно бывает заблудиться. И уж тем более непросто бывает отыскать какой-то тайник – поэтому на помощь придут координаты, позволяющие ориентироваться на местности.

Но иногда бывает полезно узнать собственные координаты.

Как же это сделать?

К сожалению, стандартные способы, предусмотренные игрой, такой возможности не дают. Поэтому геймерам приходится искать альтернативные пути для решения проблемы. Например, для этого можно скачать специальный адд-он Tom Tom. Скачав и установив его, пользователь увидит, что под миникартой появилась иконка с координатами. Удобно, что её можно перетащить в любое место экрана, чтобы она не мешала и при этом постоянно была под рукой.

Скриншоты

Особенности

  • Создавать точки на карте можно с помощью команды или клика на карте.
  • Отображение координат персонажа на карте и в интерфейсе.

Настройка

“Настройки” -> “Интерфейс” -> “Модификации” -> “TomTom” – окно настройки аддона.

/tway или /way – команды аддона

/way x y описание – создает точку маршрута в координатах x,y и описание для нее. Например, way 66 77 Банк – точка будет с координатами 66,77 и с описанием “Банк”

/way zone x y описание – также создает точку, но в указанной зоне

/way reset all – сбрасывает точки

Дополнительно

Установка

  1. Скачать архив с нашего сайта.
  2. Папки необходимо извлечь из архива в папку с игрой:

    Путь: World of Warcraft/Interface/AddOns

    Если папки Interface нет (такое бывает, когда игра ни разу не запускалась) следует создать ее и папку AddOns, соблюдая регистр. Либо просто войти в мир за любого персонажа и папки создадутся сами.
  3. Запустить игру, войти в аккаунт, открыть “Модификации” (кнопка слева внизу) и проверить, включен ли аддон.
  4. Войти в мир, убедиться, что аддон работает и при необходимости его настроить.

Видео

Скачать аддон “TomTom”

10843 скачиваний

Дополнение Версия
WOTLK
(Wrath of the Lich King)
3.3.5a Скачать
TBC Classic
(The Burning Crusade)
2.5.4 Скачать
Vanilla Classic 1.14 Скачать

Описание Koordinator 3.3.5

Аддон Koordinator 3.3.5 для WoW покажет ваши координаты возле мини-карты. Координаты можно перетаскивать любое на экране. Аддон также отобразит ваши координаты на карте, а также координаты курсора.

Скачать Koordinator 3.3.5

Скачать Кординатор 3.3.5 вы можете с сайта напрямую без файлообменников, регистрации и смс.

Скачать аддон Koordinator 3.3.5

Похожие записи

Добавить комментарий