ok i'll post some pseudo code so you can better see what i mean:
Code:
// info on players
new playersId[MAXPLAYERS];
new playerIsBanned[MAXPLAYERS];
new numberOfPlayers=0;
// info on banned players
new bannedPlayerIndex[MAXBANNEDPLAYERS];
new remainingBanTime[MAXBANNEDPLAYERS];
new numberOfBannedPlayers=0;
task decreaseRemainingTime()
{
new i;
// for every banned player
for (i=(numberOfBannedPlayers-1); i>=0; i--)
{ // decrease ban time and check if it's reached zero
if (--remainingBanTime[i]==0){
// unban the player
playerIsBanned[ bannedPlayerIndex[i] ]=0;
// remove it from array by putting the last element in it's place
numberOfBannedPlayers--;
bannedPlayerIndex[i]=bannedPlayerIndex[numberOfBannedPlayers];
remainingBanTime[i]=remainingBanTime[numberOfBannedPlayers];
}
}
}
public banPlayer(playerId,banTime){
new index= searchPlayerIndex(playerId);
// if id exists
if (index!=-1){
// mark as banned
playerIsBanned[index]=1;
// if its not a permanent ban
if (banTime != 0){
// add to banned array
bannedPlayerIndex[numberOfBannedPlayers]=index;
remainingBanTime[numberOfBannedPlayers]=banTime;
numberOfBannedPlayers++;
}
}
}
public unbanPlayer(playerId){
//
new index= searchPlayerIndex(playerId);
// if id exists
if (index!=-1){
// mark as unbanned
playerIsBanned[index]=0;
// search player's entry in banned array
new banIndex= searchPlayerIndex(bannedPlayerIndex);
// if player had a temporary ban
if (banIndex!=-1){
// remove it from array by putting the last element in it's place
numberOfBannedPlayers--;
bannedPlayerIndex[banIndex]=bannedPlayerIndex[numberOfBannedPlayers];
remainingBanTime[banIndex]=remainingBanTime[numberOfBannedPlayers];
}
}
}
As you can see, i can't have one function interrupting the execution of another one, since the array would be left in an inconsistent state.