X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fplayer.qc;h=ad3ba94e4a21d18c9aa7c293a1c68cfa9a04edeb;hb=480de525d9378ac5baa42568c212dc6b13363879;hp=b5fee52d5324277a9130edea8571fc79d0fdad08;hpb=ce80a3d3800ee2f5ce8a8d93ccb6b835a46ec5f6;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/player.qc b/qcsrc/server/player.qc index b5fee52d5..ad3ba94e4 100644 --- a/qcsrc/server/player.qc +++ b/qcsrc/server/player.qc @@ -2,7 +2,6 @@ #include #include -#include #include #include #include @@ -13,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -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) @@ -244,8 +244,13 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, } } - if (time < this.spawnshieldtime && autocvar_g_spawnshield_blockdamage < 1) - damage *= 1 - max(0, autocvar_g_spawnshield_blockdamage); + if (STAT(FROZEN, this)) + { + if (!ITEM_DAMAGE_NEEDKILL(deathtype)) + damage = 0; + } + 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 { @@ -316,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); @@ -329,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)) { @@ -339,7 +344,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, if(take) this.pauseregen_finished = max(this.pauseregen_finished, time + autocvar_g_balance_pause_health_regen); - if (time > this.pain_finished) //Don't switch pain sequences like crazy + if (time > this.pain_finished && !STAT(FROZEN, this)) // Don't switch pain sequences like crazy { this.pain_finished = time + 0.5; //Supajoe @@ -383,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) - if (!(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); @@ -413,7 +406,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, if(vbot || IS_REAL_CLIENT(this)) if(abot || IS_REAL_CLIENT(attacker)) if(attacker && this != attacker) - if(DIFF_TEAM(this, attacker)) + if (DIFF_TEAM(this, attacker) && (!STAT(FROZEN, this) || this.freeze_time > time)) { if(DEATH_ISSPECIAL(deathtype)) awep = attacker.(weaponentity).m_weapon; @@ -422,19 +415,31 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, valid_damage_for_weaponstats = true; } - dh = dh - max(GetResource(this, RES_HEALTH), 0); - da = da - max(GetResource(this, RES_ARMOR), 0); + 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) { @@ -551,8 +556,10 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, UNSET_ONGROUND(this); // dying animation this.deadflag = DEAD_DYING; + // don't play teleportation sounds + this.teleportable = TELEPORT_SIMPLE; - STAT(MOVEVARS_SPECIALCOMMAND, this) = false; // sweet release + STAT(AIR_FINISHED, this) = 0; this.death_time = time; if (random() < 0.5)