X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fplayer.qc;h=e5a8f47f90f859908e0ba951776cbd71a3bbf854;hb=06a08d0c6b573f2562297147171aff3d990fa42d;hp=ed1d938a294128758632d7e5be46caf7c5519fb5;hpb=a3a388a32d0ea11fe79341ef44edc21c5ba460f4;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/player.qc b/qcsrc/server/player.qc index ed1d938a2..e5a8f47f9 100644 --- a/qcsrc/server/player.qc +++ b/qcsrc/server/player.qc @@ -310,66 +310,66 @@ void calculate_player_respawn_time(entity this) void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force) { - float take, save, dh, da; vector v; - float excess; + float dh = max(GetResource(this, RES_HEALTH), 0); + float da = max(GetResource(this, RES_ARMOR), 0); + float take = 0, save = 0; - dh = max(GetResource(this, RES_HEALTH), 0); - da = max(GetResource(this, RES_ARMOR), 0); - - if(!DEATH_ISSPECIAL(deathtype)) + if (damage) { - damage *= Handicap_GetTotalHandicap(this); - if (this != attacker && IS_PLAYER(attacker)) + if(!DEATH_ISSPECIAL(deathtype)) { - damage /= Handicap_GetTotalHandicap(attacker); + damage *= Handicap_GetTotalHandicap(this); + if (this != attacker && IS_PLAYER(attacker)) + { + damage /= Handicap_GetTotalHandicap(attacker); + } } - } - if (time < this.spawnshieldtime && autocvar_g_spawnshield_blockdamage < 1) - damage *= 1 - max(0, autocvar_g_spawnshield_blockdamage); + if (time < this.spawnshieldtime && autocvar_g_spawnshield_blockdamage < 1) + damage *= 1 - max(0, autocvar_g_spawnshield_blockdamage); - if(DEATH_ISWEAPON(deathtype, WEP_TUBA)) - { - // tuba causes blood to come out of the ears - vector ear1, ear2; - vector d; - float f; - ear1 = this.origin; - ear1_z += 0.125 * this.view_ofs.z + 0.875 * this.maxs.z; // 7/8 - ear2 = ear1; - makevectors(this.angles); - ear1 += v_right * -10; - ear2 += v_right * +10; - d = inflictor.origin - this.origin; - if (d) - f = (d * v_right) / vlen(d); // this is cos of angle of d and v_right! - else - f = 0; // Assum ecenter. - force = v_right * vlen(force); - Violence_GibSplash_At(ear1, force * -1, 2, bound(0, damage, 25) / 2 * (0.5 - 0.5 * f), this, attacker); - Violence_GibSplash_At(ear2, force, 2, bound(0, damage, 25) / 2 * (0.5 + 0.5 * f), this, attacker); - if(f > 0) + if(deathtype & HITTYPE_SOUND) // sound based attacks cause bleeding from the ears { - hitloc = ear1; - force = force * -1; + vector ear1, ear2; + vector d; + float f; + ear1 = this.origin; + ear1_z += 0.125 * this.view_ofs.z + 0.875 * this.maxs.z; // 7/8 + ear2 = ear1; + makevectors(this.angles); + ear1 += v_right * -10; + ear2 += v_right * +10; + d = inflictor.origin - this.origin; + if (d) + f = (d * v_right) / vlen(d); // this is cos of angle of d and v_right! + else + f = 0; // Assum ecenter. + force = v_right * vlen(force); + Violence_GibSplash_At(ear1, force * -1, 2, bound(0, damage, 25) / 2 * (0.5 - 0.5 * f), this, attacker); + Violence_GibSplash_At(ear2, force, 2, bound(0, damage, 25) / 2 * (0.5 + 0.5 * f), this, attacker); + if(f > 0) + { + hitloc = ear1; + force = force * -1; + } + else + { + hitloc = ear2; + // force is already good + } } else - { - hitloc = ear2; - // force is already good - } - } - else - Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, this, attacker); + Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, this, attacker); - v = healtharmor_applydamage(GetResource(this, RES_ARMOR), autocvar_g_balance_armor_blockpercent, deathtype, damage); - take = v.x; - save = v.y; + v = healtharmor_applydamage(GetResource(this, RES_ARMOR), autocvar_g_balance_armor_blockpercent, deathtype, damage); + take = v.x; + save = v.y; + } if(attacker == this) { - // don't reset pushltime for this damage as it may be an attempt to + // don't reset pushltime for self damage as it may be an attempt to // escape a lava pit or similar //this.pushltime = 0; this.istypefrag = 0; @@ -394,11 +394,11 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, MUTATOR_CALLHOOK(PlayerDamage_SplitHealthArmor, inflictor, attacker, this, force, take, save, deathtype, damage); take = bound(0, M_ARGV(4, float), GetResource(this, RES_HEALTH)); save = bound(0, M_ARGV(5, float), GetResource(this, RES_ARMOR)); - excess = max(0, damage - take - save); + float excess = max(0, damage - take - save); if(sound_allowed(MSG_BROADCAST, attacker)) { - if (save > 10) + if (save > 10 && (dh - 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); @@ -466,8 +466,10 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, this.v_angle_x = bound(-90, this.v_angle.x, 90); } - if (this != attacker) { - float realdmg = damage - excess; + 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); } @@ -489,6 +491,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, bool valid_damage_for_weaponstats = false; Weapon awep = WEP_Null; + if (!(round_handler_IsActive() && !round_handler_IsRoundStarted()) && time >= game_starttime) if(vbot || IS_REAL_CLIENT(this)) if(abot || IS_REAL_CLIENT(attacker)) if(attacker && this != attacker) @@ -551,7 +554,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, // print an obituary message if(this.classname != "body") - Obituary (attacker, inflictor, this, deathtype, weaponentity); + Obituary(attacker, inflictor, this, deathtype, weaponentity); // increment frag counter for used weapon type Weapon w = DEATH_WEAPONOF(deathtype);