X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fmutator%2Fgamemode_ca.qc;h=159df8a7818edbf5348a6d9ab184fb1227dbaefe;hb=6b3f7d6fc917129765479348a8b3957c50af09d9;hp=4707e9fca0032114922da14f16756523b4bb596a;hpb=66458c7ed8a69280410c2b7cb395552cd42efac7;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/mutators/mutator/gamemode_ca.qc b/qcsrc/server/mutators/mutator/gamemode_ca.qc index 4707e9fca..159df8a78 100644 --- a/qcsrc/server/mutators/mutator/gamemode_ca.qc +++ b/qcsrc/server/mutators/mutator/gamemode_ca.qc @@ -6,7 +6,7 @@ bool autocvar_g_ca_spectate_enemies; void CA_count_alive_players() { total_players = redalive = bluealive = yellowalive = pinkalive = 0; - FOREACH_CLIENT(IS_PLAYER(it), LAMBDA( + FOREACH_CLIENT(IS_PLAYER(it), { switch(it.team) { case NUM_TEAM_1: ++total_players; if(!IS_DEAD(it)) ++redalive; break; @@ -14,13 +14,13 @@ void CA_count_alive_players() case NUM_TEAM_3: ++total_players; if(!IS_DEAD(it)) ++yellowalive; break; case NUM_TEAM_4: ++total_players; if(!IS_DEAD(it)) ++pinkalive; break; } - )); - FOREACH_CLIENT(IS_REAL_CLIENT(it), LAMBDA( + }); + FOREACH_CLIENT(IS_REAL_CLIENT(it), { it.redalive_stat = redalive; it.bluealive_stat = bluealive; it.yellowalive_stat = yellowalive; it.pinkalive_stat = pinkalive; - )); + }); } float CA_GetWinnerTeam() @@ -58,9 +58,11 @@ float CA_CheckWinner() { Send_Notification(NOTIF_ALL, NULL, MSG_CENTER, CENTER_ROUND_OVER); Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ROUND_OVER); + FOREACH_CLIENT(IS_PLAYER(it), { nades_Clear(it); }); + allowed_to_spawn = false; + game_stopped = true; round_handler_Init(5, autocvar_g_ca_warmup, autocvar_g_ca_round_timelimit); - FOREACH_CLIENT(IS_PLAYER(it), LAMBDA(nades_Clear(it))); return 1; } @@ -82,9 +84,10 @@ float CA_CheckWinner() } allowed_to_spawn = false; + game_stopped = true; round_handler_Init(5, autocvar_g_ca_warmup, autocvar_g_ca_round_timelimit); - FOREACH_CLIENT(IS_PLAYER(it), LAMBDA(nades_Clear(it))); + FOREACH_CLIENT(IS_PLAYER(it), { nades_Clear(it); }); return 1; } @@ -185,7 +188,7 @@ MUTATOR_HOOKFUNCTION(ca, PutClientInServer) if (!allowed_to_spawn && IS_PLAYER(player)) // this is true even when player is trying to join { TRANSMUTE(Observer, player); - if (player.jointime != time && !player.caplayer) // not when connecting + if (CS(player).jointime != time && !player.caplayer) // not when connecting { player.caplayer = 0.5; Send_Notification(NOTIF_ONE_ONLY, player, MSG_INFO, INFO_CA_JOIN_LATE); @@ -196,7 +199,7 @@ MUTATOR_HOOKFUNCTION(ca, PutClientInServer) MUTATOR_HOOKFUNCTION(ca, reset_map_players) { FOREACH_CLIENT(true, { - it.killcount = 0; + CS(it).killcount = 0; if (!it.caplayer && IS_BOT_CLIENT(it)) { it.team = -1; @@ -209,6 +212,7 @@ MUTATOR_HOOKFUNCTION(ca, reset_map_players) PutClientInServer(it); } }); + bot_relinkplayerlist(); return true; } @@ -226,7 +230,7 @@ MUTATOR_HOOKFUNCTION(ca, reset_map_global) return true; } -MUTATOR_HOOKFUNCTION(ca, GetTeamCount, CBC_ORDER_EXCLUSIVE) +MUTATOR_HOOKFUNCTION(ca, CheckAllowedTeams, CBC_ORDER_EXCLUSIVE) { M_ARGV(0, float) = ca_teams; } @@ -265,6 +269,8 @@ MUTATOR_HOOKFUNCTION(ca, PlayerDies) frag_target.respawn_flags = RESPAWN_SILENT; if (!warmup_stage) eliminatedPlayers.SendFlags |= 1; + if(IS_BOT_CLIENT(frag_target)) + bot_clear(frag_target); return true; } @@ -277,25 +283,20 @@ MUTATOR_HOOKFUNCTION(ca, ClientDisconnect) return true; } -MUTATOR_HOOKFUNCTION(ca, ForbidPlayerScore_Clear) -{ - return true; -} - MUTATOR_HOOKFUNCTION(ca, MakePlayerObserver) { entity player = M_ARGV(0, entity); if (!IS_DEAD(player)) ca_LastPlayerForTeam_Notify(player); - if (player.killindicator_teamchange == -2) + if (CS(player).killindicator_teamchange == -2) // player wants to spectate player.caplayer = 0; if (player.caplayer) player.frags = FRAGS_LMS_LOSER; - else - player.frags = FRAGS_SPECTATOR; if (!warmup_stage) eliminatedPlayers.SendFlags |= 1; + if (!player.caplayer) + return false; // allow team reset return true; // prevent team reset } @@ -323,7 +324,7 @@ MUTATOR_HOOKFUNCTION(ca, SetStartItems) start_ammo_fuel = warmup_start_ammo_fuel = cvar("g_lms_start_ammo_fuel"); } -MUTATOR_HOOKFUNCTION(ca, PlayerDamage_Calculate) +MUTATOR_HOOKFUNCTION(ca, Damage_Calculate) { entity frag_attacker = M_ARGV(1, entity); entity frag_target = M_ARGV(2, entity); @@ -365,7 +366,7 @@ MUTATOR_HOOKFUNCTION(ca, PlayerDamage_SplitHealthArmor) float excess = max(0, frag_damage - damage_take - damage_save); if (frag_target != frag_attacker && IS_PLAYER(frag_attacker)) - PlayerTeamScore_Add(frag_attacker, SP_SCORE, ST_SCORE, (frag_damage - excess) * autocvar_g_ca_damage2score_multiplier); + GameRules_scoring_add_team(frag_attacker, SCORE, (frag_damage - excess) * autocvar_g_ca_damage2score_multiplier); } MUTATOR_HOOKFUNCTION(ca, PlayerRegen) @@ -457,6 +458,11 @@ MUTATOR_HOOKFUNCTION(ca, WantWeapon) M_ARGV(2, bool) = true; // all weapons } +MUTATOR_HOOKFUNCTION(ca, HideTeamNagger) +{ + return true; // doesn't work well with the whole spectator as player thing +} + MUTATOR_HOOKFUNCTION(ca, GetPlayerStatus) { entity player = M_ARGV(0, entity);