X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fgamemodes%2Fgamemode%2Fclanarena%2Fsv_clanarena.qc;h=163b996c3f61a95996b8aa281d90b19580c60da8;hb=ab1586cc7368c885eb227b6d5447eeb06a8942a2;hp=4c889cb24be655fe22afa1af098046b1a0219082;hpb=e044c33d2e56a13837659b0cdb0ac9a2e6242957;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc b/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc index 4c889cb24..163b996c3 100644 --- a/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc +++ b/qcsrc/common/gamemodes/gamemode/clanarena/sv_clanarena.qc @@ -62,7 +62,6 @@ int CA_GetWinnerTeam() void nades_Clear(entity player); -#define CA_ALIVE_TEAMS_OK() (Team_GetNumberOfAliveTeams() == NumTeams(ca_teams)) float CA_CheckWinner() { if(round_handler_GetEndTime() > 0 && round_handler_GetEndTime() - time <= 0) @@ -115,7 +114,7 @@ bool CA_CheckTeams() static int prev_missing_teams_mask; allowed_to_spawn = true; CA_count_alive_players(); - if(CA_ALIVE_TEAMS_OK()) + if (Team_GetNumberOfAliveTeams() == NumTeams(ca_teams)) { if(prev_missing_teams_mask > 0) Kill_Notification(NOTIF_ALL, NULL, MSG_CENTER, CPID_MISSING_TEAMS); @@ -298,7 +297,7 @@ MUTATOR_HOOKFUNCTION(ca, ClientDisconnect) { entity player = M_ARGV(0, entity); - if (player.caplayer == 1) + if (IS_PLAYER(player) && !IS_DEAD(player)) ca_LastPlayerForTeam_Notify(player); return true; } @@ -307,7 +306,7 @@ MUTATOR_HOOKFUNCTION(ca, MakePlayerObserver) { entity player = M_ARGV(0, entity); - if (!IS_DEAD(player)) + if (IS_PLAYER(player) && !IS_DEAD(player)) ca_LastPlayerForTeam_Notify(player); if (player.killindicator_teamchange == -2) // player wants to spectate player.caplayer = 0; @@ -380,12 +379,12 @@ MUTATOR_HOOKFUNCTION(ca, PlayerDamage_SplitHealthArmor) entity frag_attacker = M_ARGV(1, entity); entity frag_target = M_ARGV(2, entity); float frag_damage = M_ARGV(7, float); - float damage_take = M_ARGV(4, float); - float damage_save = M_ARGV(5, float); + float damage_take = bound(0, M_ARGV(4, float), GetResourceAmount(frag_target, RESOURCE_HEALTH)); + float damage_save = bound(0, M_ARGV(5, float), GetResourceAmount(frag_target, RESOURCE_ARMOR)); float excess = max(0, frag_damage - damage_take - damage_save); - if (frag_target != frag_attacker && IS_PLAYER(frag_attacker)) + if (frag_target != frag_attacker && IS_PLAYER(frag_attacker) && DIFF_TEAM(frag_target, frag_attacker)) GameRules_scoring_add_team(frag_attacker, SCORE, (frag_damage - excess) * autocvar_g_ca_damage2score_multiplier); } @@ -421,7 +420,8 @@ MUTATOR_HOOKFUNCTION(ca, SpectateNext) { entity client = M_ARGV(0, entity); - if (!autocvar_g_ca_spectate_enemies && client.caplayer) + if (!autocvar_g_ca_spectate_enemies && client.caplayer + && Team_GetNumberOfAlivePlayers(Entity_GetTeam(client))) { entity targ = M_ARGV(1, entity); M_ARGV(1, entity) = CA_SpectateNext(client, targ); @@ -435,7 +435,8 @@ MUTATOR_HOOKFUNCTION(ca, SpectatePrev) entity targ = M_ARGV(1, entity); entity first = M_ARGV(2, entity); - if (!autocvar_g_ca_spectate_enemies && client.caplayer) + if (!autocvar_g_ca_spectate_enemies && client.caplayer + && Team_GetNumberOfAlivePlayers(Entity_GetTeam(client))) { do { targ = targ.chain; } while(targ && DIFF_TEAM(targ, client)); @@ -448,6 +449,8 @@ MUTATOR_HOOKFUNCTION(ca, SpectatePrev) return MUT_SPECPREV_RETURN; } } + else + return MUT_SPECPREV_CONTINUE; M_ARGV(1, entity) = targ;