X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fplayer.qc;h=ef60454033748a5c25acbdb3a74cefc8f4cf3447;hb=HEAD;hp=1be6b62a3f2b8903775047ab2af91d2fdb758d2e;hpb=6c4bdd5eeea06db69a457997de24bef84b4eaf93;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/player.qc b/qcsrc/server/player.qc index 1be6b62a3..a9ae47eb1 100644 --- a/qcsrc/server/player.qc +++ b/qcsrc/server/player.qc @@ -1,46 +1,43 @@ #include "player.qh" +#include +#include +#include +#include #include -#include "bot/api.qh" -#include "cheats.qh" -#include "client.qh" -#include "clientkill.qh" -#include "damage.qh" -#include -#include "world.qh" -#include "handicap.qh" -#include "portals.qh" -#include "teamplay.qh" -#include -#include "weapons/common.qh" -#include "weapons/throwing.qh" -#include "command/common.qh" -#include "command/vote.qh" -#include "../common/state.qh" -#include "../common/anim.qh" -#include "../common/animdecide.qh" -#include "../common/csqcmodel_settings.qh" -#include "../common/gamemodes/sv_rules.qh" -#include "../common/deathtypes/all.qh" -#include "../common/mapobjects/subs.qh" -#include -#include "../common/playerstats.qh" -#include "../lib/csqcmodel/sv_model.qh" - -#include "../common/minigames/sv_minigames.qh" - +#include #include - -#include "../common/physics/player.qh" -#include "../common/effects/qc/_mod.qh" -#include "../common/mutators/mutator/waypoints/waypointsprites.qh" -#include "../common/mapobjects/_mod.qh" -#include "../common/wepent.qh" - -#include "weapons/weaponstats.qh" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include - -#include "../common/animdecide.qh" +#include void Drop_Special_Items(entity player) { @@ -130,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; @@ -232,18 +230,18 @@ 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) { 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); } } @@ -252,8 +250,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 { @@ -324,7 +322,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); @@ -337,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)) { @@ -391,18 +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 && 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); @@ -430,19 +416,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) { @@ -559,8 +557,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)