X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_client.qc;h=707d36ededa4565e79c4f62a05565fb73443432a;hp=fbe98741f20ea684e2a638a1368fb4110436023d;hb=d7045045a68a8e0f187448274e226dea687ef38d;hpb=71bcd114b2be38a85c56279b851c7ca7cea83520 diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index fbe98741f2..707d36eded 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -1222,6 +1222,7 @@ Called when a client types 'kill' in the console ============= */ +.float clientkill_nexttime; void ClientKill_Now_TeamChange() { if(self.killindicator_teamchange == -1) @@ -1229,6 +1230,14 @@ void ClientKill_Now_TeamChange() self.team = -1; JoinBestTeam( self, FALSE, FALSE ); } + else if(self.killindicator_teamchange == -2) + { + if(g_ca) + self.caplayer = 0; + if(blockSpectators) + sprint(self, strcat("^7You have to become a player within the next ", ftos(autocvar_g_maxplayers_spectator_blocktime), " seconds, otherwise you will be kicked, because spectators aren't allowed at this time!\n")); + PutObserverInServer(); + } else SV_ChangeTeam(self.killindicator_teamchange - 1); } @@ -1263,7 +1272,7 @@ void KillIndicator_Think() ClientKill_Now(); // no oldself needed return; } - else if(g_cts) + else if(g_cts && self.health == 1) // health == 1 means that it's silent { self.nextthink = time + 1; self.cnt -= 1; @@ -1280,6 +1289,8 @@ void KillIndicator_Think() { if(self.owner.killindicator_teamchange == -1) centerprint(self.owner, strcat("Changing team in ", ftos(self.cnt), " seconds")); + else if(self.owner.killindicator_teamchange == -2) + centerprint(self.owner, strcat("Spectating in ", ftos(self.cnt), " seconds")); else centerprint(self.owner, strcat("Changing to ", ColoredTeamName(self.owner.killindicator_teamchange), " in ", ftos(self.cnt), " seconds")); } @@ -1291,28 +1302,34 @@ void KillIndicator_Think() } } -void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto +void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto, -2 = spec { float killtime; entity e; killtime = autocvar_g_balance_kill_delay; - if(g_race_qualifying) + if(g_race_qualifying || g_cts) killtime = 0; - self.killindicator_teamchange = targetteam; - - if(g_cts) // allow an instant kill in CTS + if(g_cts && self.killindicator && self.killindicator.health == 1) // self.killindicator.health == 1 means that the kill indicator was spawned by CTS_ClientKill { - if(self.selfkilltime < time + 3) // prevent spam - { - self.selfkilltime = max(time, self.selfkilltime) + 2; - ClientKill_Now(); - } + remove(self.killindicator); + self.killindicator = world; + + ClientKill_Now(); // allow instant kill in this case return; } + + self.killindicator_teamchange = targetteam; + if(!self.killindicator) { + if(self.modelindex && self.deadflag == DEAD_NO) + { + killtime = max(killtime, self.clientkill_nexttime - time); + self.clientkill_nexttime = time + killtime + autocvar_g_balance_kill_antispam; + } + if(killtime <= 0 || !self.modelindex || self.deadflag != DEAD_NO) { ClientKill_Now(); @@ -1348,10 +1365,14 @@ void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto } if(self.killindicator) { - if(targetteam) - self.killindicator.colormod = TeamColor(targetteam); - else + if(targetteam == 0) // just die self.killindicator.colormod = '0 0 0'; + else if(targetteam == -1) // auto + self.killindicator.colormod = '0 1 0'; + else if(targetteam == -2) // spectate + self.killindicator.colormod = '0.5 0.5 0.5'; + else + self.killindicator.colormod = TeamColor(targetteam); } } @@ -1369,13 +1390,14 @@ void ClientKill (void) ClientKill_TeamChange(0); } -void CTS_ClientKill (entity e) // silent version of ClientKill +void CTS_ClientKill (entity e) // silent version of ClientKill, used when player finishes a CTS run. Useful to prevent cheating by running back to the start line and starting out with more speed { e.killindicator = spawn(); e.killindicator.owner = e; e.killindicator.think = KillIndicator_Think; e.killindicator.nextthink = time + (e.lip) * 0.05; e.killindicator.cnt = ceil(autocvar_g_cts_finish_kill_delay); + e.killindicator.health = 1; // this is used to indicate that it should be silent e.lip = 0; }