You are not logged in.
Ну меняй, в чём проблема.
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 0x69F 910 num_params 2 pop 2 "new_name" 1@ // strcpy(dst, src) |
Last edited by DK22Pac (19-06-2013 19:48)
Offline
Спасибо.
Название компонента перезаписывается, только вот конечный нужный результат не получен. Я всё пытаюсь получить доступ к вложенным компонентам (произвольно добавленным) во вращающиеся компоненты модели (двери, капот и багажник). Думал схитрить - перезаписать имя компонента и получить потом доступ к вложенным компонентам, но не всё так просто оказалось. Имя компонента перезаписалось и этот компонент находится функцией
1 | 0AA7: call_function 0x4C 5400 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
Тут могу ошибаться,
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 ) |
А вообще на русском языке есть какая-нибудь документация по RwFrame?
Увы, нету.
Last edited by DK22Pac (20-06-2013 16:52)
Offline
Вот такой вопрос возник, опкодом можно задать номер авто (numplate), но из двух меняется только один, второй остается рандомным, как это исправить, заранее можно ли задать не для одного номера, а сразу все?
I know everything and nothing...
Offline
DK22Pac, спасибо, буду разбираться.
Ну к примеру "приаттачить" бампер этой машины к колесу этой же машины, чтобы крутился, двигался вместе с ним, это возможно?
кстате, заодно вопрос, как "сбросить" компонент, т.е. вернуть его в исходные координаты?опять же, это возможно?=)
Скорее всего - не получится.
Вращение обрабатывается специальными коллбэками, которые мняют углы в зависимости от времени.
Насколько я помню, в коллбэках обрабатывается только один атомик, и прикрепление атомиков друг к другу не предусмотрено.
Как оказалось такое возможно. Стоило покопаться в базе и вот результат:
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@ + 0x 678 // бампер передний 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@ + 0x 4 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 0x59AF 80 struct 6@ num_params 3 pop 0 0.0 0.0 0.0 // CMatrix__setPos (Z Y X) // разворачиваем !!! для некоторых компонентов без надобности 0AA6: call_method 0x59B 020 struct 6@ num_params 1 pop 0 - 3.14 // CMatrix__rotateAroundZ // прикрепляем второй компонент к первому 0AA5: call_function 0x7F0B 00 num_params 2 pop 2 4@ 3@ // _RwFrameAddChild 10@ = 2 end else // возвращаем компонент на своё место 0AA6: call_method 0x59AF 80 struct 6@ num_params 3 pop 0 9@ 8@ 7@ // CMatrix__setPos (Z Y X) // разворачиваем обратно !!! для некоторых компонентов без надобности 0AA6: call_method 0x59B 020 struct 6@ num_params 1 pop 0 0.0 // CMatrix__rotateAroundZ // прикрепляем второй компонент к "родителю" 0AA5: call_function 0x7F0B 00 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 |
После цепляния одного компонента к другому он поддаётся управлению, так что таким образом можно решить мой же вопрос
но дальше доступ получить к вложенным компонентам всё также не удаётся.
Может у кого есть какие идеи, как это всё же можно сделать?
Offline
kenking, в ImVehFt это сделано через перехват вызова функции, которая удаляет фрйемы.
Offline
другой вопрос: можно ли узнать количество 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@ += 0x 18 0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 0AA7: call_function 0x4C 5400 num_params 2 pop 2 _nodename "chassis_dummy" _rwObject 1@ _store_to 2@ if 2@ > 0 then 0AA7: call_function 0x7F09B 0 num_params 1 pop 1 2@ 3@ // _RwFrameGetRoot if // вообще-то лишнее, корень иераррхии у модели есть всегда 3@ > 0 then 0AA7: call_function 0x7F0E 00 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
kenking, поздновато ты отвечаешь, }0RIC)-( сейчас разрабатывает свой игровой движок и забил на гта
Last edited by DK22Pac (22-06-2013 18:35)
Offline
Когда нашёл ответ на вопрос, тогда и ответил. Если бы знал раньше, то и написал бы соответственно тогда. Тема предназначена не только для одного }0RIC)-(. Может кому ещё эта информация пригодится. А вообще лучше поздно, чем никогда.:D
Offline
DK22Pac, объясни пожалуйста, что получаем после вызова _RwFrameGetLTM
Offline
kenking, матрицу компонента в мировом пространстве.
Offline
Спасибо.
Offline
Есть функция
1 | 0x6DBA 30 ; void __stdcall RotateVehicleComponent(RwFrame *component, int axis, float angle, char rotationType) |
В CLEO должна вызываться так
1 | 0AA5: call 0x6DBA 30 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
как покрутить по оси 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@ + 0x 18 0A8D: 2@ = read_memory 2@ size 4 virtual_protect 0 0AA7: call_function 0x4C 5400 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} 0x7F 1010 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@ + 0x 18 0A8D: 2@ = read_memory 2@ size 4 virtual_protect 0 0AA7: call_function 0x4C 5400 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} 0x59AFA 0 struct 3@ num_params 1 pop 0 4@ wait 0 end end end end end |
Offline
На основе появившейся кучи информации, составил класс 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; __int 8 field_60[464]; RpMaterial *m_apDirtMaterials[16]; __int 8 field_270[64]; unsigned __int 8 m_anPrimaryColors[8]; unsigned __int 8 m_anSecondaryColors[8]; unsigned __int 8 m_anTertiaryColors[8]; unsigned __int 8 m_anQuaternaryColors[8]; unsigned __int 8 m_nNumColorVariations; unsigned __int 8 m_nLastColorVariation; unsigned __int 8 m_nPrimaryColor; unsigned __int 8 m_nSecondaryColor; unsigned __int 8 m_nTertiaryColor; unsigned __int 8 m_nQuaternaryColor; __int 16 m_awUpgrades[18]; __int 16 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 __int 8 *ms_currentCol; // number of wheel upgrades available // tatic __int16 ms_numWheelUpgrades[4]; static __int 16 *ms_numWheelUpgrades; // wheels upgrades data // static __int16 ms_upgradeWheels[15][4]; static __int 16 *ms_upgradeWheels; // lights states for currently rendered car // static __int8 *ms_lightsOn[4]; static __int 8 *ms_lightsOn; // extras ids for next-spawned car // static __int8 ms_compsUsed[2]; static __int 8 *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
Немного запоздалый ответ,
потом найденный компонент вставлял в ту процедуру, но вылет.
Как оказалось, это не _stdcall, а _thiscall, просто this там не используется. Т.е. надо вызывать через 0AA6.
Offline
Кто-нибудь находил в VC компонент по имени? Код, что привёл DK22Pac не работает. Просьба написать рабочий код поиска компонента по имени в VC.
Offline