Sup guys, I've been facing a memory leak issue in my autowall code, and I'm trying to find the cause. I think it might be related to the create_trace function, but I'm not entirely sure. Below is the a portion of my code. If anyone has insights, I would greatly appreciate it!
And heres a part of code of my create trace and others in tracing
And heres my sigs
Autowall code:
float F::autowall::c_auto_wall::pen(const Vector_t local_pos, const Vector_t target_pos, C_BaseEntity* target, C_BaseEntity* local,
C_CSPlayerPawn* localpawn, C_CSPlayerPawn* targetpawn) {
auto wpn_data = SDK::ActiveWeaponVData;
if (!local || !target || !wpn_data)
return 0;
trace_data_t trace_data = {};
trace_data.m_arr_pointer = &trace_data.m_arr;
Vector_t direction = target_pos - local_pos;
Vector_t end_pos = direction * wpn_data->m_flRange();
TraceFilter_t filter = {};
CGameTraceManager::Init(filter, localpawn, penmask, 3, 7);
CGameTraceManager::create_trace(&trace_data, local_pos, end_pos, filter, 4);
float corrected_dmg = static_cast<float>(wpn_data->m_nDamage());
float fl_max_range = wpn_data->m_flRange();
struct handle_bullet_data_t {
handle_bullet_data_t(const float dmg_mod, const float pen, const float range_mod, const float range,
const int pen_count, const bool failed) :
m_dmg(dmg_mod),
m_pen(pen),
m_range_mod(range_mod),
m_range(range),
m_pen_count(pen_count),
m_failed(failed) {}
float m_dmg{ }, m_pen{ }, m_range_mod{ }, m_range{ };
int m_pen_count{ };
bool m_failed{ };
}
handle_bullet_data(static_cast<float>(wpn_data->m_nDamage()), wpn_data->m_flPenetration(), wpn_data->m_flRange(),
wpn_data->m_flRangeModifier(), 4, false);
if (trace_data.m_num_update > 0)
{
float fl_trace_length = 0.f;
for (int i = 0; i < trace_data.m_num_update; i++) {
auto* value = reinterpret_cast<UpdateValueT* const>(
reinterpret_cast<std::uintptr_t>(trace_data.m_pointer_update_value)
+ i * sizeof(UpdateValueT));
game_trace_t game_trace = { };
CGameTraceManager::initialize_trace_info(&game_trace);
CGameTraceManager::get_trace_info(
&trace_data, &game_trace, 0.0f,
reinterpret_cast<void*>(
reinterpret_cast<std::uintptr_t>(trace_data.m_arr)
+ sizeof(trace_arr_element_t) * (value->handleIdx & 0x7fffu)));
fl_max_range -= fl_trace_length;
if (game_trace.Fraction == 1.0f)
{
break;
}
fl_trace_length += game_trace.Fraction * fl_max_range;
corrected_dmg *= std::powf(wpn_data->m_flRangeModifier(), fl_trace_length / 500.f);
if (fl_trace_length > 3000.f)
break;
if (game_trace.HitEntity && game_trace.HitEntity->GetRefEHandle().GetEntryIndex() == targetpawn->GetRefEHandle().GetEntryIndex()) {
scale_damage2(game_trace.HitboxData->m_nHitGroup, targetpawn, wpn_data->m_flArmorRatio(), wpn_data->m_flHeadshotMultiplier(), &corrected_dmg);
return corrected_dmg;
}
if (!CGameTraceManager::handle_bullet_penetration(&trace_data, &handle_bullet_data, value, false))
return 0;
corrected_dmg = handle_bullet_data.m_dmg;
}
}
return 0;
}
And heres a part of code of my create trace and others in tracing
Tracing Funcs:
static void create_trace(trace_data_t* const trace, const Vector_t start,
const Vector_t end, const TraceFilter_t& filler,
const int penetration_count ) {
CS_ASSERT(fn_create_trace_ != nullptr);
return fn_create_trace_( trace, start, end, filler, nullptr, nullptr, nullptr, nullptr, penetration_count );
}
static void init_trace_info(game_trace_t* const hit)
{
fninittraceinfo_(hit);
}
static void get_trace_info(trace_data_t* trace, game_trace_t* hit,
const float unknown_float, void* unknown)
{
fnget_trace_info_(trace, hit, unknown_float, unknown);
}
static void initialize_trace_info(game_trace_t* const hit)
{
fninittraceinfo_(hit);
}
static void Init(TraceFilter_t filter, C_CSPlayerPawn* skip, uint64_t mask, uint8_t layer, uint16_t idk)
{
CS_ASSERT(fn_init_ != nullptr);
fn_init_(filter, skip, mask, layer, idk);
}
static bool handle_bullet_penetration(trace_data_t* const trace, void* stats,
UpdateValueT* const mod_value,
const bool draw_showimpacts = false)
{
return fnhandle_bullet_penetration_(trace, stats, mod_value, nullptr, nullptr, nullptr, nullptr, nullptr, draw_showimpacts);
}
And heres my sigs
Signatures:
fn_create_trace_ = reinterpret_cast<CreateTraces>(MEM::FindPattern(CLIENT_DLL, CS_XOR("48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 41 56 41 57 48 83 EC 40 F2")));
fninittraceinfo_ = reinterpret_cast<fn_init_trace_info>(MEM::FindPattern(CLIENT_DLL, CS_XOR("48 89 5C 24 08 57 48 83 EC 20 48 8B D9 33 FF 48 8B 0D")));
fnget_trace_info_ = reinterpret_cast<gettraceinfo>(MEM::FindPattern(CLIENT_DLL, CS_XOR("48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 48 83 EC 60 48 8B E9 0F")));
fn_init_ = reinterpret_cast<Inits>(MEM::FindPattern(CLIENT_DLL, CS_XOR("48 89 5C 24 08 48 89 74 24 10 57 48 83 EC 20 0F B6 41 37 33")));
fnhandle_bullet_penetration_ = reinterpret_cast<handle_bullet_penetrations>(MEM::FindPattern(CLIENT_DLL, CS_XOR("48 8B C4 44 89 48 ? 48 89 50 ? 48 89 48")));
fn_trace_shape_ = reinterpret_cast<TraceShapes>(MEM::FindPattern(CLIENT_DLL, CS_XOR("48 89 5C 24 20 48 89 4C 24 08 55 56 41")));
fn_trace_shape22_ = reinterpret_cast<fnTraceShape2>(MEM::FindPattern(CLIENT_DLL, CS_XOR("48 89 5C 24 20 48 89 4C 24 08 55 56 41")));
fn_trace_shape33_ = reinterpret_cast<fnTraceShape3>(MEM::FindPattern(CLIENT_DLL, CS_XOR("48 89 5C 24 20 48 89 4C 24 08 55 56 41")));
fn_clip_trace_to_players_ = reinterpret_cast<funClipTraceToPlayers>(MEM::FindPattern(CLIENT_DLL, "48 8B C4 55 56 48 8D A8 48 FF FF FF 48 81 EC A8 01 00 00 48 89 58 08 49"));
fn_clip_trace_to_players22_ = reinterpret_cast<funClipTraceToPlayers2>(MEM::FindPattern(CLIENT_DLL, "48 8B C4 55 56 48 8D A8 48 FF FF FF 48 81 EC A8 01 00 00 48 89 58 08 49"));
fn_clip_ray_to_entity_ = reinterpret_cast<fClipRayToEntity>(MEM::FindPattern(CLIENT_DLL, CS_XOR("48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 48 89 7C 24 20 41 54 41 56 41 57 48 81 EC C0 00 00 00 48 8B 9C")));
fn_clip_ray_to_entity22_ = reinterpret_cast<fClipRayToEntity2>(MEM::FindPattern(CLIENT_DLL, CS_XOR("48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 48 89 7C 24 20 41 54 41 56 41 57 48 81 EC C0 00 00 00 48 8B 9C")));