Da, aici problema este foarte clară. Nu comanda /setbonus este problema, ci SetBonusActiv = 0 este pus în interiorul foreach.
Practic, faci asta:
foreach(Player, i)
{
...
PlayerInfo[i][pCashMoney] += MoneyAll;
...
SetBonusActiv = 0;
}
La primul player găsit în foreach, bonusul este acordat, apoi:
SetBonusActiv = 0;
și pentru următorii jucători condiția:
if(SetBonusActiv == 1)
devine falsă.
Soluția
Mută resetarea bonusului după foreach, nu în interiorul lui.
function BonusForAll()
{
new string[129];
if(SetBonusActiv == 1 && GetPlayersOnline() >= PlayersOnlineForBonus)
{
format(string, sizeof(string),
"The server has reached %d players online and you have received: $%s, %d respect points, %d premium points.",
PlayersOnlineForBonus,
FormatNumber(MoneyAll),
RespectPointsForAll,
PremiumPointsForAll
);
foreach(Player, i)
{
if(IsPlayerConnected(i) && IsPlayerLogged[i] == 1)
{
SCM(i, COLOR_YELLOW, string);
PlayerInfo[i][pCashMoney] += MoneyAll;
UpdateVar(i, "CashMoney", PlayerInfo[i][pCashMoney]);
ResetPlayerMoney(i);
GivePlayerMoney(i, PlayerInfo[i][pCashMoney]);
PlayerInfo[i][pRespectPoints] += RespectPointsForAll;
UpdateVar(i, "RespectPoints", PlayerInfo[i][pRespectPoints]);
PlayerInfo[i][pPremiumPoints] += PremiumPointsForAll;
UpdateVar(i, "PremiumPoints", PlayerInfo[i][pPremiumPoints]);
}
}
// Resetam bonusul DUPA ce l-am dat tuturor
SetBonusActiv = 0;
MoneyAll = 0;
PremiumPointsForAll = 0;
RespectPointsForAll = 0;
PlayersOnlineForBonus = 0;
}
return 1;
}
Am schimbat și == în >=
Tu aveai:
if(GetPlayersOnline() == PlayersOnlineForBonus)
Eu recomand:
if(GetPlayersOnline() >= PlayersOnlineForBonus)
De exemplu ai setat:
/setbonus 100000 10 5 50
La 50 de jucători → bonusul se acordă.
Dar dacă timerul verifică la 1 secundă și serverul ajunge, de exemplu, de la 49 la 51 de jucători între două verificări, cu == 50 bonusul nu se mai acordă niciodată.