]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/player.qc
Merge branch 'master' into Mario/status_effects_extended
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / player.qc
index c1ca497ca2f4018bb3a6a57a319daae50c65c09d..ad3ba94e4a21d18c9aa7c293a1c68cfa9a04edeb 100644 (file)
@@ -229,8 +229,8 @@ void PlayerCorpseDamage(entity this, entity inflictor, entity attacker, float da
 void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force)
 {
        vector v;
-       float dh = max(GetResource(this, RES_HEALTH), 0);
-       float da = max(GetResource(this, RES_ARMOR), 0);
+       float initial_health = max(GetResource(this, RES_HEALTH), 0);
+       float initial_armor = max(GetResource(this, RES_ARMOR), 0);
        float take = 0, save = 0;
 
        if (damage)
@@ -250,7 +250,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage,
                                damage = 0;
                }
                else if (StatusEffects_active(STATUSEFFECT_SpawnShield, this) && autocvar_g_spawnshield_blockdamage < 1)
-                       damage *= 1 - max(0, autocvar_g_spawnshield_blockdamage);
+                       damage *= 1 - bound(0, autocvar_g_spawnshield_blockdamage, 1);
 
                if(deathtype & HITTYPE_SOUND) // sound based attacks cause bleeding from the ears
                {
@@ -321,7 +321,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage,
 
        if(sound_allowed(MSG_BROADCAST, attacker))
        {
-               if (save > 10 && (dh - take) > 0) // don't play armor sound if the attack is fatal
+               if (save > 10 && (initial_health - take) > 0) // don't play armor sound if the attack is fatal
                        sound (this, CH_SHOTS, SND_ARMORIMPACT, VOL_BASE, ATTEN_NORM);
                else if (take > 30)
                        sound (this, CH_SHOTS, SND_BODYIMPACT2, VOL_BASE, ATTEN_NORM);
@@ -388,18 +388,6 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage,
                                this.v_angle_y = this.v_angle.y + (random() * 2 - 1) * shake;
                                this.v_angle_x = bound(-90, this.v_angle.x, 90);
                        }
-
-                       float realdmg = damage - excess;
-                       if (this != attacker && realdmg && !STAT(FROZEN, this)
-                               && (!(round_handler_IsActive() && !round_handler_IsRoundStarted()) && time >= game_starttime))
-                       {
-                               if (IS_PLAYER(attacker) && DIFF_TEAM(attacker, this)) {
-                                       GameRules_scoring_add(attacker, DMG, realdmg);
-                               }
-                               if (IS_PLAYER(this)) {
-                                       GameRules_scoring_add(this, DMGTAKEN, realdmg);
-                               }
-                       }
                }
                else
                        this.max_armorvalue += (save + take);
@@ -427,19 +415,31 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage,
                valid_damage_for_weaponstats = true;
        }
 
-       dh -= max(GetResource(this, RES_HEALTH), 0); // health difference
-       da -= max(GetResource(this, RES_ARMOR), 0); // armor difference
+       float dh = initial_health - max(GetResource(this, RES_HEALTH), 0); // health difference
+       float da = initial_armor - max(GetResource(this, RES_ARMOR), 0); // armor difference
        if(valid_damage_for_weaponstats)
        {
                WeaponStats_LogDamage(awep.m_id, abot, this.(weaponentity).m_weapon.m_id, vbot, dh + da);
        }
 
-       MUTATOR_CALLHOOK(PlayerDamaged, attacker, this, dh, da, hitloc, deathtype, damage);
+       bool forbid_logging_damage = MUTATOR_CALLHOOK(PlayerDamaged, attacker, this, dh, da, hitloc, deathtype, damage);
+
+       if ((dh || da) && !forbid_logging_damage)
+       {
+               float realdmg = damage - excess;
+               if ((this != attacker || deathtype == DEATH_KILL.m_id) && realdmg && !STAT(FROZEN, this)
+                       && (!(round_handler_IsActive() && !round_handler_IsRoundStarted()) && time >= game_starttime))
+               {
+                       if (IS_PLAYER(attacker) && DIFF_TEAM(attacker, this) && deathtype != DEATH_KILL.m_id)
+                               GameRules_scoring_add(attacker, DMG, realdmg);
+                       if (IS_PLAYER(this))
+                               GameRules_scoring_add(this, DMGTAKEN, realdmg);
+               }
+       }
 
        if (GetResource(this, RES_HEALTH) < 1)
        {
-               float defer_ClientKill_Now_TeamChange;
-               defer_ClientKill_Now_TeamChange = false;
+               bool defer_ClientKill_Now_TeamChange = false;
 
                if(this.alivetime)
                {
@@ -561,8 +561,6 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage,
 
                STAT(AIR_FINISHED, this) = 0;
 
-               STAT(MOVEVARS_SPECIALCOMMAND, this) = false; // sweet release
-
                this.death_time = time;
                if (random() < 0.5)
                        animdecide_setstate(this, this.anim_state | ANIMSTATE_DEAD1, true);