From: terencehill Date: Thu, 13 Jul 2017 17:20:05 +0000 (+0200) Subject: Shotgun accuracy stats: also count damage dealt by projectiles hitting the enemy... X-Git-Tag: xonotic-v0.8.5~2281^2~7 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=e0b08311f47a6451a647f5c2ad00ec9f1c02aa70;p=xonotic%2Fxonotic-data.pk3dir.git Shotgun accuracy stats: also count damage dealt by projectiles hitting the enemy after the one that kills them. It fixes wrong accuracy percentage on shotgun shots that kill the enemy --- diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index 381373ad2..da256e8f4 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -2708,6 +2708,11 @@ void PlayerPostThink (entity this) } if (IS_PLAYER(this)) { + if(this.death_time == time && IS_DEAD(this)) + { + this.maxs.z = 5; + setsize(this, this.mins, this.maxs); + } DrownPlayer(this); CheckRules_Player(this); UpdateChatBubble(this); diff --git a/qcsrc/server/player.qc b/qcsrc/server/player.qc index 0ca9cb849..ac312dc59 100644 --- a/qcsrc/server/player.qc +++ b/qcsrc/server/player.qc @@ -173,9 +173,6 @@ void PlayerCorpseDamage(entity this, entity inflictor, entity attacker, float da vector v; Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, this, attacker); - // damage resistance (ignore most of the damage from a bullet or similar) - damage = max(damage - 5, 1); - v = healtharmor_applydamage(this.armorvalue, autocvar_g_balance_armor_blockpercent, deathtype, damage); take = v.x; save = v.y; @@ -625,11 +622,16 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, animdecide_setstate(this, this.anim_state | ANIMSTATE_DEAD1, true); else animdecide_setstate(this, this.anim_state | ANIMSTATE_DEAD2, true); + + /* // postpone resize until frame end so that dead player can still + // properly get hit by all the projectiles fired in this frame (shotgun) if (this.maxs.z > 5) { this.maxs_z = 5; setsize(this, this.mins, this.maxs); } + */ + // set damage function to corpse damage this.event_damage = PlayerCorpseDamage; // call the corpse damage function just in case it wants to gib @@ -648,7 +650,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, if(autocvar_sv_gentle > 0 || autocvar_ekg || this.classname == "body") { // remove corpse // clones don't run any animation code any more, so we must gib them when they die :( - PlayerCorpseDamage(this, inflictor, attacker, autocvar_sv_gibhealth+1.0, deathtype, hitloc, force); + this.event_damage(this, inflictor, attacker, autocvar_sv_gibhealth + 1, deathtype, hitloc, force); } // reset fields the weapons may use just in case diff --git a/qcsrc/server/weapons/accuracy.qc b/qcsrc/server/weapons/accuracy.qc index 7cc06da3e..6e4c67595 100644 --- a/qcsrc/server/weapons/accuracy.qc +++ b/qcsrc/server/weapons/accuracy.qc @@ -93,7 +93,7 @@ bool accuracy_isgooddamage(entity attacker, entity targ) int mutator_check = MUTATOR_CALLHOOK(AccuracyTargetValid, attacker, targ); if (warmup_stage) return false; - if (IS_DEAD(targ)) return false; + if (IS_DEAD(targ) && time > targ.death_time) return false; if (STAT(FROZEN, targ)) return false; if (SAME_TEAM(attacker, targ)) return false; diff --git a/qcsrc/server/weapons/tracing.qc b/qcsrc/server/weapons/tracing.qc index 8e4f88b8c..6b07d8a0f 100644 --- a/qcsrc/server/weapons/tracing.qc +++ b/qcsrc/server/weapons/tracing.qc @@ -422,10 +422,10 @@ void fireBullet(entity this, .entity weaponentity, vector start, vector dir, flo yoda = 0; MUTATOR_CALLHOOK(FireBullet_Hit, this, hit, start, end, damage, this.(weaponentity)); damage = M_ARGV(4, float); - float g = accuracy_isgooddamage(this, hit); + bool gooddamage = accuracy_isgooddamage(this, hit); Damage(hit, this, this, damage * solid_penetration_left, dtype, start, force * dir * solid_penetration_left); // calculate hits for ballistic weapons - if(g) + if(gooddamage) { // do not exceed 100% float added_damage = min(damage - total_damage, damage * solid_penetration_left);