static TeamBalance = 0;
//OnPlayerConnect/Join team
if(TeamBalance == 5) return SCM(..); // or whatever
TeamBalance++;
//OnPlayerDisconnect/Leave team
TeamBalance--;
//You need to modify it if there is more than one team.
|
1. This is wrong section for that.
You can check that by making a variable, increase it when a player joins that class and decrease when a player leaves. |
#include a_samp #include foreach #include izcmd new Iterator:TeamRedPlayer<MAX_PLAYERS>; new Iterator:TeamBluePlayer<MAX_PLAYERS>; new bool:IsInTDM[MAX_PLAYERS]; #define Team_Red 1 #define Team_Blue 2
CMD:tdm(playerid)
{
if(Iter_Count(TeamRedPlayer) > Iter_Count(TeamBluePlayer)) // easy
SetPlayerTeamEx(playerid, Team_Blue);
else
SetPlayerTeamEx(playerid, Team_Red);
return 1;
}
stock SetPlayerTeamEx(playerid, teamid)
{
switch(teamid)
{
case Team_Red:
{
SetPlayerTeam(playerid, Team_Red);///// Setting team id
SetPlayerColor(playerid, 0xFF0000FF);///// Color Red
Iter_Add(TeamRedPlayer, playerid);///// Adding in iterator
}
case Team_Blue:
{
SetPlayerTeam(playerid, Team_Blue); ///// Setting team id
SetPlayerColor(playerid, 0x0000FFFF); ///// Color blue
Iter_Add(TeamBluePlayer, playerid); ///// Adding in iterator
}
}
IsInTDM[playerid] = true; // Confirm that player is in TDM minigame now
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
if(IsInTDM[playerid] == true) // checking if true
ExcludePlayerFromTeam(playerid); //then exclude player
return 1;
}
stock ExcludePlayerFromTeam(playerid)
{
switch(GetPlayerTeam(playerid))
{
case Team_Red:
{
Iter_Remove(TeamRedPlayer, playerid); //// Removing player so he wont be counted
SetPlayerColor(playerid, 0xFFFF00FF); ///// Color Setting yellow color say no team color
SetPlayerTeam(playerid, NO_TEAM); ///// Setting team id to none
}
case Team_Blue:
{
Iter_Remove(TeamRedPlayer, playerid); //// Removing player so he wont be counted
SetPlayerColor(playerid, 0xFFFF00FF); ///// Color Setting yellow color say no team color
SetPlayerTeam(playerid, NO_TEAM); ///// Setting team id to none
}
default:
return 0; // in case player was not in the specified team
}
IsInTDM[playerid] = false; // ensure that player is no more in this TDM minigame
return 1;
}
|
i would prefer using foreach include. it just help shrink the code and work even better!
Lets start with defines, variables and iterators. Код:
#include a_samp #include foreach #include izcmd new Iterator:TeamRedPlayer<MAX_PLAYERS>; new Iterator:TeamBluePlayer<MAX_PLAYERS>; new bool:IsInTDM[MAX_PLAYERS]; #define Team_Red 1 #define Team_Blue 2 Код:
CMD:tdm(playerid)
{
if(Iter_Count(TeamRedPlayer) > Iter_Count(TeamBluePlayer)) // easy
SetPlayerTeamEx(playerid, Team_Blue);
else
SetPlayerTeamEx(playerid, Team_Red);
return 1;
}
Код:
stock SetPlayerTeamEx(playerid, teamid)
{
switch(teamid)
{
case Team_Red:
{
SetPlayerTeam(playerid, Team_Red);///// Setting team id
SetPlayerColor(playerid, 0xFF0000FF);///// Color Red
Iter_Add(TeamRedPlayer, playerid);///// Adding in iterator
}
case Team_Blue:
{
SetPlayerTeam(playerid, Team_Blue); ///// Setting team id
SetPlayerColor(playerid, 0x0000FFFF); ///// Color blue
Iter_Add(TeamBluePlayer, playerid); ///// Adding in iterator
}
}
IsInTDM[playerid] = true; // Confirm that player is in TDM minigame now
return 1;
}
Код:
public OnPlayerDisconnect(playerid, reason)
{
if(IsInTDM[playerid] == true) // checking if true
ExcludePlayerFromTeam(playerid); //then exclude player
return 1;
}
stock ExcludePlayerFromTeam(playerid)
{
switch(GetPlayerTeam(playerid))
{
case Team_Red:
{
Iter_Remove(TeamRedPlayer, playerid); //// Removing player so he wont be counted
SetPlayerColor(playerid, 0xFFFF00FF); ///// Color Setting yellow color say no team color
SetPlayerTeam(playerid, NO_TEAM); ///// Setting team id to none
}
case Team_Blue:
{
Iter_Remove(TeamRedPlayer, playerid); //// Removing player so he wont be counted
SetPlayerColor(playerid, 0xFFFF00FF); ///// Color Setting yellow color say no team color
SetPlayerTeam(playerid, NO_TEAM); ///// Setting team id to none
}
default:
return 0; // in case player was not in the specified team
}
IsInTDM[playerid] = false; // ensure that player is no more in this TDM minigame
return 1;
}
|
// modified for his version:
AutoTeamBalance()
{
new i, j, random_player;
Iter_Clear(TeamRedPlayer);
Iter_Clear(TeamBluePlayer);
foreach(i : Player)
{
if (/* player is logged in/spawned etc. - able to play in next round, in other words */)
{
Iter_Add(TeamRedPlayer, i);
}
}
for (i = 0, j = Iter_Count(TeamRedPlayer) / 2; i <= j; i++)
{
random_player = Iter_Random(TeamRedPlayer);
Iter_Add(TeamBluePlayer, random_player);
Iter_Remove(TeamRedPlayer, random_player);
}
}
|
In my opinion foreach is essential part of a gamemode and except the pre-made iterators, you can make your own iterators which come in handy for many cases.
To add to gurmani11's post, when I read "auto team balance" I remembered something I had written in the past: pawn Код:
|
stock AutoBalance()
{
new GetDifference = Iter_Count(TeamRedPlayer) - Iter_Count(TeamBluePlayer);
if(GetDifference < 2) return 0;
else
{
if(Iter_Count(TeamRedPlayer) > Iter_Count(TeamBluePlayer))
SetPlayerTeamEx(random(Iter_Count(TeamRedPlayer)), Team_Blue);
else
SetPlayerTeamEx(random(Iter_Count(TeamBluePlayer)), Team_Red);
}
return 1;
}