X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=qcsrc%2Fserver%2Fplayer.qc;h=ba19f16a74c3d8b6c83d8e86797e295bc233e323;hb=258867c634125e1d048869b4a5d8ef279e8b8228;hp=9e67050cb654b23c9847c8b2e94bda0f1898b106;hpb=be37ea91fb3bbd1a6fa4f0b70b32d1ea95343ad4;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/player.qc b/qcsrc/server/player.qc index 9e67050cb..ba19f16a7 100644 --- a/qcsrc/server/player.qc +++ b/qcsrc/server/player.qc @@ -3,14 +3,19 @@ #include #include "bot/api.qh" #include "cheats.qh" +#include "client.qh" #include "clientkill.qh" #include "g_damage.qh" +#include "g_world.qh" #include "handicap.qh" #include "miscfunctions.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" @@ -18,6 +23,7 @@ #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" @@ -32,6 +38,7 @@ #include "../common/wepent.qh" #include "weapons/weaponstats.qh" +#include #include "../common/animdecide.qh" @@ -165,7 +172,7 @@ void player_anim(entity this) animbits |= ANIMSTATE_FROZEN; if(this.move_movetype == MOVETYPE_FOLLOW) animbits |= ANIMSTATE_FOLLOW; - if(this.crouch) + if(IS_DUCKED(this)) animbits |= ANIMSTATE_DUCK; animdecide_setstate(this, animbits, false); animdecide_setimplicitstate(this, IS_ONGROUND(this)); @@ -222,92 +229,6 @@ void PlayerCorpseDamage(entity this, entity inflictor, entity attacker, float da } } -void calculate_player_respawn_time(entity this) -{ - if(MUTATOR_CALLHOOK(CalculateRespawnTime, this)) - return; - - float gametype_setting_tmp; - float sdelay_max = GAMETYPE_DEFAULTED_SETTING(respawn_delay_max); - float sdelay_small = GAMETYPE_DEFAULTED_SETTING(respawn_delay_small); - float sdelay_large = GAMETYPE_DEFAULTED_SETTING(respawn_delay_large); - float sdelay_small_count = GAMETYPE_DEFAULTED_SETTING(respawn_delay_small_count); - float sdelay_large_count = GAMETYPE_DEFAULTED_SETTING(respawn_delay_large_count); - float waves = GAMETYPE_DEFAULTED_SETTING(respawn_waves); - - float pcount = 1; // Include myself whether or not team is already set right and I'm a "player". - if (teamplay) - { - FOREACH_CLIENT(IS_PLAYER(it) && it != this, { - if(it.team == this.team) - ++pcount; - }); - if (sdelay_small_count == 0) - sdelay_small_count = 1; - if (sdelay_large_count == 0) - sdelay_large_count = 1; - } - else - { - FOREACH_CLIENT(IS_PLAYER(it) && it != this, { - ++pcount; - }); - if (sdelay_small_count == 0) - { - if (IS_INDEPENDENT_PLAYER(this)) - { - // Players play independently. No point in requiring enemies. - sdelay_small_count = 1; - } - else - { - // Players play AGAINST each other. Enemies required. - sdelay_small_count = 2; - } - } - if (sdelay_large_count == 0) - { - if (IS_INDEPENDENT_PLAYER(this)) - { - // Players play independently. No point in requiring enemies. - sdelay_large_count = 1; - } - else - { - // Players play AGAINST each other. Enemies required. - sdelay_large_count = 2; - } - } - } - - float sdelay; - - if (pcount <= sdelay_small_count) - sdelay = sdelay_small; - else if (pcount >= sdelay_large_count) - sdelay = sdelay_large; - else // NOTE: this case implies sdelay_large_count > sdelay_small_count. - sdelay = sdelay_small + (sdelay_large - sdelay_small) * (pcount - sdelay_small_count) / (sdelay_large_count - sdelay_small_count); - - if(waves) - this.respawn_time = ceil((time + sdelay) / waves) * waves; - else - this.respawn_time = time + sdelay; - - if(sdelay < sdelay_max) - this.respawn_time_max = time + sdelay_max; - else - this.respawn_time_max = this.respawn_time; - - if((sdelay + waves >= 5.0) && (this.respawn_time - time > 1.75)) - this.respawn_countdown = 10; // first number to count down from is 10 - else - this.respawn_countdown = -1; // do not count down - - if(autocvar_g_forced_respawn) - this.respawn_flags = this.respawn_flags | RESPAWN_FORCE; -} - void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force) { vector v; @@ -369,7 +290,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, 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; @@ -468,6 +389,7 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, 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); @@ -490,6 +412,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) @@ -613,8 +536,17 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, this.avelocity = '0 0 0'; // view from the floor this.view_ofs = '0 0 -8'; - // toss the corpse - set_movetype(this, MOVETYPE_TOSS); + if(this.move_movetype == MOVETYPE_NOCLIP) + { + // don't toss the corpse in this case, it can get stuck in solid (causing low fps) + // or fall indefinitely into the void if out of the map + this.velocity = '0 0 0'; + } + else + { + // toss the corpse + set_movetype(this, MOVETYPE_TOSS); + } // shootable corpse this.solid = SOLID_CORPSE; PS(this).ballistics_density = autocvar_g_ballistics_density_corpse;