Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 53 additions & 17 deletions src/action/g_combat.c
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,27 @@ qboolean check_head_success(const vec3_t point, const vec3_t dir, vec3_t targ_or
return false;
}

// Fast path check - avoid expensive locational damage for simple weapons
static qboolean uses_simple_damage(int mod) {
switch (mod) {
case MOD_M3: // Shotgun
case MOD_HC: // Hand Cannon
case MOD_HELD_GRENADE:
case MOD_HG_SPLASH:
case MOD_G_SPLASH:
case MOD_BREAKINGGLASS:
case MOD_FALLING:
case MOD_CRUSH:
case MOD_TELEFRAG:
case MOD_WATER:
case MOD_SLIME:
case MOD_LAVA:
return true;
default:
return false;
}
}

void T_Damage (edict_t * targ, edict_t * inflictor, edict_t * attacker, const vec3_t dir,
const vec3_t point, const vec3_t normal, int damage, int knockback, int dflags,
int mod)
Expand Down Expand Up @@ -510,9 +531,20 @@ void T_Damage (edict_t * targ, edict_t * inflictor, edict_t * attacker, const ve

// locational damage code
// base damage is head shot damage, so all the scaling is downwards
if (client)
{

// Simple damage path - skip all locational damage calculations
if (client && uses_simple_damage(mod)) {
// FAST PATH - skip all locational damage calculations
client->took_damage++; // For shotgun damage reports
bleeding = (mod != MOD_TELEFRAG && mod != MOD_CRUSH);
instant_dam = (mod == MOD_FALLING || mod == MOD_CRUSH);

goto apply_damage; // Skip the complex path switch statement
}

// COMPLEX PATH - full locational damage for precision weapons
else if (client && !uses_simple_damage(mod))
{
switch (mod) {
case MOD_MK23:
case MOD_DUAL:
Expand Down Expand Up @@ -707,23 +739,27 @@ void T_Damage (edict_t * targ, edict_t * inflictor, edict_t * attacker, const ve
}
}
break;
case MOD_M3:
case MOD_HC:
case MOD_HELD_GRENADE:
case MOD_HG_SPLASH:
case MOD_G_SPLASH:
case MOD_BREAKINGGLASS:
//shotgun damage report stuff
if (client)
client->took_damage++;

bleeding = 1;
instant_dam = 0;
break;
default:

// Simple damage types are evaluated above instead of this
// case MOD_M3:
// case MOD_HC:
// case MOD_HELD_GRENADE:
// case MOD_HG_SPLASH:
// case MOD_G_SPLASH:
// case MOD_BREAKINGGLASS:
// //shotgun damage report stuff
// if (client)
// client->took_damage++;

// bleeding = 1;
// instant_dam = 0;
// break;
default: // Safe default check
break;
}
if(friendlyFire && team_round_going)

apply_damage:
if(friendlyFire && team_round_going)
{
Add_TeamWound(attacker, targ, mod);
}
Expand Down