#101 28-06-2011 17:06

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

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

Я сеййчас не вспомню точно адресов, но общий принцип такой: Есть класс CVehicleModelInfo (у меня в базе он может называться CModelCars). В памяти есть массив этих объектов. Каждый объект в массиве отвечает за все машины одной модели и в нем должны быть координаты всех компонентов. Их и нужно редактировать.

Как к этому доступаться - было на первой странице этой темы.

Offline

#102 28-06-2011 19:39

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

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

listener wrote:

Есть класс CVehicleModelInfo (у меня в базе он может называться CModelCars)

rolleyes это база для "IDA"? (сори, я вообще тут чайниГ)
в идиале хотелосьбы подробно и с примером, но и на этом спасибо, будем искать smile

Offline

#103 28-06-2011 20:08

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

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

Смотри внимательно эту тему - тут всё есть. Смещения, общие для всех машин одной модели: http://sannybuilder.com/forums/viewtopi … 815#p14815 , таблица 2. Работа с этими смещениями - стр. 1.

Last edited by Den_spb (28-06-2011 20:10)

Offline

#104 02-07-2011 17:21

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

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

другой вопрос: можно ли узнать количество 3д деталей машины (общее) ?

Offline

#105 02-07-2011 23:29

Kostyan
Registered: 27-09-2009
Posts: 94

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

}0RIC)-( wrote:

другой вопрос: можно ли узнать количество 3д деталей машины (общее) ?

Думаю из сообщения listener, можно сделать вывод, что да

Offline

#106 11-07-2011 11:27

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

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

Были названы смещения от компонента, указывающие на следующий компонент в иерархии, и дочерний
Нашел еще одно интересное смещение - "на родителя" компонента, +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

90331.JPG

Пример 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

25132.JPG

Offline

#107 19-10-2011 04:54

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

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

Нашёл еще одно смещение: 0xA0 от любого компонента (стандартного или произвольного) выход по этому смещению на старейшину (не путать с родителем) иерархии. Вот здесь, к примеру, это будет bus.
0d975d07d3a6t.jpg

Offline

#108 22-10-2011 09:17

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

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

Данные для самолётов:

Таблица №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

#109 02-11-2011 13:07

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

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

Я нашёл способ сделать какой-либо компонент (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

#110 02-11-2011 13:28

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

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

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

Offline

#111 03-11-2011 07:52

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

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

}0RIC)-( wrote:

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
}0RIC)-( wrote:

можно получить смещение по названию компонента?

Нет, так вряд ли получится.

}0RIC)-( wrote:

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

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

Offline

#112 03-12-2011 17:23

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

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

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

Вопрос к kenking и Den_spb в первую очередь.


I know everything and nothing...

Offline

#113 03-12-2011 18:00

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

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

С сиденьями ситуация такая же, как с фарами - в моделях присутствуют только дамми одной пары сидений (назовём их "правыми", т.к. обычно они располагаются справа). Оффсеты этих сидений можно получить через иерархию модели или через VehicleStruct (http://sannybuilder.com/forums/viewtopic.php?pid=14815#p14815 - таблица 2). Чтобы получить оффсеты "левого" сиденья, надо X оффсет "правого" сиденья умножить на -1.0. У мотоцикла есть только "правые" сиденья.

Offline

#114 06-12-2011 10:07

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

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

Тогда такой вопрос, как быть с автобусом? Там ведь 8 пасс мест. Всего мест 9, включая водительское.

Да и еще такой, если, например, у авто нет задних мест, а только передние, какие значения будут, если их искать, и как узнать, есть они в модели или нет?

Last edited by mfisto (06-12-2011 22:21)


I know everything and nothing...

Offline

#115 12-12-2011 09:38

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

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

@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

#116 15-12-2011 12:12

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

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

Следующие вопросы:
Как можно закрыть компонент A?

И еще вопрос, как можно проверить, что, например, капот или багажник есть у авто? Также как с сиденьями?

Last edited by mfisto (15-12-2011 12:13)


I know everything and nothing...

Offline

#117 16-12-2011 10:41

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

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

Как можно закрыть компонент A?

Установить значение угла поворота, равное нулю. Как поворачивать компонент - написано в начале темы.
Также существует опкод для поворота некоторых стандартных компонентов:
08A6: set_car 98@ componentA 0 rotation_to 0.0

И еще вопрос, как можно проверить, что, например, капот или багажник есть у авто? Также как с сиденьями?

Проверить то, были ли они изначально на модели, или то, что они были удалены в процессе игры? Если первое, то действуем также, как описано выше для сиденьев. Если второе, то можно воспользоваться опкодом:
08A7:  car 34@ componentA 2 opened_or_not_present

Offline

#118 09-02-2012 10:20

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

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

mfisto wrote:

как можно проверить, что, например, капот или багажник есть у авто?

Проверить присутствует ли в иерархии авто тот или иной компонент можно таким способом:

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

#119 19-02-2012 14:53

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

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

lol:lol::lol:
d97bdd59791bt.jpg

{$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

#120 19-02-2012 18:11

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

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

Интересная находка, молодец good
После сохранения локальных координат компонентов в памяти можно умножить эти координаты на масштаб, чтобы компоненты после масштабирования оставались на своих местах.
Если кто не понял, код будет выглядеть так:

{$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

#121 29-02-2012 10:23

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

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

Вращение компонента по одной из осей

.....
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

#122 16-03-2012 08:24

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

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

вращение компонента относительно центра модели

.....
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
.....

масштабирование компонента с коэффициентами для каждой из осей
1819947-thumb.jpeglol: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

#123 23-03-2012 00:26

VintProg_Pro
Registered: 17-06-2010
Posts: 153

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

масштабирование компонента с коэффициентами для каждой из осей

А как же коллизии? Они не масштабируються?

Offline

#124 23-03-2012 15:33

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

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

Коллизия представляет собой отдельную модель, поэтому при масштабировании основной модели коллизия останется без изменений.

Offline

#125 26-03-2012 09:12

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

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

У компонентов в SA и ниже, вообще нет коллизий

Offline

Board footer

Powered by FluxBB