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

Добрый день, у меня возникла проблема, делаю систему АФК если игрок нажал на ESC.
Вот код:
PHP Code:
TimerAFK[playerid] = SetTimerEx("AFKTimer"1000true"i"playerid); 
это в onplayerconnect
далее, я создаю паблик
[PHP]fCallBack::AFKTimer(playerid) //закончил работу
PHP Code:
fCallBack::AFKTimer(playerid//закончил работу
{
        
AFK[playerid]++;
        if(
AFK[playerid] == 5)
        {
            
afkplayer[playerid] = Create3DTextLabel("{66cc33}АФК:{FFFFFF} 00:00:00", -130.040.010.040.00);
            
Attach3DTextLabelToPlayer(afkplayer[playerid], playerid0.00.00.1);
            
printf("%d выполнился",playerid);
        }
        if(
AFK[playerid] > 5)
        {
            new 
string[35];
            
format(string,sizeof(string), "{66cc33}АФК:{FFFFFF} %02d:%02d",minutesf[playerid], secondsf[playerid]);
            
Update3DTextLabelText(afkplayer[playerid], -1string);
            if(
secondsf[playerid] >= 60) { secondsf[playerid] = 0minutesf[playerid]++; }
            if(
minutesf[playerid] >= 59) { Kick(playerid); }
            
secondsf[playerid]++;
        }
        if(
AFK[playerid] < 0)
        {
            
Delete3DTextLabel(afkplayer[playerid]);
            
secondsf[playerid] = 0;
            
minutesf[playerid] = 0;
        }
        return 
1;

В OnPlayerUpdate AFK[playerid] = -3; когда игрок уходит в AFK то это прекращается и AFK[playerid] начинает нормально прибавляться, но 3д текст появляется на 1 секунду и снова убирается почему то, а бывает появляется первый раз нормально а потом нет. Подскажите пожалуйста, в чем проблема.
Reply
#2

Для начала "else fi".
И зачем первый раз показывать секунды если потом ты из стираешь?
А не проще запомнить время когда игрок вошел в АФК и просто показывать разницу от текущего, нежели каждый раз их прибавлять в двух переменных?

По коду самих текстов все вроде хорошо, лимит не превышен?
Reply
#3

лимит не превышен. поставил else if, стираю их чтобы при выходе из АФК и последующем входе в него, счет секунд начинался по новой. Вот сейчас код:
PHP Code:
fCallBack::AFKTimer(playerid//çàêîí÷èë ðàáîòó
{
        
AFK[playerid]++;
        if(
AFK[playerid] == 5)
        {
            
oldtime[playerid] = gettime();
            
afkplayer[playerid] = Create3DTextLabel("{66cc33}ÀÔÊ:{FFFFFF} 00:00:00", -130.040.010.040.00);
            
Attach3DTextLabelToPlayer(afkplayer[playerid], playerid0.00.00.1);
            
printf("%d âûïîëíèëñÿ",playerid);
        }
        else if(
AFK[playerid] > 5)
        {
            new 
string[35];
            
format(string,sizeof(string), "{66cc33}ÀÔÊ:{FFFFFF} %02d",gettime() - oldtime[playerid];);
            
Update3DTextLabelText(afkplayer[playerid], -1string);
        }
        else if(
AFK[playerid] < 0)
        {
            
oldtime[playerid] = 0;
            
Delete3DTextLabel(afkplayer[playerid]);
        }
        return 
1;

Проблема та же осталась. При этом, если в АФК войдут два игрока, и один из него потом выйдет, то таймер на игроке в АФК работает, и текст тоже.
Reply
#4

так... определить афк игрок или нет можно так и не надо ничего выдумывать.
pawn Code:
глобальные
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

Quote:
Originally Posted by long76
View Post
так... определить афк игрок или нет можно так и не надо ничего выдумывать.
Прежде чем отвечать нужно читать тему, а не только заголовок, а то можно сесть в лужу!
Что с вами и произошло.
Reply
#6

Stepashka, есть идеи в чем еще может быть проблема?
Reply
#7

что за говнокоды? совсем чтоль?

Code:
new AFK_Timer[MAX_PLAYERS];


public OnPlayerUpdate(playerid)
{
   AFK_Timer[playerid] = 0;
   return 1;
}


// В таймер на 1 секунду
new str[18];
for(new i; i < MAX_PLAYERS; i++)
{
   if(!IsPlayerConnected(i)) continue;

   if(++AFK_Timer[i] > 4)
   {
      format(str, sizeof(str), "АФК %d сек", AFK_Timer[i]-4);
      SetPlayerChatBubble(i, str, -1, 10.0, 1500);
   }
}


// Проверка на афк игрока
if(AFK_Timer[playerid] > 4) { /* АФК */}
Reply
#8

Но у меня ведь то же самое.
Reply
#9

Перенеси Delete3DTextLabel(afkplayer[playerid]); в OnPlayerUpdate так:
pawn Code:
if (AFK[playerid] != -3 && !afkplayer[playerid]) {
    Delete3DTextLabel(afkplayer[playerid]);
    afkplayer[playerid] = 0;
}
AFK[playerid] = -3;
Соответственно убери третий блок из своего события.
pawn Code:
fCallBack::AFKTimer(playerid) {
    AFK[playerid]++;
    if (AFK[playerid] == 5)  {
        oldtime[playerid] = gettime();
        afkplayer[playerid] = Create3DTextLabel("{66cc33}АФК:{FFFFFF} 00:00", -1, 30.0, 40.0, 10.0, 40.0, 0);
        Attach3DTextLabelToPlayer(afkplayer[playerid], playerid, 0.0, 0.0, 0.1);
    } else if (AFK[playerid] > 5) {
        new string[35], time = gettime() - oldtime[playerid];
        format(string,sizeof(string), "{66cc33}АФК:{FFFFFF} %02.f:%02.f", time/60, time%60);
        Update3DTextLabelText(afkplayer[playerid], -1, string);
    }
    return 1;
}
По идеи должно работать, косяков тут нет.
Reply
#10


причем, они даже не в афк.
Reply
#11

Ну если заметить код создания текста я не менял.
Лучше всего дебагать, отслеживай изменение AFK[playerid]
pawn Code:
format(string,sizeof(string), "{66cc33}АФК:{FFFFFF} %02.0f:%02.0f", float(time/60), float(time%60));
Reply
#12

Сейчас продебажу, и это, в OnPlayerUpdate варнинг появилися tag mismatch , из за того что 3dText не может быть равен 0, я думаю, ну вообщем он появился.
Reply
#13

Reply
#14

и еще прикол в том, что если все сразу уйдут в АФК и потом кто нибудь с него выйдет, то он увидит таймеры над головами, вполне рабочие.
Reply
#15

Что за колесо вы здесь изобретаете? Зачем 3DText, зачем gettime()? Jon_De выложил рабочий и лучший вариант.
Reply
#16

у него не рабочий вариант, да и таймер работает даже когда игрок не АФК.
Reply
#17

Quote:
Originally Posted by AlexeyTrekkkk
View Post
у него не рабочий вариант, да и таймер работает даже когда игрок не АФК.
рукалицо
Reply
#18

ну да
Reply
#19

ставь мой вариант и закрывай тему
Reply
#20

я его ставил
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)