Перейти к содержанию

Рекомендуемые сообщения

Итак, немножно экскурса!

Попалалась мне когда-то на глаза такая игра, как Assassin's Creed. Там была одна консольная примочка, а именно - система наведения при броске метательных ножей. Зажимаем кнопку, выбираем врага, на нём появляется индикатор, кнопку отпускаем - voila - ножи летят в него. По сути, самонаведение. Задача состоит в следующем.

В современных играх преобладает объектная ориентация. Суть - каждая горстка пикселей - это объект, со своей собственной структурой. Игрок, враги, ящики, снаряды, словом, всё. У каждого игрового объекта есть свои игровые координаты, чаще всего - по трём осям. Каждый объект, опять же, умеет "рождаться" и "умирать" в игровом мире.

Алгоритм задачи простой. Берём любую игру, использующую объектную модель. Расковыриваем функцию стрельбы. Там будет нечто вроде:

-Нажали кнопку "атаковать"?

-Создали объект "снаряд" текущего оружия

-Присвоили ему координаты игрока

-Построили вектор относительно игрового мира от игрока к перекрестию прицела

-Направили снаряд вдоль вектора, придали скорость\ускорение

-Проиграли звук выстрела\анимацию

Соответственно, у снаряда появляется свой ID, тип снаряда, вектор, скорость и координаты.

Вклиниваемся в эту функцию и слегка модифицируем, а именно - считаем координаты ближайшего (любого видимого) врага и перенаправляем вектор выпущенного снаряда в него, а не в перекрестие прицела.

Кто реализует - тому пирожок, само собой. У меня почти получилось на примере Serious Sam II и Crimsonland, да времени довести до ума нет. Кто-нибудь копал в этом направлении, или я один такой извращенец? :lol:

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

То, о чем ты говоришь - это называется аим-бот. В различных хаках для Counter-strike 1.6 он присутствует, причем даже с возможностью наведения в определенную область тела врага - голова, шея, рука, нога, корпус... Но там это реализуется путем перехвата OpenGL функций построения объектов в игровом мире. И мне кажется - это наипростейший вариант такого аим-бота )

Ссылка на комментарий
Поделиться на другие сайты

То, о чем ты говоришь - это называется аим-бот. В различных хаках для Counter-strike 1.6 он присутствует, причем даже с возможностью наведения в определенную область тела врага - голова, шея, рука, нога, корпус... Но там это реализуется путем перехвата OpenGL функций построения объектов в игровом мире. И мне кажется - это наипростейший вариант такого аим-бота )

Большинство аим-ботов для FPS работают в 2D, а я говорю о 3D. :]

И классический аимбот подразумевает смещение перекрестия прицела в сторону врага (построение изначального вектора идёт от камеры игрока к врагу по прямой), а я же говорю об изменении этого вектора в риалтайме, независимо от того куда игрок смотрит. Проще говоря, где-то в прямой видимости (без препятствий в виде стен\ящиков) есть враг, игрок стреляет куда-то, а пулька всё равно летит во врага. Аимбот в этом случае вклинивается в рендер опенжл, пересчитывает 3D-координаты врагов относительно 2D-плоскости камеры игрока и двигает туда прицел, а затем стреляет.

Об облёте препятствий я не говорю, но это в принципе тоже можно реализовать.

Понятна разница? :lol:

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

Что касается задачи темы например для игры Crimsonland в которой довольно много монстров наседают со всех сторон. Функцию типа "если вижу объект А, то двигаться к нему" можно попробовать позаимствовать у ботов - существ, которые как только видят главного героя, то двигаются к нему. Для этого хорошо бы изучить код, который читает координаты героя именно для того чтобы боты двигались к ним... Затем изучить найденную функцию или участок в ней и возможно модифицировать в новую функцию в которой мы не двигаемся к объекту, а стреляем в него. Для начала, если будет даже выстрел не обязательно в ближайшего монстра, то это будет неплохо.

Ссылка на комментарий
Поделиться на другие сайты

На чём экспериментируете, какая игра? Я правильно понял, что нужно реализовать функцию "кривой ствол у пушки", но всегда попадаем в цель. Как в комедиях из 90-х :)

Ссылка на комментарий
Поделиться на другие сайты

Я расковыривал Crimsonland (там тоже есть оружие с самонаводащимися снарядами) и Serious Sam: The Second Encounter (там попроще - есть отладочная информация и названия функций). Надо будет отыскать код, выписывал куда-то.

Ссылка на комментарий
Поделиться на другие сайты

Привет, keng. Я в игре Serious Sam: The Second Encounter нашёл адреса на патроны для разного оружия, но вот правильно(вручную) найти указатели на эти адреса не выходит. Через автоматический поиск в СЕ указатели находятся - проблем нет, а вот как это сделать вручную? Там какая-то сложная схема, подскажи, как их искать.

Ссылка на комментарий
Поделиться на другие сайты

Привет, keng. Я в игре Serious Sam: The Second Encounter нашёл адреса на патроны для разного оружия, но вот правильно(вручную) найти указатели на эти адреса не выходит. Через автоматический поиск в СЕ указатели находятся - проблем нет, а вот как это сделать вручную? Там какая-то сложная схема, подскажи, как их искать.

Привет!

Всё так же, как и в туториале к Cheat Engine - правой кнопкой на адресе - "Find what accesses this address", отладчик выдаст несколько инструкций, на каждой клик и кнопку "More information", там будет показан вероятный адрес указателя и в найденной функции - смещение ("[eax+12345]", eax - адрес, 12345 - смещение), делаешь новый поиск типа hex, вбиваешь там адрес указателя из окошка (без смещения) - он найдёт адреса. Это будут указатели 1-го уровня. Адрес чёрного цвета - значит динамический и надо искать ещё, зелёный - значит статический и меняться вряд ли будет. Добавляешь в таблицу эти адреса, ставя галочку "Pointer" и вбивая в правое окошко смещение из предыдущего этапа (чтобы было типа "Найденный адрес + 12345", дальше повторяешь эти шаги для добавленных указателей до тех пор, пока не найдёшь статический.

Лучше этим пользоваться тогда, когда не работает автоматический поиск - ибо достаточно долго и муторно - напутать легко. :lol:

Ссылка на комментарий
Поделиться на другие сайты

Спасибо за объяснение. Я, кстати, посмотрел твой 3 урок, там как раз про поиск указателей и DMA. :) Хорошие уроки. Я пытался по коду, через листинг дизассемблера, отыскать цепочку указателей, но там что-то путано. Всё-таки автопоиск хорошая штука.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо за объяснение. Я, кстати, посмотрел твой 3 урок, там как раз про поиск указателей и DMA. :) Хорошие уроки. Я пытался по коду, через листинг дизассемблера, отыскать цепочку указателей, но там что-то путано. Всё-таки автопоиск хорошая штука.

Да пустяки - рад стараться! :lol:

По коду тоже отыскать можно, но это бывает ещё дольше чем через отладчик, да и всегда в пределах одного исполняемого файла, т.е. если часть кода "генерации" указателя подгружается из внешней dll, то найти через код нифига не получится - только функцию, а-ля LoadDll(), возвращающую указатель на базовый адрес загруженной dll, только вот возвращать она будет только после исполнения, чего в дизассемблере не получишь. :-P

Ссылка на комментарий
Поделиться на другие сайты

Вот вот, там именно такая ситуация, длл работает с адресами. Я даже вроде вылез на нужную вершину, но там снова искать еаикс, ебикс и пр. плюнул, воспользовался автопоиском и нормально. Попробую создать самонаводящиеся ракеты, но думаю реализовать будет сложно.

Ссылка на комментарий
Поделиться на другие сайты

Вот вот, там именно такая ситуация, длл работает с адресами. Я даже вроде вылез на нужную вершину, но там снова искать еаикс, ебикс и пр. плюнул, воспользовался автопоиском и нормально. Попробую создать самонаводящиеся ракеты, но думаю реализовать будет сложно.

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

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

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.