Суббота, 20.04.2024, 07:27
Качественные скрипты, моды и дополнения для GTA без регистрации
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 6 из 8
  • «
  • 1
  • 2
  • 4
  • 5
  • 6
  • 7
  • 8
  • »
Форум » Игры серии ГТА » Скриптинг » Вопросы скриптинга, связанные с транспортом
Вопросы скриптинга, связанные с транспортом
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
 
Форум » Игры серии ГТА » Скриптинг » Вопросы скриптинга, связанные с транспортом
  • Страница 6 из 8
  • «
  • 1
  • 2
  • 4
  • 5
  • 6
  • 7
  • 8
  • »
Поиск: