GTA Vice City > Скриптинг

Чтение адресов памяти через пойнтер

(1/4) > >>

ilufir:
Вопрос таков:
Я решил считать уровень здоровья автомобиля и столкнулся с такой проблемой - у автомобиля есть поинтер, к которому уже как-то надо применять адрес. Я не  смог разобраться, как надо его использовать и как правильно считывать адреса памяти. В основном все туторы на СА, где несколько расширенный и измененный скриптинг.
Так вот, как это делается и есть ли где-нибудь толковый учебник скриптинга под Вайс? Не хочу тут создавать тему за темой по каждому возникшему вопросу.

Shagg_E:
Это не совсем скриптинг: это навыки работы с игровой памятью, инфы по которой достаточно и на этом сайте, и в справке 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
--- Конец кода ---

ilufir:
Разбирая чужие скрипты в поисках указателя на дамми, нашел одну занятную вещь - это делается как раз через поинтер, но вот незадача - опять же нигде это не документировано толком. Имею только указатель 0x3E0 на дамми windscreen, а ищу exhaust.

DK:
А зачем это докумментировать? Есть база по вайсу.
В структуре транспорта (CAutomobile, CHeli и т.д.) сохраняется массив указателей на "базовые" компоненты - колёса, двери, и т.п. Для CAutomobile этот массив начинается с оффсета 0x394.
Для каждого вида транспорта этот массив может различаться - как его размер, так и типы компонентов. В игре есть таблицы (для каждого типа транспорта), по которым можно определить формат этого массива.
Для CAutomobile сохраняются такие компоненты:

--- Код: C++ ---enum eCarNodes_VC {    CAR_NODE_NONE = 0, // в начале массива - пустой указатель    CAR_WHEEL_RF = 1,    CAR_WHEEL_RM = 2,    CAR_WHEEL_RB = 3,    CAR_WHEEL_LF = 4,    CAR_WHEEL_LM = 5,    CAR_WHEEL_LB = 6,    CAR_BUMP_FRONT = 7,    CAR_BUMP_REAR = 8,    CAR_WING_RF = 9,    CAR_WING_RR = 10,    CAR_DOOR_RF = 11,    CAR_DOOR_RR = 12,    CAR_WING_LF = 13,    CAR_WING_LR = 14,    CAR_DOOR_LF = 15,    CAR_DOOR_LR = 16,    CAR_BONNET = 17,    CAR_BOOT = 18,    CAR_WINDSCREEN = 19};Фреймы, которые в игре используются только для определения позиции (эффекта, света и пр.), в этот массив не сохраняются. Они удаляются из иерархии модели (клампа), а позиция (3d-координаты) записывается в структуре CVehicleModelInfo.

Вообще, учись работать с базой и исследовать код exe. Вся документация - именно там.
Не понимаю людей, которые столько лет занимаются скриптингом, интересуются им, интересуются самой игрой, и боятся залезть куда-то "поглубже".

Shagg_E:

--- Цитата: DK от Август 25, 2016, 08:42:13 pm ---Не понимаю людей, которые столько лет занимаются скриптингом, интересуются им, интересуются самой игрой, и боятся залезть куда-то "поглубже".

--- Конец цитаты ---
Эхх, если бы только скриптингом... Так хочется изучить всё и сразу - а из-за нехватки времени это получается делать лишь рывками) Чуток моделирования, немного анимирования, горстка скриптинга и щепотка программирования...так и живем ;D

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии