#151 19-06-2013 14:17

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

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

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

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;
    };
};
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 15:48)


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#152 20-06-2013 05:09

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

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

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

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

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

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

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

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 12:36

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
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).
До

RwFrame( bonnet_dummy )
|
+--RwFrame( bonnet_dummy_ok )
|     RpAtomic( ok_atomic )
|
+--RwFrame( bonnet_dummy_dam )
      RpAtomic( dam_atomic )

После

RwFrame( bonnet_dummy )
   RpAtomic( ok_atomic )
   RpAtomic( dam_atomic )
kenking wrote:

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

Увы, нету.

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


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#154 20-06-2013 15:54

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

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

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


I know everything and nothing...

Offline

#155 20-06-2013 17:07

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

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

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

}0RIC)-( wrote:

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

listener wrote:

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

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

{$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 18:05

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

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

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


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#157 22-06-2013 13:02

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

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

}0RIC)-( wrote:

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

{$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 14:34

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

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

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

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


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#159 23-06-2013 06:55

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

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

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

Offline

#160 28-06-2013 05:13

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

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

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

Offline

#161 29-06-2013 07:51

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

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

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


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#162 29-06-2013 09:20

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

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

Спасибо.

Offline

#163 27-10-2013 22:34

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

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

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


I know everything and nothing...

Offline

#164 28-10-2013 16:43

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

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

Есть функция

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

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

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

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

0 - X
1 - Y
2 - Z

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


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#165 29-10-2013 00:33

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

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

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

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

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


I know everything and nothing...

Offline

#166 29-10-2013 06:13

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

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

mfisto wrote:

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

вариант 1

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

{$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 04:35

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

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

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

#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 04:48)


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#168 23-01-2014 02:57

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

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

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

mfisto wrote:

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

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


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#169 02-02-2014 15:08

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

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

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

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


I know everything and nothing...

Offline

#170 16-02-2014 01:42

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

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

Товарищи, а у кого-нибудь получалось найти доступ к компонентам объекта, созданного скриптом?
В структурах объектов, созданных скриптом, по смещению:

CEntity +0x18 = [dword] Указатель на RwObject (RpClump)

почему-то всё время записан ноль.

Offline

#171 04-03-2014 09:26

Seemann
Registered: 07-08-2006
Posts: 2,155

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

DK22Pac wrote:

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

Вернул cool Если заметите на каких-нибудь страницах ошибки, связанные с новой подсветкой, пишите в ПМ.

Offline

#172 25-06-2014 12:26

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

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

Подскажите пожалуйста ответы на следующие вопросы:
1) Можно ли скриптом  у компонента авто, например у компонента авто игрока, изменить положение локальных осей не меняя при этом положения самого компонента (тоже самое про вращение локальных осей без вращения самого компонента)?
2) Можно ли скриптом отключить у транспорта, например у авто игрока, тень по подобию, как можно отключить коллизию?

Если можно, то пожалуйста напишите пример в клео.

Offline

#173 27-06-2014 00:48

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

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

Den_spb, после создания обьекта поставь wait.
kenking, это надо двигать вершины модели. Или создать дополнительный дочерний дамми.
Для теней я делал такой плагин (там "деревянные" тени заменяются на динамические)
http://www.gtagarage.com/mods/show.php?id=26155
Может он сможет решить проблемы?

Last edited by DK22Pac (27-06-2014 00:55)


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#174 27-06-2014 08:20

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

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

DK22Pac wrote:

это надо двигать вершины модели. Или создать дополнительный дочерний дамми.

Не, надо не редактируя саму модель в редакторе, а именно клео скриптом. Ну например, возьмём компонент дверь. Этот компонент вращается вокруг своих локальных осей, положение, которых выставляется изначально при создании модели в редакторе 3d. Вот интересует - возможно ли скриптом переместить эти оси для изменения места вращения этого компонента не перемещая при этом сам компонент?

DK22Pac wrote:

Для теней я делал такой плагин (там "деревянные" тени заменяются на динамические)
Может он сможет решить проблемы?

Спасибо, про этот твой плагин я знаю. Хорошая вещь. good
Но интересует возможность отключить скриптом у отдельно взятого транспорта тень совсем, а не заменить на качественную.

Offline

#175 20-07-2014 14:13

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

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

Den_spb wrote:

1) Можно ли прицепить произвольный объект к какому-либо компоненту транспорта.

Можно.
.....
1.При движении автомобиля на большой скорости объект немного отстаёт от него.
2.После удаления транспорта объект перемещается в мировые координаты, равные заданным оффсетам.

А отцепить без удаления транспорта как?

Offline

Board footer

Powered by FluxBB