501 lines
18 KiB
C++
501 lines
18 KiB
C++
#include "chams.h"
|
|
|
|
// used: game's interfaces
|
|
#include "../../core/interfaces.h"
|
|
#include "../../sdk/interfaces/imaterialsystem.h"
|
|
#include "../../sdk/interfaces/igameresourceservice.h"
|
|
#include "../../sdk/interfaces/cgameentitysystem.h"
|
|
#include "../../core/sdk.h"
|
|
#include "../../sdk/entity.h"
|
|
#include "../cstrike/sdk/datatypes/resourceutils.h"
|
|
#include "../cstrike/sdk/datatypes/buf/utlbuffer.h"
|
|
|
|
#include <iostream>
|
|
// used: original call in hooked function
|
|
#include "../../core/hooks.h"
|
|
|
|
// used: cheat variables
|
|
#include"../cstrike/sdk/interfaces/imaterialsystem.h"
|
|
#include "../../core/variables.h"
|
|
#include <stdexcept>
|
|
inline bool(CS_FASTCALL* fnLoadBuffer)(CUtlBuffer*) = nullptr;
|
|
|
|
// custom material
|
|
struct custom_material_data_t {
|
|
material2_t* m_material;
|
|
material2_t* m_material_z;
|
|
};
|
|
|
|
// material list.
|
|
enum material_list_t {
|
|
material_white,
|
|
material_default,
|
|
material_illum,
|
|
material_size
|
|
};
|
|
|
|
// array
|
|
static custom_material_data_t array_materials[material_size]; // material max
|
|
|
|
material2_t* create_material_glow2_visible(const char* m_name) {
|
|
const char szVmatBuffer[] = R"#(<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d}
|
|
format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
|
|
{
|
|
shader = "solidcolor.vfx"
|
|
F_SELF_ILLUM = 1
|
|
F_PAINT_VERTEX_COLORS = 1
|
|
F_TRANSLUCENT = 1
|
|
F_IGNOREZ = 0
|
|
F_DISABLE_Z_WRITE = 0
|
|
F_DISABLE_Z_BUFFERING = 0
|
|
|
|
g_tColor = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tNormal = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tRoughness = resource:"materials/default/default_normal_tga_b3f4ec4c.vtex"
|
|
g_tMetalness = resource:"materials/default/default_normal_tga_b3f4ec4c.vtex"
|
|
g_tSelfIllumMask = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
TextureAmbientOcclusion = resource:"materials/debug/particleerror.vtex"
|
|
g_tAmbientOcclusion = resource:"materials/debug/particleerror.vtex"
|
|
|
|
g_vColorTint = [ 20.000000, 20.000000, 20.000000, 20.000000 ]
|
|
g_flSelfIllumScale = [ 5.000000, 5.000000, 5.000000, 5.000000 ]
|
|
g_flSelfIllumBrightness = [ 5.000000, 5.000000, 5.000000, 5.000000 ]
|
|
g_vSelfIllumTint = [ 10.000000, 10.000000, 10.000000, 10.000000 ]
|
|
} )#";
|
|
|
|
auto buffer = new unsigned char[0x100 + sizeof(CKeyValues3)];
|
|
CRT::MemorySet(buffer, 0, sizeof(buffer));
|
|
CKeyValues3* kv3 = (CKeyValues3*)(buffer + 0x100);
|
|
|
|
KV3IVD_t kv3ID;
|
|
kv3ID.szName = m_name;
|
|
kv3ID.unk0 = 0x469806E97412167C;
|
|
kv3ID.unk1 = 0xE73790B53EE6F2AF;
|
|
|
|
if (!MEM::load_key_value(kv3, nullptr, szVmatBuffer, &kv3ID, nullptr))
|
|
throw;
|
|
|
|
material2_t** custom_material;
|
|
MEM::fnCreateMaterial(nullptr, &custom_material, m_name, kv3, 0, 1);
|
|
|
|
return *custom_material;
|
|
}
|
|
|
|
material2_t* create_material_glow2_invisible(const char* m_name) {
|
|
const char szVmatBuffer[] = R"#(<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d}
|
|
format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
|
|
{
|
|
shader = "solidcolor.vfx"
|
|
F_SELF_ILLUM = 1
|
|
F_PAINT_VERTEX_COLORS = 1
|
|
F_TRANSLUCENT = 1
|
|
F_IGNOREZ = 1
|
|
F_DISABLE_Z_WRITE = 1
|
|
F_DISABLE_Z_BUFFERING = 1
|
|
|
|
g_tColor = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tNormal = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tRoughness = resource:"materials/default/default_normal_tga_b3f4ec4c.vtex"
|
|
g_tMetalness = resource:"materials/default/default_normal_tga_b3f4ec4c.vtex"
|
|
g_tSelfIllumMask = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
TextureAmbientOcclusion = resource:"materials/debug/particleerror.vtex"
|
|
g_tAmbientOcclusion = resource:"materials/debug/particleerror.vtex"
|
|
|
|
g_vColorTint = [ 20.000000, 20.000000, 20.000000, 20.000000 ]
|
|
g_flSelfIllumScale = [ 5.000000, 5.000000, 5.000000, 5.000000 ]
|
|
g_flSelfIllumBrightness = [ 5.000000, 5.000000, 5.000000, 5.000000 ]
|
|
g_vSelfIllumTint = [ 10.000000, 10.000000, 10.000000, 10.000000 ]
|
|
} )#";
|
|
|
|
auto buffer = new unsigned char[0x100 + sizeof(CKeyValues3)];
|
|
CRT::MemorySet(buffer, 0, sizeof(buffer));
|
|
CKeyValues3* kv3 = (CKeyValues3*)(buffer + 0x100);
|
|
|
|
KV3IVD_t kv3ID;
|
|
kv3ID.szName = m_name;
|
|
kv3ID.unk0 = 0x469806E97412167C;
|
|
kv3ID.unk1 = 0xE73790B53EE6F2AF;
|
|
|
|
if (!MEM::load_key_value(kv3, nullptr, szVmatBuffer, &kv3ID, nullptr))
|
|
throw;
|
|
|
|
material2_t** custom_material;
|
|
MEM::fnCreateMaterial(nullptr, &custom_material, m_name, kv3, 0, 1);
|
|
|
|
return *custom_material;
|
|
}
|
|
|
|
material2_t* create_material_default_visible(const char* m_name) {
|
|
const char szVmatBuffer[] = R"(<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
|
|
{
|
|
shader = "csgo_complex.vfx"
|
|
F_PAINT_VERTEX_COLORS = 1
|
|
F_TRANSLUCENT = 1
|
|
|
|
g_vColorTint = [1, 1, 1, 1]
|
|
TextureAmbientOcclusion = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tAmbientOcclusion = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tColor = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tNormal = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tTintMask = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
|
|
})";
|
|
|
|
auto buffer = new unsigned char[0x100 + sizeof(CKeyValues3)];
|
|
CRT::MemorySet(buffer, 0, sizeof(buffer));
|
|
CKeyValues3* kv3 = (CKeyValues3*)(buffer + 0x100);
|
|
|
|
KV3IVD_t kv3ID;
|
|
kv3ID.szName = m_name;
|
|
kv3ID.unk0 = 0x469806E97412167C;
|
|
kv3ID.unk1 = 0xE73790B53EE6F2AF;
|
|
|
|
if (!MEM::load_key_value(kv3, nullptr, szVmatBuffer, &kv3ID, nullptr))
|
|
throw;
|
|
|
|
material2_t** custom_material;
|
|
MEM::fnCreateMaterial(nullptr, &custom_material, m_name, kv3, 0, 1);
|
|
|
|
return *custom_material;
|
|
}
|
|
material2_t* create_material_default_invisible(const char* m_name) {
|
|
const char szVmatBuffer[] = R"(<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
|
|
{
|
|
shader = "csgo_complex.vfx"
|
|
F_PAINT_VERTEX_COLORS = 1
|
|
F_TRANSLUCENT = 1
|
|
F_DISABLE_Z_BUFFERING = 1
|
|
|
|
g_vColorTint = [1, 1, 1, 1]
|
|
TextureAmbientOcclusion = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tAmbientOcclusion = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tColor = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tNormal = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tTintMask = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
|
|
})";
|
|
|
|
auto buffer = new unsigned char[0x100 + sizeof(CKeyValues3)];
|
|
CRT::MemorySet(buffer, 0, sizeof(buffer));
|
|
CKeyValues3* kv3 = (CKeyValues3*)(buffer + 0x100);
|
|
|
|
KV3IVD_t kv3ID;
|
|
kv3ID.szName = m_name;
|
|
kv3ID.unk0 = 0x469806E97412167C;
|
|
kv3ID.unk1 = 0xE73790B53EE6F2AF;
|
|
|
|
if (!MEM::load_key_value(kv3, nullptr, szVmatBuffer, &kv3ID, nullptr))
|
|
throw;
|
|
|
|
material2_t** custom_material;
|
|
MEM::fnCreateMaterial(nullptr, &custom_material, m_name, kv3, 0, 1);
|
|
|
|
return *custom_material;
|
|
}
|
|
material2_t* create_material_flat_visible(const char* m_name) {
|
|
const char szVmatBuffer[] = R"(<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
|
|
{
|
|
shader = "csgo_unlitgeneric.vfx"
|
|
F_PAINT_VERTEX_COLORS = 1
|
|
F_TRANSLUCENT = 1
|
|
F_BLEND_MODE = 1
|
|
|
|
g_vColorTint = [1, 1, 1, 1]
|
|
TextureAmbientOcclusion = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tAmbientOcclusion = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tColor = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tNormal = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tTintMask = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
|
|
})";
|
|
|
|
auto buffer = new unsigned char[0x100 + sizeof(CKeyValues3)];
|
|
CRT::MemorySet(buffer, 0, sizeof(buffer));
|
|
CKeyValues3* kv3 = (CKeyValues3*)(buffer + 0x100);
|
|
|
|
KV3IVD_t kv3ID;
|
|
kv3ID.szName = m_name;
|
|
kv3ID.unk0 = 0x469806E97412167C;
|
|
kv3ID.unk1 = 0xE73790B53EE6F2AF;
|
|
|
|
if (!MEM::load_key_value(kv3, nullptr, szVmatBuffer, &kv3ID, nullptr))
|
|
throw;
|
|
|
|
material2_t** custom_material;
|
|
MEM::fnCreateMaterial(nullptr, &custom_material, m_name, kv3, 0, 1);
|
|
|
|
return *custom_material;
|
|
}
|
|
material2_t* create_material_flat_invisible(const char* m_name) {
|
|
const char szVmatBuffer[] = R"(<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
|
|
{
|
|
shader = "csgo_unlitgeneric.vfx"
|
|
F_PAINT_VERTEX_COLORS = 1
|
|
F_TRANSLUCENT = 1
|
|
F_BLEND_MODE = 1
|
|
F_DISABLE_Z_BUFFERING = 1
|
|
|
|
g_vColorTint = [1, 1, 1, 1]
|
|
TextureAmbientOcclusion = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tAmbientOcclusion = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tColor = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tNormal = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tTintMask = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
|
|
})";
|
|
|
|
auto buffer = new unsigned char[0x100 + sizeof(CKeyValues3)];
|
|
CRT::MemorySet(buffer, 0, sizeof(buffer));
|
|
CKeyValues3* kv3 = (CKeyValues3*)(buffer + 0x100);
|
|
|
|
KV3IVD_t kv3ID;
|
|
kv3ID.szName = m_name;
|
|
kv3ID.unk0 = 0x469806E97412167C;
|
|
kv3ID.unk1 = 0xE73790B53EE6F2AF;
|
|
|
|
if (!MEM::load_key_value(kv3, nullptr, szVmatBuffer, &kv3ID, nullptr))
|
|
throw;
|
|
|
|
material2_t** custom_material;
|
|
MEM::fnCreateMaterial(nullptr, &custom_material, m_name, kv3, 0, 1);
|
|
|
|
return *custom_material;
|
|
}
|
|
material2_t* create_material_illum_visible(const char* m_name) {
|
|
const char szVmatBuffer[] = R"(<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
|
|
{
|
|
shader = "csgo_complex.vfx"
|
|
|
|
g_tColor = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tNormal = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tSelfIllumMask = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
TextureAmbientOcclusion = resource:"materials/debug/particleerror.vtex"
|
|
g_tAmbientOcclusion = resource:"materials/debug/particleerror.vtex"
|
|
|
|
g_vColorTint = [ 20.000000, 20.000000, 20.000000, 20.000000 ]
|
|
g_flSelfIllumScale = [ 5.000000, 5.000000, 5.000000, 5.000000 ]
|
|
g_flSelfIllumBrightness = [ 5.000000, 5.000000, 5.000000, 5.000000 ]
|
|
g_vSelfIllumTint = [ 10.000000, 10.000000, 10.000000, 10.000000 ]
|
|
|
|
F_SELF_ILLUM = 1
|
|
|
|
F_PAINT_VERTEX_COLORS = 1
|
|
|
|
F_TRANSLUCENT = 1
|
|
|
|
})";
|
|
|
|
auto buffer = new unsigned char[0x100 + sizeof(CKeyValues3)];
|
|
CRT::MemorySet(buffer, 0, sizeof(buffer));
|
|
CKeyValues3* kv3 = (CKeyValues3*)(buffer + 0x100);
|
|
|
|
KV3IVD_t kv3ID;
|
|
kv3ID.szName = m_name;
|
|
kv3ID.unk0 = 0x469806E97412167C;
|
|
kv3ID.unk1 = 0xE73790B53EE6F2AF;
|
|
|
|
if (!MEM::load_key_value(kv3, nullptr, szVmatBuffer, &kv3ID, nullptr))
|
|
throw;
|
|
|
|
material2_t** custom_material;
|
|
MEM::fnCreateMaterial(nullptr, &custom_material, m_name, kv3, 0, 1);
|
|
|
|
return *custom_material;
|
|
}
|
|
material2_t* create_material_illum_invisible(const char* m_name) {
|
|
const char szVmatBuffer[] = R"(<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{7412167c-06e9-4698-aff2-e63eb59037e7} -->
|
|
{
|
|
shader = "csgo_complex.vfx"
|
|
|
|
g_tColor = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tNormal = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
g_tSelfIllumMask = resource:"materials/default/default_mask_tga_fde710a5.vtex"
|
|
TextureAmbientOcclusion = resource:"materials/debug/particleerror.vtex"
|
|
g_tAmbientOcclusion = resource:"materials/debug/particleerror.vtex"
|
|
|
|
g_vColorTint = [ 20.000000, 20.000000, 20.000000, 20.000000 ]
|
|
g_flSelfIllumScale = [ 5.000000, 5.000000, 5.000000, 5.000000 ]
|
|
g_flSelfIllumBrightness = [ 5.000000, 5.000000, 5.000000, 5.000000 ]
|
|
g_vSelfIllumTint = [ 10.000000, 10.000000, 10.000000, 10.000000 ]
|
|
|
|
F_SELF_ILLUM = 1
|
|
|
|
F_PAINT_VERTEX_COLORS = 1
|
|
|
|
F_TRANSLUCENT = 1
|
|
|
|
F_DISABLE_Z_BUFFERING = 1
|
|
|
|
})";
|
|
|
|
auto buffer = new unsigned char[0x100 + sizeof(CKeyValues3)];
|
|
CRT::MemorySet(buffer, 0, sizeof(buffer));
|
|
CKeyValues3* kv3 = (CKeyValues3*)(buffer + 0x100);
|
|
|
|
KV3IVD_t kv3ID;
|
|
kv3ID.szName = m_name;
|
|
kv3ID.unk0 = 0x469806E97412167C;
|
|
kv3ID.unk1 = 0xE73790B53EE6F2AF;
|
|
|
|
if (!MEM::load_key_value(kv3, nullptr, szVmatBuffer, &kv3ID, nullptr))
|
|
throw;
|
|
|
|
material2_t** custom_material;
|
|
MEM::fnCreateMaterial(nullptr, &custom_material, m_name, kv3, 0, 1);
|
|
|
|
return *custom_material;
|
|
}
|
|
// other functions.
|
|
bool ams::chams_t::initialize() {
|
|
// first we have to check if this shit is alr initialized
|
|
if (this->m_initialized) {
|
|
return this->m_initialized;
|
|
}
|
|
|
|
// only initialize this for moment, later we're gonna init more
|
|
array_materials[material_list_t::material_white] = custom_material_data_t{
|
|
.m_material = CreateMaterial(CS_XOR("primary_white"), CS_XOR("materials/dev/primary_white.vmat"), CS_XOR("csgo_unlitgeneric.vfx"), true, true, false),
|
|
.m_material_z = CreateMaterial(CS_XOR("primary_white_invisible"), CS_XOR("materials/dev/primary_white.vmat"), CS_XOR("csgo_unlitgeneric.vfx"), true, true, true)
|
|
};
|
|
|
|
array_materials[material_list_t::material_default] = custom_material_data_t{
|
|
.m_material = CreateMaterial(CS_XOR("primary_white"), CS_XOR("materials/dev/primary_white.vmat"), CS_XOR("csgo_unlitgeneric.vfx"), true, true, false),
|
|
.m_material_z = CreateMaterial(CS_XOR("primary_white_invisible"), CS_XOR("materials/dev/primary_white.vmat"), CS_XOR("csgo_unlitgeneric.vfx"), true, true, true)
|
|
};
|
|
|
|
array_materials[material_list_t::material_illum] = custom_material_data_t{
|
|
.m_material = CreateMaterial(CS_XOR("primary_white"), CS_XOR("materials/dev/primary_white.vmat"), CS_XOR("csgo_unlitgeneric.vfx"), true, true, false),
|
|
.m_material_z = CreateMaterial(CS_XOR("primary_white_invisible"), CS_XOR("materials/dev/primary_white.vmat"), CS_XOR("csgo_unlitgeneric.vfx"), true, true, true)
|
|
};
|
|
|
|
// we initialized by now
|
|
this->m_initialized = true;
|
|
|
|
// iterate.
|
|
for (auto& [m_visible, m_invisible] : array_materials) {
|
|
if (m_visible == nullptr || m_invisible == nullptr)
|
|
this->m_initialized = false;
|
|
}
|
|
|
|
// finish and return value
|
|
return this->m_initialized;
|
|
}
|
|
|
|
void ams::chams_t::destroy() {
|
|
// nothing to destroy boss
|
|
}
|
|
|
|
bool ams::chams_t::draw_object(void* animatable_object, void* dx11, material_data_t* arr_material_data, int data_count,
|
|
void* scene_view, void* scene_layer, void* unk1, void* unk2) {
|
|
// check if we initialized.
|
|
if (!this->m_initialized) {
|
|
return false;
|
|
}
|
|
if (!C_GET(bool, Vars.bVisualChams))
|
|
{
|
|
return false;
|
|
}
|
|
if (!SDK::LocalPawn)
|
|
return false;
|
|
// no chams enable.
|
|
// return false
|
|
|
|
// no data on material
|
|
if (arr_material_data == nullptr) {
|
|
return false;
|
|
}
|
|
|
|
// no data on scene object.
|
|
if (arr_material_data->m_scene_animable == nullptr) {
|
|
return false;
|
|
}
|
|
|
|
// owner.
|
|
CBaseHandle m_owner = arr_material_data->m_scene_animable->m_owner;
|
|
|
|
// get entity.
|
|
auto m_entity = I::GameResourceService->pGameEntitySystem ->Get< C_BaseEntity >(m_owner);
|
|
if (m_entity == nullptr) {
|
|
return false;
|
|
}
|
|
|
|
// schema info
|
|
SchemaClassInfoData_t* m_class_info;
|
|
m_entity->GetSchemaClassInfo(&m_class_info);
|
|
if (m_class_info == nullptr) {
|
|
return false;
|
|
}
|
|
|
|
// compare string.
|
|
if (CRT::StringCompare(m_class_info->szName, CS_XOR("C_CSPlayerPawn")) != 0)
|
|
return false;
|
|
|
|
// get pawn.
|
|
auto m_pawn = I::GameResourceService->pGameEntitySystem->Get< C_CSPlayerPawn>(m_owner);
|
|
if (m_pawn == nullptr) {
|
|
return false;
|
|
}
|
|
|
|
// other entity
|
|
if (!m_pawn->IsOtherEnemy(SDK::LocalPawn)) {
|
|
return false;
|
|
}
|
|
|
|
// it is alive
|
|
if (m_pawn->GetHealth() <= 0) {
|
|
return false;
|
|
}
|
|
|
|
// we passed to everythign.
|
|
// please render material.
|
|
return this->override_material(animatable_object, dx11, arr_material_data, data_count,
|
|
scene_view, scene_layer, unk1, unk2);
|
|
}
|
|
|
|
material2_t* ams::chams_t::CreateMaterial(const char* szName, const char* szMaterialVMAT, const char* szShaderType, bool bBlendMode, bool bTranslucent, bool bDisableZBuffering)
|
|
{
|
|
material_data_t* pData = reinterpret_cast<material_data_t*>(static_cast<std::byte*>(MEM_STACKALLOC(0x200)) + 0x50);
|
|
material2_t** pMatPrototype;
|
|
|
|
I::MaterialSystem2->find_or_create_from_resource(&pMatPrototype, szMaterialVMAT);
|
|
if (pMatPrototype == nullptr)
|
|
return nullptr;
|
|
// @note: SetCreateDataByMaterial failed on release build idk why
|
|
#ifdef _DEBUG
|
|
I::MaterialSystem2->set_create_data_by_material(pData, &pMatPrototype);
|
|
pData->set_shader_type(szShaderType);
|
|
|
|
pData->set_material_function(CS_XOR("F_DISABLE_Z_BUFFERING"), bDisableZBuffering ? 1 : 0);
|
|
pData->set_material_function(CS_XOR("F_BLEND_MODE"), bBlendMode ? 1 : 0);
|
|
pData->set_material_function(CS_XOR("F_TRANSLUCENT"), bTranslucent ? 1 : 0);
|
|
|
|
material2_t** pMaterial;
|
|
I::MaterialSystem2->create_material(&pMaterial, szName, pData);
|
|
return *pMaterial;
|
|
#endif
|
|
return *pMatPrototype;
|
|
}
|
|
|
|
bool ams::chams_t::override_material(void* animatable_object, void* dx11, material_data_t* arr_material_data, int data_count,
|
|
void* scene_view, void* scene_layer, void* unk1, void* unk2) {
|
|
|
|
const auto original = H::hkDrawObject.GetOriginal();
|
|
const custom_material_data_t customMaterial = array_materials[C_GET(int, Vars.nVisualChamMaterial)];
|
|
|
|
if (C_GET(bool, Vars.bVisualChamsIgnoreZ))
|
|
{
|
|
arr_material_data->m_material = customMaterial.m_material_z;
|
|
arr_material_data->m_color = C_GET(ColorPickerVar_t, Vars.colVisualChamsIgnoreZ).colValue;
|
|
I::MaterialSystem2->set_color(arr_material_data, C_GET(ColorPickerVar_t, Vars.colVisualChamsIgnoreZ).colValue);
|
|
|
|
original(animatable_object, dx11, arr_material_data, data_count, scene_view, scene_layer, unk1, unk2);
|
|
}
|
|
|
|
arr_material_data->m_material = customMaterial.m_material;
|
|
arr_material_data->m_color = C_GET(ColorPickerVar_t, Vars.colVisualChams).colValue;
|
|
I::MaterialSystem2->set_color(arr_material_data, C_GET(ColorPickerVar_t, Vars.colVisualChams).colValue);
|
|
original(animatable_object, dx11, arr_material_data, data_count, scene_view, scene_layer, unk1, unk2);
|
|
|
|
return true;
|
|
}
|