You are not logged in.
Я сеййчас не вспомню точно адресов, но общий принцип такой: Есть класс CVehicleModelInfo (у меня в базе он может называться CModelCars). В памяти есть массив этих объектов. Каждый объект в массиве отвечает за все машины одной модели и в нем должны быть координаты всех компонентов. Их и нужно редактировать.
Как к этому доступаться - было на первой странице этой темы.
Offline
Есть класс CVehicleModelInfo (у меня в базе он может называться CModelCars)
это база для "IDA"? (сори, я вообще тут чайниГ)
в идиале хотелосьбы подробно и с примером, но и на этом спасибо, будем искать
Offline
Смотри внимательно эту тему - тут всё есть. Смещения, общие для всех машин одной модели: http://sannybuilder.com/forums/viewtopi … 815#p14815 , таблица 2. Работа с этими смещениями - стр. 1.
Last edited by Den_spb (28-06-2011 20:10)
Offline
другой вопрос: можно ли узнать количество 3д деталей машины (общее) ?
Offline
другой вопрос: можно ли узнать количество 3д деталей машины (общее) ?
Думаю из сообщения listener, можно сделать вывод, что да
Offline
Были названы смещения от компонента, указывающие на следующий компонент в иерархии, и дочерний
Нашел еще одно интересное смещение - "на родителя" компонента, +4 от детали (может и не пригодится вовсе)
Примеры (модель машины manana):
Пример 1.
{$CLEO} thread '_test1_' :1 wait 0 0A8D: 1@ = read_memory 0xBA18FC size 4 virtual_protect 0 //заменил сразу несколько проверок, это указатель на машину игрока. //если он есть, то игрок существует, и он в авто, //причем 1@ это сразу структура if 1@ <> 0 //указатель есть jf @1 1@ += 0x650 //wheel_rf_dummy (смотрите скрин иерархии ниже) его "родитель" это //главный думми, под названием manana 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 1@ += 4 //смещение на родителя 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 1@ += 172 //смещение на название компонента 0ACD: show_text_highpriority 1@ time 100 //отображаем на экране jump @1
Пример 2.
{$CLEO} thread '_test2_' :1 wait 0 0A8D: 1@ = read_memory 0xBA18FC size 4 virtual_protect 0 //заменил сразу несколько проверок, это указатель на машину игрока. //если он есть, то игрок существует, и он в авто, //причем 1@ это сразу структура if 1@ <> 0 //указатель есть jf @1 1@ += 0x688 //bonnet_dummy (смотрите скрин иерархии ниже) его "родитель" это //думми, под названием chassis_dummy 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 1@ += 4 //смещение на родителя 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 1@ += 172 //смещение на название компонента 0ACD: show_text_highpriority 1@ time 100 //отображаем на экране jump @1
Offline
Offline
Данные для самолётов:
Таблица №4
Смещение____Обозначение_________Пояснение __________в иерархии модели______________________ 0x678____static_prop___________статический пропеллер 0x67C____moving_prop_________вращающийся пропеллер 0x680____static_prop2__________статический пропеллер 2 0x684____moving_prop2________вращающийся пропеллер 2 0x688____rudder______________руль (на хвосте) 0x68C____elevator_l___________руль высоты левый (на хвосте) 0x690____elevator_r___________руль высоты правый (на хвосте) 0x694____aileron_l____________элерон левый (на крыле) 0x698____aileron_r____________элерон правый (на крыле) 0x69C____gear_l______________выпускное шасси левое 0x6A0____gear_r______________выпускное шасси правое 0x6A4____misc_a_____________спецкомпонент 0x6A8____misc_b_____________спецкомпонент
Offline
Я нашёл способ сделать какой-либо компонент (RwFrame) транспорта невидимым/видимым. Правда при условии, что к моменту сокрытия этот компонент не был удалён с транспорта. Способ работает и для произвольно добавленных компонентов. В этом случае даже лучше, так как произвольный компонент нельзя удалить стандартными опкодами.
{$CLEO .cs} 0000: var 2@: array 24 of float end while true wait 0 if Player.Defined($PLAYER_CHAR) then if Actor.Driving($PLAYER_ACTOR) // для авто then 03C0: 31@ = actor $PLAYER_ACTOR car //---удаление компонентов 29@ = 0x64C for 0@ = 1 to 24 if Car.Defined(31@) jf break if 00DB: actor $PLAYER_ACTOR in_car 31@ jf break 0A97: 30@ = car 31@ struct 005A: 30@ += 29@ 0085: 28@ = 29@ // (int) 29@ += 0x4 0A8D: 30@ = read_memory 30@ size 4 virtual_protect 0 if 30@ > 0 then 0ACE: show_formatted_text_box "%04X" 28@ 0087: 27@ = 30@ // (float) 27@ += 172 0ACD: show_text_highpriority 27@ time 2000 30@ += 0x2 0A8D: 2@[0@] = read_memory 30@ size 4 virtual_protect 0 0A8C: write_memory 30@ size 4 value 0 virtual_protect 0 wait 2000 end end //---восстановление компонентов 29@ = 0x6A8 for 0@ = 24 downto 1 if Car.Defined(31@) jf break if 00DB: actor $PLAYER_ACTOR in_car 31@ jf break 0A97: 30@ = car 31@ struct 005A: 30@ += 29@ 0085: 28@ = 29@ // (int) 29@ -= 0x4 0A8D: 30@ = read_memory 30@ size 4 virtual_protect 0 if 30@ > 0 then 0ACE: show_formatted_text_box "%04X" 28@ 0087: 27@ = 30@ // (float) 27@ += 172 0ACD: show_text_highpriority 27@ time 2000 30@ += 0x2 0A8C: write_memory 30@ size 4 value 2@[0@] virtual_protect 0 wait 2000 end end end end end
Offline
kenking, а как оно работает?
кстати заодно вопрос, оперируя всеми знаниями которые сейчас есть, можно получить смещение по названию компонента? ну или как оптимально сделать перебор всех компонентов, и нахождение с нужным мне именем?
Offline
kenking, а как оно работает?
Достаточно записать ноль в любой из четырёх байтов соответствующего адреса родителя компонента и компонент исчезает. Вот подправленный код
{$CLEO .cs} 0000: var 2@: array 24 of integer end while true wait 0 if Player.Defined($PLAYER_CHAR) then if Actor.Driving($PLAYER_ACTOR) // для авто then 03C0: 31@ = actor $PLAYER_ACTOR car //---удаление компонентов 29@ = 0x64C for 0@ = 1 to 24 if Car.Defined(31@) jf break if 00DB: actor $PLAYER_ACTOR in_car 31@ jf break 0A97: 30@ = car 31@ struct 005A: 30@ += 29@ 0085: 28@ = 29@ // (int) 29@ += 0x4 0A8D: 30@ = read_memory 30@ size 4 virtual_protect 0 if 30@ > 0 then 0ACE: show_formatted_text_box "%04X" 28@ 0087: 27@ = 30@ // (float) 27@ += 172 0ACD: show_text_highpriority 27@ time 2000 30@ += 0x4 0A8D: 2@[0@] = read_memory 30@ size 1 virtual_protect 0 0A8C: write_memory 30@ size 1 value 0 virtual_protect 0 wait 2000 end end //---восстановление компонентов 29@ = 0x6A8 for 0@ = 24 downto 1 if Car.Defined(31@) jf break if 00DB: actor $PLAYER_ACTOR in_car 31@ jf break 0A97: 30@ = car 31@ struct 005A: 30@ += 29@ 0085: 28@ = 29@ // (int) 29@ -= 0x4 0A8D: 30@ = read_memory 30@ size 4 virtual_protect 0 if 30@ > 0 then 0ACE: show_formatted_text_box "%04X" 28@ 0087: 27@ = 30@ // (float) 27@ += 172 0ACD: show_text_highpriority 27@ time 2000 30@ += 0x4 0A8C: write_memory 30@ size 1 value 2@[0@] virtual_protect 0 wait 2000 end end end end end
можно получить смещение по названию компонента?
Нет, так вряд ли получится.
ну или как оптимально сделать перебор всех компонентов, и нахождение с нужным мне именем?
В цикле перебираешь все компоненты, считываешь их название и сравниваешь с нужным тебе значением.
Offline
Ребята вы не разбирали подробнее даммисы. Меня интересуют смещения для заднего и переднего сидений. Как их различать левое и правое для легкового, а для мотоциклов как?
Вопрос к kenking и Den_spb в первую очередь.
I know everything and nothing...
Offline
С сиденьями ситуация такая же, как с фарами - в моделях присутствуют только дамми одной пары сидений (назовём их "правыми", т.к. обычно они располагаются справа). Оффсеты этих сидений можно получить через иерархию модели или через VehicleStruct (http://sannybuilder.com/forums/viewtopic.php?pid=14815#p14815 - таблица 2). Чтобы получить оффсеты "левого" сиденья, надо X оффсет "правого" сиденья умножить на -1.0. У мотоцикла есть только "правые" сиденья.
Offline
Тогда такой вопрос, как быть с автобусом? Там ведь 8 пасс мест. Всего мест 9, включая водительское.
Да и еще такой, если, например, у авто нет задних мест, а только передние, какие значения будут, если их искать, и как узнать, есть они в модели или нет?
Last edited by mfisto (06-12-2011 22:21)
I know everything and nothing...
Offline
@mfisto
По автобусам: когда-то я проводил эксперименты с посадкой пассажиров в автобус. Не нашёл те скрипты, видимо удалил. Ну суть тех экспериментов была в следующем: в автобус можно запихать не 8 пассажиров, а гораздо больше. Вот только игра сама удаляет их. Т.е. актёр заходит в автобус (как бы садится на указанное пассажирское сидение) и далее исчезает. При Actor.RemoveReferences актёры выходят из буса, но уже только в количестве 8 единиц (если зашло больше). Для автобусов установленные на другие ID с хендлом буса, вообще выходят всего 1-3 актёра. В общем полностью я тогда так и не разобрался в этом вопросе. Вот примерно такой код тогда я использовал для экспериментов:
{$CLEO .cs} 0000: var 1@: array 25 of integer end while true wait 0 if Player.Defined($PLAYER_CHAR) then if and Actor.DrivingVehicleType($PLAYER_ACTOR, #BUS) 0AB0: key_pressed 123 // F12 then 03C0: 0@ = actor $PLAYER_ACTOR car Car.LockInCurrentPosition(0@,true) 0441: 31@ = car 0@ model 07E4: get_model 31@ dimensions_cornerA_to 26@ 27@ 28@ dimensions_cornerB_to 29@ 30@ 31@ 0087: 26@ = 29@ // (float) 26@ += 1.0 0087: 27@ = 30@ // (float) 0407: store_coords_to 29@ 30@ 31@ from_car 0@ with_offset 26@ 27@ 28@ for 27@ = 0 to 24 if Car.Defined(0@) jf break if and not Car.Wrecked(0@) 82BF: not car 0@ sunk 8495: not car 0@ burning jf break 0376: 1@[27@] = create_random_actor_at 29@ 30@ 31@ Actor.SetImmunities(1@[27@], 1, 1, 1, 1, 1) 05CA: AS_actor 1@[27@] enter_car 0@ passenger_seat 27@ 2000 ms 0085: 28@ = 27@ // (int) 28@ += 1 01E3: show_text_1number_styled GXT 'NUMBER' number 28@ time 2000 style 4 // ~1~ repeat wait 0 if Car.Defined(0@) jf break if and not Car.Wrecked(0@) 82BF: not car 0@ sunk 8495: not car 0@ burning jf break if Actor.Defined(1@[27@]) jf break until 00DB: actor 1@[27@] in_car 0@ end for 27@ = 0 to 24 if Actor.Defined(1@[27@]) then Actor.SetImmunities(1@[27@], 0, 0, 0, 0, 0) Actor.RemoveReferences(1@[27@]) end if Car.Defined(0@) then Car.LockInCurrentPosition(0@,false) end end end end end
Тестировать лучше на стандартном бусе или хотя бы со стандартными настройками, иначе может быть вылет игры. А дамми сидений для пассажиров в количестве 8 в бусе, как таковых нет.
По второму вопросу: если в модели дамми заднего сидения присутствует, то соответственно значения x,y,z никак не будут равны 0.0. Значит можно проверить примерно так:
{$CLEO .cs} 0000: while true wait 0 if Player.Defined($PLAYER_CHAR) then if and Actor.Driving($PLAYER_ACTOR) 0AB0: key_pressed 122 // F11 then 03C0: 0@ = actor $PLAYER_ACTOR car 0A97: 1@ = car 0@ struct 1@ += 0x22 0A8D: 1@ = read_memory 1@ size 2 virtual_protect 0 //model index 1@ *= 4 1@ += 0xA9B0C8 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 //CModel 1@ += 0x5C 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 //vehicle struct 1@ += 60 0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 //x offset 1@ += 4 0A8D: 3@ = read_memory 1@ size 4 virtual_protect 0 //y offset 1@ += 4 0A8D: 4@ = read_memory 1@ size 4 virtual_protect 0 //z offset if and not 2@ == 0.0 not 3@ == 0.0 not 4@ == 0.0 then 0AD1: show_formatted_text_highpriority "dammy +%d is present" time 1000 60 else 0AD1: show_formatted_text_highpriority "dammy +%d is not present" time 1000 60 end repeat wait 0 until 8AB0: not key_pressed 122 // F11 end end end
Last edited by kenking (12-12-2011 10:09)
Offline
Следующие вопросы:
Как можно закрыть компонент A?
И еще вопрос, как можно проверить, что, например, капот или багажник есть у авто? Также как с сиденьями?
Last edited by mfisto (15-12-2011 12:13)
I know everything and nothing...
Offline
Как можно закрыть компонент A?
Установить значение угла поворота, равное нулю. Как поворачивать компонент - написано в начале темы.
Также существует опкод для поворота некоторых стандартных компонентов:
08A6: set_car 98@ componentA 0 rotation_to 0.0
И еще вопрос, как можно проверить, что, например, капот или багажник есть у авто? Также как с сиденьями?
Проверить то, были ли они изначально на модели, или то, что они были удалены в процессе игры? Если первое, то действуем также, как описано выше для сиденьев. Если второе, то можно воспользоваться опкодом:
08A7: car 34@ componentA 2 opened_or_not_present
Offline
как можно проверить, что, например, капот или багажник есть у авто?
Проверить присутствует ли в иерархии авто тот или иной компонент можно таким способом:
0A97: 1@ = car 0@ struct 0AA8: call_function_method 0x6A2250 struct 1@ num_params 1 pop 0 1 {1...25} 2@ Значение 2@ 1 - компонент есть 0 - компонент отсутствует Компонент____Обозначение_____Пояснение ___________в иерархии модели____________ 1__________chassis______________кузов (корпус авто) 2__________wheel_rf_dummy______правое переднее колесо авто 3__________wheel_rm_dummy_____правое среднее колесо авто 4__________wheel_rb_dummy_____правое заднее колесо авто 5__________wheel_lf_dummy______левое переднее колесо авто 6__________wheel_lm_dummy_____левое среднее колесо авто 7__________wheel_lb_dummy_____левое заднее колесо авто 8__________door_rf_dummy______правая передняя дверь авто 9__________door_rr_dummy______правая задняя дверь авто 10_________door_lf_dummy______левая передняя дверь авто 11_________door_lr_dummy______левая задняя дверь авто 12_________bump_front_dummy___передний бампер 13_________bump_rear_dummy___задний бампер 14_________wing_rf_dummy______правое переднее крыло авто 15_________wing_lf_dummy______левое переднее крыло авто 16_________bonnet_dummy______капот 17_________boot_dummy________багажник 18_________windscreen_dummy___лобовое стекло 19_________exhaust_ok_________глушитель 20_________misc_a____________спецкомпонент 21_________misc_b____________спецкомпонент 22_________misc_c____________спецкомпонент 23_________misc_d____________спецкомпонент 24_________misc_e____________спецкомпонент 25_________??????____________???????????????
Offline
{$CLEO} model.Load(400) 038B: load_requested_models Car.Create(29@ 400 -2029.1, 173.0, 28.7) 0175: set_car 29@ Z_angle_to 270.0 Car.Create(30@ 400 -2029.1, 175.0, 28.7) 0175: set_car 30@ Z_angle_to 270.0 Car.Create(31@ 400 -2029.1, 180.0, 28.7) 0175: set_car 31@ Z_angle_to 270.0 model.Destroy(400) //---масштабирование (увеличение) компонентов первого авто 0A97: 1@ = car 31@ struct 1@ += 0x458 0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 2@ *= 2.0 0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0 28@ = 0x64C for 0@ = 1 to 24 0A97: 1@ = car 31@ struct 005A: 1@ += 28@ 28@ += 0x4 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 if 1@ > 0 then 1@ += 64 0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 // сохраняем значения эл-тов +48, +52, +56 в памяти т.к. метод масштабирования матрицы их обнуляет 1@ += 4 0A8D: 3@ = read_memory 1@ size 4 virtual_protect 0 1@ += 4 0A8D: 4@ = read_memory 1@ size 4 virtual_protect 0 1@ -= 56 0AA6: call_method 0x59AED0 struct 1@ num_params 1 pop 0 2.0 // метод масштабирования матрицы 1@ += 48 0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0 // восстанавливаем значение X-position 1@ += 4 0A8C: write_memory 1@ size 4 value 3@ virtual_protect 0 // восстанавливаем значение Y-position 1@ += 4 0A8C: write_memory 1@ size 4 value 4@ virtual_protect 0 // восстанавливаем значение Z-position end end //---масштабирование (уменьшение) компонентов третьего авто 0A97: 1@ = car 29@ struct 1@ += 0x458 0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 2@ *= 0.5 0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0 28@ = 0x64C for 0@ = 1 to 24 0A97: 1@ = car 29@ struct 005A: 1@ += 28@ 28@ += 0x4 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 if 1@ > 0 then 1@ += 64 0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 // сохраняем значения эл-тов +48, +52, +56 в памяти т.к. метод масштабирования матрицы их обнуляет 1@ += 4 0A8D: 3@ = read_memory 1@ size 4 virtual_protect 0 1@ += 4 0A8D: 4@ = read_memory 1@ size 4 virtual_protect 0 1@ -= 56 0AA6: call_method 0x59AED0 struct 1@ num_params 1 pop 0 0.5 // метод масштабирования матрицы 1@ += 48 0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0 // восстанавливаем значение X-position 1@ += 4 0A8C: write_memory 1@ size 4 value 3@ virtual_protect 0 // восстанавливаем значение Y-position 1@ += 4 0A8C: write_memory 1@ size 4 value 4@ virtual_protect 0 // восстанавливаем значение Z-position end end 0A93:
Offline
Интересная находка, молодец
После сохранения локальных координат компонентов в памяти можно умножить эти координаты на масштаб, чтобы компоненты после масштабирования оставались на своих местах.
Если кто не понял, код будет выглядеть так:
{$CLEO} model.Load(400) 038B: load_requested_models Car.Create(29@ 400 -2029.1, 173.0, 28.7) 0175: set_car 29@ Z_angle_to 270.0 Car.Create(30@ 400 -2029.1, 175.0, 28.7) 0175: set_car 30@ Z_angle_to 270.0 Car.Create(31@ 400 -2029.1, 180.0, 28.7) 0175: set_car 31@ Z_angle_to 270.0 model.Destroy(400) //---масштабирование (увеличение) компонентов первого авто 0A97: 1@ = car 31@ struct 1@ += 0x458 0A8D: 32@ = read_memory 1@ size 4 virtual_protect 0 32@ *= 2.0 0A8C: write_memory 1@ size 4 value 32@ virtual_protect 0 28@ = 0x64C for 0@ = 1 to 24 0A97: 1@ = car 31@ struct 005A: 1@ += 28@ 28@ += 0x4 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 if 1@ > 0 then 1@ += 64 0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 // сохраняем значения эл-тов +48, +52, +56 в памяти т.к. метод масштабирования матрицы их обнуляет 006B: 2@ *= 32@ // (float) 1@ += 4 0A8D: 3@ = read_memory 1@ size 4 virtual_protect 0 006B: 3@ *= 32@ // (float) 1@ += 4 0A8D: 4@ = read_memory 1@ size 4 virtual_protect 0 006B: 4@ *= 32@ // (float) 1@ -= 56 0AA6: call_method 0x59AED0 struct 1@ num_params 1 pop 0 2.0 // метод масштабирования матрицы 1@ += 48 0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0 // восстанавливаем значение X-position 1@ += 4 0A8C: write_memory 1@ size 4 value 3@ virtual_protect 0 // восстанавливаем значение Y-position 1@ += 4 0A8C: write_memory 1@ size 4 value 4@ virtual_protect 0 // восстанавливаем значение Z-position end end //---масштабирование (уменьшение) компонентов третьего авто 0A97: 1@ = car 29@ struct 1@ += 0x458 0A8D: 32@ = read_memory 1@ size 4 virtual_protect 0 32@ *= 0.5 0A8C: write_memory 1@ size 4 value 32@ virtual_protect 0 28@ = 0x64C for 0@ = 1 to 24 0A97: 1@ = car 29@ struct 005A: 1@ += 28@ 28@ += 0x4 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 if 1@ > 0 then 1@ += 64 0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 // сохраняем значения эл-тов +48, +52, +56 в памяти т.к. метод масштабирования матрицы их обнуляет 006B: 2@ *= 32@ // (float) 1@ += 4 0A8D: 3@ = read_memory 1@ size 4 virtual_protect 0 006B: 3@ *= 32@ // (float) 1@ += 4 0A8D: 4@ = read_memory 1@ size 4 virtual_protect 0 006B: 4@ *= 32@ // (float) 1@ -= 56 0AA6: call_method 0x59AED0 struct 1@ num_params 1 pop 0 0.5 // метод масштабирования матрицы 1@ += 48 0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0 // восстанавливаем значение X-position 1@ += 4 0A8C: write_memory 1@ size 4 value 3@ virtual_protect 0 // восстанавливаем значение Y-position 1@ += 4 0A8C: write_memory 1@ size 4 value 4@ virtual_protect 0 // восстанавливаем значение Z-position end end 0A93:
Offline
Вращение компонента по одной из осей
..... 0A97: 1@ = car 0@ struct 1@ += 0x670 // левая передняя дверь 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 if 1@ > 0 then 1@ += 16 0AA6: call_method 0x59AFA0 struct 1@ num_params 1 pop 0 -1.0 // _sub_59AFA0 надо бы переименовать в CMatrix__rotateAroundX //0AA6: call_method 0x59AFE0 struct 1@ num_params 1 pop 0 -1.0 // _sub_59AFE0 надо бы переименовать в CMatrix__rotateAroundY //0AA6: call_method 0x59B020 struct 1@ num_params 1 pop 0 -1.0 // CMatrix__rotateAroundZ end ....
Перемещение компонента
..... 0A97: 1@ = car 0@ struct 1@ += 0x670 // левая передняя дверь 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 if 1@ > 0 then 1@ += 64 0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 2@ -= 1.0 // изменяем координату X 1@ += 4 0A8D: 3@ = read_memory 1@ size 4 virtual_protect 0 3@ -= 1.0 // изменяем координату Y 1@ += 4 0A8D: 4@ = read_memory 1@ size 4 virtual_protect 0 4@ += 1.0 // изменяем координату Z 1@ -= 56 0AA6: call_method 0x59AF80 struct 1@ num_params 3 pop 0 4@ 3@ 2@ // CMatrix__setPos (Z Y X) end ....
Удаление компонента
..... 0A97: 1@ = car 0@ struct 1@ += 0x670 // левая передняя дверь 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 if 1@ > 0 then 0AA5: call_function 0x7F05A0 num_params 1 pop 1 1@ // _rwFrameDestroy end ....
Удаление всех вложенных компонентов (child)
..... 0A97: 1@ = car 0@ struct 1@ += 0x64C // chassis 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 if 1@ > 0 then 0AA5: call_function 0x7F0CD0 num_params 1 pop 1 1@ // _RwFrameRemoveChild end ....
Получение корня иерархии (root)
..... 0A97: 1@ = car 0@ struct 1@ += 0x670 // левая передняя дверь 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 if 1@ > 0 then 0AA7: call_function 0x7F09B0 num_params 1 pop 1 1@ 2@ // _RwFrameGetRoot end ....
Last edited by kenking (13-04-2012 10:40)
Offline
вращение компонента относительно центра модели
..... 0A97: 1@ = car 0@ struct 1@ += 0x670 // левая передняя дверь 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 if 1@ > 0 then 1@ += 16 0AA6: call_method 0x59B1E0 struct 1@ num_params 1 pop 0 0.05 // sub_59B1E0 вращение компонента относительно центра модели по оси X //0AA6: call_method 0x59B2C0 struct 1@ num_params 1 pop 0 0.05 // sub_59B2C0 вращение компонента относительно центра модели по оси Y //0AA6: call_method 0x59B390 struct 1@ num_params 1 pop 0 0.05 // sub_59B390 вращение компонента относительно центра модели по оси Z //0AA6: call_method 0x59B460 struct 1@ num_params 3 pop 0 0.05 0.05 0.05 // sub_59B460 вращение компонента относительно центра модели по трём осям end .....
масштабирование компонента с коэффициентами для каждой из осей
:lol::lol:
{$CLEO} model.Load(400) 038B: load_requested_models Car.Create(29@ 400 -2029.1, 173.0, 28.7) 0175: set_car 29@ Z_angle_to 270.0 Car.Create(30@ 400 -2029.1, 175.0, 28.7) 0175: set_car 30@ Z_angle_to 270.0 Car.Create(31@ 400 -2029.1, 180.0, 28.7) 0175: set_car 31@ Z_angle_to 270.0 model.Destroy(400) //---масштабирование по оси X (увеличение) компонентов первого авто 28@ = 0x64C 27@ = 2.0 // коэффициент масштабирования for 0@ = 1 to 24 0A97: 1@ = car 31@ struct 005A: 1@ += 28@ 28@ += 0x4 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 if 1@ > 0 then 1@ += 64 0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 // сохраняем значения эл-тов +48, +52, +56 в памяти т.к. метод масштабирования матрицы их обнуляет 006B: 2@ *= 27@ // (float) 1@ += 4 0A8D: 3@ = read_memory 1@ size 4 virtual_protect 0 1@ += 4 0A8D: 4@ = read_memory 1@ size 4 virtual_protect 0 1@ -= 56 0AA6: call_method 0x59AF00 struct 1@ num_params 3 pop 0 1.0 1.0 27@ // sub_59AF00 масштабирование(Z Y X) 1@ += 48 0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0 // восстанавливаем значение X-position 1@ += 4 0A8C: write_memory 1@ size 4 value 3@ virtual_protect 0 // восстанавливаем значение Y-position 1@ += 4 0A8C: write_memory 1@ size 4 value 4@ virtual_protect 0 // восстанавливаем значение Z-position end end //---масштабирование по оси X (уменьшение) компонентов третьего авто 28@ = 0x64C 27@ = 0.5 // коэффициент масштабирования for 0@ = 1 to 24 0A97: 1@ = car 29@ struct 005A: 1@ += 28@ 28@ += 0x4 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 if 1@ > 0 then 1@ += 64 0A8D: 2@ = read_memory 1@ size 4 virtual_protect 0 // сохраняем значения эл-тов +48, +52, +56 в памяти т.к. метод масштабирования матрицы их обнуляет 006B: 2@ *= 27@ // (float) 1@ += 4 0A8D: 3@ = read_memory 1@ size 4 virtual_protect 0 1@ += 4 0A8D: 4@ = read_memory 1@ size 4 virtual_protect 0 1@ -= 56 0AA6: call_method 0x59AF00 struct 1@ num_params 3 pop 0 1.0 1.0 27@ // sub_59AF00 масштабирование(Z Y X) 1@ += 48 0A8C: write_memory 1@ size 4 value 2@ virtual_protect 0 // восстанавливаем значение X-position 1@ += 4 0A8C: write_memory 1@ size 4 value 3@ virtual_protect 0 // восстанавливаем значение Y-position 1@ += 4 0A8C: write_memory 1@ size 4 value 4@ virtual_protect 0 // восстанавливаем значение Z-position end end 0A93:
Offline
масштабирование компонента с коэффициентами для каждой из осей
А как же коллизии? Они не масштабируються?
Offline