X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fplayer.qc;h=ad3ba94e4a21d18c9aa7c293a1c68cfa9a04edeb;hb=978b389f7810328d616ff4ceca1690ef51d90b53;hp=291c9588c5ffd8074b07e440a1c0618439160248;hpb=39ff67006e98371c2961166ea52984024d9d3fab;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/player.qc b/qcsrc/server/player.qc index 291c9588c..ad3ba94e4 100644 --- a/qcsrc/server/player.qc +++ b/qcsrc/server/player.qc @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -228,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) @@ -248,8 +249,8 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, if (!ITEM_DAMAGE_NEEDKILL(deathtype)) damage = 0; } - else if (time < this.spawnshieldtime && autocvar_g_spawnshield_blockdamage < 1) - damage *= 1 - max(0, autocvar_g_spawnshield_blockdamage); + else if (StatusEffects_active(STATUSEFFECT_SpawnShield, this) && autocvar_g_spawnshield_blockdamage < 1) + damage *= 1 - bound(0, autocvar_g_spawnshield_blockdamage, 1); if(deathtype & HITTYPE_SOUND) // sound based attacks cause bleeding from the ears { @@ -320,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); @@ -333,7 +334,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, if (take > 100) Violence_GibSplash_At(hitloc, force * -0.2, 3, 1, this, attacker); - if (time >= this.spawnshieldtime || autocvar_g_spawnshield_blockdamage < 1) + if (!StatusEffects_active(STATUSEFFECT_SpawnShield, this) || autocvar_g_spawnshield_blockdamage < 1) { if (!(this.flags & FL_GODMODE)) { @@ -387,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); @@ -426,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) { @@ -560,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);