#151 19-06-2013 18:17

DK22Pac
From: Вінниця
Registered: 26-03-2010
Posts: 294
Website

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

Ну меняй, в чём проблема.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct RwFrame
{
    RwObject              object;           // 0
    RwLLLink              inDirtyListLink;  // 8
    RwMatrix              modelling;        // 16
    RwMatrix              ltm;              // 80
    RwLinkList            objectList;       // 144
    RwFrame              *child;            // 152
    RwFrame              *next;             // 156
    RwFrame              *root;             // 160
    // RenderWare plugins                     
    RpHAnimFrameExtension hAnimFrame;       // 164
    // GTA Plugins                            
    char                  nodeName[24];     // 172
    union                                   // 196
    {
        void             *model;
        int               hierId;
    };
};
1
2
0A8E: 1@ = 0@ + 172
0AA5: call 0x69F910 num_params 2 pop 2 "new_name" 1@ // strcpy(dst, src)

Last edited by DK22Pac (19-06-2013 19:48)

Offline

#152 20-06-2013 09:09

kenking
From: Казахстан, Чимкент
Registered: 28-06-2010
Posts: 149

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

Спасибо.
Название компонента перезаписывается, только вот конечный нужный результат не получен. Я всё пытаюсь получить доступ к вложенным компонентам (произвольно добавленным) во вращающиеся компоненты модели (двери, капот и багажник). Думал схитрить - перезаписать имя компонента и получить потом доступ к вложенным компонентам, но не всё так просто оказалось. Имя компонента перезаписалось и этот компонент находится функцией

1
0AA7: call_function 0x4C5400 num_params 2 pop 2 _nodename "myname" _rwObject 0@ _store_to 1@

но дальше доступ получить к вложенным компонентам всё также не удаётся.

Может у кого есть какие идеи, как это всё же можно сделать?

и сразу по структуре RwFrame вопросы

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct RwFrame
{
    RwLLLink              inDirtyListLink;  // 8
    
    RwLinkList            objectList;       // 144
     
    // RenderWare plugins                     
    RpHAnimFrameExtension hAnimFrame;       // 164
    // GTA Plugins                
    
    union                                   // 196
    {
        void             *model;
        int               hierId;
    };
};

вот эти смещения каким образом и для чего используются?   
А вообще на русском языке есть какая-нибудь документация по RwFrame?

Offline

#153 20-06-2013 16:36

DK22Pac
From: Вінниця
Registered: 26-03-2010
Posts: 294
Website

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

Тут могу ошибаться,
inDirtyListLink - список фреймов, нуждающихся в обновлении (например, после смены местоположения фрейма);
objectList - список атомиков, прикреплённых к этому фрейму. Для обработки всех атомиков фрейма можно использовать функцию RwFrameForAllObjects;
hAnimFrame - обьект анимации на уровне RwFrame. Используется только для заскиненных обьектов (вроде). В общем, для обьектов, которые анимируются.
model - указатель на обьект - наследователь CBaseModelInfo (т.е., CVehicleModelInfo, CPedModelInfo, CWeaponModelInfo и т.д.). В основном, используется для привязки между фреймом обьекта оружия и его моделью (CWeaponModelInfo). Для обьектов с иерархией заменяется на hierId;
hierId - id фрейма в иерархии. Используется только для фреймов транспорта/педов. Id определены заранее и привязаны к именам фреймов в специальной таблице (массив обьектов RwObjectNameIdAssocation). Для некоторых видов транспорта, эти таблицы представлены тут:
http://gtamodding.ru/wiki/Структура_мод … Automobile

По первому вопросу - фреймы, которые находятся внутри "повреждаемых" фреймов (двери, капот, и т.д.) удаляются игрой ещё при создании обьекта-модели транспорта. Их атомики получают флаг состояния компонента (если атомик был прикреплён к фрейму с пометкой _ok - это атомик целого компонента, _dam - поврежденного компонента), и переходят к родителю (в случае с капотом это фрейм с именем bonnet_dummy).
До

1
2
3
4
5
6
7
RwFrame( bonnet_dummy )
|
+--RwFrame( bonnet_dummy_ok )
|     RpAtomic( ok_atomic )
|
+--RwFrame( bonnet_dummy_dam )
      RpAtomic( dam_atomic )

После

1
2
3
RwFrame( bonnet_dummy )
   RpAtomic( ok_atomic )
   RpAtomic( dam_atomic )
kenking wrote:

А вообще на русском языке есть какая-нибудь документация по RwFrame?

Увы, нету.

Last edited by DK22Pac (20-06-2013 16:52)

Offline

#154 20-06-2013 19:54

mfisto
From: Perm
Registered: 01-02-2008
Posts: 448
Website

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

Вот такой вопрос возник, опкодом можно задать номер авто (numplate), но из двух меняется только один, второй остается рандомным, как это исправить, заранее можно ли задать не для одного номера, а сразу все?


I know everything and nothing...

Offline

#155 20-06-2013 21:07

kenking
From: Казахстан, Чимкент
Registered: 28-06-2010
Posts: 149

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

DK22Pac, спасибо, буду разбираться.

}0RIC)-( wrote:

Ну к примеру "приаттачить" бампер этой машины к колесу этой же машины, чтобы крутился, двигался вместе с ним, это возможно?
кстате, заодно вопрос, как "сбросить" компонент, т.е. вернуть его в исходные координаты?опять же, это возможно?=)

listener wrote:

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

Как оказалось такое возможно. Стоило покопаться в базе и вот результат:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
{$CLEO .cs}
 
0000:
10@ = 1
while true
wait 0
   if
     Player.Defined($PLAYER_CHAR)
   then
       if
         Actor.Driving($PLAYER_ACTOR)
       then
           if
             0AB0: key_pressed 77 // M
           then
               03C0: 0@ = actor $PLAYER_ACTOR car
               0441: 1@ = car 0@ model
               if
                 0A01: model 1@ car
               then
                   0A97: 2@ = car 0@ struct
                   // получаем два компонента авто
                   0A8E: 3@ = 2@ + 0x65C // левое переднее колесо
                   0A8E: 4@ = 2@ + 0x678 // бампер передний            
                   0A8D: 3@ = read_memory 3@ size 4 virtual_protect 0
                   0A8D: 4@ = read_memory 4@ size 4 virtual_protect 0
                   if and
                     3@ > 0 // компонент имеется
                     4@ > 0 // компонент имеется
                   then  
                       if
                         10@ == 1
                       then
                           // получаем "родителя" второго компонента
                           0A8E: 5@ = 4@ + 0x4
                           0A8D: 5@ = read_memory 5@ size 4 virtual_protect 0
                           if
                             5@ > 0
                           then
                               // записываем координаты второго компонента
                               0A8E: 6@ = 4@ + 64
                               0A8D: 7@ = read_memory 6@ size 4 virtual_protect 0
                               6@ += 4
                               0A8D: 8@ = read_memory 6@ size 4 virtual_protect 0
                               6@ += 4
                               0A8D: 9@ = read_memory 6@ size 4 virtual_protect 0
                               6@ -= 56
                               // помещаем второй компонент в центр модели
                               0AA6: call_method 0x59AF80 struct 6@ num_params 3 pop 0 0.0 0.0 0.0 // CMatrix__setPos (Z Y X)
                               // разворачиваем !!! для некоторых компонентов без надобности
                               0AA6: call_method 0x59B020 struct 6@ num_params 1 pop 0 -3.14 // CMatrix__rotateAroundZ
                               // прикрепляем второй компонент к первому
                               0AA5: call_function 0x7F0B00 num_params 2 pop 2 4@ 3@ // _RwFrameAddChild
                               10@ = 2
                           end
                       else
                           // возвращаем компонент на своё место
                           0AA6: call_method 0x59AF80 struct 6@ num_params 3 pop 0 9@ 8@ 7@ // CMatrix__setPos (Z Y X)
                           // разворачиваем обратно !!! для некоторых компонентов без надобности
                           0AA6: call_method 0x59B020 struct 6@ num_params 1 pop 0 0.0 // CMatrix__rotateAroundZ   
                           // прикрепляем второй компонент к "родителю"
                           0AA5: call_function 0x7F0B00 num_params 2 pop 2 4@ 5@ // _RwFrameAddChild
                           10@ = 1
                       end
                   end
               end
           repeat
             wait 0
           until 8AB0: not key_pressed 77 // M
           end  
       end
   end
end

После цепляния одного компонента к другому он поддаётся управлению, так что таким образом можно решить мой же вопрос

kenking wrote:

но дальше доступ получить к вложенным компонентам всё также не удаётся.

Может у кого есть какие идеи, как это всё же можно сделать?

Offline

#156 20-06-2013 22:05

DK22Pac
From: Вінниця
Registered: 26-03-2010
Posts: 294
Website

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

kenking, в ImVehFt это сделано через перехват вызова функции, которая удаляет фрйемы.

Offline

#157 22-06-2013 17:02

kenking
From: Казахстан, Чимкент
Registered: 28-06-2010
Posts: 149

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

}0RIC)-( wrote:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{$CLEO .cs}
 
0000:
while true
wait 0
   if
     Player.Defined($PLAYER_CHAR)
   then
       if
         Actor.Driving($PLAYER_ACTOR)
       then
           03C0: 0@ = actor $PLAYER_ACTOR car
           0A97: 1@ = car 0@ struct
           1@ += 0x18
           0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
           0AA7: call_function 0x4C5400 num_params 2 pop 2 _nodename "chassis_dummy" _rwObject 1@ _store_to 2@
           if
             2@ > 0
           then  
               0AA7: call_function 0x7F09B0 num_params 1 pop 1 2@ 3@ // _RwFrameGetRoot
               if // вообще-то лишнее, корень иераррхии у модели есть всегда
                 3@ > 0
               then
                   0AA7: call_function 0x7F0E00 num_params 1 pop 1 3@ 4@ // _RwFrameCount
                   0AD1: show_formatted_text_highpriority "model has %d components" time 5000 4@
                   while Actor.Driving($PLAYER_ACTOR)
                     wait 0
                   end
               end
           end  
       end
   end
end

Offline

#158 22-06-2013 18:34

DK22Pac
From: Вінниця
Registered: 26-03-2010
Posts: 294
Website

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

kenking, поздновато ты отвечаешь, }0RIC)-( сейчас разрабатывает свой игровой движок и забил на гта crazy

Last edited by DK22Pac (22-06-2013 18:35)

Offline

#159 23-06-2013 10:55

kenking
From: Казахстан, Чимкент
Registered: 28-06-2010
Posts: 149

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

Когда нашёл ответ на вопрос, тогда и ответил. Если бы знал раньше, то и написал бы соответственно тогда. Тема предназначена не только для одного }0RIC)-(. Может кому ещё эта информация пригодится. А вообще лучше поздно, чем никогда.:D

Offline

#160 28-06-2013 09:13

kenking
From: Казахстан, Чимкент
Registered: 28-06-2010
Posts: 149

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

DK22Pac, объясни пожалуйста, что получаем после вызова _RwFrameGetLTM

Offline

#161 29-06-2013 11:51

DK22Pac
From: Вінниця
Registered: 26-03-2010
Posts: 294
Website

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

kenking, матрицу компонента в мировом пространстве.

Offline

#162 29-06-2013 13:20

kenking
From: Казахстан, Чимкент
Registered: 28-06-2010
Posts: 149

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

Спасибо.

Offline

#163 28-10-2013 02:34

mfisto
From: Perm
Registered: 01-02-2008
Posts: 448
Website

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

Ребят возник нубский вопрос: как покрутить по оси x, допустим, компонент, прибегая к новым опкодам от DK22PAC? Компонент - новый. Свой, скажем, добавил.


I know everything and nothing...

Offline

#164 28-10-2013 20:43

DK22Pac
From: Вінниця
Registered: 26-03-2010
Posts: 294
Website

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

Есть функция

1
0x6DBA30     ; void __stdcall RotateVehicleComponent(RwFrame *component, int axis, float angle, char rotationType)

В CLEO должна вызываться так

1
0AA5: call 0x6DBA30 num_params 4 pop 4 _rotationType 1 _angle 1@ _axis 1 _component 0@

axis - ось вращения

1
2
3
0 - X
1 - Y
2 - Z

angle - угол в радианах
component - адрес компонента (RwFrame)
rotationType - тип вращения (0 или 1, надо экспериментировать).

Offline

#165 29-10-2013 04:33

mfisto
From: Perm
Registered: 01-02-2008
Posts: 448
Website

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

я находил компонент по названию опкодом:

1
8D0D: 29@ = get_car 31@ component "new_comp" // IF and SET

потом найденный компонент вставлял в ту процедуру, но вылет.


I know everything and nothing...

Offline

#166 29-10-2013 10:13

kenking
From: Казахстан, Чимкент
Registered: 28-06-2010
Posts: 149

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

mfisto wrote:

как покрутить по оси x, допустим, компонент

вариант 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{$CLEO .cs}
0000:
while true
wait 0
    if
      Player.Defined($PLAYER_CHAR)
    then
        if
          Actor.Driving($PLAYER_ACTOR)
        then
            03C0: 0@ = actor $PLAYER_ACTOR car
            0A97: 1@ = car 0@ struct
            0A8E: 2@ = 1@ + 0x18
            0A8D: 2@ = read_memory 2@ size 4 virtual_protect 0
            0AA7: call_function 0x4C5400 num_params 2 pop 2 _nodename "new_comp" _rwObject 2@ _store_to 3@
            if
              3@ > 0
            then
                // axis
                10@ = 1.0 // X
                11@ = 0.0 // Y
                12@ = 0.0 // Z
                while Car.Defined(0@)
                  if
                    00DB: actor $PLAYER_ACTOR in_car 0@
                  jf break
                  0AA5: call {RwFrameRotate} 0x7F1010 num_params 4 pop 4 _combine 1 _angle+= 1.0 _axis 10@v _frame 3@
                  wait 0
                end
            end
        end
    end
end

вариант 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{$CLEO .cs}
0000:
while true
wait 0
    if
      Player.Defined($PLAYER_CHAR)
    then
        if
          Actor.Driving($PLAYER_ACTOR)
        then
            03C0: 0@ = actor $PLAYER_ACTOR car
            0A97: 1@ = car 0@ struct
            0A8E: 2@ = 1@ + 0x18
            0A8D: 2@ = read_memory 2@ size 4 virtual_protect 0
            0AA7: call_function 0x4C5400 num_params 2 pop 2 _nodename "new_comp" _rwObject 2@ _store_to 3@
            if
              3@ > 0
            then
                3@ += 16
                4@ = 0.0
                while Car.Defined(0@)
                  if
                    00DB: actor $PLAYER_ACTOR in_car 0@
                  jf break
                  4@ += 0.05
                  0AA6: call_method {CMatrix__rotateAroundX} 0x59AFA0 struct 3@ num_params 1 pop 0 4@
                  wait 0
                end
            end
        end
    end
end

Offline

#167 02-01-2014 08:35

DK22Pac
From: Вінниця
Registered: 26-03-2010
Posts: 294
Website

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

На основе появившейся кучи информации, составил класс CVehicleModelInfo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#pragma once
#include "plugin\plugin.h"
#include "CClumpModelInfo.h"
#include "RenderWare.h"
#include "CVector.h"
#include "CQuaternion.h"
#include "RwObjectNameIdAssocation.h"
#include "CRGBA.h"
 
enum VehicleUpgradePosn
{
    UPGRADE_BONNET,
    UPGRADE_BONNET_LEFT,
    UPGRADE_BONNET_RIGHT,
    UPGRADE_BONNET_DAM,
    UPGRADE_BONNET_LEFT_DAM,
    UPGRADE_BONNET_RIGHT_DAM,
    UPGRADE_SPOILER,
    UPGRADE_SPOILER_DAM,
    UPGRADE_WING_LEFT,
    UPGRADE_WING_RIGHT,
    UPGRADE_FRONTBULLBAR,
    UPGRADE_BACKBULLBAR,
    UPGRADE_LIGHTS,
    UPGRADE_LIGHTS_DAM,
    UPGRADE_ROOF,
    UPGRADE_NITRO,
};
 
#pragma pack(push, 4)
struct PLUGIN_API UpgradePosnDesc
{
    CVector m_vPosition;
    CQuaternion m_qRotation;
    int m_dwParentComponentId;
    UpgradePosnDesc();
    ~UpgradePosnDesc();
};
#pragma pack(pop)
 
#pragma pack(push, 1)
class PLUGIN_API CVehicleModelInfo : public CClumpModelInfo
{
public:
    RpMaterial *m_pPlateMaterial;
    char m_plateText[8];
    __int8 field_30;
    unsigned __int8 m_nPlateType;
    char m_nGameName[8];
    __int16 pad0;
    unsigned __int32 m_dwType;
    float m_fWheelSizeFront;
    float m_fWheelSizeRear;
    unsigned __int16 m_wWheelModelId;
    unsigned __int16 m_wHandlingIndex;
    unsigned __int8 m_nNumDoors;
    unsigned __int8 m_nClass;
    unsigned __int8 m_nFlags;
    unsigned __int8 m_nWheelUpgradeClass;
    unsigned __int16 m_wTimesUsed;
    unsigned __int16 m_wFrq;
    union{
        unsigned __int32 m_dwCompRules;
        struct{
            unsigned __int32 m_nExtraA_comp1 : 4;
            unsigned __int32 m_nExtraA_comp2 : 4;
            unsigned __int32 m_nExtraA_comp3 : 4;
            unsigned __int32 m_nExtraA_rule : 4;
            unsigned __int32 m_nExtraB_comp1 : 4;
            unsigned __int32 m_nExtraB_comp2 : 4;
            unsigned __int32 m_nExtraB_comp3 : 4;
            unsigned __int32 m_nExtraB_rule : 4;
        };
    };
    float m_fBikeSteerAngle;
 
    class CVehicleStructure{
    public:
        CVector m_avDummyPosn[15];
        UpgradePosnDesc m_aUpgrades[18];
        RpAtomic *m_apExtras[6];
        unsigned char m_nNumExtras;
        unsigned int m_dwMaskComponentsDamagable;
        CVehicleStructure();
        ~CVehicleStructure();
        static class CPool *m_pInfoPool;
    } *m_pVehicleStruct;
 
    __int8 field_60[464];
    RpMaterial *m_apDirtMaterials[16];
    __int8 field_270[64];
    unsigned __int8 m_anPrimaryColors[8];
    unsigned __int8 m_anSecondaryColors[8];
    unsigned __int8 m_anTertiaryColors[8];
    unsigned __int8 m_anQuaternaryColors[8];
    unsigned __int8 m_nNumColorVariations;
    unsigned __int8 m_nLastColorVariation;
    unsigned __int8 m_nPrimaryColor;
    unsigned __int8 m_nSecondaryColor;
    unsigned __int8 m_nTertiaryColor;
    unsigned __int8 m_nQuaternaryColor;
    __int16 m_awUpgrades[18];
    __int16 m_awRemapTxds[5];
    class CAnimBlock *m_pAnimBlock;
 
    static class CLinkedUpgradeList{
    public:
        __int16 m_wUpgrade1[30];
        __int16 m_wUpgrade2[30];
        unsigned __int32 m_dwLinksCount;
        // add upgrade with components upgrade1 and upgrade2
        void AddUpgradeLink(short upgrade1, short upgrade2);
        // find linked upgrade for this upgrade. In this case upgrade param could be upgrade1 or
        // upgrade2
        short FindOtherUpgrade(short upgrade);
    } &ms_linkedUpgrades;
 
    // vehicle components description tables
    // static RwObjectNameIdAssocation ms_vehicleDescs[12];
    static RwObjectNameIdAssocation *ms_vehicleDescs;
 
    // vehiclelights128 texture
    static RwTexture *ms_pLightsTexture;
    // vehiclelightson128 texture
    static RwTexture *ms_pLightsOnTexture;
     
    // color of currently rendered car
    // static unsigned __int8 ms_currentCol[4];
    static unsigned __int8 *ms_currentCol;
 
    // number of wheel upgrades available
    // tatic __int16 ms_numWheelUpgrades[4];
    static __int16 *ms_numWheelUpgrades;
 
    // wheels upgrades data
    // static __int16 ms_upgradeWheels[15][4];
    static __int16 *ms_upgradeWheels;
 
    // lights states for currently rendered car
    // static __int8 *ms_lightsOn[4];
    static __int8 *ms_lightsOn;
 
    // extras ids for next-spawned car
    // static __int8 ms_compsUsed[2];
    static __int8 *ms_compsUsed;
 
    // vehicle colours from carcols.dat
    // static CRGBA ms_vehicleColourTable[128];
    static CRGBA *ms_vehicleColourTable;
 
    CVehicleModelInfo();
    ~CVehicleModelInfo();
 
    // destroying vehiclelights textures
    static void ShutdownLightTexture();
    // find remap texture with name
    static RwTexture *FindTextureCB(char  const* name);
    // start using special finding callback
    static void UseCommonVehicleTexDicationary();
    // stop using special finding callback
    static void StopUsingCommonVehicleTexDicationary();
    // set new parent frame for object. Data is actually RwFrame *
    static RpAtomic *MoveObjectsCB(RwObject *object, void *data);
    // this is used to disable _dam atomic and "enable" _ok atomic at vehicle model setup. Data is
    // unused
    static RpAtomic *HideDamagedAtomicCB(RpAtomic *atomic, void *data);
    // hide all atomics with state data (data is actually unsigned char)
    static RpAtomic *HideAllComponentsAtomicCB(RpAtomic *atomic, void *data);
    // check if material has alpha. Boolean result is stored to data (data is actually bool *)
    static RpMaterial *HasAlphaMaterialCB(RpMaterial *material, void *data);
    // setup atomic renderer. Data is unused
    static RpAtomic *SetAtomicRendererCB(RpAtomic *atomic, void *data);
    // setup heli renderer. Data is unused
    static RpAtomic *SetAtomicRendererCB_RealHeli(RpAtomic *atomic, void *data);
    // setup plane renderer. Data is unused
    static RpAtomic *SetAtomicRendererCB_Plane(RpAtomic *atomic, void *data);
    // setup boat renderer. Data is unused
    static RpAtomic *SetAtomicRendererCB_Boat(RpAtomic *atomic, void *data);
    // setup heli renderer. Data is unused
    static RpAtomic *SetAtomicRendererCB_Heli(RpAtomic *atomic, void *data);
    // setup train renderer. Data is unused
    static RpAtomic *SetAtomicRendererCB_Train(RpAtomic *atomic, void *data);
    // setup model render callbacks
    void SetAtomicRenderCallbacks();
    // setup objects flag. Data is actually flag (unsigned short)
    static RwObject *SetAtomicFlagCB(RwObject *object, void *data);
    // clear all atomic flag. Data is actually flag (unsigned short)
    static RwObject *ClearAtomicFlagCB(RwObject *object, void *data);
    // set component flags
    void SetVehicleComponentFlags(RwFrame *component, unsigned int flags);
    // get wheel position. Wheel is wheel id [0-3]. Local - get local offset (if false it will get
    // world position)
    void GetWheelPosn(int wheel, CVector &outVec, bool local);
    // get component local offset. Component is a frame hierarchy id. Returns true if component present
    bool GetOriginalCompPosition(CVector &outVec, int component);
    // get vehicle extra with rules. Returns extra id.
    int ChooseComponent();
    // get vehicle second extra with rules. Returns extra id.
    int ChooseSecondComponent();
    // check if upgrade is available
    bool IsUpgradeAvailable(VehicleUpgradePosn upgrade);
    // change colors and settings of material according to vehicle color and lights states.  Data
    // contains pointer to restore entries
    RpMaterial *SetEditableMaterialsCB(RpMaterial *material, void *data);
    // execute SetEditableMaterialsCB(RpMaterial *, void *) for atomic materials and also remove
    // vehicle window if needed. Data contains pointer to restore entries
    RpAtomic *SetEditableMaterialsCB(RpAtomic *atomic, void *data);
    // execute SetEditableMaterialsCB(RpAtomic *, void *) for atomics in clump. This one is called
    // before vehicle rendering
    void SetEditableMaterials(RpClump *clump);
    // reset materials settings. This one is called after vehicle rendering
    void ResetEditableMaterials(RpClump *clump);
    // set current vehicle colour for model
    void SetVehicleColour(unsigned char prim, unsigned char sec, unsigned char tert,
        unsigned char quat);
    // get color for car. variationShift determines how many color variations to skip.
    // For example, 1 will simply give you next color variation.
    void ChooseVehicleColour(unsigned char &prim, unsigned char &sec, unsigned char &tert,
        unsigned char &quat, int variationShift);
    // get num remaps in this model
    int GetNumRemaps();
    // add remap to model. Txd is id of tex dictionary.
    void AddRemap(int txd);
    // adds wheel upgrade. This one is called from LoadVehicleUpgrades()
    static void AddWheelUpgrade(int wheelSetNumber, int modelId);
    // gets num upgrades for this set
    static int GetNumWheelUpgrades(int wheelSetNumber);
    // gets whell upgrade
    static void GetWheelUpgrade(int wheelSetNumber, int wheelUpgradeNumber);
    // do nothing
    static void DeleteVehicleColourTextures();
    // loads 'white' texture
    static void LoadEnvironmentMaps();
    // unloads 'white' texture
    static void ShutdownEnvironmentMaps();
    // gets mat effect of this material. Data is actually int *
    static RpMaterial *GetMatFXEffectMaterialCB(RpMaterial *material, void *data);
    // sets mat effect for this meterial. Data is actually int
    static RpMaterial *SetEnvironmentMapCB(RpMaterial *material, void *data);
    // sets environment map intensity. Data is acually unsigned int
    static RpMaterial *SetEnvMapCoeffCB(RpMaterial *material, void *data);
    // do nothing
    static RpAtomic *SetRenderPipelinesCB(RpAtomic *atomic, void *data);
    // setups rendering pipelines for atomics in model (CCustomCarEnvMapPipeline::CustomPipeAtomicSetup)
    void SetRenderPipelines();
    // gets car plate text
    // return m_plateText[0] != '\0' ? m_plateText : NULL;
    char *GetCustomCarPlateText();
    // sets plate text
    void SetCustomCarPlateText(char *text);
    // gets max number of passengers for model
    static int GetMaximumNumberOfPassengersFromNumberOfDoors(int modelId);
    // remove some unused materials in model?
    void ReduceMaterialsInVehicle();
    // setup lights states for currenly rendered vehicle
    void SetupLightFlags(CVehicle *vehicle);
    // move all objects from data (it is actually RwFrame *) to frame
    static RwFrame *CollapseFramesCB(RwFrame *frame, void *data);
    // setup vehicle model components
    void PreprocessHierarchy();
    // setup environment map for atomic's materials. Data is actually int and it represents effect id
    static RpAtomic *SetEnvironmentMapAtomicCB(RpAtomic *atomic, void *data);
    // setup environment map intensity for atomic with data (unsigned int)
    static RpAtomic *SetEnvMapCoeffAtomicCB(RpAtomic *atomic, void *data);
    // setup custom plate
    void SetCarCustomPlate();
    // disable environment map effect on model
    void DisableEnvMap();
    // setup environment map intensity for model
    void SetEnvMapCoeff(float coeff);
};
#pragma pack(pop)
 
VALIDATE_SIZE(CVehicleModelInfo, 0x308);

Edit: Верните подсветку С++)

Last edited by DK22Pac (02-01-2014 08:48)

Offline

#168 23-01-2014 06:57

DK22Pac
From: Вінниця
Registered: 26-03-2010
Posts: 294
Website

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

Немного запоздалый ответ,

mfisto wrote:

потом найденный компонент вставлял в ту процедуру, но вылет.

Как оказалось, это не _stdcall, а _thiscall, просто this там не используется. Т.е. надо вызывать через 0AA6.

Offline

#169 02-02-2014 19:08

mfisto
From: Perm
Registered: 01-02-2008
Posts: 448
Website

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

Немного запоздалый ответ

На днях попробую, только сперва надо решить проблему с новым клео (ни один скрипт не стартует).


I know everything and nothing...

Offline

#170 09-10-2014 12:10

kenking
From: Казахстан, Чимкент
Registered: 28-06-2010
Posts: 149

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

Кто-нибудь находил в VC компонент по имени? Код, что привёл DK22Pac не работает. Просьба написать рабочий код поиска компонента по имени в VC.

Offline

Board footer

Powered by FluxBB