Как заставить двигать персонажа к заданной точке, + сделать не какое то тупое движение?

wafq

Новичок
Автор темы
10
2
Делаю бота на амазинг рп рудокопа. Смог разобраться с пулом объектов, высчитывать дистанции, но с бегом беда, не получается никак. Либо багнутое либо просто на месте поворачивает и в сторону смотрит. У кого есть знания прошу дать ответ
 

БеzликиЙ

Автор темы
Проверенный
1,730
1,005
эмулируй ходьбу через https://wiki.blast.hk/moonloader/lua/setGameKeyState. повернулся - бежит. добавь виляние из стороны в сторону, прыжки, чтобы живее выглядело. и не забудь отжимать ходьбу, когда бот что-то отвечает в чат
 

VanoKLR

Известный
1,115
755
эмулируй ходьбу через https://wiki.blast.hk/moonloader/lua/setGameKeyState. повернулся - бежит. добавь виляние из стороны в сторону, прыжки, чтобы живее выглядело. и не забудь отжимать ходьбу, когда бот что-то отвечает в чат
вроде как данная тема не отправляет зажатие кнопки в синхре, её нужно эмулировать дополнительно
 

wafq

Новичок
Автор темы
10
2
эмулируй ходьбу через https://wiki.blast.hk/moonloader/lua/setGameKeyState. повернулся - бежит. добавь виляние из стороны в сторону, прыжки, чтобы живее выглядело. и не забудь отжимать ходьбу, когда бот что-то отвечает в чат
Мне на C++ через память нужно. На амз нет вариант lua или мунлоадер подгрузить. Да и впринципе идея эмуляция нажатий клавиш мне не заходила никогда. Зато пока я пытался сделать одно нашел другое, рабочий корд мастер и обход античита при тп. Но к сожалению мне это не нужно
 

Tema05

Известный
1,626
544
вроде как данная тема не отправляет зажатие кнопки в синхре, её нужно эмулировать дополнительно
Ещё как отправляет. Это буквально функция для изменения состояния игровой клавиши на уровне игры. Или по твоему откуда синхра нажатых клавиш берётся? Более того, оно не просто перезаписывает значение но и инициализирует все процессы как будто она была нажата вручную. Например такие как отправка дублирующей синхры при изменении состояния клавиш.

Мне на C++ через память нужно. На амз нет вариант lua или мунлоадер подгрузить. Да и впринципе идея эмуляция нажатий клавиш мне не заходила никогда. Зато пока я пытался сделать одно нашел другое, рабочий корд мастер и обход античита при тп. Но к сожалению мне это не нужно
Вообще setGameKeyState как и большинство функций moonloader'а это просто красивая обёртка для опкодов из самой игры. Можешь вызывать напрямую опкод 0b56 на плюсах с теми же аргументами. Реализация всех этих функций есть в самой гташке без модов и игра их сама использует
1767736659330.png

 
Последнее редактирование:

wafq

Новичок
Автор темы
10
2
Ещё как отправляет. Это буквально функция для изменения состояния игровой клавиши на уровне игры. Или по твоему откуда синхра нажатых клавиш берётся? Более того, оно не просто перезаписывает значение но и инициализирует все процессы как будто она была нажата вручную. Например такие как отправка дублирующей синхры при изменении состояния клавиш.


Вообще setGameKeyState как и большинство функций moonloader'а это просто красивая обёртка для опкодов из самой игры. Можешь вызывать напрямую опкод 0b56 на плюсах с теми же аргументами. Реализация всех этих функций есть в самой гташке без модов и их их также использует
Посмотреть вложение 284542
1767737246310.png

прислушиваться есть смысл к иишке?
 

Tema05

Известный
1,626
544
Посмотреть вложение 284543
прислушиваться есть смысл к иишке?
Честно говоря немного удручает, что ты сразу бежишь к иишке. Неужели погуглить уже так сложно и не интересно для людей. Ты номер этого опкода бы смог найти за 2 минуты.

По поводу использования ии: В целом использовать ии для скриптинга под гта са гиблое дело, так как это как и любая разработка модификаций на столько низком уровне супер нишевая тема и ии никогда не врубится в контекст (речь конкретно про плюсы и более менее сложные вещи, на lua ещё куда не шло). Информационный шум в виде сверхпопулярного moonloader и lua только усугубляет ситуацию. Но это моё мнение.

Если по существу, про CRunningScript и ProcessOneCommand верно, то что без moonloader/cleo этот опкод не поможет бред. Они разумеется дают возможность лёгкого использования с абстракцией, но не являются обязательными. Про последний абзац вообще хуй пойми что он несёт.

Все эти опкоды, адреса вообще ЛЮБОЙ хуйни уже 100500 раз описаны и задокументированы. С гта са по степени изученности разве что марио может сравниться. Просто эта инфа премущественно находится не на модном популярном бластхаке, а в богом забытых документациях на страницах 10-летней давности, но уж точно не у ии. Вот буквально базу файла gta_sa.exe открываем и смотрим:
тут тебе и сама функция для вызова, и таблица опкодов, можешь хоть код любого опкода просмотреть и как он работает, что там внутри дёргает
1767738451363.png
1767738463206.png


1767738491584.png
1767738554303.png
 
Последнее редактирование:
  • Влюблен
Реакции: wafq

wafq

Новичок
Автор темы
10
2
Честно говоря немного удручает, что ты сразу бежишь к иишке. Неужели погуглить уже так сложно и не интересно для людей. Ты номер этого опкода бы смог найти за 2 минуты.

По поводу использования ии: В целом использовать ии для скриптинга под гта са гиблое дело, так как это как и любая разработка модификаций на столько низком уровне супер нишевая тема и ии никогда не врубится в контекст (речь конкретно про плюсы и более менее сложные вещи, на lua ещё куда не шло). Информационный шум в виде сверхпопулярного moonloader и lua только усугубляет ситуацию. Но это моё мнение.

Если по существу, про CRunningScript и ProcessOneCommand верно, то что без moonloader/cleo этот опкод не поможет бред, они дают разумеется возможность лёгкого использования с абстракцией, но не обязательно. Про последний абзатц вообще хуй пойми что он несёт.

Все эти опкоды, адреса вообще ЛЮБОЙ хуйни уже 100500 раз описаны и задокументированы. Вот буквально базу файла gta_sa.exe открываем и смотрим:
тут тебе и сама функция для вызова, и таблица опкодов, можешь хоть код любого опкода просмотреть и как он работает, что там внутри дёргает
Посмотреть вложение 284545Посмотреть вложение 284546

Посмотреть вложение 284547Посмотреть вложение 284548
Просто у амз чуть другой клиент. И этот клиент если сам не разберешь - хуй че поймешь. Дай бог если функции гташки будут живы, но пока таких особо не встретил. Гуглить - гуглил и пытался делать все с тем что находил - тщетно. Щас буду разбирать твой метод
Я нашел какой то софт который в теории работает (я не запускал его и не запускаю, ибо сурс скрыт, вирус тотал ноет (ну на него чуть похуй) да и на амз таких проектов нет, а люди живут чтобы получать выгоду. Буду реверсить и смотреть мб смогу чет вытащить его не запуская
 

Tema05

Известный
1,626
544
Просто у амз чуть другой клиент. И этот клиент если сам не разберешь - хуй че поймешь. Дай бог если функции гташки будут живы, но пока таких особо не встретил. Гуглить - гуглил и пытался делать все с тем что находил - тщетно. Щас буду разбирать твой метод
Я нашел какой то софт который в теории работает (я не запускал его и не запускаю, ибо сурс скрыт, вирус тотал ноет (ну на него чуть похуй) да и на амз таких проектов нет, а люди живут чтобы получать выгоду. Буду реверсить и смотреть мб смогу чет вытащить его не запуская
Что за бред? Чем он другой? Это та же самая gta san andreas, тот же самп просто изменённой версии crmp. Та же физика, те же структуры, то же управление сам костят игры один и тот же, его нет смысла менять да и не получится. ДА, поверх устанавливается миллион патчей, хуков, но сама база игры никуда не девается.

Когда ты просто спавнишься в мире у тебя создаётся персонаж, в этот момент вызывается опкод 009A (createChar в moonloader). И когда в samp срабатывает функция добавления нового игрока в зону стрима там также гдле-то внутри будет вызван опкод 009A. И любая моделька человека (char'а) в мире появляется так или иначе вызывом опкода 009A. Точно также с изменением скина, с ускорением транспорта, созданием объектов и так далее и так далее. И все кастомные системы от лаунчеров проекта по типу охранников, питомцев, нпс они если начать ревёрсить все по итогу для создания персонажей вызовут где-то опокод 009A.

Безусловно там наверняка на половину этих функции будут стоять хуки, чтобы пересылать на расширенные таблицы моделей, анимаций, текстурок. Добавлять какие-то дополнительные эффекты, хуки в рендере дополнительно отрисовывающие какую-то хуйню. Но так или иначе костяк игры остаётся, просто его обвешивают всё новой и новой мишурой. Это несколько тысяч опкодов это база самой игры, которую могут ЧАСТИЧНО заменять, но чаще модифицирует для расширения возможностей, но никто их вырезать не будет. Потому что УСЛОВНО при прыжке может вызываться какой-то один единственный опкод, нигде более не использующийся, который просчитывает кости персонажа и если его удалить игра умрёт. Может быть там поставят хук, который будет ссылаться на функцию в асишке лаунчера, который будет по другой формуле рассчитывать кости у каких-то кастомных персонажей великанов, но опкод останется на месте.

Я решил ради интереса посмотреть чё там внутри setGameKeyState. sub_100013A0 ссылается на CPad::GetPad в самой игре (тут буква "a", а не "e", не путать с "ped"). Индекс 0 это наш персонаж, получаем из массива "устройств ввода" наше, далее по номеру клавиши считает оффсет до неё в структуре и меняется значение. В твоём случаи вероятно лаунчер ставит на CPad::GetPad хук так как там скорее всего лимит 1000 устройств, а насколько я знаю на Амазинге на 1 сервере может быть больше игроков. Но это просто выведет нас на другой расширенных массив. Технология управления уверен на 100% они не меняли, это невероятный гемор непонятно ради чего.

Интересно, что опкод 0b56 moonloader не вызывает, как в других его функциях, я честно говоря впервые встречаю чтоб вместо вызова опкода была реализация на месте. Также я немного преувеличил, конкретно опкод 0b56 не входит в стандартный набор и его реализация находится в sampfuncs, который туда добавлен через интерфейс cleo (хотя он как я уже только что сказал и не вызывается). Хз, почему так сделано. Но учитывая что я за столько лет не сталкивался с потребностью вызвать опкод из стандартного набора в 2600+ штук думаю они слишком ситуативные и не сильно нужны. На крайняк можно спиздить реализацию из муна или сампфункса.
1767742453030.png
1767742498326.png
1767742762029.png
1767742781479.png


Ну и в целом хочу прокомментировать, то что ты пытаешься сделать. Разработка под Амазинг это тебе не Аризона и даже не Радмир. Там помимо дохуищя кастомизации (вероятно сделанной через жопу) есть защита. Это конечно всё можно раскопать и сделать при желании, но тут без навыков ревёрса ты нихера с места не сдвинешься. Дай бог ты найдёшь достаточно исходников с реализациями всего, что тебе нужно, и разберёшься как это себе взять. Но судя по твоим ответам и что тебя удивляет, то что я за 15 минут нашёл тебе в базе в открытом доступе ты полез в дело, которое намного сложнее чем тебе кажется и твоих навыков может не хватить
 
Последнее редактирование:

wafq

Новичок
Автор темы
10
2
Что за бред? Чем он другой? Это та же самая gta san andreas, тот же самп просто изменённой версии crmp. Та же физика, те же структуры, то же управление сам костят игры один и тот же, его нет смысла менять да и не получится. ДА, поверх устанавливается миллион патчей, хуков, но сама база игры никуда не девается.

Когда ты просто спавнишься в мире у тебя создаётся персонаж, в этот момент вызывается опкод 009A (createChar в moonloader). И когда в samp срабатывает функция добавления нового игрока в зону стрима там также гдле-то внутри будет вызван опкод 009A. И любая моделька человека (char'а) в мире появляется так или иначе вызывом опкода 009A. Точно также с изменением скина, с ускорением транспорта, созданием объектов и так далее и так далее. И все кастомные системы от лаунчеров проекта по типу охранников, питомцев, нпс они если начать ревёрсить все по итогу для создания персонажей вызовут где-то опокод 009A.

Безусловно там наверняка на половину этих функции будут стоять хуки, чтобы пересылать на расширенные таблицы моделей, анимаций, текстурок. Добавлять какие-то дополнительные эффекты, хуки в рендере дополнительно отрисовывающие какую-то хуйню. Но так или иначе костяк игры остаётся, просто его обвешивают всё новой и новой мишурой. Это несколько тысяч опкодов это база самой игры, которую могут ЧАСТИЧНО заменять, но чаще модифицирует для расширения возможностей, но никто их вырезать не будет. Потому что УСЛОВНО при прыжке может вызываться какой-то один единственный опкод, нигде более не использующийся, который просчитывает кости персонажа и если его удалить игра умрёт. Может быть там поставят хук, который будет ссылаться на функцию в асишке лаунчера, который будет по другой формуле рассчитывать кости у каких-то кастомных персонажей великанов, но опкод останется на месте.

Я решил ради интереса посмотреть чё там внутри setGameKeyState. sub_100013A0 ссылается на CPad::GetPad в самой игре (тут буква "a", а не "e", не путать с "ped"). Индекс 0 это наш персонаж, получаем из массива "устройств ввода" наше, далее по номеру клавиши считает оффсет до неё в структуре и меняется значение. В твоём случаи вероятно лаунчер ставит на CPad::GetPad хук так как там скорее всего лимит 1000 устройств, а насколько я знаю на Амазинге на 1 сервере может быть больше игроков. Но это просто выведет нас на другой расширенных массив. Технология управления уверен на 100% они не меняли, это невероятный гемор непонятно ради чего.

Интересно, что опкод 0b56 moonloader не вызывает, как в других его функциях, я честно говоря впервые встречаю чтоб вместо вызова опкода была реализация на месте. Также я немного преувеличил, конкретно опкод 0b56 не входит в стандартный набор и его реализация находится в sampfuncs, который туда добавлен через интерфейс cleo (хотя он как я уже только что сказал и не вызывается). Хз, почему так сделано. Но учитывая что я за столько лет не сталкивался с потребностью вызвать опкод из стандартного набора в 2600+ штук думаю они слишком ситуативные и не сильно нужны. На крайняк можно спиздить реализацию из муна или сампфункса.
Посмотреть вложение 284551Посмотреть вложение 284552Посмотреть вложение 284553Посмотреть вложение 284554

Ну и в целом хочу прокомментировать, то что ты пытаешься сделать. Разработка под Амазинг это тебе не Аризона и даже не Радмир. Там помимо дохуищя кастомизации (вероятно сделанной через жопу) есть защита. Это конечно всё можно раскопать и сделать при желании, но тут без навыков ревёрса ты нихера с места не сдвинешься. Дай бог ты найдёшь достаточно исходников с реализациями всего, что тебе нужно, и разберёшься как это себе взять. Но судя по твоим ответам и что тебя удивляет, то что я за 15 минут нашёл тебе в базе в открытом доступе ты полез в дело, которое намного сложнее чем тебе кажется и твоих навыков может не хватить
Да не удивляет меня это нихуя, я в целом понимаю что это не работает, я шерстил интернет уже. Вместо реверса заебистого игры реверснул чужой код - достал часть камеры, нужно еще проверять, уже спать пойду. Пробовал твой метод, не сработало. Тут уж не знаю, то ли я криворукий то ли амазинг не дает
Я хочу получать навыки, реверсом я ранее не занимался, мой максимум был циферки в чит энжин вводить. То что сейчас - часть познания и развития. Я делаю софт под себя не больше

Что за бред? Чем он другой? Это та же самая gta san andreas, тот же самп просто изменённой версии crmp. Та же физика, те же структуры, то же управление сам костят игры один и тот же, его нет смысла менять да и не получится. ДА, поверх устанавливается миллион патчей, хуков, но сама база игры никуда не девается.

Когда ты просто спавнишься в мире у тебя создаётся персонаж, в этот момент вызывается опкод 009A (createChar в moonloader). И когда в samp срабатывает функция добавления нового игрока в зону стрима там также гдле-то внутри будет вызван опкод 009A. И любая моделька человека (char'а) в мире появляется так или иначе вызывом опкода 009A. Точно также с изменением скина, с ускорением транспорта, созданием объектов и так далее и так далее. И все кастомные системы от лаунчеров проекта по типу охранников, питомцев, нпс они если начать ревёрсить все по итогу для создания персонажей вызовут где-то опокод 009A.

Безусловно там наверняка на половину этих функции будут стоять хуки, чтобы пересылать на расширенные таблицы моделей, анимаций, текстурок. Добавлять какие-то дополнительные эффекты, хуки в рендере дополнительно отрисовывающие какую-то хуйню. Но так или иначе костяк игры остаётся, просто его обвешивают всё новой и новой мишурой. Это несколько тысяч опкодов это база самой игры, которую могут ЧАСТИЧНО заменять, но чаще модифицирует для расширения возможностей, но никто их вырезать не будет. Потому что УСЛОВНО при прыжке может вызываться какой-то один единственный опкод, нигде более не использующийся, который просчитывает кости персонажа и если его удалить игра умрёт. Может быть там поставят хук, который будет ссылаться на функцию в асишке лаунчера, который будет по другой формуле рассчитывать кости у каких-то кастомных персонажей великанов, но опкод останется на месте.

Я решил ради интереса посмотреть чё там внутри setGameKeyState. sub_100013A0 ссылается на CPad::GetPad в самой игре (тут буква "a", а не "e", не путать с "ped"). Индекс 0 это наш персонаж, получаем из массива "устройств ввода" наше, далее по номеру клавиши считает оффсет до неё в структуре и меняется значение. В твоём случаи вероятно лаунчер ставит на CPad::GetPad хук так как там скорее всего лимит 1000 устройств, а насколько я знаю на Амазинге на 1 сервере может быть больше игроков. Но это просто выведет нас на другой расширенных массив. Технология управления уверен на 100% они не меняли, это невероятный гемор непонятно ради чего.

Интересно, что опкод 0b56 moonloader не вызывает, как в других его функциях, я честно говоря впервые встречаю чтоб вместо вызова опкода была реализация на месте. Также я немного преувеличил, конкретно опкод 0b56 не входит в стандартный набор и его реализация находится в sampfuncs, который туда добавлен через интерфейс cleo (хотя он как я уже только что сказал и не вызывается). Хз, почему так сделано. Но учитывая что я за столько лет не сталкивался с потребностью вызвать опкод из стандартного набора в 2600+ штук думаю они слишком ситуативные и не сильно нужны. На крайняк можно спиздить реализацию из муна или сампфункса.
Посмотреть вложение 284551Посмотреть вложение 284552Посмотреть вложение 284553Посмотреть вложение 284554

Ну и в целом хочу прокомментировать, то что ты пытаешься сделать. Разработка под Амазинг это тебе не Аризона и даже не Радмир. Там помимо дохуищя кастомизации (вероятно сделанной через жопу) есть защита. Это конечно всё можно раскопать и сделать при желании, но тут без навыков ревёрса ты нихера с места не сдвинешься. Дай бог ты найдёшь достаточно исходников с реализациями всего, что тебе нужно, и разберёшься как это себе взять. Но судя по твоим ответам и что тебя удивляет, то что я за 15 минут нашёл тебе в базе в открытом доступе ты полез в дело, которое намного сложнее чем тебе кажется и твоих навыков может не хватить
Зареверсил, вышло B72D50, спасибо тебе большое, теперь все работает у мя
 
Последнее редактирование:

Tema05

Известный
1,626
544
Пробовал твой метод, не сработало. Тут уж не знаю, то ли я криворукий то ли амазинг не дает
Это не мой метод. Это то как в принципе все делают) И с широкой точки зрения единственный правильный вариант, кроме изобретения велосипеда.

А слова "не сработало" я честно говоря не понимаю. Что значит не сработало? Дебаггером ставить брейпоинты, смотришь что там вызывается, кто куда обращается, что записывает в память. Если не понятно ищешь через что угодно, хоть изменение координат персонажа, зависимость между движением и где в памяти триггерятся кнопки, смотришь кто и откуда их вызывает. Нельзя просто сказать "не сработало". Твой код же исполняется, значит что-то да и делает, хотя и не то что ты ожидал. Опять же ты не говоришь и не показываешь что именно ты пробуешь вызвать и как.
Я хочу получать навыки
Ок, молодец, получай, одобряем.
реверсом я ранее не занимался, мой максимум был циферки в чит энжин вводить
Я так и подумал, в целом через чит энджин можно +- всё необходимые раскопать (другие программы разве что более удобны в определённых задачах).
То что сейчас - часть познания и развития. Я делаю софт под себя не больше
Не знаю что ты подумал, но я тебе ни в чём не упрекал, тут большинство даже не поняли бы, что я написал. Попробуй щас найти исполнителя не за 25к, который после слова "ревёрс" не сольётся)
Зареверсил, вышло B72D50, спасибо тебе большое, теперь все работает у мя
Адреса всегда принято указывать с названием файла. И смещение от него. Также нужно учесть, что конкретно у gta_sa.exe базовый адрес 40000, а не 1000 как у большинства. Ну ладно, я могу понять, что речь про абсолютный адрес gta_sa.exe.
Ты делаешь не очень хорошую практику. Потому что твой адрес это какое-то место в CPad::TempKeyState (CKeyboardState) (вероятно конкретная клавиша). Так лучше не делать, а указывать оффсеты в структуре и вычислять их (даже когда ты просто хочешь привести пример или указать пишут что-то вроде file.dll+0x55555+4*i (где i индекс чего-то там)).
1767754667803.png

Далее можно увидеть, что обращение к этим данным есть в 3 местах. В 2 из них это просто очистка.

1767755248828.png

В 3 же они тупо перезаписываются в CPad:NewKeyState.
1767755365105.png

И как я выше приводил пример реализации из мунлоадера у нас запись идёт без смешения по структуре CPad. Только считается смещение в 2 байта по индексу клавиши.
1767755439698.png

А в CPad в начале т.е. без смещения у нас идут NewState клавиши.

1767755801781.png

Это я всё к тому, что ты пишешь в TempKeyState, которые нигде не используются кроме как записываются в NewKeyState. А реализация из мунлоадера пишет сразу в NewState. И тут как говорится "А не ебанёт? Да не должно.". Может быть обязательно нужно сразу писать в NewState, а может можно и в TempState и оно само запишется туда. Из последствий может быть нарушена поочередность обработки внутри кадра, но хз важно ли это КОНКРЕТНО В ЭТОЙ ситуации.
Также прошу обратить внимание, что CPad::NewKeyState с структурой CKeyboardState это по сути вся клавиатура ближе к уровню винды:
1767756175446.png

А реализация муна получает указатель на нашу структуру CPad и далее пишет в поле NewState, которое является структурой CControllerState. Отличие этих структур в том, что последние являются так называемыми "gamekey", т.е. набором из состояний 24 игровых клавиш, которые непосредственно влиют на управление персонажам на уровне игры. Это по сути те клавиши, что у нас указаны в настройках. Проше говоря ты записываешь состояния нажатий на уровне самой клавиатуры, а функция муна непосредственно игровые нажатия. Вероятно первые где-то конвертируются в последние.

Я это всё пишу не потому что ты что-то неправильно сделал, нет. А просто, чтоб ты задумался, что именно ты делаешь. В работе с памятью можно запросто выстрелить себе в ногу так, что ты даже не поймёшь, а потом будешь ломать голову. Принято использовать уже существующие реализации от более опытных разработчиков если они есть. Фип сделал эмуляцию клавиш через получение структуры CPad при помощи CPad::GetPad(0) и последующие записи в поле NewState, значит это лучшее решение. Были у этого реальные основания или нет уже другой вопрос, как и то будут ли проблемы в твоей реализации.

Опять же в Амазинге возможны изменения, которые усложняют эту реализацию и надо разбираться почему оно так не работает. Возможно тупо адрес другой или структура CPad у них перенесена в другое место. Тут только ревёрсить докапываясь до всех нюансов или смотреть на практике. Опять же повторюсь, если ты сделал как-то по другому и оно так заработало это не плохо, просто желательно понимать, почему так, чтобы позже не столкнуться с большими проблемами. Очень часто действия в 1 месте могут ломать что-то абсолютно с этим не связанное, через супер косвенные моменты. А могут и не сломать)
 
Последнее редактирование:

fuflexxxx

Известный
38
18
Просто добавлю немного от себя, тебе тут уже всё расписали более чем, но я бы советовал тебе изучить базовые хуки и питон.
Банально сможешь сделать автоматический ренейм хукнутых функций. Что-то в духе: GetAllNamesInIda -> GetAllHooks -> RenameAllFuncsInAmazingDump. Это достаточно простой способ, который сможет тебе сэкономить время(Не ты будешь по адресам ручками бегать и переименовывать, а скрипт всё сделает).
 
  • Bug
  • Ха-ха
Реакции: Tema05 и wafq

вайега52

Налуашил состояние
Модератор
2,982
3,098
Если вам нужно переписать lua/cleo, то просто берете таблицу опкодов:
Ищите опкод, и если он является GTA-шным, а не добавляется SAMPFUNCS-ом (а setGameKeyState как раз таки является), то подключаете plugin-sdk в свой проект и вызываешь его при помощи функций псдк:
Единственное, в том примере не указано то, как получать возвращаемое значение - надо лишь после всех аргументов, передать указатель на переменную, в которую должен записаться результат.

По поводу опкодов SF и setGameKeyState в частности, то тут нужно самому реверсить sampfuncs.asi и смотреть реализацию этих опкодов. Проще всего это сделать в IDA через: Search -> Sequence of bytes -> Ввести нужный опкод и выставить настройки, как на скрине
1767786258798.png


-> Найти строку, где будет push ваш_опкодh и далее перейти в каллбек функцию.
1767786279061.png

Чтобы тебе не тратить время, сам нашел реализацию клавиши:
C++:
int __stdcall sub_10082582(CScriptThread *a1)
{
  unsigned int Int; // esi

  Int = CScriptThread::GetInt(a1);
  *(_WORD *)(2 * Int + 0xB73458) = CScriptThread::GetInt(a1);
  return 0;
}
 
  • Нравится
Реакции: Tema05

wafq

Новичок
Автор темы
10
2
int __stdcall sub_10082582(CScriptThread *a1) { unsigned int Int; // esi Int = CScriptThread::GetInt(a1); *(_WORD *)(2 * Int + 0xB73458) = CScriptThread::GetInt(a1); return 0;
1767792275538.png

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

1767793087713.png

Реализация:
// game-keys (как в 0B56): 0xB73458 + 2*index
static void SetGameKeyState(int key, short state) {
    if (GAME_KEY_STATE_ADDR < MIN_PTR) {
        return;
    }
    WriteMem<short>(GAME_KEY_STATE_ADDR + key * 2, state);
}

// пример использования в движении:
if (g_useGameKeyState) {
    SetGameKeyState(1, -128);   // forward/back
    SetGameKeyState(0, 0);      // left/right
    SetGameKeyState(16, 255);   // run
    SetGameKeyState(14, 0);     // jump
}


По дебагу видно, GameKey fwd/run реально меняются, но движения всё равно нет. Значит amz не читает B73458 как game‑keys.

Сделал пошаговую “скан‑панель” прямо в меню, чтобы без IDA увидеть реальные оффсеты


Мой максимум

Если вам нужно переписать lua/cleo, то просто берете таблицу опкодов:
Ищите опкод, и если он является GTA-шным, а не добавляется SAMPFUNCS-ом (а setGameKeyState как раз таки является), то подключаете plugin-sdk в свой проект и вызываешь его при помощи функций псдк:
Единственное, в том примере не указано то, как получать возвращаемое значение - надо лишь после всех аргументов, передать указатель на переменную, в которую должен записаться результат.

По поводу опкодов SF и setGameKeyState в частности, то тут нужно самому реверсить sampfuncs.asi и смотреть реализацию этих опкодов. Проще всего это сделать в IDA через: Search -> Sequence of bytes -> Ввести нужный опкод и выставить настройки, как на скрине
Посмотреть вложение 284576

-> Найти строку, где будет push ваш_опкодh и далее перейти в каллбек функцию.
Посмотреть вложение 284578
Чтобы тебе не тратить время, сам нашел реализацию клавиши:
C++:
int __stdcall sub_10082582(CScriptThread *a1)
{
  unsigned int Int; // esi

  Int = CScriptThread::GetInt(a1);
  *(_WORD *)(2 * Int + 0xB73458) = CScriptThread::GetInt(a1);
  return 0;
}
Сейчас буду пробовать plugin sdk

в плагине ниче нового
NewKeyState = 0xB73190
OldKeyState = 0xB72F20
CPad::GetPad = 0x53FB70
CPad::UpdatePads = 0x541DD0
Это совпадает с тем, что я уже зареверсил (особенно UpdatePads и New/OldKeyState)

plugin‑sdk полезен как справочник по структурам и базовым адресам, но не даёт готового решения для setGameKeyState

Итог: Пока что единственная рабочая хуйня это tempkeystate которую я зареверсил с чужого софта
 
Последнее редактирование:
  • Нравится
Реакции: вайега52