X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fplayer.qc;h=ef60454033748a5c25acbdb3a74cefc8f4cf3447;hb=HEAD;hp=bd1bc6d684f2636951cd313ca00cbacdc611fb06;hpb=c8411b61c6dd7b1bd1204a2d090308d38da058df;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/player.qc b/qcsrc/server/player.qc index bd1bc6d68..da2c48ded 100644 --- a/qcsrc/server/player.qc +++ b/qcsrc/server/player.qc @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -126,6 +127,7 @@ void CopyBody(entity this, float keepvelocity) if(clone.colormap <= maxclients && clone.colormap > 0) clone.colormap = 1024 + this.clientcolors; + clone.sv_entnum = etof(this); // sent to CSQC for color mapping purposes CSQCMODEL_AUTOINIT(clone); clone.CopyBody_nextthink = this.nextthink; @@ -236,10 +238,10 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, { if(!DEATH_ISSPECIAL(deathtype)) { - damage *= Handicap_GetTotalHandicap(this); + damage *= Handicap_GetTotalHandicap(this, true); if (this != attacker && IS_PLAYER(attacker)) { - damage /= Handicap_GetTotalHandicap(attacker); + damage /= Handicap_GetTotalHandicap(attacker, false); } } @@ -248,7 +250,7 @@ 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) + 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 @@ -333,7 +335,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,21 +389,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 || 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); - } - // don't count DEATH_KILL damage in game modes where suicide is for respawning - // TODO mutator hook? - if (deathtype != DEATH_KILL.m_id || !(IS_GAMETYPE(RACE) || IS_GAMETYPE(CTS))) - if (IS_PLAYER(this)) { - GameRules_scoring_add(this, DMGTAKEN, realdmg); - } - } } else this.max_armorvalue += (save + take); @@ -436,7 +423,21 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, 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)) + { + // accumulate damage, it will be logged later in this frame + if (IS_PLAYER(attacker) && DIFF_TEAM(attacker, this) && deathtype != DEATH_KILL.m_id) + attacker.score_frame_dmg += realdmg; + if (IS_PLAYER(this)) + this.score_frame_dmgtaken += realdmg; + } + } if (GetResource(this, RES_HEALTH) < 1) { @@ -560,13 +561,8 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, // don't play teleportation sounds this.teleportable = TELEPORT_SIMPLE; - STAT(STRENGTH_FINISHED, this) = 0; - STAT(INVINCIBLE_FINISHED, this) = 0; - STAT(SUPERWEAPONS_FINISHED, this) = 0; 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); @@ -613,7 +609,8 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, bool PlayerHeal(entity targ, entity inflictor, float amount, float limit) { - if(GetResource(targ, RES_HEALTH) <= 0 || GetResource(targ, RES_HEALTH) >= limit) + float hlth = GetResource(targ, RES_HEALTH); + if (hlth <= 0 || hlth >= limit) return false; GiveResourceWithLimit(targ, RES_HEALTH, amount, limit);