Сообщение от
wafq
Пробовал твой метод, не сработало. Тут уж не знаю, то ли я криворукий то ли амазинг не дает
Это не мой метод. Это то как в принципе все делают) И с широкой точки зрения единственный правильный вариант, кроме изобретения велосипеда.
А слова "не сработало" я честно говоря не понимаю. Что значит не сработало? Дебаггером ставить брейпоинты, смотришь что там вызывается, кто куда обращается, что записывает в память. Если не понятно ищешь через что угодно, хоть изменение координат персонажа, зависимость между движением и где в памяти триггерятся кнопки, смотришь кто и откуда их вызывает. Нельзя просто сказать "не сработало". Твой код же исполняется, значит что-то да и делает, хотя и не то что ты ожидал. Опять же ты не говоришь и не показываешь что именно ты пробуешь вызвать и как.
Сообщение от
wafq
Я хочу получать навыки
Ок, молодец, получай, одобряем.
Сообщение от
wafq
реверсом я ранее не занимался, мой максимум был циферки в чит энжин вводить
Я так и подумал, в целом через чит энджин можно +- всё необходимые раскопать (другие программы разве что более удобны в определённых задачах).
Сообщение от
wafq
То что сейчас - часть познания и развития. Я делаю софт под себя не больше
Не знаю что ты подумал, но я тебе ни в чём не упрекал, тут большинство даже не поняли бы, что я написал. Попробуй щас найти исполнителя не за 25к, который после слова "ревёрс" не сольётся)
Сообщение от
wafq
Зареверсил, вышло B72D50, спасибо тебе большое, теперь все работает у мя
Адреса всегда принято указывать с названием файла. И смещение от него. Также нужно учесть, что конкретно у gta_sa.exe базовый адрес 40000, а не 1000 как у большинства. Ну ладно, я могу понять, что речь про абсолютный адрес gta_sa.exe.
Ты делаешь не очень хорошую практику. Потому что твой адрес это какое-то место в CPad::TempKeyState (CKeyboardState) (вероятно конкретная клавиша). Так лучше не делать, а указывать оффсеты в структуре и вычислять их (даже когда ты просто хочешь привести пример или указать пишут что-то вроде file.dll+0x55555+4*i (где i индекс чего-то там)).
Далее можно увидеть, что обращение к этим данным есть в 3 местах. В 2 из них это просто очистка.
В 3 же они тупо перезаписываются в CPad:NewKeyState.
И как я выше приводил пример реализации из мунлоадера у нас запись идёт без смешения по структуре CPad. Только считается смещение в 2 байта по индексу клавиши.
А в CPad в начале т.е. без смещения у нас идут NewState клавиши.
Это я всё к тому, что ты пишешь в TempKeyState, которые нигде не используются кроме как записываются в NewKeyState. А реализация из мунлоадера пишет сразу в NewState. И тут как говорится "А не ебанёт? Да не должно.". Может быть обязательно нужно сразу писать в NewState, а может можно и в TempState и оно само запишется туда. Из последствий может быть нарушена поочередность обработки внутри кадра, но хз важно ли это КОНКРЕТНО В ЭТОЙ ситуации.
Также прошу обратить внимание, что CPad::NewKeyState с структурой CKeyboardState это по сути вся клавиатура ближе к уровню винды:
А реализация муна получает указатель на нашу структуру CPad и далее пишет в поле NewState, которое является структурой CControllerState. Отличие этих структур в том, что последние являются так называемыми "gamekey", т.е. набором из состояний 24 игровых клавиш, которые непосредственно влиют на управление персонажам на уровне игры. Это по сути те клавиши, что у нас указаны в настройках. Проше говоря ты записываешь состояния нажатий на уровне самой клавиатуры, а функция муна непосредственно игровые нажатия. Вероятно первые где-то конвертируются в последние.
Я это всё пишу не потому что ты что-то неправильно сделал, нет. А просто, чтоб ты задумался, что именно ты делаешь. В работе с памятью можно запросто выстрелить себе в ногу так, что ты даже не поймёшь, а потом будешь ломать голову. Принято использовать уже существующие реализации от более опытных разработчиков если они есть. Фип сделал эмуляцию клавиш через получение структуры CPad при помощи CPad::GetPad(0) и последующие записи в поле NewState, значит это лучшее решение. Были у этого реальные основания или нет уже другой вопрос, как и то будут ли проблемы в твоей реализации.
Опять же в Амазинге возможны изменения, которые усложняют эту реализацию и надо разбираться почему оно так не работает. Возможно тупо адрес другой или структура CPad у них перенесена в другое место. Тут только ревёрсить докапываясь до всех нюансов или смотреть на практике. Опять же повторюсь, если ты сделал как-то по другому и оно так заработало это не плохо, просто желательно понимать, почему так, чтобы позже не столкнуться с большими проблемами. Очень часто действия в 1 месте могут ломать что-то абсолютно с этим не связанное, через супер косвенные моменты. А могут и не сломать)