From 60fefa8c94f1736824c4136432f24caca275b858 Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Fri, 17 Dec 2021 20:27:36 -0800 Subject: [PATCH] Server: Fix bug where clients would not receive damage notifications when armor is the only affected attribute. --- src/server/defs.h | 1 + src/server/gamerules.qc | 15 +++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/server/defs.h b/src/server/defs.h index 9096fb6c..2d2a8051 100644 --- a/src/server/defs.h +++ b/src/server/defs.h @@ -75,6 +75,7 @@ hashtable hashMaterials; entity g_dmg_eAttacker; entity g_dmg_eTarget; int g_dmg_iDamage; +int g_dmg_iRealDamage; bodyType_t g_dmg_iHitBody; int g_dmg_iFlags; int g_dmg_iWeapon; diff --git a/src/server/gamerules.qc b/src/server/gamerules.qc index c3a56c32..62121e75 100644 --- a/src/server/gamerules.qc +++ b/src/server/gamerules.qc @@ -183,6 +183,10 @@ CGameRules::DamageApply(entity t, entity c, float dmg, int w, damageType_t type) /* Damage */ base_player tp = (base_player)t; + /* for armor damage */ + float flArmor; + float flNewDamage; + /* player god mode */ if (t.flags & FL_CLIENT && t.flags & FL_GODMODE) return; @@ -191,13 +195,14 @@ CGameRules::DamageApply(entity t, entity c, float dmg, int w, damageType_t type) if (t.health <= 0) return; + /* before any calculation is done... */ + g_dmg_iRealDamage = dmg; + /* only clients have armor */ if (t.flags & FL_CLIENT) { /* skip armor */ if not (type & DMG_SKIP_ARMOR) if (tp.armor && dmg > 0) { - float flArmor; - float flNewDamage; flNewDamage = dmg * 0.2; flArmor = (dmg - flNewDamage) * 0.5; @@ -225,18 +230,20 @@ CGameRules::DamageApply(entity t, entity c, float dmg, int w, damageType_t type) g_dmg_iFlags = type; g_dmg_iWeapon = w; - if (dmg > 0) { + if (dmg > 0 || flArmor > 0) { vector dmg_origin; if (c.origin == [0,0,0]) dmg_origin = g_dmg_eTarget.origin; + else + dmg_origin = g_dmg_eAttacker.origin; WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); WriteByte(MSG_MULTICAST, EV_DAMAGE); WriteCoord(MSG_MULTICAST, dmg_origin[0]); WriteCoord(MSG_MULTICAST, dmg_origin[1]); WriteCoord(MSG_MULTICAST, dmg_origin[2]); - WriteInt(MSG_MULTICAST, g_dmg_iDamage); + WriteInt(MSG_MULTICAST, g_dmg_iRealDamage); WriteInt(MSG_MULTICAST, g_dmg_iFlags); msg_entity = g_dmg_eTarget; multicast([0,0,0], MULTICAST_ONE_R);