05E7: 1@ = car 0@ struct 1@ += 0x128 05E0: 1@ = read_memory 1@ size 4 virtual_protect 0 // получили указатель на handling-структуру для данного авто
0x4___fMass___________________________________dd 0x10__Dimensions.x____________________________dd 0x14__Dimensions.y____________________________dd 0x18__Dimensions.z____________________________dd 0x1C__CentreOfMass.x__________________________dd 0X20__CentreOfMass.y__________________________dd 0X24__CentreOfMass.z__________________________dd 0x28__nPercentSubmerged_______________________db 0x30__fTractionMultiplier_____________________dd 0xA4__fTractionLoss___________________________dd 0xA8__fTractionBias___________________________dd 0x7E__TransmissionData.nNumberOfGears_________db 0x84__TransmissionData.fMaxVelocity___________dd 0x??__TransmissionData.fEngineAcceleration____dd 0x7C__TransmissionData.nDriveType_____________db 0x7D__TransmissionData.nEngineType____________db 0x??__fBrakeDeceleration______________________dd 0x98__fBrakeBias______________________________dd 0x9C__bABS____________________________________db 0xA0__fSteeringLock___________________________dd 0xB0__fSuspensionForceLevel___________________dd 0xB4__fSuspensionDampingLevel_________________dd 0x??__fSeatOffsetDistance_____________________dd 0xC4__fCollisionDamageMultiplier______________dd 0x??__nMonetaryValue__________________________dd 0xB8__suspension upper limit__________________dd 0xBC__suspension lower limit__________________dd 0xC0__suspension bias between front and rear__dd 0xC8__flags___________________________________dd 0x??__front lights____________________________db 0x??__rear lights_____________________________db]]>
Смещение_______Обозначение_____________Пояснение ___________в иерархии модели_______________________ 0x380______wheel_rf_dummy_________правое переднее колесо 0x384______wheel_rm_dummy________правое среднее колесо 0x388______wheel_rb_dummy________правое заднее колесо 0x38C______wheel_lf_dummy_________левое переднее колесо 0x390______wheel_lm_dummy________левое среднее колесо 0x394______wheel_lb_dummy________левое заднее колесо 0x398______bump_front_dummy_______передний бампер 0x39C______bump_rear_dummy_______задний бампер 0x3A0______wing_rf_dummy__________правое переднее крыло 0x3A4______wing_rr_dummy_________правое заднее крыло 0x3A8______door_rf_dummy_________правая передняя дверь 0x3AC______door_rr_dummy_________правая задняя дверь 0x3B0______wing_lf_dummy__________левое переднее крыло 0x3B4______wing_lr_dummy_________левое заднее крыло 0x3B8______door_lf_dummy__________левая передняя дверь 0x3BC______door_lr_dummy__________левая задняя дверь 0x3C0______bonnet_dummy__________ капот 0x3C4______boot_dummy___________багажник 0x3C8______windscreen_dummy_______лобовое стекло]]>
#include <iostream> #include <windows.h> #include <string> #include <conio.h> #include <fstream> #include <iomanip> #include <stdio.h> #include <io.h> #include <fcntl.h> #include <mmsystem.h> #include <tlhelp32.h> #pragma comment(lib, "winmm") using namespace std; DWORD WINAPI GtaSA_thread (LPVOID); DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return true; } void CreateConsole () { int hConHandle = 0; HANDLE lStdHandle = 0; FILE *fp = 0; AllocConsole (); SetConsoleTitle ("ID "); lStdHandle = GetStdHandle (STD_OUTPUT_HANDLE); hConHandle = _open_osfhandle (PtrToUlong (lStdHandle), _O_TEXT); fp = _fdopen (hConHandle, "w"); *stdout = *fp; setvbuf (stdout, NULL, _IONBF, 0); } int* ReadPointer (DWORD base, int offsets [], int level) { int* pointer = (int*)base; for (int i = 0; i < level; i++) { pointer = (int*)(*pointer + offsets[i]); printf("pointer = 0x%X / *pointer = 0x%X\n", pointer, *pointer); } return pointer; } void MEMwrite(void *adr, void *ptr, int size) { DWORD OldProtection; VirtualProtect(adr,size,PAGE_EXECUTE_READWRITE, &OldProtection); memcpy(adr,ptr,size); VirtualProtect(adr,size,OldProtection, &OldProtection); } DWORD WINAPI GtaSA_thread (LPVOID) { int* pointer0 = 0; DWORD base = 0xBA18FC; int offsets[1] = { 0x00 }; pointer0 = ReadPointer (base, offsets, 0); DWORD*var = (DWORD*)(0x6CC3B2); DWORD*var2 = (DWORD*)(0x6C9103); DWORD*var3 = (DWORD*)(0x406AF3); DWORD*var4 = (DWORD*)(0x6c9690); DWORD*var5 = (DWORD*)(0x6C9F1C); DWORD*var6 = (DWORD*)(0x6C8F10); DWORD*var7 = (DWORD*)(0x6d9c06); DWORD*var8 = (DWORD*)(0x6cd78a); CreateConsole (); for (;;Sleep (100)) { if (*pointer0) { int offsets[2] = { 0x384, 0x00 }; int* pointer = 0; pointer = ReadPointer (base, offsets, 2); if (*pointer == 188) { *var = 0x01DCF981; *var2 = 0x01DC227E; *var3 = 0x01DC227E; *var4 = 0x01DC227E; *var5 = 0x01DC3D66; *var6 = 0x01DCFF81; *var7 = 0x01DC227E; *var8 = 0x01DCB800; // MEMwrite ((void*)(adr), (void*)"1", 1); // MEMwrite ((void*)(adr2), (void*)"1", 1); }else { *var = 0x0208F981; *var2 = 0x0208227E; *var3 = 0x0208227E; *var4 = 0x0208227E; *var5 = 0x02083D66; *var6 = 0x0208FF81; *var7 = 0x0208227E; *var8 = 0x0208B800; } } } }
результат: у rustlera появляются все функции hydra, в.ч. работающие (поворачивающиеся) сопла, вертикальный взлет/посадка, но шасси не работают
]]>208h = 520 => т.е. hydra
В теории, можно попробовать убрать эту проверку
]]>text:006CC3B1 loc_6CC3B1: ; CODE XREF: CPlane__m110+BBF j .text:006CC3B1 0A4 cmp cx, 208h .text:006CC3B6 0A4 jnz loc_6CC461 .text:006CC3BC 0A4 test byte ptr [esi+36h], 0F8h .text:006CC3C0 0A4 jnz loc_6CC461 .text:006CC3C6 0A4 movzx edx, word ptr [esi+86Ch] .text:006CC3CD 0A4 movsx eax, word_8D33C8 .text:006CC3D4 0A4 cmp edx, eax .text:006CC3D6 0A4 jl loc_6CC461 .text:006CC3DC 0A4 mov eax, _modelPtrs+6A4h .text:006CC3E1 0A4 mov edi, [esi+388h] .text:006CC3E7 0A4 xor ecx, ecx .text:006CC3E9 0A4 mov cl, [eax+4Ah] .text:006CC3EC 0A4 push ecx ; id .text:006CC3ED 0A8 mov ecx, offset handlingData .text:006CC3F2 0A8 call CHandlingData__getFlyingHandling .text:006CC3F7 0A4 fld dword ptr [esi+994h] .text:006CC3FD 0A4 fcomp ds:dbl_859EF8 .text:006CC403 0A4 mov [esi+388h], eax .text:006CC409 0A4 fnstsw ax .text:006CC40B 0A4 test ah, 41h .text:006CC40E 0A4 jz short loc_6CC422 .text:006CC410 0A4 cmp byte ptr [esi+960h], 4 .text:006CC417 0A4 jnb short loc_6CC451 .text:006CC419 0A4 test dword ptr [esi+40h], 8000000h .text:006CC420 0A4 jnz short loc_6CC451 .text:006CC422 .text:006CC422 loc_6CC422: ; CODE XREF: CPlane__m110+C4E j]]>
Смещение_______Обозначение_____________Пояснение ___________в иерархии модели_______________________ 0x398______wheel_rf_dummy_________правое переднее колесо 0x39C______wheel_rm_dummy________правое среднее колесо 0x3A0______wheel_rb_dummy________правое заднее колесо 0x3A4______wheel_lf_dummy_________левое переднее колесо 0x3A8______wheel_lm_dummy________левое среднее колесо 0x3AC______wheel_lb_dummy________левое заднее колесо 0x3B0______bump_front_dummy_______передний бампер 0x3B4______bump_rear_dummy_______задний бампер 0x3B8______wing_rf_dummy__________правое переднее крыло 0x3BC______wing_rr_dummy_________правое заднее крыло 0x3C0______door_rf_dummy_________правая передняя дверь 0x3C4______door_rr_dummy_________правая задняя дверь 0x3C8______wing_lf_dummy__________левое переднее крыло 0x3CC______wing_lr_dummy_________левое заднее крыло 0x3D0______door_lf_dummy__________левая передняя дверь 0x3D4______door_lr_dummy__________левая задняя дверь 0x3D8______bonnet_dummy__________ капот 0x3DC______boot_dummy___________багажник 0x3E0______windscreen_dummy_______лобовое стекло
Подскажите пожалуйста, как в клео скрипте определить на какой угол развёрнут произвольный компонент машины в VC
Shag, вот поиск компонента по имени. В игре не проверялось.
05E7: 1@ = car 0@ struct 1@ += 0x4C 05E0: 1@ = read_memory 1@ size 4 virtual_protect 0 1@ += 4 05E0: 1@ = read_memory 1@ size 4 virtual_protect 0 05F8: 4@ = var 2@ offset 05F7: 2@ = label @dummy_name offset 3@ = 0 05E1: call 0x645060 num_params 3 pop 3 4@ 0x5411E0 1@ if 3@ > 0 then // Получили результат в переменную 3@ end // -- name -- :dummy_name hex "mydummy" 00 end
Не работает. Если не затруднит, то поправь пожалуйста до рабочего варианта.
]]>1) Можно ли прицепить произвольный объект к какому-либо компоненту транспорта.
Можно.
.....
1.При движении автомобиля на большой скорости объект немного отстаёт от него.
2.После удаления транспорта объект перемещается в мировые координаты, равные заданным оффсетам.
А отцепить без удаления транспорта как?
]]>это надо двигать вершины модели. Или создать дополнительный дочерний дамми.
Не, надо не редактируя саму модель в редакторе, а именно клео скриптом. Ну например, возьмём компонент дверь. Этот компонент вращается вокруг своих локальных осей, положение, которых выставляется изначально при создании модели в редакторе 3d. Вот интересует - возможно ли скриптом переместить эти оси для изменения места вращения этого компонента не перемещая при этом сам компонент?
Для теней я делал такой плагин (там "деревянные" тени заменяются на динамические)
Может он сможет решить проблемы?
Спасибо, про этот твой плагин я знаю. Хорошая вещь.
Но интересует возможность отключить скриптом у отдельно взятого транспорта тень совсем, а не заменить на качественную.
Если можно, то пожалуйста напишите пример в клео.
]]>Верните подсветку С++)
Вернул Если заметите на каких-нибудь страницах ошибки, связанные с новой подсветкой, пишите в ПМ.
]]>CEntity +0x18 = [dword] Указатель на RwObject (RpClump)
почему-то всё время записан ноль.
]]>Немного запоздалый ответ
На днях попробую, только сперва надо решить проблему с новым клео (ни один скрипт не стартует).
]]>потом найденный компонент вставлял в ту процедуру, но вылет.
Как оказалось, это не _stdcall, а _thiscall, просто this там не используется. Т.е. надо вызывать через 0AA6.
]]>#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: Верните подсветку С++)
]]>