2025-07-29 20:23:06 +03:00

127 lines
3.9 KiB
C++

#pragma once
// used: call virtual function
#include "../../utilities/memory.h"
// used: color_t
#include "../datatypes/color.h"
// used: stronghandle
#include "../datatypes/stronghandle.h"
// used: keyvalue3
#include "../datatypes/keyvalue3.h"
// used vector4d_t
#include "../datatypes/vector.h"
// used: cbasehandle
#include "../entity_handle.h"
class CMaterial2
{
public:
virtual const char* GetName() = 0;
virtual const char* GetShareName() = 0;
};
// idk
struct MaterialKeyVar_t
{
std::uint64_t uKey;
const char* szName;
MaterialKeyVar_t(std::uint64_t uKey, const char* szName) :
uKey(uKey), szName(szName) { }
MaterialKeyVar_t(const char* szName, bool bShouldFindKey = false) :
szName(szName)
{
uKey = bShouldFindKey ? FindKey(szName) : 0x0;
}
std::uint64_t FindKey(const char* szName)
{
using fnFindKeyVar = std::uint64_t(CS_FASTCALL*)(const char*, unsigned int, int);
static auto oFindKeyVar = reinterpret_cast<fnFindKeyVar>(MEM::FindPattern(PARTICLES_DLL, CS_XOR("48 89 5C 24 ? 57 48 81 EC ? ? ? ? 33 C0 8B DA")));
#ifdef CS_PARANOID
CS_ASSERT(oFindKeyVar != nullptr);
#endif
// idk those enum flags, just saw it called like that soooo yea
return oFindKeyVar(szName, 0x12, 0x31415926);
}
};
class CObjectInfo
{
MEM_PAD(0xB0);
int nId;
};
class CSceneAnimatableObject
{
MEM_PAD(0xB8);
CBaseHandle hOwner;
};
// the naming is incorrect but i dont care atm
class CMeshData
{
public:
void SetShaderType(const char* szShaderName)
{
// @ida: #STR: shader, spritecard.vfx
using fnSetMaterialShaderType = void(CS_FASTCALL*)(void*, MaterialKeyVar_t, const char*, int);
static auto oSetMaterialShaderType = reinterpret_cast<fnSetMaterialShaderType>(MEM::FindPattern(PARTICLES_DLL, CS_XOR("48 89 5C 24 ? 48 89 6C 24 ? 56 57 41 54 41 56 41 57 48 83 EC ? 0F B6 01 45 0F B6 F9 8B 2A 4D 8B E0 4C 8B 72 ? 48 8B F9 C0 E8 ? 24 ? 3C ? 74 ? 41 B0 ? B2 ? E8 ? ? ? ? 0F B6 07 33 DB C0 E8 ? 24 ? 3C ? 75 ? 48 8B 77 ? EB ? 48 8B F3 4C 8D 44 24 ? C7 44 24 ? ? ? ? ? 48 8D 54 24 ? 89 6C 24 ? 48 8B CE 4C 89 74 24 ? E8 ? ? ? ? 8B D0 83 F8 ? 75 ? 45 33 C9 89 6C 24 ? 4C 8D 44 24 ? 4C 89 74 24 ? 48 8B D7 48 8B CE E8 ? ? ? ? 8B D0 0F B6 0F C0 E9 ? 80 E1 ? 80 F9 ? 75 ? 48 8B 4F ? EB ? 48 8B CB 8B 41 ? 85 C0 74 ? 48 8D 59 ? 83 F8 ? 76 ? 48 8B 1B 48 63 C2 4D 85 E4")));
#ifdef CS_PARANOID
CS_ASSERT(oSetMaterialShaderType != nullptr);
#endif
MaterialKeyVar_t shaderVar(0x162C1777, CS_XOR("shader"));
oSetMaterialShaderType(this, shaderVar, szShaderName, 0x18);
}
void SetMaterialFunction(const char* szFunctionName, int nValue)
{
using fnSetMaterialFunction = void(__fastcall*)(void*, MaterialKeyVar_t, int, int);
static auto oSetMaterialFunction = reinterpret_cast<fnSetMaterialFunction>(MEM::FindPattern(PARTICLES_DLL, CS_XOR("48 89 5C 24 ? 48 89 6C 24 ? 56 57 41 54 41 56 41 57 48 83 EC ? 0F B6 01 45 0F B6 F9 8B 2A 48 8B F9")));
#ifdef CS_PARANOID
CS_ASSERT(oSetMaterialFunction != nullptr);
#endif
MaterialKeyVar_t functionVar(szFunctionName, true);
oSetMaterialFunction(this, functionVar, nValue, 0x18);
}
// Credit: https://www.unknowncheats.me/forum/4270816-post6392.html
MEM_PAD(0x18); // 0x0
CSceneAnimatableObject* pSceneAnimatableObject; // 0x18
CMaterial2* pMaterial; // 0x20
CMaterial2* pMaterialCpy; // 0x28
MEM_PAD(0x10);
CObjectInfo* pObjectInfo;
MEM_PAD(0x8);
Color_t colValue;
};
class IMaterialSystem2
{
public:
CMaterial2*** FindOrCreateFromResource(CMaterial2*** pOutMaterial, const char* szMaterialName)
{
return MEM::CallVFunc<CMaterial2***, 14U>(this, pOutMaterial, szMaterialName);
}
CMaterial2** CreateMaterial(CMaterial2*** pOutMaterial, const char* szMaterialName, CMeshData* pData)
{
return MEM::CallVFunc<CMaterial2**, 29U>(this, pOutMaterial, szMaterialName, pData, 0, 0, 0, 0, 0, 1);
}
void SetCreateDataByMaterial(const void* pData, CMaterial2*** const pInMaterial)
{
return MEM::CallVFunc<void, 37U>(this, pInMaterial, pData);
}
};