Проверка на АФК в авто
#1

Здравствуйте, у меня возникла такая проблема со системой AFK.
Когда игрок содиться в автомобиль над ним появляеться надпись что он в AFK и вот не подскажите как сделать проверку на авто чтобы в авто не было ложных вызова.
Если игрок находится в авто и он зашел в афк и над ним должна появиться надпись
Варианты как:
PHP код:
if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)
if(
IsPlayerInAnyVehicle(playerid)) 
не предлагать!

немного кода:
PHP код:
stock AFKSystemTime(i)
{
    if(
IsPlayerConnected(i))
    {
        new 
string[200];
        new 
playersip[120];
        new 
sendername[MAX_PLAYER_NAME];
        
GetPlayerName(isendernamesizeof(sendername));
        
GetPlayerIp(iplayersipsizeof(playersip));
        if(
CheckAFK1[i] == CheckAFK0[i])
        {
            if(
AFKSpawn[i] == 1)
            {
                if(
GetPlayerState(i) == PLAYER_STATE_ONFOOT)//Плюсуется только когда игрок на ногах
                
CheckAFK2[i] = true;
            }
        }
        
CheckAFK1[i] = CheckAFK0[i];
        if(
CheckAFK2[i] == 1)
        {
            
AccountAFK[i] ++;
        }
        if(
AccountAFK[i] > 3)
        {
            
format(stringsizeof(string), "АФК: {FFA500}%s"Convert(AccountAFK[i]));
            
SetPlayerChatBubble(istring0xFFFFFFFF12.01200);
        }
    }
    return 
1;

Reply
#2

как проверяйте что игрок афк? в OnPlayerUpdate?
Reply
#3

PHP код:
if(IsPlayerConnected(playerid)) CheckAFK0[playerid] ++;
    if(
AccountAFK[playerid] > -2)
    {
        if(
AccountAFK[playerid] > 3)
        {
            
format(stringsizeof(string), "Вы находились в АФК: {FFA500}%s"Convert(AccountAFK[playerid]));
            
SendClientMessage(playerid0xFFFFFFFFstring);
        }
        
AccountAFK[playerid] = 0;
        
CheckAFK2[playerid] = 0;
    } 
Reply
#4

что я парюсь кину как у меня попробуй мож тебе пойдет.
pawn Код:
глобальные
new timeafk[MAX_PLAYERS];
new timelast[MAX_PLAYERS];
new afk[MAX_PLAYERS];

в OnPlayerConnect
afk[playerid]=0;

в паблик который обновляется каждую 1 секунду
if(GetTickCount()-timelast[i] >= 2000)
{
afk[i]=1;
timeafk[i]++;
new str[64];
format(str,64,"[AFK] %s",conv(timeafk[i]));
SetPlayerChatBubble(i,str,0x33CC00FF,15.0,1200);
}
else if(GetTickCount()-timelast[i] < 2000)
{
afk[i]=0;
}

в OnPlayerUpdate
timelast[playerid] = GetTickCount();

stock conv(sec)
{
new cmin = floatround(sec/60,floatround_tozero);
new str[64];
new minsec = sec-(cmin*60);
if(minsec < 10)
{
format(str,64,"%d:0%d",cmin,minsec);
}
else format(str,64,"%d:%d",cmin,minsec);
return str;
}
Reply
#5

Простенькая проверка на AFK:
PHP код:
forward BlaBlaBla();
new 
bool:afkcheck[MAX_PLAYERS];
new 
bool:afk[MAX_PLAYERS];
public 
OnGameModeInit()
{
    
SetTimer("BlaBlaBla"1000true);
    return 
true;
}
public 
OnPlayerUpdate(playerid)
{
    
afkcheck[playerid] = false;
    return 
true;
}
public 
BlaBlaBla()
{
    for(new 
i!= MAX_PLAYERSi++) if(IsPlayerConnected(i))
    {
        
afk[i] = afkcheck[i];
        
afkcheck[i] = true;
    }
}
    if(
afk[playerid]) // игрок находится в AFK
    
if(!afk[playerid]) // игрок не AFK 
.
long76, при онлайне 100 человек в OnPlayerUpdate функция GetTickCount() вызовется 2000 раз за 1 секунду
.
.
Reply
#6

Quote:
Originally Posted by SoNikMells
Посмотреть сообщение
при онлайне 100 человек в OnPlayerUpdate функция GetTickCount() вызовется 2000 раз за 1 секунду
Тесты покажете?
Reply
#7

OKStyle, зачем тесты? Третий класс, умножение и деление
Если rate = 40, то ((1000 / 40) * 100) = 2500.
Reply
#8

Судя по всему, третий класс вас ничему не научил. Какая разница какой онлайн, если rate означает время (в мс) обновления инфы об игроке в OnPlayerUpdate при движении? Хотите сказать, что обновление инфы отсылается по очереди каждому игроку? Таким образом, GetTickCount вызовется в OnPlayerUpdate 1 раз! Это вызов OnPlayerUpdate произойдёт 25 раз за секунду (в движении). В простое - 1 раз.
Reply
#9

Quote:
Originally Posted by OKStyle
Посмотреть сообщение
Судя по всему, третий класс вас ничему не научил. Какая разница какой онлайн, если rate означает время (в мс) обновления инфы об игроке в OnPlayerUpdate при движении? Хотите сказать, что обновление инфы отсылается по очереди каждому игроку? Таким образом, GetTickCount вызовется в OnPlayerUpdate 1 раз! Это вызов OnPlayerUpdate произойдёт 25 раз за секунду (в движении). В простое - 1 раз.
25 раз в секунду для каждого игрока

а вообще, ничего не будет если в OnPlayerUpdate что то пихать, следите за GetServerTickRate
Reply
#10

Quote:
Originally Posted by Jon_De
Посмотреть сообщение
25 раз в секунду для каждого игрока
Я и написал, что для каждого. Обновление происходит единовременно или по очереди для каждого игрока? Если бы была очередь, то синхронизация была бы ужасной, поэтому единовременно.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)