GTA Builder Форум

GTA Vice City => Скриптинг => Тема начата: ilufir от Август 25, 2016, 02:41:35 pm

Название: Чтение адресов памяти через пойнтер
Отправлено: ilufir от Август 25, 2016, 02:41:35 pm
Вопрос таков:
Я решил считать уровень здоровья автомобиля и столкнулся с такой проблемой - у автомобиля есть поинтер, к которому уже как-то надо применять адрес. Я не  смог разобраться, как надо его использовать и как правильно считывать адреса памяти. В основном все туторы на СА, где несколько расширенный и измененный скриптинг.
Так вот, как это делается и есть ли где-нибудь толковый учебник скриптинга под Вайс? Не хочу тут создавать тему за темой по каждому возникшему вопросу.
Название: Re: Чтение адресов памяти через пойнтер
Отправлено: Shagg_E от Август 25, 2016, 05:37:53 pm
Это не совсем скриптинг: это навыки работы с игровой памятью, инфы по которой достаточно и на этом сайте, и в справке SB(там для СА инфа, но всё подходит и для ВС, кроме адресов памяти, ессно), и в доп справке CLEO 4 в аттаче(тоже инфа по СА, но опкоды, добавленные в CLEO Вайса 0 идентичны аналогичным САновским), и в Вики (http://www.gtamodding.com/wiki/Memory_Addresses_(VC)), и на форуме SB и т.д.. Сам скриптинг в СА и ВС ничем принципиально не отличается, кроме набора опкодов.
Итак, поинтер - это адрес чего-то конкретного, например - той же структуры тачки.
Получить поинтер структуры авто можно опкодом:
0A97: $CarStruct = car $MyCar structИногда встречаются случаи, когда тебе известен лишь адрес поинтера, т.е. не сам поинтер, а адрес, в котором записан адрес поинтера. Например, в Вики (http://www.gtamodding.com/wiki/Memory_Addresses_(VC)) есть такой момент:
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
Название: Re: Чтение адресов памяти через пойнтер
Отправлено: ilufir от Август 25, 2016, 07:05:11 pm
Разбирая чужие скрипты в поисках указателя на дамми, нашел одну занятную вещь - это делается как раз через поинтер, но вот незадача - опять же нигде это не документировано толком. Имею только указатель 0x3E0 на дамми windscreen, а ищу exhaust.
Название: Re: Чтение адресов памяти через пойнтер
Отправлено: DK от Август 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. Вся документация - именно там.
Не понимаю людей, которые столько лет занимаются скриптингом, интересуются им, интересуются самой игрой, и боятся залезть куда-то "поглубже".
Название: Re: Чтение адресов памяти через пойнтер
Отправлено: Shagg_E от Август 25, 2016, 09:13:41 pm
Не понимаю людей, которые столько лет занимаются скриптингом, интересуются им, интересуются самой игрой, и боятся залезть куда-то "поглубже".
Эхх, если бы только скриптингом... Так хочется изучить всё и сразу - а из-за нехватки времени это получается делать лишь рывками) Чуток моделирования, немного анимирования, горстка скриптинга и щепотка программирования...так и живем ;D
Название: Re: Чтение адресов памяти через пойнтер
Отправлено: ilufir от Август 27, 2016, 12:19:25 pm
Вообще, учись работать с базой и исследовать код exe. Вся документация - именно там.
Не понимаю людей, которые столько лет занимаются скриптингом, интересуются им, интересуются самой игрой, и боятся залезть куда-то "поглубже".
Уже давно пытаюсь что-то понять, пока что не получилось получить никаких результатов по этому поводу
Название: Re: Чтение адресов памяти через пойнтер
Отправлено: Prographer от Август 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-базой как раз требует этого понимания, и ещё много чего. Здесь уже необходимы определённые знания в соответствующей сфере.
Название: Re: Чтение адресов памяти через пойнтер
Отправлено: ilufir от Август 29, 2016, 12:51:24 am
Вопрос остается открытым - надо конкретно "налечь" на моддинг Вайса, чтобы не отставать от SA.
Вообще обидно, что вайс так быстро забросили в плане моддинга, ибо даже такой нуб и лохчмо как я смог сделать вот такой вот мод
https://vk.com/video70744092_456239312
На СА таких небольших - тысячи
На вайс - единицы
Обидно
Название: Re: Чтение адресов памяти через пойнтер
Отправлено: Shagg_E от Август 29, 2016, 08:20:41 am
Вопрос остается открытым - надо конкретно "налечь" на моддинг Вайса, чтобы не отставать от SA.
Вообще обидно, что вайс так быстро забросили в плане моддинга, ибо даже такой нуб и лохчмо как я смог сделать вот такой вот мод
https://vk.com/video70744092_456239312
На СА таких небольших - тысячи
На вайс - единицы
Обидно
Мод клевый, но по-моему, звуки стуков нужно сделать потише, а то как-то странно: какой-то пердеж движка в десять раз громче, чем лобовое столкновение в стену на полной скорости :D
По поводу моддинга Вайса: лично меня устраивает текущая ситуация. SA популярна, поэтому всякий шлак тоннами создается для неё, на Вайсе же сидят люди, которые понимают, что он вполне может реализовать многие их потребности при бОльшем удобстве работы с игрой. Ты сам это доказал, запилив этот мод со стуками. И еще доказал, что годные идеи-таки добираются и до Вайса, пройдя проверку временем на SA.
Я недавно видел на либерти, как один чувак заявлял, что "движок SA кривой" из-за того, что этот чувак ничего кроме кривеньких DYOM миссий делать не умеет. Представляю, что такие как он думают о "движке VC".
Редко кому действительно удается раскрыть потенциал SA, а уж Вайс реально ковыряют лишь тут да на форумсах.
Нужно писать туториалы и делать качественные моды, чтобы прогнать стереотип об устаревании Вайса, как платформы для моддинга и привлекать мозги. Благодаря моддингу я получил некоторые знания, полезные на моей работе, и я знаю еще пару таких примеров среди модмейкеров. Моддинг позволяет тренировать мозг, поэтому это полезное дело, и нужно его развивать ;D
Название: Re: Чтение адресов памяти через пойнтер
Отправлено: ilufir от Август 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? Я качал последнюю версию, где написано, что они починены, но безрезультатно.
Название: Re: Чтение адресов памяти через пойнтер
Отправлено: kenking от Август 29, 2016, 02:33:48 pm
Цитировать
...я еще хотел чтобы из выхлопной трубы "выстреливал" черный-черный дым...Но по сравнению с СА надо копаться в памяти чтобы узнать X Y и Z даммисов типа exhaust.

http://gta.com.ua/file_details.phtml?id=2821 (http://gta.com.ua/file_details.phtml?id=2821)
Название: Re: Чтение адресов памяти через пойнтер
Отправлено: DK от Август 29, 2016, 07:13:37 pm
Скриптинг по своей сути вообще не подразумевает явную работу с памятью.
Дело в том, что создание качественных и чего-то стоящих модов в наше время (что для SA, что для VC) требует эту самую "работу с памятью".
а работа с idb-базой как раз требует этого понимания
Нет. Работа с базой - это как раз и процесс этого "понимания".
Работая с базой, ты учишься и понимаешь, как работает игра и её компоненты, в т.ч. и скриптинг.
Название: Re: Чтение адресов памяти через пойнтер
Отправлено: ilufir от Август 29, 2016, 07:18:04 pm
Цитировать
...я еще хотел чтобы из выхлопной трубы "выстреливал" черный-черный дым...Но по сравнению с СА надо копаться в памяти чтобы узнать X Y и Z даммисов типа exhaust.

[url]http://gta.com.ua/file_details.phtml?id=2821[/url] ([url]http://gta.com.ua/file_details.phtml?id=2821[/url])

Ты не будешь против если я использую часть твоего кода в своем скрипте?
Название: Re: Чтение адресов памяти через пойнтер
Отправлено: kenking от Август 29, 2016, 08:15:55 pm
Цитировать
Ты не будешь против если я использую часть твоего кода в своем скрипте?
Используй, конечно.
Название: Re: Чтение адресов памяти через пойнтер
Отправлено: ilufir от Август 31, 2016, 05:03:36 pm
Хм, появилась еще одна идея - вызывать покачивание автомобиля как при процессе "пополнения здоровья" с проституткой скриптовым способом
Название: Re: Чтение адресов памяти через пойнтер
Отправлено: Shagg_E от Август 31, 2016, 06:55:31 pm
Хм, появилась еще одна идея - вызывать покачивание автомобиля как при процессе "пополнения здоровья" с проституткой скриптовым способом

Когда-то одному челу нужно было то же самое для одного проекта - я сделал демонстрацию одного из вариантов, как это можно реализовать: тестовый скрипт тут (http://newrockstar.do.am/Other_Files/sexincar.rar). На X - однократный толчок тачки, на Z - пример полноценного "сношения". Но это не полноценное покачивание - нет скрипа подвески и вообще выглядит немного по-другому. Идея в простом физическом "поворотном толчке"(Roll) машины, а не полноценной работе с гидравликой.