You are not logged in.
Я думаю, применяя слово "родитель", нужно говорить об иерархии компонентов, а не о том, положение чего влияет на положение чего. И пушка и башня танка определены иерархически в одном уровне (каком и как - это лучше спросить у моделеров).
Нет, в иерархии данные компоненты подчинены друг другу. И там, кстати, 3 компонента: башня, пушка и нематериальный думмис на конце пушки:
П.С. В структуре компонента 0x69C (пушка танка) по смещению "child" (0x98) записано число, совпадающее с указателем на компонент 0x6A0 (думмис на конце пушки танка).
Денис, спасибо за доходчивое объяснение полезной информации.
Незачто. listener-у спасибо и Alien-у.
Если знаешь, то напиши пожалуйста ещё смещение wing (крылья модели авто).
Как они в иерархии называются? И на какой модели авто присутствуют?
Last edited by Den_spb (15-03-2011 21:07)
Offline
Ладно, убедил.:D Меня смутило то, что в структуре авто они содержатся в одном массиве и определены в одном modelling space. Как оказалось, modelling space не определяет родителя компонента, а он общий для всей модели.
нематериальный думмис на конце пушки
Это место, в котором рисуется партикл огня после выстрела (или как скорее в данном случае это место, из которого бьет струя воды; если я еще не забыл, как играть в SA, эта моделька SWAT с водометом?)
Offline
определены в одном 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
Наличие второй трубы - один из флагов в handling.cfg. Смотри код для создания эффектов нитры, адрес написан выше. Тип двигателя тоже прописан в handling.cfg.
То, что это прописано в handling.cfg мне известно. Непонятно только, как сделать проверку на наличие второй трубы?=(
Не надо ничего пересчитывать - они уже посчитатаны.
С этим разобрался.:D
Как они в иерархии называются? И на какой модели авто присутствуют?
wing_lf_dummy - левый передний, wing_rf_dummy - правый передний (Вообще по аналогии там и для задних должно быть также. На стандарном транспорте я не нашёл, а на заменённых моделях, где есть эти компоненты на них опкоды не действуют.=()
Например, на ID=408 (wing_lf_dummy, wing_rf_dummy)
Offline
как сделать проверку на наличие второй трубы?=(
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
Денис, спасибо. С этим всё понятно. А вот как прочитать какое-нибудь значение из handling.cfg, например, тот же тип двигателя (сейчас интересует именно это) я так и не пойму:blush:. Мозг уже закипает.
Напишите, пожалуйста кто-нибудь пример считывания значений из handling.cfg.=)
Offline
пример считывания значений из 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
Спасибо разобрался. После объяснения всё оказалось довольно просто.
А вот вращение приведённым способом похоже работает не для всех компонентов (например, для колёс).
Не работает для колёс и перемещение по оси Z. А вот на счёт вращения колёс: в игре на моделях 444, 556, 557 при нажатии клавиши 'пробел' задние колёса поворачиваются. Значит это как-то можно реализовать. Ещё вопрос: как можно отсоединить/удалить какой-либо компонент от авто (про опкоды 0697: и 0689: я знаю - это немного не то, что надо). Ведь при взрыве авто компоненты разлетаются. В частности колёса.
Используя пояснения Дениса я провел некоторые эксперементы с компонентами транспорта. Получил интересные результаты. Оказывается в иерархии транспорта можно создавать 'свои' dummy (и соответственно компоненты авто) и потом манипулировать этими компонентами в скриптах способом описанным выше. Чтобы было понятнее о чём идёт речь я взял стандартную модель с ID=480, отсоединил оба сиденья в отдельные компоненты (названия ставлю отличные от стандартных). Потом скриптом я 'настраиваю' (передвигаю) сидения. Вот скрины с игры и иерархии авто.
Установка: заменить в 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
вращение задних колёс по пробелу - флаг STEER_REARWHEEL в handling.cfg
Есть один недостаток - если на пассажирском сидении есть пассажир, то он перемещается вместе с игроком (а не с сидением пассажира, как должно быть). Тут ни чего нельзя сделать.
ибо dummy указывает только на сидение водителя, а пассажирское ставится зеркально оси Y
Last edited by 3Doomer (18-03-2011 15:29)
GIMS developer
Offline
смещение в структуре компонента, по которому записан указатель на следующий компонент иерархии с таким же рангом
А какое смещение надо прибавлять для "подчинённого" компонента (т.е. вложенного в данный компонент)??? По аналогии башня танка --> дуло танка--> дамми на конце пушки или, например, у модели с ID=544 элементы лестницы.
Offline
В общем-то цель была продемонстрировать то, что скриптом можно управлять компонентами авто с названиями отличными от стандартных названий.
Интересная новость. А ты не пробовал в данном примере через структуру транспорта получить доступ к стандартному компоненту, следующему за добавленными компонентами, т.е. bump_front_dummy? Является ли он по-прежнему доступным?
А какое смещение надо прибавлять для "подчинённого" компонента
По смещению 0x98 содержится указатель на первый из компонентов, подчинённых данному компоненту.
Offline
А ты не пробовал в данном примере через структуру транспорта получить доступ к стандартному компоненту, следующему за добавленными компонентами, т.е. bump_front_dummy? Является ли он по-прежнему доступным?
Да, следующие компоненты в иерархии доступны.
По смещению 0x98 содержится указатель на первый из компонентов, подчинённых данному компоненту.
Смещение 0x98 подходит, если обозначить компоненты, как misc_a, misc_b, misc_c. И то если распологать их в иерархии по методу стандартных. Мне надо было для другого. Хотел сделать открывающиеся стёкла на дверях авто. Но таким образом это не срабатывает. Пробывал так: отделил стекло в новый компонент (подчинённый двери) - не срабатывает. Другой вариант: обозначил стекло, как misc_a (также подчинённый двери) - не срабатывает.
Offline
На счёт смещения 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_е. Не получается пока манипулировать компонентами вложенными в 'подвижные' компоненты (двери, капот и багажник). В том числе и компонентами тюнинга. Например, спойлер распологается на багажнике и вот к нему (спойлеру) доступ получить не получается. По видимому для этого нужно другое смещение. В общем вопрос: какое нужно смещение??? Кроме этих вложенных компонентов можно получить доступ к любым компонентам иерархии модели. Расположение компонентов в иерархии для каждой модели индивидуально и следовательно добираться до компонентов надо по разному (кроме компонентов с известными смещениями).
{$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
0AA6: call_method $Destroy struct $CarStruct num_params 0 pop 0
Часть описания опкода из справки SB:
В данном примере мы вызываем метод уничтожения структуры $CarStruct (условно, если $Destroy содержит глобальный адрес такой процедуры в ЕХЕ).
Подскажите пожалуйста ответы на следующие вопросы:
1) Адрес такой процедуры?
2) Подойдёт ли этот метод для удаления компонентов, найденых способом описанным выше?
3) Как потом восстановить удалённый компонент?
4) Число передаваемых параметров?
5) Аналогично для повреждения / восстановления компонентов - адрес процедуры?
Заранее спасибо.
Offline
Оказывается в иерархии транспорта можно создавать 'свои' 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
Подойдёт ли этот метод для удаления компонентов, найденых способом описанным выше?
А зачем удалять? достаточно помоему перенести на 1000 метров ХД
Last edited by }0RIC)-( (25-03-2011 09:06)
Offline
В случае добавления собственных компонентов можно обойтись и без пустых объектов (думмисов), связывая детали "напрямую".
Да я это тоже потом понял.:D
Если иерархия модели отличается от стандартной, то по некоторым смещениям структуры транспорта, соответствующим стандартным компонентам, могут быть записаны нули, несмотря на то, что данные объекты существуют.
Если названия компонентов отличны от стандартных, то это будут уже не стандартные компоненты, а произвольные (как дополнительно добавленные) и соответственно находить их в иерархии надо добавляя нужное смещение от известного для стандартного компонента находящегося выше в иерархии модели. Это и было продемонстрировано в приведённом примере.=)
Если будешь изучать IDA, и в процессе изучения появятся вопросы, то задавать их можно здесь
Хорошо бы кто-нибудь написал руководство для работы с базой в этой программе.=)
А зачем удалять? достаточно помоему перенести на 1000 метров ХД
При переносе компонента будет видно его перемещение от модели.
Offline
Если названия компонентов отличны от стандартных, то это будут уже не стандартные компоненты, а произвольные (как дополнительно добавленные) и соответственно находить их в иерархии надо добавляя нужное смещение от известного для стандартного компонента находящегося выше в иерархии модели.
Я не имел ввиду переименование.
В моих экспериментах был случай, когда по смещению стандартного компонента записан ноль, хотя компонент существует (и должен существовать на данной модели) и название у него не изменено.
Offline
Хорошо бы кто-нибудь написал руководство для работы с базой в этой программе.
Для начала - учи ассемблер x86. Без этого понять что-дибо в этой базе будет проблематично.
По работе с IDA читай официальный Help. Там содержится информация о системе команд и менюшек, есть справочник по IDC функциям (это внутренний скриптовый язык такой). Вся документация на английском, несмотря на то, что разработчики русские. А еще есть книженция под названием The Ida Pro Book (тоже на английском).
Last edited by Alien (25-03-2011 18:35)
Offline
Немного дополнения к изложенным выше данным.
Таблица №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
Если у кого-нибудь руки возьмуться, то с этим можно изрядно улучшить скрипт трансфендера, сделав намного интереснее модификации машин
Offline
При переносе компонента будет видно его перемещение от модели.
кто такое придумал? я же сделал на кузове поворотники которые пропадают таким метадом, только переносил на 3000 вверх, моментально
Если у кого-нибудь руки возьмуться, то с этим можно изрядно улучшить скрипт трансфендера, сделав намного интереснее модификации машин
Приведи пример... Можно попробовать сделать как в Juiced 2 что бампер допустим убирается (переносится вперед), заменяется на новый, и плавно на место возвращается, могу попробовать)
Offline
хотя бы настроить спойлер например... колеса...
Offline
хотя бы настроить спойлер например... колеса...
Мне кажется или речь идет об "автоскульпте" из карбона, прострита итд?
Offline
кто такое придумал? я же сделал на кузове поворотники которые пропадают таким метадом, только переносил на 3000 вверх, моментально
Мне надо удаление произвольного компонета, а не его перемещение. С перемещением и вращением уже всё понятно.
Можно попробовать сделать как в 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