From bb7ac9ebee375828b36a6c3d4125065c4ae022a5 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Tue, 7 Feb 2023 17:23:48 -0800 Subject: [PATCH] WEAPON_KNIFE: more accurate damage values thanks to the CS wiki. Also added the ability to back-stab! --- src/shared/w_knife.qc | 61 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/src/shared/w_knife.qc b/src/shared/w_knife.qc index 44ee04d..67aba63 100644 --- a/src/shared/w_knife.qc +++ b/src/shared/w_knife.qc @@ -111,7 +111,7 @@ w_knife_primary(player pl) vector src; Weapons_MakeVectors(pl); src = pl.origin + pl.view_ofs; - traceline(src, src + (v_forward * 32), FALSE, pl); + traceline(src, src + (v_forward * 32), MOVE_HITMODEL, pl); Sound_Play(pl, CHAN_WEAPON, "weapon_knife.miss"); @@ -126,8 +126,30 @@ w_knife_primary(player pl) Sound_Play(pl, CHAN_WEAPON, "weapon_knife.hit"); } + /* let's calculate damage! */ if (trace_ent.takedamage) { - Damage_Apply(trace_ent, pl, 15, WEAPON_KNIFE, DMG_SLASH); + /* values taken from https://counterstrike.fandom.com/wiki/Knife */ + int dmg; + switch (trace_surface_id) { + case BODY_HEAD: + dmg = 60; + break; + case BODY_STOMACH: + dmg = 18; + break; + case BODY_LEGLEFT: + case BODY_LEGRIGHT: + dmg = 11; + break; + case BODY_DEFAULT: + case BODY_CHEST: + case BODY_ARMLEFT: + case BODY_ARMRIGHT: + default: + dmg = 15; + break; + } + Damage_Apply(trace_ent, pl, dmg, WEAPON_KNIFE, DMG_SLASH); } #endif } @@ -153,7 +175,7 @@ w_knife_secondary(player pl) vector src; Weapons_MakeVectors(pl); src = pl.origin + pl.view_ofs; - traceline(src, src + (v_forward * 32), FALSE, pl); + traceline(src, src + (v_forward * 32), MOVE_HITMODEL, pl); Sound_Play(pl, CHAN_WEAPON, "weapon_knife.miss"); @@ -169,8 +191,39 @@ w_knife_secondary(player pl) Sound_Play(pl, CHAN_WEAPON, "weapon_knife.hit"); } + /* let's calculate damage! */ if (trace_ent.takedamage) { - Damage_Apply(trace_ent, pl, 65, WEAPON_KNIFE, DMG_SLASH); + /* values taken from https://counterstrike.fandom.com/wiki/Knife */ + int dmg; + switch (trace_surface_id) { + case BODY_HEAD: + dmg = 260; + break; + case BODY_STOMACH: + dmg = 81; + break; + case BODY_LEGLEFT: + case BODY_LEGRIGHT: + dmg = 48; + break; + case BODY_DEFAULT: + case BODY_CHEST: + case BODY_ARMLEFT: + case BODY_ARMRIGHT: + default: + dmg = 65; + break; + } + + /* secondary can do a backstab */ + if (trace_ent.classname == "player") { + player otherpl = (player)trace_ent; + if (otherpl.IsFacing(pl) == false) { + dmg *= 3; + } + } + + Damage_Apply(trace_ent, pl, dmg, WEAPON_KNIFE, DMG_SLASH); } #endif }