bool Autowall::HandleBulletPenetration(CCSWeaponInfo* weaponInfo, FireBulletData& data)
{
surfacedata_t* enter_surface_data = g_PhysSurface->GetSurfaceData(data.enter_trace.surface.surfaceProps);
int enter_material = enter_surface_data->game.material;
float enter_surf_penetration_mod = enter_surface_data->game.flPenetrationModifier;
data.trace_length += data.enter_trace.fraction * data.trace_length_remaining;
data.current_damage *= powf(weaponInfo->range_modifier, data.trace_length * 0.002f);
if (data.trace_length > 3000.f || enter_surf_penetration_mod < 0.1f)
data.penetrate_count = 0;
if (data.penetrate_count <= 0) {
return false;
}
Vector dummy;
trace_t trace_exit;
if (!TraceToExit(dummy, &data.enter_trace, data.enter_trace.endpos, data.direction, &trace_exit))
return false;
surfacedata_t* exit_surface_data = g_PhysSurface->GetSurfaceData(trace_exit.surface.surfaceProps);
const int exit_material = exit_surface_data->game.material;
const float exit_surf_penetration_mod = *(float*)((uint8_t*)exit_surface_data + 76);
float final_damage_modifier = 0.16f;
float combined_penetration_modifier;
if ((data.enter_trace.contents & CONTENTS_GRATE) != 0 || enter_material == 89 || enter_material == 71) {
combined_penetration_modifier = 3.0f;
final_damage_modifier = 0.05f;
}
else
combined_penetration_modifier = (enter_surf_penetration_mod + exit_surf_penetration_mod) * 0.5f;
if (enter_material == exit_material) {
if (exit_material == 87 || exit_material == 85)
combined_penetration_modifier = 3.0f;
else if (exit_material == 76)
combined_penetration_modifier = 2.0f;
}
const float v34 = fmaxf(0.f, 1.0f / combined_penetration_modifier);
const float v35 = (data.current_damage * final_damage_modifier) + v34 * 3.0f * fmaxf(0.0f, (3.0f / weaponInfo->penetration) * 1.25f);
float thickness = (trace_exit.endpos - data.enter_trace.endpos).Length();
thickness *= thickness;
thickness *= v34;
thickness /= 24.0f;
float lost_damage = fmaxf(0.0f, v35 + thickness); //=inf
//Autowall::HandleBulletPenetration lost_damage=inf
if (lost_damage > data.current_damage) {
return false;
}
if (lost_damage >= 0.0f)
data.current_damage -= lost_damage;
if (data.current_damage < 1.0f) {
return false;
}
data.src = trace_exit.endpos;
data.penetrate_count--;
return true;
}