Начинающий
- Статус
- Оффлайн
- Регистрация
- 27 Ноя 2025
- Сообщения
- 25
- Реакции
- 0
Дарова брадки !
Кароч хотел зафиксить дарк сайд , Сегодня фиксил раге бот и появилось проблема . Автоволл не правильно воркает и раге бот стреляет в стены которые даже не аволл (даже на 1хп) . Пытался зафиксить и с дебагом нихуя не смог помогите .
Кароч хотел зафиксить дарк сайд , Сегодня фиксил раге бот и появилось проблема . Автоволл не правильно воркает и раге бот стреляет в стены которые даже не аволл (даже на 1хп) . Пытался зафиксить и с дебагом нихуя не смог помогите .
#include "auto_wall.hpp"void c_auto_wall::scale_damage(int hitgroup, c_cs_player_pawn* entity, c_cs_weapon_base_v_data* weapon_data, float& damage){ static convar_t* mp_damage_scale_ct_head = g_interfaces->m_var->get_by_name("mp_damage_scale_ct_head"); static convar_t* mp_damage_scale_t_head = g_interfaces->m_var->get_by_name("mp_damage_scale_t_head"); static convar_t* mp_damage_scale_ct_body = g_interfaces->m_var->get_by_name("mp_damage_scale_ct_body"); static convar_t* mp_damage_scale_t_body = g_interfaces->m_var->get_by_name("mp_damage_scale_t_body"); auto safe_scale = [](convar_t* cv, float def = 1.f) -> float { if (!cv) return def; float v = cv->get_float(); return (v <= 0.f) ? def : v; }; float damage_scale_ct_head = safe_scale(mp_damage_scale_ct_head); float damage_scale_t_head = safe_scale(mp_damage_scale_t_head); float damage_scale_ct_body = safe_scale(mp_damage_scale_ct_body); float damage_scale_t_body = safe_scale(mp_damage_scale_t_body); const bool is_ct = entity->m_team_num() == 3, is_t = entity->m_team_num() == 2; LOG_INFO("[scale_damage] hitgroup=%d team=%d is_ct=%d is_t=%d damage_in=%.1f", hitgroup, entity->m_team_num(), is_ct, is_t, damage); float head_damage_scale = is_ct ? damage_scale_ct_head : is_t ? damage_scale_t_head : 1.f; const float body_damage_scale = is_ct ? damage_scale_ct_body : is_t ? damage_scale_t_body : 1.f; switch (hitgroup) { case hitgroup_head: LOG_INFO("[scale_damage] head_mult=%.2f head_scale=%.2f before=%.1f", weapon_data->m_headshot_multiplier(), head_damage_scale, damage); damage *= weapon_data->m_headshot_multiplier() * head_damage_scale; LOG_INFO("[scale_damage] after head mult: damage=%.1f", damage); break; case hitgroup_chest: case hitgroup_left_hand: case hitgroup_right_hand: case hitgroup_neck: damage *= body_damage_scale; break; case hitgroup_stomach: damage *= 1.25f * body_damage_scale; break; case hitgroup_left_leg: case hitgroup_right_leg: damage *= .75f * body_damage_scale; break; default: break; } if (!entity->has_armor(hitgroup) || entity->m_armor_value() <= 0) return; float heavy_armor_bonus = 1.f, armor_bonus = .5f, armor_ratio = weapon_data->m_armor_ratio() * .5f; float damage_to_health = damage * armor_ratio; const float damage_to_armor = (damage - damage_to_health) * (heavy_armor_bonus * armor_bonus); LOG_INFO("[scale_damage] armor_ratio=%.2f d2health=%.1f d2armor=%.1f armor_val=%d", armor_ratio, damage_to_health, damage_to_armor, entity->m_armor_value()); if (damage_to_armor > static_cast<float>(entity->m_armor_value())) damage_to_health = damage - static_cast<float>(entity->m_armor_value()) / armor_bonus; damage = damage_to_health; LOG_INFO("[scale_damage] final damage=%.1f", damage);}bool c_auto_wall::fire_bullet(vec3_t start, vec3_t end, c_cs_player_pawn* target, c_cs_weapon_base_v_data* weapon_data, penetration_data_t& pen_data, bool is_taser){ c_cs_player_pawn* local_player = g_ctx->m_local_pawn; if (!local_player) return false; trace_data_t trace_data = trace_data_t(); trace_data.arr_pointer = &trace_data.arr; vec3_t direction = end - start; vec3_t end_pos = direction * weapon_data->m_range(); const trace_filter_t filter(0x1C300B, local_player, nullptr, 3); g_interfaces->m_trace->create_trace(&trace_data, start, end_pos, filter, 4); handle_bulllet_penetration_data_t handle_bullet_data = handle_bulllet_penetration_data_t( static_cast<float>(weapon_data->m_damage()), weapon_data->m_penetration(), weapon_data->m_range(), weapon_data->m_range_modifier(), 4, false ); float max_range = weapon_data->m_range(); pen_data.m_damage = static_cast<float>(weapon_data->m_damage()); LOG_INFO("[fire_bullet] init damage=%.1f range=%.1f pen=%.2f", pen_data.m_damage, max_range, weapon_data->m_penetration()); for (int i = 0; i < trace_data.num_update; i++) { update_value_t* modulate_values = reinterpret_cast<update_value_t* const>(reinterpret_cast<std::uintptr_t>(trace_data.pointer_update_value) + i * sizeof(update_value_t)); game_trace_t game_trace; g_interfaces->m_trace->init_trace_info(&game_trace); g_interfaces->m_trace->get_trace_info(&trace_data, &game_trace, 0.0f, reinterpret_cast<void*>(reinterpret_cast<std::uintptr_t>(trace_data.arr.data()) + sizeof(trace_array_element_t) * (modulate_values->m_handle_index & ENT_ENTRY_MASK))); if (game_trace.m_hit_entity && game_trace.m_hit_entity->is_player_pawn()) { if (pen_data.m_damage < 1.f) continue; float dmg_before = pen_data.m_damage; scale_damage(game_trace.get_hit_group(), game_trace.m_hit_entity, weapon_data, pen_data.m_damage); LOG_INFO("[fire_bullet] hit entity hitgroup=%d dmg_before=%.1f dmg_after=%.1f armor=%d", game_trace.get_hit_group(), dmg_before, pen_data.m_damage, game_trace.m_hit_entity->m_armor_value()); pen_data.m_hitbox = game_trace.get_hitbox_id(); pen_data.m_penetrated = i == 0; if (is_taser && pen_data.m_penetrated) break; return true; } if (handle_bullet_penetration(&trace_data, &handle_bullet_data, modulate_values, g_ctx->m_local_pawn->m_team_num())) break; pen_data.m_damage = handle_bullet_data.m_damage; } return false;}#pragma once#include "../../darkside.hpp"#include "../../valve/interfaces/vtables/i_trace.hpp"struct penetration_data_t {float m_damage{ };uint8_t m_hitgroup{ };int m_hitbox{ };bool m_penetrated{ true };};struct handle_bulllet_penetration_data_t {handle_bulllet_penetration_data_t( const float damage, const float pen, const float range_mod, const float range, const int pen_count, const bool failed ) :m_damage( damage ),m_penetration( pen ),m_range_modifier( range_mod ),m_range( range ),m_pen_count( pen_count ),m_failed( failed ) {}float m_damage{ };float m_penetration{ };float m_range_modifier{ };float m_range{ };int m_pen_count{ };bool m_failed{ };};enum e_hitgroups{hitgroup_gear,hitgroup_head,hitgroup_chest,hitgroup_stomach,hitgroup_left_hand,hitgroup_right_hand,hitgroup_left_leg,hitgroup_right_leg,hitgroup_neck};class c_auto_wall {using fn_handle_bullet_penetration = bool( __fastcall* ) ( trace_data_t*, handle_bulllet_penetration_data_t*, update_value_t*, int, void* );inline bool handle_bullet_penetration( trace_data_t* const trace, handle_bulllet_penetration_data_t* stats, update_value_t* const mod_value, const int team_num ) {static fn_handle_bullet_penetration fn = reinterpret_cast<fn_handle_bullet_penetration>( g_opcodes->scan( g_modules->m_modules.client_dll.get_name(), xorstr_( "48 8B C4 44 89 48 20 55 57 41 55 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 41 F6 40 ? ? 0F 57" ) ) );return fn( trace, stats, mod_value, team_num, nullptr );}public:void scale_damage( int hitgroup, c_cs_player_pawn* entity, c_cs_weapon_base_v_data* weapon_data, float& damage );bool fire_bullet( vec3_t start, vec3_t end, c_cs_player_pawn* target, c_cs_weapon_base_v_data* weapon_data, penetration_data_t& pen_data, bool is_taser = false );};const auto g_auto_wall = std::make_unique<c_auto_wall>( );