вроде как данная тема не отправляет зажатие кнопки в синхре, её нужно эмулировать дополнительноэмулируй ходьбу через https://wiki.blast.hk/moonloader/lua/setGameKeyState. повернулся - бежит. добавь виляние из стороны в сторону, прыжки, чтобы живее выглядело. и не забудь отжимать ходьбу, когда бот что-то отвечает в чат
Мне на C++ через память нужно. На амз нет вариант lua или мунлоадер подгрузить. Да и впринципе идея эмуляция нажатий клавиш мне не заходила никогда. Зато пока я пытался сделать одно нашел другое, рабочий корд мастер и обход античита при тп. Но к сожалению мне это не нужноэмулируй ходьбу через https://wiki.blast.hk/moonloader/lua/setGameKeyState. повернулся - бежит. добавь виляние из стороны в сторону, прыжки, чтобы живее выглядело. и не забудь отжимать ходьбу, когда бот что-то отвечает в чат
Ещё как отправляет. Это буквально функция для изменения состояния игровой клавиши на уровне игры. Или по твоему откуда синхра нажатых клавиш берётся? Более того, оно не просто перезаписывает значение но и инициализирует все процессы как будто она была нажата вручную. Например такие как отправка дублирующей синхры при изменении состояния клавиш.вроде как данная тема не отправляет зажатие кнопки в синхре, её нужно эмулировать дополнительно
Вообще setGameKeyState как и большинство функций moonloader'а это просто красивая обёртка для опкодов из самой игры. Можешь вызывать напрямую опкод 0b56 на плюсах с теми же аргументами. Реализация всех этих функций есть в самой гташке без модов и игра их сама используетМне на C++ через память нужно. На амз нет вариант lua или мунлоадер подгрузить. Да и впринципе идея эмуляция нажатий клавиш мне не заходила никогда. Зато пока я пытался сделать одно нашел другое, рабочий корд мастер и обход античита при тп. Но к сожалению мне это не нужно
Ещё как отправляет. Это буквально функция для изменения состояния игровой клавиши на уровне игры. Или по твоему откуда синхра нажатых клавиш берётся? Более того, оно не просто перезаписывает значение но и инициализирует все процессы как будто она была нажата вручную. Например такие как отправка дублирующей синхры при изменении состояния клавиш.
Вообще setGameKeyState как и большинство функций moonloader'а это просто красивая обёртка для опкодов из самой игры. Можешь вызывать напрямую опкод 0b56 на плюсах с теми же аргументами. Реализация всех этих функций есть в самой гташке без модов и их их также использует
Посмотреть вложение 284542
opcodes - 0b56 | BlastHack — DEV_WIKI
www.blast.hk
Честно говоря немного удручает, что ты сразу бежишь к иишке. Неужели погуглить уже так сложно и не интересно для людей. Ты номер этого опкода бы смог найти за 2 минуты.Посмотреть вложение 284543
прислушиваться есть смысл к иишке?
Просто у амз чуть другой клиент. И этот клиент если сам не разберешь - хуй че поймешь. Дай бог если функции гташки будут живы, но пока таких особо не встретил. Гуглить - гуглил и пытался делать все с тем что находил - тщетно. Щас буду разбирать твой методЧестно говоря немного удручает, что ты сразу бежишь к иишке. Неужели погуглить уже так сложно и не интересно для людей. Ты номер этого опкода бы смог найти за 2 минуты.
По поводу использования ии: В целом использовать ии для скриптинга под гта са гиблое дело, так как это как и любая разработка модификаций на столько низком уровне супер нишевая тема и ии никогда не врубится в контекст (речь конкретно про плюсы и более менее сложные вещи, на lua ещё куда не шло). Информационный шум в виде сверхпопулярного moonloader и lua только усугубляет ситуацию. Но это моё мнение.
Если по существу, про CRunningScript и ProcessOneCommand верно, то что без moonloader/cleo этот опкод не поможет бред, они дают разумеется возможность лёгкого использования с абстракцией, но не обязательно. Про последний абзатц вообще хуй пойми что он несёт.
Все эти опкоды, адреса вообще ЛЮБОЙ хуйни уже 100500 раз описаны и задокументированы. Вот буквально базу файла gta_sa.exe открываем и смотрим:
тут тебе и сама функция для вызова, и таблица опкодов, можешь хоть код любого опкода просмотреть и как он работает, что там внутри дёргает
Посмотреть вложение 284545Посмотреть вложение 284546
Посмотреть вложение 284547Посмотреть вложение 284548
Что за бред? Чем он другой? Это та же самая gta san andreas, тот же самп просто изменённой версии crmp. Та же физика, те же структуры, то же управление сам костят игры один и тот же, его нет смысла менять да и не получится. ДА, поверх устанавливается миллион патчей, хуков, но сама база игры никуда не девается.Просто у амз чуть другой клиент. И этот клиент если сам не разберешь - хуй че поймешь. Дай бог если функции гташки будут живы, но пока таких особо не встретил. Гуглить - гуглил и пытался делать все с тем что находил - тщетно. Щас буду разбирать твой метод
Я нашел какой то софт который в теории работает (я не запускал его и не запускаю, ибо сурс скрыт, вирус тотал ноет (ну на него чуть похуй) да и на амз таких проектов нет, а люди живут чтобы получать выгоду. Буду реверсить и смотреть мб смогу чет вытащить его не запуская
Да не удивляет меня это нихуя, я в целом понимаю что это не работает, я шерстил интернет уже. Вместо реверса заебистого игры реверснул чужой код - достал часть камеры, нужно еще проверять, уже спать пойду. Пробовал твой метод, не сработало. Тут уж не знаю, то ли я криворукий то ли амазинг не даетЧто за бред? Чем он другой? Это та же самая 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, спасибо тебе большое, теперь все работает у мяЧто за бред? Чем он другой? Это та же самая 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 минут нашёл тебе в базе в открытом доступе ты полез в дело, которое намного сложнее чем тебе кажется и твоих навыков может не хватить
Это не мой метод. Это то как в принципе все делают) И с широкой точки зрения единственный правильный вариант, кроме изобретения велосипеда.Пробовал твой метод, не сработало. Тут уж не знаю, то ли я криворукий то ли амазинг не дает
Ок, молодец, получай, одобряем.Я хочу получать навыки
Я так и подумал, в целом через чит энджин можно +- всё необходимые раскопать (другие программы разве что более удобны в определённых задачах).реверсом я ранее не занимался, мой максимум был циферки в чит энжин вводить
Не знаю что ты подумал, но я тебе ни в чём не упрекал, тут большинство даже не поняли бы, что я написал. Попробуй щас найти исполнителя не за 25к, который после слова "ревёрс" не сольётся)То что сейчас - часть познания и развития. Я делаю софт под себя не больше
Адреса всегда принято указывать с названием файла. И смещение от него. Также нужно учесть, что конкретно у gta_sa.exe базовый адрес 40000, а не 1000 как у большинства. Ну ладно, я могу понять, что речь про абсолютный адрес gta_sa.exe.Зареверсил, вышло B72D50, спасибо тебе большое, теперь все работает у мя
int __stdcall sub_10082582(CScriptThread *a1)
{
unsigned int Int; // esi
Int = CScriptThread::GetInt(a1);
*(_WORD *)(2 * Int + 0xB73458) = CScriptThread::GetInt(a1);
return 0;
}
int __stdcall sub_10082582(CScriptThread *a1) { unsigned int Int; // esi Int = CScriptThread::GetInt(a1); *(_WORD *)(2 * Int + 0xB73458) = CScriptThread::GetInt(a1); return 0;
// 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
}
Сейчас буду пробовать plugin sdkЕсли вам нужно переписать lua/cleo, то просто берете таблицу опкодов:
Ищите опкод, и если он является GTA-шным, а не добавляется SAMPFUNCS-ом (а setGameKeyState как раз таки является), то подключаете plugin-sdk в свой проект и вызываешь его при помощи функций псдк:Таблица соответствия опкодов
wiki.blast.hk
Единственное, в том примере не указано то, как получать возвращаемое значение - надо лишь после всех аргументов, передать указатель на переменную, в которую должен записаться результат.![]()
Другое - С/С++ Вопрос - Ответ
1.Ваш вопрос: Как в dll / asi добавить wait, который идет с GTA SA опкодом 0001 ? Еще вариант используя plugin sdk #include #include "extensions/ScriptCommands.h" // Тут находится весь список опкодов -> extenstions/scripting/ScriptCommandNames.h plugin::Command( 1000 );www.blast.hk
По поводу опкодов 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; }