PDA

Просмотр полной версии : [Вопрос] AFK Система



Skyline
13.02.2015, 01:51
Здравствуйте. Подскажите пожалуйста хорошую, но простую AFK систему, с обычной проверкой, в АФК игрок или нет. Сделал систему, но она показывает АФК когда игрок просто стоит на месте. Т.е. если игрок в движении, все нормально. Буду очень благодарен.

BaBuIIIkaDrifteR
13.02.2015, 02:09
Проверка свернуто ли окошко samp.

После incluide

#define AFK_WINDOW_TIME 1200// 1200 мс - время последнего обновления статуса с сервером.
new AFK_window[MAX_PLAYERS];

В public OnPlayerUpdate(playerid)

AFK_window[playerid] = GetTickCount();

И сама проверка

if(GetTickCount() - AFK_window[playerid] > AFK_WINDOW_TIME) SetPlayerChatBubble(playerid,"AFK",0xDD90FFFF,80.0,10000);

И удобный макрос для использования:

#define AFK(%0) (GetTickCount() - AFK_window[%0] > AFK_WINDOW_TIME)

Пример использования:

if(AFK(playerid)) SetPlayerChatBubble(playerid,"AFK",0xDD90FFFF,80.0,10000);

Gressie
15.02.2015, 01:38
Ко всем new:

new
AFKTime[MAX_PLAYERS],
bool:AFKCHECK[MAX_PLAYERS],
Float:POSAFK[MAX_PLAYERS][2],
Text3D:AFKTEXT[MAX_PLAYERS];
OnPlayerConnect:

AFKCHECK[playerid] = false;
AFKTime[playerid] = 0;
OnPlayerDisconnect:

if(AFKCHECK[playerid] == true) Delete3DTextLabel(AFKTEXT[playerid]), AFKCHECK[playerid] = false;
AFKTime[playerid] = 0;
OnPlayerUpdate:

AFKTime[playerid] = 0;
if(AFKCHECK[playerid] == true)
{
Delete3DTextLabel(AFKTEXT[playerid]);
AFKCHECK[playerid] = false;
}
В любой таймер в 1 сек:

AFKTimer(playerid);
В конец мода:

stock AFKTimer(playerid)
{
new Float: posX, Float: posY, Float: posZ, afk[30];
GetPlayerPos(playerid, posX, posY, posZ);
if(posX == POSAFK[playerid][0] && posY == POSAFK[playerid][1])
{
AFKTime[playerid]++;
if(AFKTime[playerid] > 500 && PlayerInfo[playerid][pAdmin] < 1)
{
if(AFKCHECK[playerid] == true)
{
Delete3DTextLabel(AFKTEXT[playerid]);
AFKCHECK[playerid] = false;
}
SendClientMessage(playerid, COLOR_LIGHTRED,"Вы были кикнуты за долгое пребывание в режиме (AFK)");
KickEx(playerid);
return true;
}
if(AFKCHECK[playerid] == true)
{
format(afk, sizeof(afk),"Игрок на паузе: %d секунд.",AFKTime[playerid]);
Update3DTextLabelText(AFKTEXT[playerid], COLOR_GRAY, afk);
return true;
}
if(AFKTime[playerid] > 1 && AFKCHECK[playerid] == false)
{
format(afk, sizeof(afk),"Игрок на паузе: %d секунд.",AFKTime[playerid]);
AFKTEXT[playerid] = Create3DTextLabel(afk, COLOR_GRAY, 0.00, 0.00, 10000.0, 20.0, 0);
Attach3DTextLabelToPlayer(AFKTEXT[playerid], playerid, 0.0, 0.0, 0.3);
AFKCHECK[playerid] = true;
return true;
}
}
else
{
if(AFKCHECK[playerid] == true) Delete3DTextLabel(AFKTEXT[playerid]), AFKCHECK[playerid] = false;
if(AFKTime[playerid] > 0) AFKTime[playerid] = 0;
POSAFK[playerid][0] = posX;
POSAFK[playerid][1] = posY;
}
return true;
}
Для использования:

if (AFKTime[giveplayerid] > 0) return SendClientMessage(playerid, COLOR_GRAD1, "Данный игрок в АФК.");