#26 15-03-2011 20:43

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Работа с компонентами машины

Я думаю, применяя слово "родитель", нужно говорить об иерархии компонентов, а не о том, положение чего влияет на положение чего. И пушка и башня танка определены иерархически в одном уровне (каком и как - это лучше спросить у моделеров).

Нет, в иерархии данные компоненты подчинены друг другу. И там, кстати, 3 компонента: башня, пушка и нематериальный думмис на конце пушки:
8bd5e0454463t.jpg
П.С. В структуре компонента 0x69C (пушка танка) по смещению "child" (0x98) записано число, совпадающее с указателем на компонент 0x6A0 (думмис на конце пушки танка).

Денис, спасибо за доходчивое объяснение полезной информации.

Незачто. listener-у спасибо и Alien-у.

Если знаешь, то напиши пожалуйста ещё смещение wing (крылья модели авто).

Как они в иерархии называются? И на какой модели авто присутствуют?

Last edited by Den_spb (15-03-2011 21:07)

Offline

#27 15-03-2011 21:14

Alien
Registered: 12-10-2008
Posts: 564

Re: Работа с компонентами машины

Ладно, убедил.:D Меня смутило то, что в структуре авто они содержатся в одном массиве и определены в одном modelling space. Как оказалось, modelling space не определяет родителя компонента, а он общий для всей модели.

нематериальный думмис на конце пушки

Это место, в котором рисуется партикл огня после выстрела (или как скорее в данном случае это место, из которого бьет струя воды; если я еще не забыл, как играть в SA, эта моделька SWAT с водометом?)

Offline

#28 16-03-2011 01:17

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Работа с компонентами машины

определены в одном modelling space. Как оказалось, modelling space не определяет родителя компонента, а он общий для всей модели.

Чтобы окончательно разобраться с танками, написал простенький код, выводящий на экран modelling-матрицу для различных компонентов танка. Результаты: 1.Матрица компонента 0x6A0 (думмис на конце пушки) - всегда единичная, т.к. modelling space думмиса получается поступательным переносом modelling space пушки. 2.В матрице компонента 0x69C (пушка) вектор Right всегда равен {1;0;0} - т.к. пушка вращается только в вертикальной плоскости относительно своего родителя - башни. 3.В матрице компонента 0x698 (башня) вектор At всегда равен {0;0;1} - башня вращается только в горизонтальной плоскости относительно своего родителя.

эта моделька SWAT с водометом?

Да, она самая. За пушку и башню отвечают те же компоненты, что и у танка.

Offline

#29 16-03-2011 09:37

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Работа с компонентами машины

Alien wrote:

Наличие второй трубы - один из флагов в handling.cfg. Смотри код для создания эффектов нитры, адрес написан выше. Тип двигателя тоже прописан в handling.cfg.

То, что это прописано в handling.cfg мне известно. Непонятно только, как сделать проверку на наличие второй трубы?=(

Alien wrote:

Не надо ничего пересчитывать - они уже посчитатаны.

С этим разобрался.:D

Den_spb wrote:

Как они в иерархии называются? И на какой модели авто присутствуют?

wing_lf_dummy - левый передний,  wing_rf_dummy - правый передний (Вообще по аналогии там и для задних должно быть также. На стандарном транспорте я не нашёл, а на заменённых моделях, где есть эти компоненты на них опкоды не действуют.=()
Например, на ID=408 (wing_lf_dummy, wing_rf_dummy)

Offline

#30 16-03-2011 22:41

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Работа с компонентами машины

kenking wrote:

как сделать проверку на наличие второй трубы?=(

0A97: 1@ = car 0@ struct
1@ += 0x384
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
1@ += 0xCC
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
if
    08B7:   test 1@ bit 13
then
    // у авто 2 выхлопные трубы

UPD:

Например, на ID=408 (wing_lf_dummy, wing_rf_dummy)

wing_lf_dummy:

    0A97: 1@ = car 0@ struct 
    1@ += 0x668 // правая дверь авто
    0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
    if
        1@ <> 0
    then
        1@ += 0x9C // смещение в структуре компонента, по которому записан указатель на следующий компонент иерархии с таким же рангом
        0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
        if
            1@ <> 0
        then

wing_rf_dummy:

    0A97: 1@ = car 0@ struct 
    1@ += 0x668 // int
    0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
    if
        1@ <> 0
    then
        1@ += 0x9C
        0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
        if
            1@ <> 0
        then
            1@ += 0x9C
            0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
            if
                1@ <> 0
            then

Last edited by Den_spb (17-03-2011 01:03)

Offline

#31 17-03-2011 04:41

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Работа с компонентами машины

Денис, спасибо. good С этим всё понятно. А вот как прочитать какое-нибудь значение из handling.cfg, например, тот же тип двигателя (сейчас интересует именно это) я так и не пойму:blush:. Мозг уже закипает.
Напишите, пожалуйста кто-нибудь пример считывания значений из handling.cfg.=)

Offline

#32 17-03-2011 12:20

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Работа с компонентами машины

пример считывания значений из handling.cfg

Пример дан выше. Комментирую:

0A97: 1@ = car 0@ struct
1@ += 0x384
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 // получили указатель на handling-структуру для данного авто
1@ += 0xCC // прибавляем нужное смещение (см. http://gtamodding.ru/wiki/Адреса_Памяти_(SA) , раздел HAndling)
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 // Читаем значение. В случае, когда характеристика определяется битовым флагом, тестируем нужный бит.

Offline

#33 18-03-2011 15:09

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Работа с компонентами машины

Спасибо разобрался. После объяснения всё оказалось довольно просто. 

Den_spb wrote:

А вот вращение приведённым способом похоже работает не для всех компонентов (например, для колёс).

Не работает для колёс и перемещение по оси Z. А вот на счёт вращения колёс: в игре на моделях 444, 556, 557 при нажатии клавиши 'пробел' задние колёса поворачиваются. Значит это как-то можно реализовать. Ещё вопрос: как можно отсоединить/удалить какой-либо компонент от авто (про опкоды 0697: и 0689: я знаю - это немного не то, что надо). Ведь при взрыве авто компоненты разлетаются. В частности колёса.

Используя пояснения Дениса я провел некоторые эксперементы с компонентами транспорта. Получил интересные результаты. Оказывается в иерархии транспорта можно создавать 'свои' dummy (и соответственно компоненты авто) и потом манипулировать этими компонентами в скриптах способом описанным выше. Чтобы было понятнее о чём идёт речь я взял стандартную модель с ID=480, отсоединил оба сиденья в отдельные компоненты (названия ставлю отличные от стандартных). Потом скриптом я 'настраиваю' (передвигаю) сидения. Вот скрины с игры и иерархии авто.
d6c001625444t.jpg  b97a870640bbt.jpg
Установка: заменить в gta3.img файлы comet.dff и comet.txd (настройки авто стандартные).
Управление скриптом: находясь за рулём авто с ID=480 (comet)
1) для регулировки сидения пассажира - при нажатой клавише 3 (на основной части клавиатуры) нажимать + или - (на основной части клавиатуры);
2)  для регулировки сидения водителя - при нажатой клавише 1 (на основной части клавиатуры) нажимать + или - (на основной части клавиатуры); 
Игрок перемещается вместе с сиденьем. Есть один недостаток - если на пассажирском сидении есть пассажир, то он перемещается вместе с игроком (а не с сидением пассажира, как должно быть). Тут ни чего нельзя сделать. Без пассажира всё отлично.
В общем-то цель была продемонстрировать то, что скриптом можно управлять компонентами авто с названиями отличными от стандартных названий. Я пробывал добавлять таким образом 8 новых компонентов - все они поддаются управлению скриптом.
Что это даёт? Возможность реализовать все свои фантазии в создании моделей с передвигающимися/вращающимися даталями. Первое, что приходит сразу на ум: рабочие дворники на авто, открывающийся люк на крыше, настраиваемые зеркала заднего вида, настраиваемые сидения (пример готов), работающий автокран (давняя задумка) и другая спецтехника, открывающиеся присалонно-сдвижные двери на автобусах. И много чего другого. 
Пример расположения компонентов в иерархии на скрине.
Скачать скрипт и модель:
http://gta.com.ua/files/kenking/primer.rar

Last edited by kenking (18-03-2011 15:21)

Offline

#34 18-03-2011 15:27

3Doomer
From: КаZан
Registered: 14-05-2008
Posts: 659
Website

Re: Работа с компонентами машины

вращение задних колёс по пробелу - флаг STEER_REARWHEEL в handling.cfg

kenking wrote:

Есть один недостаток - если на пассажирском сидении есть пассажир, то он перемещается вместе с игроком (а не с сидением пассажира, как должно быть). Тут ни чего нельзя сделать.

ибо dummy указывает только на сидение водителя, а пассажирское ставится зеркально оси Y

Last edited by 3Doomer (18-03-2011 15:29)


GIMS developer

Offline

#35 19-03-2011 10:20

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Работа с компонентами машины

Den_spb wrote:

смещение в структуре компонента, по которому записан указатель на следующий компонент иерархии с таким же рангом

А какое смещение надо прибавлять для "подчинённого" компонента (т.е. вложенного в данный компонент)??? По аналогии башня танка --> дуло танка--> дамми на конце пушки или, например, у модели с ID=544 элементы лестницы.

Offline

#36 19-03-2011 15:52

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Работа с компонентами машины

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

Интересная новость. А ты не пробовал в данном примере через структуру транспорта получить доступ к стандартному компоненту, следующему за добавленными компонентами, т.е. bump_front_dummy? Является ли он по-прежнему доступным?

А какое смещение надо прибавлять для "подчинённого" компонента

По смещению 0x98 содержится указатель на первый из компонентов, подчинённых данному компоненту.

Offline

#37 20-03-2011 13:33

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Работа с компонентами машины

Den_spb wrote:

А ты не пробовал в данном примере через структуру транспорта получить доступ к стандартному компоненту, следующему за добавленными компонентами, т.е. bump_front_dummy? Является ли он по-прежнему доступным?

Да, следующие компоненты в иерархии доступны.
df8c9fd8a10dt.jpg


Den_spb wrote:

По смещению 0x98 содержится указатель на первый из компонентов, подчинённых данному компоненту.

Смещение 0x98 подходит, если обозначить компоненты, как misc_a, misc_b, misc_c. И то если распологать их в иерархии по методу стандартных. Мне надо было для другого. Хотел сделать открывающиеся стёкла на дверях авто. Но таким образом это не срабатывает. Пробывал так: отделил стекло в новый компонент (подчинённый двери) - не срабатывает. Другой вариант: обозначил стекло, как misc_a (также подчинённый двери) - не срабатывает.

Offline

#38 21-03-2011 11:42

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Работа с компонентами машины

На счёт смещения 0x98 я был не прав. Разобрал на примере модели с ID=574 (sweeper) возможность управления всеми компонентами (колёса не трогал) иерархии модели. Как было сказано выше обращаться к указателю на следующий компонент иерархии с таким же рангом надо по смещению 0x9C, а к указателю на 'вложенный' компонент иерархии по смещению 0x98. Для просмотра иерархии модели не обязательно открывать её в программах ZModeler2 или 3d MAX. Вполне подойдёт и GGMM. В рассмотренной модели есть компоненты miscа и miscb. Названия отличаются от стандартных misc_а и misc_b, поэтому обратиться к этим компонентам по известным смещениям 0x698 и 0x69С не получается. Поэтому пришлось брать предыдущий копонент и от него уже идти к этим компонентам. Кстати, кроме misc_а, misc_b и misc_c в моделях ещё используются misc_d и misc_е. Не получается пока манипулировать компонентами вложенными в 'подвижные' компоненты (двери, капот и багажник). В том числе и компонентами тюнинга. Например, спойлер распологается на багажнике и вот к нему (спойлеру) доступ получить не получается. По видимому для этого нужно другое смещение. В общем вопрос: какое нужно смещение??? Кроме этих вложенных компонентов можно получить доступ к любым компонентам иерархии модели. Расположение компонентов в иерархии для каждой модели индивидуально и следовательно добираться до компонентов надо по разному (кроме компонентов с известными смещениями).
e762eb4dc3f6t.jpg  b384d824a831t.jpg

{$CLEO}
model.Load(574)
repeat
    wait 0
until model.Available(574)
car.Create(0@ 574 -2026.9, 173.2, 27.8)
model.Destroy(574)     
0A97: 1@ = car 0@ struct 
1@ += 0x658 // начинаем с правого заднего колеса
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
  if
    1@ <> 0
  then
      1@ += 0x9C // смещение в структуре компонента, по которому записан указатель на следующий 
      // компонент иерархии с таким же рангом (в данном случае chassis_dummy)
      0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
      if
        1@ <> 0
      then
          1@ += 0x48 
          0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 
          2@ += 1.0
          0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0
          1@ -= 0x48
          //-----------------------------------------------------
          1@ += 0x98 // смещение в структуре компонента, по которому записан указатель на первый 
          // из компонентов, подчинённых данному компоненту (в данном случае chassis)            
          0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
          if
            1@ <> 0
          then
              1@ += 0x48 
              0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 
              2@ += 0.5
              0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0
              1@ -= 0x48
              //-----------------------------------------------------
              1@ += 0x9C // смещение в структуре компонента, по которому записан указатель на следующий 
              // компонент иерархии с таким же рангом (в данном случае exhaust_ok)
              0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
              if
                1@ <> 0
              then
                  1@ += 0x44 
                  0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 
                  2@ -= 1.0
                  0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0
                  //-----------------------------------------------------
                  0A97: 1@ = car 0@ struct 
                  1@ += 0x670 // продолжаем далее с известного нам смещения - 0x670 - левая передняя дверь авто
                  0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
                  if
                    1@ <> 0
                  then
                      1@ += 0x40 
                      0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 
                      2@ -= 0.5
                      0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0
                      //-----------------------------------------------------
                      // правую дверь и далее misca, misca пока пропустим (просто для дальнейшего цикла вращения
                      // этих компонентов)
                      //-----------------------------------------------------
                      0A97: 1@ = car 0@ struct 
                      1@ += 0x690 // продолжаем далее с известного нам смещения - 0x690 - windscreen_dummy 
                      //(ветровое стекло)
                      0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
                      if
                        1@ <> 0
                      then
                          1@ += 0x44 
                          0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 
                          2@ += 1.0
                          0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0
                          //-----------------------------------------------------
                          0A97: 1@ = car 0@ struct 
                          1@ += 0x678 // продолжаем далее с известного нам смещения - 0x678 - bump_front_dummy
                          0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
                          if
                            1@ <> 0
                          then
                              1@ += 0x44 
                              0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 
                              2@ += 1.0       
                              0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0
                              //-----------------------------------------------------
                              0A97: 1@ = car 0@ struct 
                              1@ += 0x67C // продолжаем далее с известного нам смещения - 0x67C - bump_rear_dummy
                              0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
                              if
                                1@ <> 0
                              then
                                  1@ += 0x44 
                                  0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 
                                  2@ -= 0.5       
                                  0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0
                                  //-----------------------------------------------------            
                                  0A97: 1@ = car 0@ struct 
                                  1@ += 0x668 // продолжаем далее с известного нам смещения - 0x668 - правая 
                                  // передняя дверь авто
                                  0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
                                  if
                                    1@ <> 0
                                  then
                                      1@ += 0x40 
                                      0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 
                                      2@ += 0.5
                                      0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0
                                      1@ -= 0x40
                                      //------------------------------------------------------
                                      1@ += 0x9C // смещение в структуре компонента, по которому записан 
                                      // указатель на следующий компонент иерархии с таким же рангом 
                                      //(в данном случае misca)
                                      0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
                                      if
                                        1@ <> 0
                                      then
                                          0085: 30@ = 1@ // (int)
                                          30@ += 0x40 
                                          0A8D: 2@ = read_memory 30@ size 4 virtual_protect 0 // сохраняем 
                                          // значения эл-тов +48, +52, +56 в памяти для misca
                                          2@ -= 1.0
                                          0A8C: write_memory 30@ size 4 value 2@ virtual_protect 0
                                          0A8D: 12@ = read_memory 30@ size 4 virtual_protect 0
                                          30@ += 4
                                          0A8D: 13@ = read_memory 30@ size 4 virtual_protect 0
                                          30@ += 4
                                          0A8D: 14@ = read_memory 30@ size 4 virtual_protect 0
                                          30@ -= 56
                                          //-----------------------------------------------------
                                          1@ += 0x9C // смещение в структуре компонента, по которому записан
                                          // указатель на следующий компонент иерархии с таким же рангом 
                                          //(в данном случае miscb)
                                          0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
                                          if
                                            1@ <> 0
                                          then
                                              1@ += 0x40 
                                              0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 // сохраняем
                                              // значения эл-тов +48, +52, +56 в памяти для miscb
                                              2@ += 1.0
                                              0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0
                                              0A8D: 22@ = read_memory 1@ size 4 virtual_protect 0
                                              1@ += 4
                                              0A8D: 23@ = read_memory 1@ size 4 virtual_protect 0
                                              1@ += 4
                                              0A8D: 24@ = read_memory 1@ size 4 virtual_protect 0
                                              1@ -= 56
                                              while 056E: 0@  // цикл для вращения для miscа и для miscb
                                              3@ += 0.5
                                              0AA6: call_method 0x59B120 struct 30@ num_params 3 pop 0 3@ 0.0 0.0 
                                              // rot Z rot Y rot X (radians) - метод поворота матрицы
                                              30@ += 48
                                              0A8C: write_memory 30@ size 4 value 12@ virtual_protect 0 
                                              // устанавливаем новое значение X-position
                                              30@ += 4
                                              0A8C: write_memory 30@ size 4 value 13@ virtual_protect 0
                                              // восстанавливаем старое значение Y-position      
                                              30@ += 4                                                       
                                              0A8C: write_memory 30@ size 4 value 14@ virtual_protect 0 
                                              // восстанавливаем старое значение Z-position         
                                              30@ -= 56 
                                              //-----------------------------------------------------
                                              4@ -= 0.5
                                              0AA6: call_method 0x59B120 struct 1@ num_params 3 pop 0 4@ 0.0 0.0 
                                              // rot Z rot Y rot X (radians) - метод поворота матрицы
                                              1@ += 48
                                              0A8C: write_memory 1@ size 4 value 22@ virtual_protect 0 
                                              // устанавливаем новое значение X-position
                                              1@ += 4
                                              0A8C: write_memory 1@ size 4 value 23@ virtual_protect 0 
                                              // восстанавливаем старое значение Y-position      
                                              1@ += 4                                                       
                                              0A8C: write_memory 1@ size 4 value 24@ virtual_protect 0 
                                              // восстанавливаем старое значение Z-position         
                                              1@ -= 56
                                              wait 0
                                              end 
                                          end    
                                      end    
                                  end        
                              end                              
                          end
                      end
                  end
              end
          end
      end
  end
0A93:

Кстати, щётки сделал вращающимися.

Last edited by kenking (21-03-2011 11:44)

Offline

#39 24-03-2011 11:22

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Работа с компонентами машины

0AA6: call_method $Destroy struct $CarStruct num_params 0 pop 0

Часть описания опкода из справки SB:

В данном примере мы вызываем метод уничтожения структуры $CarStruct (условно, если $Destroy содержит глобальный адрес такой процедуры в ЕХЕ).

Подскажите пожалуйста ответы на следующие вопросы:
1) Адрес такой процедуры?
2) Подойдёт ли этот метод для удаления компонентов, найденых способом описанным выше?
3) Как потом восстановить удалённый компонент?
4) Число передаваемых параметров?
5) Аналогично для повреждения / восстановления компонентов - адрес процедуры?

Заранее спасибо.

Offline

#40 24-03-2011 12:33

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Работа с компонентами машины

Оказывается в иерархии транспорта можно создавать 'свои' dummy (и соответственно компоненты авто)

В случае добавления собственных компонентов можно обойтись и без пустых объектов (думмисов), связывая детали "напрямую".

Названия отличаются от стандартных misc_а и misc_b, поэтому обратиться к этим компонентам по известным смещениям 0x698 и 0x69С не получается.

Если иерархия модели отличается от стандартной, то по некоторым смещениям структуры транспорта, соответствующим стандартным компонентам, могут быть записаны нули, несмотря на то, что данные объекты существуют.

2) Подойдёт ли этот метод для удаления компонентов, найденых способом описанным выше?

Метод, предназначенный для всей машины, навряд ли подойдёт для отдельного компонента. Чтобы узнать, как удаляются компоненты, можно посмотреть устройство стандартных опкодов удаления и восстановления компонентов в idb-базе от listener. Для того, чтобы отобразить код нужного опкода, надо при активной вкладке IDA View-A нажать G (переход на указанный адрес), и ввести @@opcode_XXXX (XXXX - номер опкода).
Если у тебя ещё нет базы, то скачать её можно отсюда: http://public.sannybuilder.com/gtasa_exe_idb/ (gta_sa_idb, чем позднее дата, тем новее версия базы). Смотреть базу можно с помощью программы IDA, версии не ниже 5.5, если не ошибаюсь (я лично пользуюсь базой 20091205 - её читает и IDA 5.2).
При наличии какого-то опыта, база сильно помогает при написании модов и изучении устройства игры: поиск адресов, исследование процедур и т.д.
Что касается структуры компонента (RwFrame), о которой шла речь ранее, то её состав (как и некоторых других структур) отображён на вкладке Structures. Чтобы отобразить данную структуру, надо при активной вкладке Structures нажать Search - Text , что искать - RwFrame.
П.С.Если будешь изучать IDA, и в процессе изучения появятся вопросы, то задавать их можно здесь http://sannybuilder.com/forums/viewtopic.php?id=941 .
Код gta_sa.exe, отображаемый в базе, представлен на языке ассемблера, краткое руководство по которому можно посмотреть здесь: http://sannybuilder.com/forums/viewtopic.php?id=41

Offline

#41 25-03-2011 09:05

}0RIC)-(
Registered: 21-11-2010
Posts: 30

Re: Работа с компонентами машины

kenking wrote:

Подойдёт ли этот метод для удаления компонентов, найденых способом описанным выше?

А зачем удалять? достаточно помоему перенести на 1000 метров ХД

Last edited by }0RIC)-( (25-03-2011 09:06)

Offline

#42 25-03-2011 13:20

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Работа с компонентами машины

Den_spb wrote:

В случае добавления собственных компонентов можно обойтись и без пустых объектов (думмисов), связывая детали "напрямую".

Да я это тоже потом понял.:D

Den_spb wrote:

Если иерархия модели отличается от стандартной, то по некоторым смещениям структуры транспорта, соответствующим стандартным компонентам, могут быть записаны нули, несмотря на то, что данные объекты существуют.

Если названия компонентов отличны от стандартных, то это будут уже не стандартные компоненты, а произвольные (как дополнительно добавленные) и соответственно находить их в иерархии надо добавляя нужное смещение от известного для стандартного компонента находящегося выше в иерархии модели. Это и было продемонстрировано в приведённом примере.=) 

Den_spb wrote:

Если будешь изучать IDA, и в процессе изучения появятся вопросы, то задавать их можно здесь

Хорошо бы кто-нибудь написал руководство для работы с базой в этой программе.=)

}0RIC)-( wrote:

А зачем удалять? достаточно помоему перенести на 1000 метров ХД

При переносе компонента будет видно его перемещение от модели.

Offline

#43 25-03-2011 18:02

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Работа с компонентами машины

Если названия компонентов отличны от стандартных, то это будут уже не стандартные компоненты, а произвольные (как дополнительно добавленные) и соответственно находить их в иерархии надо добавляя нужное смещение от известного для стандартного компонента находящегося выше в иерархии модели.

Я не имел ввиду переименование. smile
В моих экспериментах был случай, когда по смещению стандартного компонента записан ноль, хотя компонент существует (и должен существовать на данной модели) и название у него не изменено.

Offline

#44 25-03-2011 18:33

Alien
Registered: 12-10-2008
Posts: 564

Re: Работа с компонентами машины

Хорошо бы кто-нибудь написал руководство для работы с базой в этой программе.

Для начала - учи ассемблер x86. Без этого понять что-дибо в этой базе будет проблематично.
По работе с IDA читай официальный Help. Там содержится информация о системе команд и менюшек, есть справочник по IDC функциям (это внутренний скриптовый язык такой). Вся документация на английском, несмотря на то, что разработчики русские. А еще есть книженция под названием The Ida Pro Book (тоже на английском).

Last edited by Alien (25-03-2011 18:35)

Offline

#45 26-03-2011 15:51

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Работа с компонентами машины

Немного дополнения к изложенным выше данным.

Таблица №1

Смещение      Обозначение       Пояснение
           в иерархии модели   
0x64C      chassis              кузов (корпус авто)
0x650      wheel_rf_dummy       правое переднее колесо авто
0x654      wheel_rm_dummy       правое среднее колесо авто
0x658      wheel_rb_dummy       правое заднее колесо авто
0x65C	   wheel_lf_dummy	    левое переднее колесо авто
0x660	   wheel_lm_dummy	    левое среднее колесо авто
0x664	   wheel_lb_dummy	    левое заднее колесо авто
0x668	   door_rf_dummy	    правая передняя дверь авто
0x66C	   door_rr_dummy	    правая задняя дверь авто
0x670	   door_lf_dummy	    левая передняя дверь авто
0x674	   door_lr_dummy	    левая задняя дверь авто
0x678	   bump_front_dummy	    передний бампер
0x67C	   bump_rear_dummy	    задний бампер
0x680	   wing_rf_dummy	    правое переднее крыло авто
0x684	   wing_lf_dummy	    левое переднее крыло авто
0x688	   bonnet_dummy	        капот
0x68C	   boot_dummy	        багажник
0x690	   windscreen_dummy	    лобовое стекло
0x694	   exhaust_ok	        глушитель
0x698	   misc_a	            спецкомпонент
0x69C	   misc_b	            спецкомпонент
0x6A0	   misc_c	            спецкомпонент
0x6A4	   misc_d	            спецкомпонент
0x6A8	   misc_e	            спецкомпонент

Таблица №2

Смещение	Обозначение       Пояснение
         в иерархии модели	
+0	        headlights	      правая передняя фара
+12	        taillights	      правая задняя фара
+24	        headlights2	      правая передняя фара 2
+36	        taillights2	      правая задняя фара 2
+48	        ped_frontseat	  дамми передних сидений
+60	        ped_backseat	  дамми задних сидений
+72          exhaust	          источник выхлопных газов
+84	        engine	          источник дыма при снижении здоровья
+96	        petrolcap	      дамми бензобака
+108	     hookup	      место крепежа прицепа к авто (только на прицеп)
+120	    ped_arm–для авто
           (bargrip-для мото) дамми для стрельбы
+???	    ped_hoodseat	  дамми для актёра на капоте

Last edited by kenking (27-03-2011 06:30)

Offline

#46 26-03-2011 16:20

Airon
Registered: 05-11-2010
Posts: 42

Re: Работа с компонентами машины

Если у кого-нибудь руки возьмуться, то с этим можно изрядно улучшить скрипт трансфендера, сделав намного интереснее модификации машин

Offline

#47 27-03-2011 10:32

}0RIC)-(
Registered: 21-11-2010
Posts: 30

Re: Работа с компонентами машины

kenking wrote:

При переносе компонента будет видно его перемещение от модели.

кто такое придумал? я же сделал на кузове поворотники которые пропадают таким метадом, только переносил на 3000 вверх, моментально

Airon wrote:

Если у кого-нибудь руки возьмуться, то с этим можно изрядно улучшить скрипт трансфендера, сделав намного интереснее модификации машин

Приведи пример... Можно попробовать сделать как в Juiced 2 что бампер допустим убирается (переносится  вперед), заменяется на новый, и плавно на место возвращается, могу попробовать)

Offline

#48 27-03-2011 11:39

Airon
Registered: 05-11-2010
Posts: 42

Re: Работа с компонентами машины

хотя бы настроить спойлер например... колеса...

Offline

#49 27-03-2011 12:58

}0RIC)-(
Registered: 21-11-2010
Posts: 30

Re: Работа с компонентами машины

Airon wrote:

хотя бы настроить спойлер например... колеса...

Мне кажется или речь идет об "автоскульпте" из карбона, прострита итд?

Offline

#50 27-03-2011 12:59

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Работа с компонентами машины

}0RIC)-( wrote:

кто такое придумал? я же сделал на кузове поворотники которые пропадают таким метадом, только переносил на 3000 вверх, моментально

Мне надо удаление произвольного компонета, а не его перемещение. С перемещением и вращением уже всё понятно. 

}0RIC)-( wrote:

Можно попробовать сделать как в Juiced 2 что бампер допустим убирается (переносится  вперед), заменяется на новый, и плавно на место возвращается, могу попробовать)

С заменой бампера как раз всё просто:
1) Вычислил его координаты. 2) Удалил (читай ниже). 3) Загрузил в память модель другого бампера, создал объект(затем выгрузил модель бампера) и прицепил его  к авто с оффсетом по вычисленным ранее координатам. Это при условии, что у модели не предусмотрен тюнинг этого компонента. Если тюнинг предусмотрен, то тогда всё решается простой установкой этого компонента тюнинга (другого бампера).

Смещения для вело/мото
Таблица №3

Смещение_______Обозначение_____________Пояснение
___________в иерархии модели_______________________   
0x5A4______chassis_dummy_____________дамми шасси
0x5A8______forks_front_______________передняя вилка
0x5AC______forks_rear________________задняя вилка
0x5B0______wheel_front(+ mudguard)___переднее колесо + амортизатор(для мото)
0x5B4______wheel_rear________________колесо заднее

Это, наверно, все знают:

073С: car 0@ damage_component 0 {0,1,2,3,4,5}// повредить
0689: set_car 0@ remove_componentA 0 {0,1,2,3,4,5} visible_effect_flag 1 // отделить-flag 1, удалить-flag 0
068A: set_car 0@ repair_componentA 0 {0,1,2,3,4,5} // восстановить
0 - капот
1 - багажник
2 - левая передняя дверь
3 - правая передняя дверь
4 - левая задняя дверь
5 - правая задняя дверь

А вот это может кому-нибудь пригодится.
Можно проверить для этих компонентов их состояние:

0A97: 1@ = car 0@ struct
1@ += 0x5A0
0AA8: call_function_method 0x6C2230 struct 1@ num_params 1 pop 0 0{0,1,2,3,4,5} 2@  

Значение 2@ 
0 - компонент целый 
2 - компонент повреждён 
4 - компонент отсутствует

А также:

0730: car 0@ damage_component 0 {0,1,4,5,6}// повредить
0697: set_car 0@ remove_componentB 0 {0,1,4,5,6} visible_effect_flag 0 // отделить-flag 1, удалить-flag 0
0698: set_car 0@ repair_componentB 0 {0,1,4,5,6} // восстановить
0 - левое переднее крыло авто
1 - правое переднее крыло авто
4 - лобовое стекло
5 - передний бампер
6 - задний бампер

Вопрос: какой адрес нужен для проверки состояния этих компонентов?

Offline

Board footer

Powered by FluxBB