Начинающий
-
Автор темы
- #1
Всем привет, хочу показать как менять материал на оружиях и тд и тп.
SPOILER- Дополняю материал(Поиск материалов).
Дополнил
CEntity::GetMaterial(...........);
IMaterial::GetName();
Теперь пишем код и всё работает.
CEntityIt * pEntIt = SSystemGlobalEnvironment::Singleton()->GetEntitySystem()->GetEntityIterator();
for (; CEntity * pEnt = pEntIt->Next();)
{
IMaterial* pMaterial = SSystemGlobalEnvironment::Singleton()->Get3DEngine()->GetMaterialManager()->LoadMaterial("Objects/effects/forcefield/materials/forcefield_act2_b.mtl");
if (pMaterial)
{
pEnt->SetMaterial(pMaterial);
}
}
};
class IMaterial
{
public:
const char* GetName() { return CallFunction<const char* (__fastcall*)(PVOID64)>(this, 0x30)(this); } -- Новое!
Find -> _can't_resolve_material_name_
one xref, 5f pseudocode
Видим такой код
________________________________________________________
else
{
v171 = *(_DWORD *)(v158 + 60);
v172 = aCanTResolveMat;
if ( v171 >= 0 && v171 < (int)((__int64)(a5[1] - *a5) >> 3) )
{
if ( v169 )
v172 = (char *)(*(__int64 (__fastcall **)(__int64))(*(_QWORD *)v169 + 48i64))(v169); <---------- 48 convert hex = 0x30;
else
v172 = &szAgent;
}
sub_1400D2DA0(aWarningRemoved, *(float *)(v158 + 36), *(float *)(v158 + 40), *(float *)(v158 + 44), v172);
(*(void (__fastcall **)(__int64))(*(_QWORD *)v163 + 88i64))(v163);
}
goto LABEL_221;
};
Можно менять и у других ентити материалы тоже так же,Хотите другой материал ищи его сами.
SPOILER- Дополняю материал(Поиск материалов).
Дополнил
CEntity::GetMaterial(...........);
IMaterial::GetName();
C++:
class SSystemGlobalEnvironment
{
public:
I3DEngine* Get3DEngine() { return *(I3DEngine**)((uintptr_t)this + 0x100); }
/*
Ищем I3DEngine;
1)Поиск SunShafts_Active;
2)жмем x, переходим по 1 ссылке,нажимаем f5
3)Поднимаемся в самый вверх функции и видим такое:
4)
v52 = *(_QWORD *)(SSystemGlobalEnvironment + 72);
v63 = *(_QWORD *)(SSystemGlobalEnvironment + 256); 256 переводим в hex и получаем 256 to hex = 0x100;
*/
static SSystemGlobalEnvironment* Singleton() { return *(SSystemGlobalEnvironment**)SystemGlobalEnvironment; }
};
class I3DEngine
{
public:
IMaterialManager* GetMaterialManager()
{
return CallFunction<IMaterialManager* (__thiscall*)(PVOID)>(this, 0x450)(this);
}
/*
Find->EntityLinks;
One xref, 5f;
205 string;
code view->
LABEL_53:
v31 = v80;
if ( v80 )
{
if ( *v80 )
{
v32 = (*(__int64 (__fastcall **)(_QWORD))(**(_QWORD **)(qword_141EF2480 + 0x100) + 0x450i64))(*(_QWORD *)(qword_141EF2480 + 0x100)); qword_141EF2480 + 256 + 1104 gEnv->I3DEngine->GetMaterialManager() <- 1104
LOBYTE(v33) = 1;
v34 = (*(__int64 (__fastcall **)(__int64, _BYTE *, __int64, _QWORD, _DWORD))(*(_QWORD *)v32 + 0x28i64))(
v32,
v31,
v33,
0i64,
0);
if ( v34 )
(*(void (__fastcall **)(__int64, __int64))(*(_QWORD *)v7 + 544i64))(v7, v34);
}
}
v35 = a1[6];
if ( v18 )
{
*/
};
class IMaterialManager
{
public:
IMaterial* LoadMaterial(const char* sMtName, bool bMakelfNotFound = true, bool bNonremovable = false, unsigned long nLoadingFlags = 0)
{
return CallFunction<IMaterial* (__thiscall*)(PVOID, const char*, bool, bool, unsigned long)>(this, 0x28)(this, sMtName, bMakelfNotFound, bNonremovable, nLoadingFlags);
}
/*
Find->EntityLinks;
One xref, 5f;
205 string;
code view->
LABEL_53:
v31 = v80;
if ( v80 )
{
if ( *v80 )
{
v32 = (*(__int64 (__fastcall **)(_QWORD))(**(_QWORD **)(qword_141EF2480 + 0x100) + 0x450i64))(*(_QWORD *)(qword_141EF2480 + 0x100)); qword_141EF2480 + 256 + 1104
LOBYTE(v33) = 1;
v34 = (*(__int64 (__fastcall **)(__int64, _BYTE *, __int64, _QWORD, _DWORD))(*(_QWORD *)v32 + 0x28i64)) ----->( v32 + 40i) <---- 40 - LoadMaterial();
v32,
v31,
v33,
0i64,
0);
if ( v34 )
(*(void (__fastcall **)(__int64, __int64))(*(_QWORD *)v7 + 544i64))(v7, v34);
}
}
v35 = a1[6];
if ( v18 )
{
*/
};
class CEntity
{
public:
void SetMaterial(IMaterial* pMaterial) { CallFunction<void(__fastcall*)(PVOID, IMaterial*)>(this, 0x220)(this, pMaterial); }
IMaterial* GetMaterial() { return CallFunction<IMaterial* (__fastcall*)(PVOID64)>(this, 0x228)(this); } - Новое!!!
};
CEntityIt * pEntIt = SSystemGlobalEnvironment::Singleton()->GetEntitySystem()->GetEntityIterator();
for (; CEntity * pEnt = pEntIt->Next();)
{
IMaterial* pMaterial = SSystemGlobalEnvironment::Singleton()->Get3DEngine()->GetMaterialManager()->LoadMaterial("Objects/effects/forcefield/materials/forcefield_act2_b.mtl");
if (pMaterial)
{
pEnt->SetMaterial(pMaterial);
}
}
};
class IMaterial
{
public:
const char* GetName() { return CallFunction<const char* (__fastcall*)(PVOID64)>(this, 0x30)(this); } -- Новое!
Find -> _can't_resolve_material_name_
one xref, 5f pseudocode
Видим такой код
________________________________________________________
else
{
v171 = *(_DWORD *)(v158 + 60);
v172 = aCanTResolveMat;
if ( v171 >= 0 && v171 < (int)((__int64)(a5[1] - *a5) >> 3) )
{
if ( v169 )
v172 = (char *)(*(__int64 (__fastcall **)(__int64))(*(_QWORD *)v169 + 48i64))(v169); <---------- 48 convert hex = 0x30;
else
v172 = &szAgent;
}
sub_1400D2DA0(aWarningRemoved, *(float *)(v158 + 36), *(float *)(v158 + 40), *(float *)(v158 + 44), v172);
(*(void (__fastcall **)(__int64))(*(_QWORD *)v163 + 88i64))(v163);
}
goto LABEL_221;
};
Можно менять и у других ентити материалы тоже так же,Хотите другой материал ищи его сами.
Последнее редактирование: