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