X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_client.qc;h=71584d350379869717ce8e3cd1ca6a2a3ce47f24;hp=36c23473202d47d7f2e094103b0fccda9bfd3e5d;hb=94db0bdbb20203c5675c8e6f1ab3bdf6a105b20f;hpb=7a8e4ad81bf523a53882ef97822b0641e424730c diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 36c234732..71584d350 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -2346,6 +2346,7 @@ void SpectateCopy(entity spectatee) { self.impulse = 0; self.items = spectatee.items; self.last_pickup = spectatee.last_pickup; + self.hit_time = spectatee.hit_time; self.metertime = spectatee.metertime; self.strength_finished = spectatee.strength_finished; self.invincible_finished = spectatee.invincible_finished; @@ -2438,7 +2439,7 @@ void ShowRespawnCountdown() void LeaveSpectatorMode() { - if(isJoinAllowed()) { + if(nJoinAllowed(1)) { if(!teams_matter || autocvar_g_campaign || autocvar_g_balance_teams || (self.wasplayer && autocvar_g_changeteam_banned) || self.team_forced > 0) { self.classname = "player"; @@ -2475,25 +2476,30 @@ void LeaveSpectatorMode() * Determines whether the player is allowed to join. This depends on cvar * g_maxplayers, if it isn't used this function always return TRUE, otherwise * it checks whether the number of currently playing players exceeds g_maxplayers. - * @return bool TRUE if the player is allowed to join, false otherwise + * @return int number of free slots for players, 0 if none */ -float isJoinAllowed() { +float nJoinAllowed(float includeMe) { if(self.team_forced < 0) return FALSE; // forced spectators can never join + // TODO simplify this + local entity e; + + local float totalClients; + FOR_EACH_CLIENT(e) + totalClients += 1; + if (!autocvar_g_maxplayers) - return TRUE; + return maxclients - totalClients + includeMe; - local entity e; local float currentlyPlaying; - FOR_EACH_REALPLAYER(e) { - if(e.classname == "player") - currentlyPlaying += 1; - } + FOR_EACH_REALPLAYER(e) + currentlyPlaying += 1; + if(currentlyPlaying < autocvar_g_maxplayers) - return TRUE; + return min(maxclients - totalClients + includeMe, autocvar_g_maxplayers - currentlyPlaying); - return FALSE; + return 0; } /** @@ -3090,7 +3096,7 @@ void PlayerPostThink (void) playerdemo_write(); - if((g_cts || g_race) && self.cvar_cl_allow_uid2name == 1) + if((g_cts || g_race) && self.cvar_cl_allow_uidtracking == 1 && self.cvar_cl_allow_uid2name == 1) { if(!self.stored_netname) self.stored_netname = strzone(uid2name(self.crypto_idfp));