From: Mario Date: Sun, 10 Jul 2016 09:57:53 +0000 (+1000) Subject: Fix bot_vs_human and CTF HUD X-Git-Tag: xonotic-v0.8.2~700^2~10^2~4 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=957444808b4c2ccf91a2e998f569e4630d05d7ec;p=xonotic%2Fxonotic-data.pk3dir.git Fix bot_vs_human and CTF HUD --- diff --git a/qcsrc/client/hud/panel/modicons.qc b/qcsrc/client/hud/panel/modicons.qc index 54c835831..d79877a78 100644 --- a/qcsrc/client/hud/panel/modicons.qc +++ b/qcsrc/client/hud/panel/modicons.qc @@ -108,6 +108,7 @@ void HUD_Mod_CTF_Reset() redflag_statuschange_time = blueflag_statuschange_time = yellowflag_statuschange_time = pinkflag_statuschange_time = neutralflag_statuschange_time = 0; } +int autocvar__teams_available; void HUD_Mod_CTF(vector pos, vector mySize) { vector redflag_pos, blueflag_pos, yellowflag_pos, pinkflag_pos, neutralflag_pos; @@ -121,6 +122,8 @@ void HUD_Mod_CTF(vector pos, vector mySize) float fs, fs2, fs3, size1, size2; vector e1, e2; + int nteams = autocvar__teams_available; + redflag = (stat_items/CTF_RED_FLAG_TAKEN) & 3; blueflag = (stat_items/CTF_BLUE_FLAG_TAKEN) & 3; yellowflag = (stat_items/CTF_YELLOW_FLAG_TAKEN) & 3; @@ -134,9 +137,9 @@ void HUD_Mod_CTF(vector pos, vector mySize) if (autocvar__hud_configure) { redflag = 1; blueflag = 2; - if (team_count >= 3) + if (nteams & BIT(2)) yellowflag = 2; - if (team_count >= 4) + if (nteams & BIT(3)) pinkflag = 3; ctf_oneflag = neutralflag = 0; // disable neutral flag in hud editor? } @@ -200,16 +203,24 @@ void HUD_Mod_CTF(vector pos, vector mySize) } MACRO_END X(red, myteam != NUM_TEAM_1); X(blue, myteam != NUM_TEAM_2); - X(yellow, myteam != NUM_TEAM_3 && team_count >= 3); - X(pink, myteam != NUM_TEAM_4 && team_count >= 4); + X(yellow, myteam != NUM_TEAM_3 && (nteams & BIT(2))); + X(pink, myteam != NUM_TEAM_4 && (nteams & BIT(3))); X(neutral, ctf_oneflag); #undef X + int tcount = 2; + if(nteams & BIT(2)) + tcount = 3; + if(nteams & BIT(3)) + tcount = 4; + + LOG_INFO(ftos(tcount), "\n"); + if (ctf_oneflag) { // hacky, but these aren't needed red_icon = red_icon_prevstatus = blue_icon = blue_icon_prevstatus = yellow_icon = yellow_icon_prevstatus = pink_icon = pink_icon_prevstatus = string_null; fs = fs2 = fs3 = 1; - } else switch (team_count) { + } else switch (tcount) { default: case 2: fs = 0.5; fs2 = 0.5; fs3 = 0.5; break; case 3: fs = 1; fs2 = 0.35; fs3 = 0.35; break; diff --git a/qcsrc/server/bot/bot.qc b/qcsrc/server/bot/bot.qc index 8707a03bd..941807428 100644 --- a/qcsrc/server/bot/bot.qc +++ b/qcsrc/server/bot/bot.qc @@ -573,7 +573,7 @@ float bot_fixcount() // But don't remove bots immediately on level change, as the real players // usually haven't rejoined yet bots_would_leave = false; - if (teamplay && autocvar_bot_vs_human && (c3==-1 && c4==-1)) + if (teamplay && autocvar_bot_vs_human && AvailableTeams() == 2) bots = min(ceil(fabs(autocvar_bot_vs_human) * activerealplayers), maxclients - realplayers); else if ((realplayers || autocvar_bot_join_empty || (currentbots > 0 && time < 5))) { diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 912086389..1ca349ee7 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -1145,7 +1145,7 @@ void ClientConnect(entity this) if (!sv_foginterval && world.fog != "") stuffcmd(this, strcat("\nfog ", world.fog, "\nr_fog_exp2 0\nr_drawfog 1\n")); - if (autocvar_sv_teamnagger && !(autocvar_bot_vs_human && (c3==-1 && c4==-1))) + if (autocvar_sv_teamnagger && !(autocvar_bot_vs_human && AvailableTeams() == 2)) if (!g_ca && !g_cts && !g_race) // teamnagger is currently bad for ca, race & cts send_CSQC_teamnagger(); diff --git a/qcsrc/server/scores_rules.qc b/qcsrc/server/scores_rules.qc index a6786595f..b93c114c0 100644 --- a/qcsrc/server/scores_rules.qc +++ b/qcsrc/server/scores_rules.qc @@ -3,6 +3,8 @@ #include "cl_client.qh" #include "scores.qh" +int ScoreRules_teams; + void CheckAllowedTeams (entity for_whom); int NumTeams(int teams) @@ -10,9 +12,15 @@ int NumTeams(int teams) return boolean(teams & BIT(0)) + boolean(teams & BIT(1)) + boolean(teams & BIT(2)) + boolean(teams & BIT(3)); } +int AvailableTeams() +{ + return NumTeams(ScoreRules_teams); + // NOTE: this method is unreliable, as forced teams set the c* globals to weird values + //return boolean(c1 >= 0) + boolean(c2 >= 0) + boolean(c3 >= 0) + boolean(c4 >= 0); +} + // NOTE: SP_ constants may not be >= MAX_SCORE; ST_constants may not be >= MAX_TEAMSCORE // scores that should be in all modes: -int ScoreRules_teams; void ScoreRules_basics(int teams, float sprio, float stprio, float score_enabled) { float i; diff --git a/qcsrc/server/scores_rules.qh b/qcsrc/server/scores_rules.qh index 451d3f603..9d1caf539 100644 --- a/qcsrc/server/scores_rules.qh +++ b/qcsrc/server/scores_rules.qh @@ -1,6 +1,7 @@ #pragma once int NumTeams(int teams); +int AvailableTeams(); void ScoreRules_basics(int teams, float sprio, float stprio, float score_enabled); void ScoreRules_basics_end(); void ScoreRules_generic(); diff --git a/qcsrc/server/teamplay.qc b/qcsrc/server/teamplay.qc index 921bf0cef..e2156705a 100644 --- a/qcsrc/server/teamplay.qc +++ b/qcsrc/server/teamplay.qc @@ -244,24 +244,46 @@ void CheckAllowedTeams (entity for_whom) } // TODO: Balance quantity of bots across > 2 teams when bot_vs_human is set (and remove next line) - if(c3==-1 && c4==-1) + if(AvailableTeams() == 2) if(autocvar_bot_vs_human && for_whom) { if(autocvar_bot_vs_human > 0) { - // bots are all blue + // find last team available + if(IS_BOT_CLIENT(for_whom)) - c1 = c3 = c4 = -1; + { + if(c4 >= 0) { c3 = c2 = c1 = -1; } + else if(c3 >= 0) { c4 = c2 = c1 = -1; } + else { c4 = c3 = c1 = -1; } + // no further cases, we know at least 2 teams exist + } else - c2 = -1; + { + if(c1 >= 0) { c2 = c3 = c4 = -1; } + else if(c2 >= 0) { c1 = c3 = c4 = -1; } + else { c1 = c2 = c4 = -1; } + // no further cases, bots have one of the teams + } } else { - // bots are all red + // find first team available + if(IS_BOT_CLIENT(for_whom)) - c2 = c3 = c4 = -1; + { + if(c1 >= 0) { c2 = c3 = c4 = -1; } + else if(c2 >= 0) { c1 = c3 = c4 = -1; } + else { c1 = c2 = c4 = -1; } + // no further cases, we know at least 2 teams exist + } else - c1 = -1; + { + if(c4 >= 0) { c3 = c2 = c1 = -1; } + else if(c3 >= 0) { c4 = c2 = c1 = -1; } + else { c4 = c3 = c1 = -1; } + // no further cases, bots have one of the teams + } } }