use score to balance
according to a server owner, the "teamTime" persistent variable isn't defined when a player joins a new team. not sure why because GSC dumps reveal it should be just fine, but just in case, just sort by score instead.
This commit is contained in:
parent
a83671b105
commit
2554846b30
@ -1,11 +1,71 @@
|
|||||||
init()
|
main()
|
||||||
{
|
{
|
||||||
// define the auto balance string in the game array (referenced in gsc dump, but not defined past IW6?)
|
|
||||||
precachestring(&"MP_AUTOBALANCE_NOW");
|
precachestring(&"MP_AUTOBALANCE_NOW");
|
||||||
game["strings"]["autobalance"] = &"MP_AUTOBALANCE_NOW";
|
|
||||||
|
|
||||||
// define onteamselection callback function used in balanceteams()
|
// use player's score to balance instead player's time on team
|
||||||
level.onteamselection = ::set_team;
|
replacefunc(maps\mp\gametypes\_teams::balanceteams, ::balance_teams_stub);
|
||||||
|
}
|
||||||
|
|
||||||
|
balance_teams_stub()
|
||||||
|
{
|
||||||
|
iprintlnbold(&"MP_AUTOBALANCE_NOW");
|
||||||
|
|
||||||
|
allied_players = get_valid_team_array("allies");
|
||||||
|
axis_players = get_valid_team_array("axis");
|
||||||
|
while (is_team_bigger_than(allied_players, axis_players) || is_team_bigger_than(axis_players, allied_players))
|
||||||
|
{
|
||||||
|
if (is_team_bigger_than(allied_players, axis_players))
|
||||||
|
{
|
||||||
|
handle_lowest_score_player(allied_players, "axis");
|
||||||
|
}
|
||||||
|
else if (is_team_bigger_than(axis_players, team))
|
||||||
|
{
|
||||||
|
handle_lowest_score_player(axis_players, "allies");
|
||||||
|
}
|
||||||
|
|
||||||
|
// refresh array for loop
|
||||||
|
allied_players = get_valid_team_array("allies");
|
||||||
|
axis_players = get_valid_team_array("axis");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get_valid_team_array(team)
|
||||||
|
{
|
||||||
|
team_array = [];
|
||||||
|
players = level.players;
|
||||||
|
for (i = 0; i < players.size; i++)
|
||||||
|
{
|
||||||
|
if (!isdefined(players[i].pers["score"])) // was teamTime
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (isdefined(players[i].pers["team"]) && players[i].pers["team"] == team)
|
||||||
|
team_array[team_array.size] = players[i];
|
||||||
|
}
|
||||||
|
return team_arary;
|
||||||
|
}
|
||||||
|
|
||||||
|
is_team_bigger_than(team_one, team_two)
|
||||||
|
{
|
||||||
|
return (team_one.size > (team_two.size + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
handle_lowest_score_player(team, new_team)
|
||||||
|
{
|
||||||
|
lowest_score_player = undefined;
|
||||||
|
|
||||||
|
// move the player that has the lowest score (highest teamTime value)
|
||||||
|
for (i = 0; i < team.size; i++)
|
||||||
|
{
|
||||||
|
if (isdefined(team[j].dont_auto_balance))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!isdefined(lowest_score_player))
|
||||||
|
lowest_score_player = team[j];
|
||||||
|
else if (team[j].pers["score"] < lowest_score_player.pers["score"])
|
||||||
|
lowest_score_player = team[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
lowest_score_player set_team(new_team);
|
||||||
}
|
}
|
||||||
|
|
||||||
set_team(team)
|
set_team(team)
|
||||||
@ -24,6 +84,4 @@ set_team(team)
|
|||||||
|
|
||||||
self maps\mp\gametypes\_menus::addtoteam(team);
|
self maps\mp\gametypes\_menus::addtoteam(team);
|
||||||
self maps\mp\gametypes\_menus::endrespawnnotify();
|
self maps\mp\gametypes\_menus::endrespawnnotify();
|
||||||
|
|
||||||
self maps\mp\gametypes\_teams::updateteamtime(); // defines pers["teamTime"] for balancing
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user