Автор Тема: Чтение адресов памяти через пойнтер  (Прочитано 1732 раз)

Оффлайн ilufir

  • Прохожий
  • *
  • Сообщений: 69
  • Репутация: +1/-0
  • Я пытался
    • Просмотр профиля
Вопрос таков:
Я решил считать уровень здоровья автомобиля и столкнулся с такой проблемой - у автомобиля есть поинтер, к которому уже как-то надо применять адрес. Я не  смог разобраться, как надо его использовать и как правильно считывать адреса памяти. В основном все туторы на СА, где несколько расширенный и измененный скриптинг.
Так вот, как это делается и есть ли где-нибудь толковый учебник скриптинга под Вайс? Не хочу тут создавать тему за темой по каждому возникшему вопросу.

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 514
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Чтение адресов памяти через пойнтер
« Ответ #1 : Август 25, 2016, 05:37:53 pm »
Это не совсем скриптинг: это навыки работы с игровой памятью, инфы по которой достаточно и на этом сайте, и в справке SB(там для СА инфа, но всё подходит и для ВС, кроме адресов памяти, ессно), и в доп справке CLEO 4 в аттаче(тоже инфа по СА, но опкоды, добавленные в CLEO Вайса 0 идентичны аналогичным САновским), и в Вики, и на форуме SB и т.д.. Сам скриптинг в СА и ВС ничем принципиально не отличается, кроме набора опкодов.
Итак, поинтер - это адрес чего-то конкретного, например - той же структуры тачки.
Получить поинтер структуры авто можно опкодом:
0A97: $CarStruct = car $MyCar structИногда встречаются случаи, когда тебе известен лишь адрес поинтера, т.е. не сам поинтер, а адрес, в котором записан адрес поинтера. Например, в Вики есть такой момент:
0x7E49C0 - [pointer] - Player's car pointer (player pointer when not in car)Т.е., чтобы узнать поинтер тачки игрока(при условии, что он сидит в тачке) - нужно считать по адресу 0x7E49C0 значение размера 4 байта:
0A8D: $PlayerCarStruct = read_memory 0x7E49C0 size 4 virtual_protect 1В $PlayerCarStruct запишется адрес(поинтер) стракта авто игрока.
Далее в той же Вики для каждого стракта приводится оффсет: это смещение относительно начального адреса структуры. Иначе говоря - это то значение, которое нужно прибавить к адресу стракта, чтобы получить необходимый адрес для работы с конкретной вещью.
К примеру, возьмем смещение здоровья авто:
0x204 | float | healthОзначает, что нам нужно к нашему адресу стракта прибавить 0x204, чтобы получить нужный адрес здоровья конкретного авто. Тип float, т.е. считывать нужно 4 байта. Если byte - 1 байт, если float, dword или pointer - 4 байта.
Иначе говоря, вот код получения здоровья авто:
0A97: $CarStruct = car $MyCar struct
$CarStruct += 0x204
0A8D: $CarHealth = read_memory $CarStruct size 4 virtual_protect 1
« Последнее редактирование: Август 25, 2016, 05:53:37 pm от Shagg_E »

Оффлайн ilufir

  • Прохожий
  • *
  • Сообщений: 69
  • Репутация: +1/-0
  • Я пытался
    • Просмотр профиля
Re: Чтение адресов памяти через пойнтер
« Ответ #2 : Август 25, 2016, 07:05:11 pm »
Разбирая чужие скрипты в поисках указателя на дамми, нашел одну занятную вещь - это делается как раз через поинтер, но вот незадача - опять же нигде это не документировано толком. Имею только указатель 0x3E0 на дамми windscreen, а ищу exhaust.

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 222
  • Репутация: +313/-0
    • dk22pac
    • Просмотр профиля
Re: Чтение адресов памяти через пойнтер
« Ответ #3 : Август 25, 2016, 08:42:13 pm »
А зачем это докумментировать? Есть база по вайсу.
В структуре транспорта (CAutomobile, CHeli и т.д.) сохраняется массив указателей на "базовые" компоненты - колёса, двери, и т.п. Для CAutomobile этот массив начинается с оффсета 0x394.
Для каждого вида транспорта этот массив может различаться - как его размер, так и типы компонентов. В игре есть таблицы (для каждого типа транспорта), по которым можно определить формат этого массива.
Для CAutomobile сохраняются такие компоненты:
Код: C++
  1. enum eCarNodes_VC {
  2.     CAR_NODE_NONE = 0, // в начале массива - пустой указатель
  3.     CAR_WHEEL_RF = 1,
  4.     CAR_WHEEL_RM = 2,
  5.     CAR_WHEEL_RB = 3,
  6.     CAR_WHEEL_LF = 4,
  7.     CAR_WHEEL_LM = 5,
  8.     CAR_WHEEL_LB = 6,
  9.     CAR_BUMP_FRONT = 7,
  10.     CAR_BUMP_REAR = 8,
  11.     CAR_WING_RF = 9,
  12.     CAR_WING_RR = 10,
  13.     CAR_DOOR_RF = 11,
  14.     CAR_DOOR_RR = 12,
  15.     CAR_WING_LF = 13,
  16.     CAR_WING_LR = 14,
  17.     CAR_DOOR_LF = 15,
  18.     CAR_DOOR_LR = 16,
  19.     CAR_BONNET = 17,
  20.     CAR_BOOT = 18,
  21.     CAR_WINDSCREEN = 19
  22. };
Фреймы, которые в игре используются только для определения позиции (эффекта, света и пр.), в этот массив не сохраняются. Они удаляются из иерархии модели (клампа), а позиция (3d-координаты) записывается в структуре CVehicleModelInfo.

Вообще, учись работать с базой и исследовать код exe. Вся документация - именно там.
Не понимаю людей, которые столько лет занимаются скриптингом, интересуются им, интересуются самой игрой, и боятся залезть куда-то "поглубже".
« Последнее редактирование: Август 25, 2016, 08:50:32 pm от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 514
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Чтение адресов памяти через пойнтер
« Ответ #4 : Август 25, 2016, 09:13:41 pm »
Не понимаю людей, которые столько лет занимаются скриптингом, интересуются им, интересуются самой игрой, и боятся залезть куда-то "поглубже".
Эхх, если бы только скриптингом... Так хочется изучить всё и сразу - а из-за нехватки времени это получается делать лишь рывками) Чуток моделирования, немного анимирования, горстка скриптинга и щепотка программирования...так и живем ;D

Оффлайн ilufir

  • Прохожий
  • *
  • Сообщений: 69
  • Репутация: +1/-0
  • Я пытался
    • Просмотр профиля
Re: Чтение адресов памяти через пойнтер
« Ответ #5 : Август 27, 2016, 12:19:25 pm »
Вообще, учись работать с базой и исследовать код exe. Вся документация - именно там.
Не понимаю людей, которые столько лет занимаются скриптингом, интересуются им, интересуются самой игрой, и боятся залезть куда-то "поглубже".
Уже давно пытаюсь что-то понять, пока что не получилось получить никаких результатов по этому поводу

Оффлайн Prographer

  • Прохожий
  • *
  • Сообщений: 89
  • Репутация: +7/-0
  • Говнокодим, грабим, убиваем
    • Просмотр профиля
Re: Чтение адресов памяти через пойнтер
« Ответ #6 : Август 28, 2016, 07:33:07 pm »
А зачем это докумментировать? Есть база по вайсу.
В структуре транспорта (CAutomobile, CHeli и т.д.) сохраняется массив указателей на "базовые" компоненты - колёса, двери, и т.п. Для CAutomobile этот массив начинается с оффсета 0x394.
Для каждого вида транспорта этот массив может различаться - как его размер, так и типы компонентов. В игре есть таблицы (для каждого типа транспорта), по которым можно определить формат этого массива.
Для CAutomobile сохраняются такие компоненты:
Код: C++
  1. enum eCarNodes_VC {
  2.     CAR_NODE_NONE = 0, // в начале массива - пустой указатель
  3.     CAR_WHEEL_RF = 1,
  4.     CAR_WHEEL_RM = 2,
  5.     CAR_WHEEL_RB = 3,
  6.     CAR_WHEEL_LF = 4,
  7.     CAR_WHEEL_LM = 5,
  8.     CAR_WHEEL_LB = 6,
  9.     CAR_BUMP_FRONT = 7,
  10.     CAR_BUMP_REAR = 8,
  11.     CAR_WING_RF = 9,
  12.     CAR_WING_RR = 10,
  13.     CAR_DOOR_RF = 11,
  14.     CAR_DOOR_RR = 12,
  15.     CAR_WING_LF = 13,
  16.     CAR_WING_LR = 14,
  17.     CAR_DOOR_LF = 15,
  18.     CAR_DOOR_LR = 16,
  19.     CAR_BONNET = 17,
  20.     CAR_BOOT = 18,
  21.     CAR_WINDSCREEN = 19
  22. };
Фреймы, которые в игре используются только для определения позиции (эффекта, света и пр.), в этот массив не сохраняются. Они удаляются из иерархии модели (клампа), а позиция (3d-координаты) записывается в структуре CVehicleModelInfo.

Вообще, учись работать с базой и исследовать код exe. Вся документация - именно там.
Не понимаю людей, которые столько лет занимаются скриптингом, интересуются им, интересуются самой игрой, и боятся залезть куда-то "поглубже".
Это абсолютно нормально, я считаю. Скриптинг по своей сути вообще не подразумевает явную работу с памятью. Большинство людей, пишущих сценарии на LUA понятия не имеют как это будет выполнять машина, а работа с idb-базой как раз требует этого понимания, и ещё много чего. Здесь уже необходимы определённые знания в соответствующей сфере.
« Последнее редактирование: Август 29, 2016, 04:36:49 pm от Prographer »

Оффлайн ilufir

  • Прохожий
  • *
  • Сообщений: 69
  • Репутация: +1/-0
  • Я пытался
    • Просмотр профиля
Re: Чтение адресов памяти через пойнтер
« Ответ #7 : Август 29, 2016, 12:51:24 am »
Вопрос остается открытым - надо конкретно "налечь" на моддинг Вайса, чтобы не отставать от SA.
Вообще обидно, что вайс так быстро забросили в плане моддинга, ибо даже такой нуб и лохчмо как я смог сделать вот такой вот мод
https://vk.com/video70744092_456239312
На СА таких небольших - тысячи
На вайс - единицы
Обидно

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 514
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Чтение адресов памяти через пойнтер
« Ответ #8 : Август 29, 2016, 08:20:41 am »
Вопрос остается открытым - надо конкретно "налечь" на моддинг Вайса, чтобы не отставать от SA.
Вообще обидно, что вайс так быстро забросили в плане моддинга, ибо даже такой нуб и лохчмо как я смог сделать вот такой вот мод
https://vk.com/video70744092_456239312
На СА таких небольших - тысячи
На вайс - единицы
Обидно
Мод клевый, но по-моему, звуки стуков нужно сделать потише, а то как-то странно: какой-то пердеж движка в десять раз громче, чем лобовое столкновение в стену на полной скорости :D
По поводу моддинга Вайса: лично меня устраивает текущая ситуация. SA популярна, поэтому всякий шлак тоннами создается для неё, на Вайсе же сидят люди, которые понимают, что он вполне может реализовать многие их потребности при бОльшем удобстве работы с игрой. Ты сам это доказал, запилив этот мод со стуками. И еще доказал, что годные идеи-таки добираются и до Вайса, пройдя проверку временем на SA.
Я недавно видел на либерти, как один чувак заявлял, что "движок SA кривой" из-за того, что этот чувак ничего кроме кривеньких DYOM миссий делать не умеет. Представляю, что такие как он думают о "движке VC".
Редко кому действительно удается раскрыть потенциал SA, а уж Вайс реально ковыряют лишь тут да на форумсах.
Нужно писать туториалы и делать качественные моды, чтобы прогнать стереотип об устаревании Вайса, как платформы для моддинга и привлекать мозги. Благодаря моддингу я получил некоторые знания, полезные на моей работе, и я знаю еще пару таких примеров среди модмейкеров. Моддинг позволяет тренировать мозг, поэтому это полезное дело, и нужно его развивать ;D

Оффлайн ilufir

  • Прохожий
  • *
  • Сообщений: 69
  • Репутация: +1/-0
  • Я пытался
    • Просмотр профиля
Re: Чтение адресов памяти через пойнтер
« Ответ #9 : Август 29, 2016, 12:59:32 pm »
Вопрос остается открытым - надо конкретно "налечь" на моддинг Вайса, чтобы не отставать от SA.
Вообще обидно, что вайс так быстро забросили в плане моддинга, ибо даже такой нуб и лохчмо как я смог сделать вот такой вот мод
https://vk.com/video70744092_456239312
На СА таких небольших - тысячи
На вайс - единицы
Обидно
Мод клевый, но по-моему, звуки стуков нужно сделать потише, а то как-то странно: какой-то пердеж движка в десять раз громче, чем лобовое столкновение в стену на полной скорости :D
По поводу моддинга Вайса: лично меня устраивает текущая ситуация. SA популярна, поэтому всякий шлак тоннами создается для неё, на Вайсе же сидят люди, которые понимают, что он вполне может реализовать многие их потребности при бОльшем удобстве работы с игрой. Ты сам это доказал, запилив этот мод со стуками. И еще доказал, что годные идеи-таки добираются и до Вайса, пройдя проверку временем на SA.
Я недавно видел на либерти, как один чувак заявлял, что "движок SA кривой" из-за того, что этот чувак ничего кроме кривеньких DYOM миссий делать не умеет. Представляю, что такие как он думают о "движке VC".
Редко кому действительно удается раскрыть потенциал SA, а уж Вайс реально ковыряют лишь тут да на форумсах.
Нужно писать туториалы и делать качественные моды, чтобы прогнать стереотип об устаревании Вайса, как платформы для моддинга и привлекать мозги. Благодаря моддингу я получил некоторые знания, полезные на моей работе, и я знаю еще пару таких примеров среди модмейкеров. Моддинг позволяет тренировать мозг, поэтому это полезное дело, и нужно его развивать ;D
Спасибо! Этот мод на самом деле еще далек от завершения. Именно из-за идей, которые я хочу реализовать, я и пишу сюда. При стуке движка я еще хотел чтобы из выхлопной трубы "выстреливал" черный-черный дым как в четверке, а при горении, как собсна тоже в четверке, горели и колеса. Но по сравнению с СА надо копаться в памяти чтобы узнать X Y и Z даммисов типа exhaust.
Кстати, кто-нибудь знает как починить эту проблему vice37? Я качал последнюю версию, где написано, что они починены, но безрезультатно.

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 144
  • Репутация: +5/-0
    • Просмотр профиля
Re: Чтение адресов памяти через пойнтер
« Ответ #10 : Август 29, 2016, 02:33:48 pm »
Цитировать
...я еще хотел чтобы из выхлопной трубы "выстреливал" черный-черный дым...Но по сравнению с СА надо копаться в памяти чтобы узнать X Y и Z даммисов типа exhaust.

http://gta.com.ua/file_details.phtml?id=2821

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 222
  • Репутация: +313/-0
    • dk22pac
    • Просмотр профиля
Re: Чтение адресов памяти через пойнтер
« Ответ #11 : Август 29, 2016, 07:13:37 pm »
Скриптинг по своей сути вообще не подразумевает явную работу с памятью.
Дело в том, что создание качественных и чего-то стоящих модов в наше время (что для SA, что для VC) требует эту самую "работу с памятью".
а работа с idb-базой как раз требует этого понимания
Нет. Работа с базой - это как раз и процесс этого "понимания".
Работая с базой, ты учишься и понимаешь, как работает игра и её компоненты, в т.ч. и скриптинг.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн ilufir

  • Прохожий
  • *
  • Сообщений: 69
  • Репутация: +1/-0
  • Я пытался
    • Просмотр профиля
Re: Чтение адресов памяти через пойнтер
« Ответ #12 : Август 29, 2016, 07:18:04 pm »
Цитировать
...я еще хотел чтобы из выхлопной трубы "выстреливал" черный-черный дым...Но по сравнению с СА надо копаться в памяти чтобы узнать X Y и Z даммисов типа exhaust.

http://gta.com.ua/file_details.phtml?id=2821

Ты не будешь против если я использую часть твоего кода в своем скрипте?

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 144
  • Репутация: +5/-0
    • Просмотр профиля
Re: Чтение адресов памяти через пойнтер
« Ответ #13 : Август 29, 2016, 08:15:55 pm »
Цитировать
Ты не будешь против если я использую часть твоего кода в своем скрипте?
Используй, конечно.

Оффлайн ilufir

  • Прохожий
  • *
  • Сообщений: 69
  • Репутация: +1/-0
  • Я пытался
    • Просмотр профиля
Re: Чтение адресов памяти через пойнтер
« Ответ #14 : Август 31, 2016, 05:03:36 pm »
Хм, появилась еще одна идея - вызывать покачивание автомобиля как при процессе "пополнения здоровья" с проституткой скриптовым способом