Вопросы скриптинга, связанные с транспортом
|
|
DK22Pac | Дата: Вторник, 03.07.2012, 20:17 | Сообщение # 76 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Да, надо изменять в блоке const...end
|
|
| |
liaz6212 | Дата: Воскресенье, 08.07.2012, 16:01 | Сообщение # 77 |
Группа: Пользователи
Сообщений: 3
Статус: Offline
| А возможно двигать мигалку на легковых автомобилях полиции раздельно? К примеру, волга 3110 дпс в этом нуждается, а большинство жигулей - нет...
Сообщение отредактировал liaz6212 - Воскресенье, 08.07.2012, 16:01 |
|
| |
Den_spb | Дата: Воскресенье, 08.07.2012, 16:35 | Сообщение # 78 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Теоретически возможно, но это сложнее - надо делать скрипт, правящий код exe.
|
|
| |
liaz6212 | Дата: Воскресенье, 08.07.2012, 16:48 | Сообщение # 79 |
Группа: Пользователи
Сообщений: 3
Статус: Offline
| А реально смещать посадку с одной стороны: например, автобусы ПАЗ и ЛиАЗ 677, запрещать ее (было бы уместно там, где нет водительской двери)?
|
|
| |
Den_spb | Дата: Воскресенье, 08.07.2012, 17:04 | Сообщение # 80 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Лично я не исследовал данный вопрос, поэтому конкретно ничего сказать не могу.
|
|
| |
liaz6212 | Дата: Воскресенье, 08.07.2012, 19:57 | Сообщение # 81 |
Группа: Пользователи
Сообщений: 3
Статус: Offline
| Спасибо за ответы. Такой вопрос: как текстовые коды (мигалки) перевести в рабочий вид?
|
|
| |
Den_spb | Дата: Воскресенье, 08.07.2012, 22:17 | Сообщение # 82 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Пример: зададим оффсеты мигалки FBI Ranch, равные x = 0.0, y = 1.0, z = 1.5
{$CLEO} // команда, обозначающая начало клео-скрипта (ставится в начале любого клео-скрипта) 0A8C: write_memory 0x6ABBCD size 4 value 0.0 virtual_protect 1 0A8C: write_memory 0x6ABBD5 size 4 value 1.0 virtual_protect 1 0A8C: write_memory 0x6ABBDD size 4 value 1.5 virtual_protect 1 0A93: // команда, обозначающая конец клео-скрипта
Здесь: 0x6ABBCD - адрес памяти 4 - размер записи (так как записываем дробное число, то ставим 4, т.к. размер дробного числа всегда равен 4 байтам) 0.0 - значение (в данном случае величина оффсета в метрах, дробное число)
Как скомпилировать скрипт (сделать cs-файл): 1.Жмём в SB Файл-Создать 2.Набираем в окне код скрипта (или копируем готовый) 3.Жмём Запуск-Компилировать, в качестве пути указываем папку cleo, имя файла задаём любое. В результате создаются 2 файла: cs (готовый скрипт) и txt (так называемый исходник, содержит код в том виде, в каком он отображался в окне программы). Если при компиляции готовый скрипт и (или) исходник с таким именем уже существуют, то они будут перезаписаны. В дальнейшем можно открыть исходник для редактирования командой Файл-Открыть, сохранить изменения (без компиляции) - Файл-Сохранить.
|
|
| |
ILYALION | Дата: Понедельник, 30.07.2012, 17:32 | Сообщение # 83 |
Группа: Проверенные
Сообщений: 325
Статус: Offline
| А изестен ли адрес памяти, в котором прописаны оффсеты точки от комбайна, из которой вываливаются внутренности людей? А то я комбайн заменил, а внутренности вываливается не из трубы, а из другого места. Дамми там нет, откуда вывод - оффсеты прописаны в exe. Quote (liaz6212) А реально смещать посадку с одной стороны: например, автобусы ПАЗ и ЛиАЗ 677, запрещать ее (было бы уместно там, где нет водительской двери)? Присоединяюсь к вопросу. В стандартной игре такая посадка реализована у dumper (id 406), однако, я заменил модель, и посадка пропала. Тут дело в модели.Добавлено (30.07.2012, 17:32) --------------------------------------------- Всё, разобрался. За это отвечает флаг модели FORCE_DOOR_CHECK, прописанный handling.cfg. При его снятии со стандартного dumper, можно садиться с другой стороны. Однако, установка этого флага на другие модели ничего не даёт. Странно...
|
|
| |
Den_spb | Дата: Вторник, 31.07.2012, 01:45 | Сообщение # 84 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Как искать адреса, относящиеся только к определённым моделям транспорта Кровь и внутренности создаются только в том случае, если пед был переехан транспортным средством с моделью 532 (COMBINE). Это даёт основания предположить, что где-то в exe есть проверка - если ИД модели транспорта равен 532, то запускаются функции создания крови и внутренностей.
Попробуем осуществить поиск данных проверок по базе gta_sa.exe. Открываем базу, далее идём на вкладку Functions (список всех функций и методов exe). Щёлкаем по первой функции в списке - её код открывается в основном окне IDA View-A (первую функцию открываем для того, чтобы поиск запустился с начала кода exe). Далее запускаем поиск командой Search - Text. В базе числа обычно отображаются в шестнадцатиричном виде, поэтому искать будем не 532, а 214h (h - приставка, обозначающая то, что число шестнадцатиричное. Напомню, что в скриптинге для этой же цели используется приставка 0x. Перевести число из десятичного в шестнадцатиричное и обратно можно с помощью стандартного Windows-калькулятора).
В найденных совпадениях ищем конструкции подобного вида: Code cmp word ptr [esi+22h], 214h Здесь: cmp - операция сравнения; esi - регистр, в котором обычно записан адрес структуры объекта, транспорта, или педа (также для этой цели часто используется ecx) 22h - смещение в структуре объекта, транспорта и педа, по которому записан ИД номер модели; 214h - ИД-номер модели комбайна (532). Т.е. данная команда сравнивает, равен ли ИД номер модели транспорта 532 (внешний вид команды может отличаться, но смысл должен быть тот же). Переход к следующему совпадению осуществляется с помощью комбинации Ctrl+T. Поиск продолжаем до тех пор, пока не пройдём всю кодовую часть exe (это адреса типа "text" - в "спектре", расположенном под панелью инструментов они обозначены синим и голубым цветом. Вторая часть exe используется для хранения различных данных - чисел, строк и т.п. Это адреса типа "data", в "спектре" им соответствуют серый и серо-зелёный цвет).
Просматривая совпадения по заданной комбинации, находим среди прочих и такой кусок кода:Code .text:006B36C5 0E8 cmp word ptr [esi+22h], 214h ; Compare Two Operands .text:006B36CB 0E8 jnz short loc_6B36D4 ; Jump if Not Zero (ZF=0) .text:006B36CD 0E8 mov ecx, esi .text:006B36CF 0E8 call sub_6A9680 ; Call Procedure Суть кода в том, что если транспортное средство является комбайном, то вызывается функция sub_6A9680. Просмотрим эту функцию - для этого щёлкаем по sub_6A9680, в результате код функции отображается в окне IDA View-A. Просмотрим список функций, из которых вызывается функция sub_6A9680. Для этого используем команду View - Open Subviews - Function Calls. В результате открывается окно, состоящее из двух частей: Caller - функции, вызывающие данную функцию, Called Functions - функции, вызываемые из данной функции. В окне Caller присутствует только одна функция, что свидетельствует о том, что sub_6A9680 во всём exe используется только один раз. Появился шанс, что мы нашли то, что нужно.
Внимательно просматриваем код функции sub_6A9680, находим такой кусок:Code .text:006A99E5 074 mov [esp+74h+point.x], 0BF99999Ah .text:006A99ED 074 mov [esp+74h+point.y], 0C0733333h .text:006A99F5 074 mov [esp+74h+point.z], 3FC00000h Данные команды записывают какие-то координаты. О том, что это координаты свидетельствуют признаки: 1) восьмизначные шестнадцатиричные числа (0BF99999Ah, 0C0733333h, 3FC00000h) - это, как правило, дробные числа 2)названия - point.x, point.y, point.z. 3) количество чисел - 3 (координат всегда 3).
Проверяем свою находку - для этого с помощью скрипта заменим дробные значения на свои. Адрес получаем следующим образом: сначала переходим на вкладку отображения кода exe в шестнадцатиричном виде Hex View-A. КомандаCode .text:006A99E5 074 mov [esp+74h+point.x], 0BF99999Ah в шестнадцатиричном виде выглядит такCode C7 44 24 34 9A 99 99 BF Здесь 9A 99 99 BF - это записываемое дробное значение 0BF99999Ah (в коде exe байты каждого числа записываются в обратном порядке). Щёлкаем по первому байту числа (9A) - внизу окна программы отображается его адрес - 0x6A99E9. Для замены значения координаты, мы должны произвести запись нового значения по данному адресу. Размер записи составит 4 байта (т.к. число дробное). Адреса типа text имеют защиту от чтения и записи, для снятия защиты в опкодах 0A8C/0A8D используется значение флага virtual_protect, равное 1.
Code {$CLEO} 0A8C: write_memory 0x6A99E9 size 4 value -5.0 virtual_protect 1 // X 0A8C: write_memory 0x6A99F1 size 4 value 10.0 virtual_protect 1 // Y 0A8C: write_memory 0x6A99F9 size 4 value 0.0 virtual_protect 1 // Z 0A93: Теперь внутренности и кровь должны создаваться слева и спереди от комбайна. Проверяем скрипт в игре - адреса найдены верно.
|
|
| |
ILYALION | Дата: Вторник, 31.07.2012, 17:50 | Сообщение # 85 |
Группа: Проверенные
Сообщений: 325
Статус: Offline
| Den_spb, спасибо за эту очень полезную статью. Добавлено (31.07.2012, 17:50) --------------------------------------------- Den_spb, я искал 214h,ничего не нашёл. Тогда я нашёл функцию sub_6A9680, посмотрел код, который её вызывает, вот он: Code 0E8 cmp [esi+CAutomobile.__parent.__parent.__parent.m_wModelIndex], 532 0E8 jnz short loc_6B36D4 0E8 mov ecx, esi 0E8 call sub_6A9680 ; process 'combine' Видно, что то же, что и у Вас, но шестнадцатеричное число переедено в десятичное. Поэтому я сначала ничего и не нашёл. Почему же оно переведено десятичное?
Сообщение отредактировал ILYALION - Вторник, 31.07.2012, 09:03 |
|
| |
Den_spb | Дата: Вторник, 31.07.2012, 18:51 | Сообщение # 86 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Quote (ILYALION) Видно, что то же, что и у Вас, но шестнадцатеричное число переедено в десятичное. Поэтому я сначала ничего и не нашёл. Почему же оно переведено десятичное? Видимо потому, что у нас разные версии баз (у меня - gta_sa_idb_20091205).
|
|
| |
ILYALION | Дата: Вторник, 31.07.2012, 20:19 | Сообщение # 87 |
Группа: Проверенные
Сообщений: 325
Статус: Offline
| Quote (Den_spb) В найденных совпадениях ищем конструкции подобного вида: Code cmp word ptr [esi+22h], 214h Можно ли утверждать, что, если я буду искать не "214h", а ", 214h", то найду то, что мне нужно (естественно я буду искать не комбайн, а что-то другое)?
|
|
| |
Den_spb | Дата: Вторник, 31.07.2012, 20:40 | Сообщение # 88 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Да, такой запрос наверное получше будет. Часто приходится пробовать несколько вариантов запросов - с шестнадцатиричными и десятичными числами, и т.д.
|
|
| |
ILYALION | Дата: Вторник, 31.07.2012, 22:41 | Сообщение # 89 |
Группа: Проверенные
Сообщений: 325
Статус: Offline
| Я попытался изменить координаты того места, из которого летят пули на hunter. Искал ", 1A9h" и ", 425", но ничего не нашёл.
Добавлено (31.07.2012, 22:41) --------------------------------------------- Только что осуществил поиск по словам "1A9h" и "425 ". Безрезультатно.
Сообщение отредактировал ILYALION - Вторник, 31.07.2012, 22:41 |
|
| |
DK22Pac | Дата: Среда, 01.08.2012, 03:03 | Сообщение # 90 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| 0x8D35D4 Тут начинается массив офсетов пушек для транспорта. Первые три числа в этом массиве - координаты xyz для модели hunter.
Сообщение отредактировал DK22Pac - Среда, 01.08.2012, 03:26 |
|
| |