GetPlayerPoolSize
#1

Всех приветствую.
Обнаружил проблему после перевода циклов на 0.3.7 GetPlayerPoolSize.

Раньше всё было в норме.

Проблема состоит в том что если ввести /admins то Вы увидите список администрации ОНЛАЙН, но даже если этого администратора нет в сети его всё равно покажет (потому что он уже заходил сегодня) и не чистится в листе после выхода..

PHP код:
CMD:admins(playeridparams[])
{
    
SendClientMessage(playerid,-1,"Admin's Online:");
    new 
ttext[64],ftext[4];
    for(new 
GetPlayerPoolSize(); >= 0i--)
    {
        if(
PlayerInfo[i][pAdmin] > 0)
        {
            switch(
PlayerInfo[i][pAdmin]) {
            case 
1ttext "{33AA33}[Практикант]";
            case 
2ttext "{33AA33}[Ст.Практикант]";
            case 
3ttext "{33AA33}[Мл.Модератор]";
            case 
4ttext "{33AA33}[Модератор]";
            case 
5ttext "{33AA33}[Ст.Модератор]";
            case 
6ttext "{33CCFF}[Гл.Модератор]";
            case 
7ttext "{33CCFF}[Мл.Администратор]";
            case 
8ttext "{FF9900}[Администратор]";
            case 
9ttext "{FF9900}[Ст.Администратор]";
            case 
10ttext "{D900D3}[Гл.Администратор]";
            case 
11ttext "{EAC700}[Спец.Администратор]";
            case 
12ttext "{FF0000}[Основатель]{FFFFFF}"; }
            if(
GetPVarInt(i"PlayerInAFK") > 0) { ftext "Да"; }
            else { 
ftext "Нет"; }
            
SendMes(playerid,COLOR_GREY,"- %s{FFFFFF} %s[%d] [{32CD32}lvl:%d{FFFFFF}][AFK: %s]",ttext,PlayerInfo[i][pName],i,PlayerInfo[i][pAdmin],ftext);
        }
    }
    return 
true;



Я думаю что проблема где-то в цикле...
Reply
#2

попробуй использовать Foreach
Reply
#3

Проверку на IsPlayerConnected надо добавить
Reply
#4

de ce
PHP код:
for(new GetPlayerPoolSize(); >= 0i--) 
i++
Reply
#5

Quote:
Originally Posted by Azula
Посмотреть сообщение
de ce
PHP код:
for(new GetPlayerPoolSize(); >= 0i--) 
i++
Lolwut?
Reply
#6

Нужно либо обнулять данные при выходе, либо это:
Quote:
Originally Posted by stabker
Посмотреть сообщение
Проверку на IsPlayerConnected надо добавить
Reply
#7

можно и так:

PHP код:
new AdminRanks[12][] = 
{
    
"{33AA33}[Практикант]",
    
"{33AA33}[Ст.Практикант]",
    
"{33AA33}[Мл.Модератор]",
    
"{33AA33}[Модератор]",
    
"{33AA33}[Ст.Модератор]",
    
"{33CCFF}[Гл.Модератор]",
    
"{33CCFF}[Мл.Администратор]",
    
"{FF9900}[Администратор]",
    
"{FF9900}[Ст.Администратор]",
    
"{D900D3}[Гл.Администратор]",
    
"{EAC700}[Спец.Администратор]",
    
"{FF0000}[Основатель]{FFFFFF}"
};
new 
YesNo[2][] = 
{
    
"Да",
    
"Нет"
};
CMD:admins(playeridparams[])
{
    
SendClientMessage(playerid,-1,"Admin's Online:");
    for(new 
GetPlayerPoolSize(); >= 0i--)
    {
        if(
PlayerInfo[i][pAdmin])
        {
            
SendMes(playerid,COLOR_GREY,"- %s{FFFFFF} %s[%d] [{32CD32}lvl:%d{FFFFFF}][AFK: %s]",
                
AdminRanks[PlayerInfo[i][pAdmin]],
                
PlayerInfo[i][pName],
                
i,
                
PlayerInfo[i][pAdmin],
                
YesNo[GetPVarInt(i"PlayerInAFK")]);
        }
    }
    return 
true;
}
OnPlayerDisconnect(playeridreason)
{
    
PlayerInfo[playerid][pAdmin] = 0;
}; 
или так...

PHP код:
new AdminRanks[12][] = 
{
    
"{33AA33}[Практикант]",
    
"{33AA33}[Ст.Практикант]",
    
"{33AA33}[Мл.Модератор]",
    
"{33AA33}[Модератор]",
    
"{33AA33}[Ст.Модератор]",
    
"{33CCFF}[Гл.Модератор]",
    
"{33CCFF}[Мл.Администратор]",
    
"{FF9900}[Администратор]",
    
"{FF9900}[Ст.Администратор]",
    
"{D900D3}[Гл.Администратор]",
    
"{EAC700}[Спец.Администратор]",
    
"{FF0000}[Основатель]{FFFFFF}"
};
new 
YesNo[2][] = 
{
    
"Да",
    
"Нет"
};
CMD:admins(playeridparams[])
{
    
SendClientMessage(playerid,-1,"Admin's Online:");
    for(new 
GetPlayerPoolSize(); >= 0i--)
    {
        if(
IsPlayerConnected() && PlayerInfo[i][pAdmin])
        {
            
SendMes(playerid,COLOR_GREY,"- %s{FFFFFF} %s[%d] [{32CD32}lvl:%d{FFFFFF}][AFK: %s]",
                
AdminRanks[PlayerInfo[i][pAdmin]],
                
PlayerInfo[i][pName],
                
i,
                
PlayerInfo[i][pAdmin],
                
YesNo[GetPVarInt(i"PlayerInAFK")]);
        }
    }
    return 
true;

а ещё можно не выпендриваться и сделать так:

PHP код:
CMD:admins(playeridparams[])
{
    
SendClientMessage(playerid,-1,"Admin's Online:");
    new 
ttext[64],ftext[4];
    for(new 
GetPlayerPoolSize(); >= 0i--)
    {
        if(
IsPlayerConnected())
        {
            if(
PlayerInfo[i][pAdmin] > 0)
            {
                switch(
PlayerInfo[i][pAdmin]) {
                case 
1ttext "{33AA33}[Практикант]";
                case 
2ttext "{33AA33}[Ст.Практикант]";
                case 
3ttext "{33AA33}[Мл.Модератор]";
                case 
4ttext "{33AA33}[Модератор]";
                case 
5ttext "{33AA33}[Ст.Модератор]";
                case 
6ttext "{33CCFF}[Гл.Модератор]";
                case 
7ttext "{33CCFF}[Мл.Администратор]";
                case 
8ttext "{FF9900}[Администратор]";
                case 
9ttext "{FF9900}[Ст.Администратор]";
                case 
10ttext "{D900D3}[Гл.Администратор]";
                case 
11ttext "{EAC700}[Спец.Администратор]";
                case 
12ttext "{FF0000}[Основатель]{FFFFFF}"; }
                if(
GetPVarInt(i"PlayerInAFK") > 0) { ftext "Да"; }
                else { 
ftext "Нет"; }
                
SendMes(playerid,COLOR_GREY,"- %s{FFFFFF} %s[%d] [{32CD32}lvl:%d{FFFFFF}][AFK: %s]",ttext,PlayerInfo[i][pName],i,PlayerInfo[i][pAdmin],ftext);
            }
        }
    }
    return 
true;

Reply
#8

Решение чтобы быстро "обнулить" игрока.
PHP код:
new PlayerInfo[MAX_PLAYERS+1][ENUM];
OnPlayerDisconnect(playeridreason

    
PlayerInfo[playerid] = PlayerInfo[MAX_PLAYERS];
}; 
Reply
#9

James_Braga, сам то понял, что написал?
Кого проверяешь в IsPlayerConnected() — пустоту?

Далее по поводу: new YesNo — угадай к чему придерусь? Я подскажу, PVar возвращает истину в случаи, если игрок AFK, значит из массива вставится точно не первая строка. А что если у нас PVar имеет не только 0|1 ? Что если там секунды записываются игрока в AFK? Где строчку взять? Да-да, у тебя crashdected будет ругаться.

Смотри что надо советовать:

PHP код:
CMD:admins(playeridparams[]) 
{
    new 
str[128], i; static rank[12][] =
    {
        
"{33AA33}[Практикант]"
        
"{33AA33}[Ст.Практикант]"
        
"{33AA33}[Мл.Модератор]"
        
"{33AA33}[Модератор]"
        
"{33AA33}[Ст.Модератор]"
        
"{33CCFF}[Гл.Модератор]"
        
"{33CCFF}[Мл.Администратор]"
        
"{FF9900}[Администратор]"
        
"{FF9900}[Ст.Администратор]"
        
"{D900D3}[Гл.Администратор]"
        
"{EAC700}[Спец.Администратор]"
        
"{FF0000}[Основатель]" 
    
};
    
SendClientMessage(playerid,-1,"Admin's Online:"); 
    for(
GetPlayerPoolSize(); >= 0i--) if(IsPlayerConnected(i) && PlayerInfo[i][pAdmin])
    {
        
format(str128"- %s{FFFFFF} %s[%i] [{32CD32}lvl:%i{FFFFFF}][AFK: %s]",
        
rank[PlayerInfo[i][pAdmin]], PlayerInfo[i][pName], iPlayerInfo[i][pAdmin],
        
GetPVarInt(i"PlayerInAFK") ? ("Да") : ("Нет"));
        
SendClientMessage(playeridCOLOR_GREYstr);
    } 
    return 
str[1] ? true SendClientMessage(playerid,-1,"Нет администраторов Online"); 

Reply
#10

Quote:
Originally Posted by ZiGGi
Посмотреть сообщение
Нужно либо обнулять данные при выходе, либо это:
Мне кажется когда лучше 2 варианта сделаны.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)