1 post in this topic

С помощью этой системы можно ограничить время бездействия игрока. Также просто просматривать время бездействия игрока.
Введя команду /setafk - можно получить меню настроек, где можно настроить время определения AFK (время определения - время, через которое, над головой игрока появляется 3D Text о том, что игрок находится в AFK). Также можно включить/выключить кик за долгое AFK. Время кика Вы можете также настроить, введя команду/setafk. 
При первом запуске скрипта - в папке scriptfiles создастся файл "OP_AFK_Dostup.cfg". В этом файле, через переход на другую строку, можно прописывать ники игроков, кому разрешён доступ к изменению режимов AFK.

Спойлер

#define DAFK 1360
#define COLOR_WHITE 0xFFFFFFFF

 

Спойлер

new afkoprtime = 120, bool:afkkick,afktime[MAX_PLAYERS],afkmaxtime = 1800, bool:afksystem = true;

 

Спойлер

new File:_File_Open = fopen("OP_AFK_Dostup.cfg", io_read);
if(_File_Open) fclose(_File_Open);
else
{
new File:_File_Create = fopen("OP_AFK_Dostup.cfg", io_write);
fclose(_File_Create);
print("Файл \"OP_AFK_Dostup.cfg\" не был найден. Файл был создан системой.");
}

 

Спойлер

SetTimerEx("@AFKUpdate", 10000, false, "i", playerid);
afktime[playerid] = 0;

 

Спойлер

afktime[playerid] = 0 && 0;

 

Спойлер

if(!strcmp(cmdtext, "/setafk", true))
{
   if(!DostupYes(playerid)) return 1;
   new string[300];
format(string, sizeof(string), "Функция\tЗначение\nВремя определения AFK\t{0000FF}%d секунд",afkoprtime);
new _afkkick[90];
if(afkkick == true) format(_afkkick, sizeof(_afkkick), "\nКик за долгое AFK\t{00FF00}Включено\nКоличество секунд в AFK до кика\t{0000FF}%d секунд", afkmaxtime) ,strcat(string, _afkkick);
else strcat(string, "\nКик за долгое AFK\t{FF0000}Выключено");
ShowPlayerDialog(playerid, DAFK, DIALOG_STYLE_LIST, "Система AFK",string,"Далее","Назад");
       return 1;
}
if(!strcmp(cmdtext, "/afkon", true) || !strcmp(cmdtext, "/afkoff", true))
{
   if(!DostupYes(playerid)) return 1;
   if(afksystem == true) afksystem = false, ShowPlayerDialog(playerid, DAFK+3, DIALOG_STYLE_MSGBOX, "AFK-система", "Вы выключили AFK-систему.\nИгроки смогут стоять в AFK сколько захотят.\nНад никами игроков не будет показано время AFK.", "Понятно","");
else if(afksystem == false)
{
afksystem = true;
new string[150];
format(string, sizeof(string), "Вы включили AFK-систему.\nНад никами игроков, при бездействии, появится\nтекст, показывающий время, находящееся игроком в AFK.\nТекст над никами появится в течении %d секунд.", afkoprtime);
ShowPlayerDialog(playerid, DAFK+3, DIALOG_STYLE_MSGBOX, "AFK-система", string, "Понятно", "");
return 1;
}
return 1;
}

 

Спойлер

afktime[playerid] = 0;

 

Спойлер

switch(dialogid)
{
     case DAFK:
   {
if(!response) return 1;
switch(listitem)
{
   case 0: return ShowPlayerDialog(playerid, DAFK+1, DIALOG_STYLE_INPUT, "Время определения AFK", "Введите новое время определения AFK.\n\nСтандартное время: 120 секунд.\nНельзя вводить число, менее 60 секунд.\nВремя вводится в секундах.","Далее","Отмена");
case 1:
{
if(afkkick == false) return ShowPlayerDialog(playerid, DAFK+2, DIALOG_STYLE_MSGBOX, "Кик за AFK", "Вы хотите включить кик за долгое AFK?\n\nВремя, за которое игрок будет кикнут - можно изменить.\nСтандартное время = 1800 секунд.", "Далее","Назад");
else return ShowPlayerDialog(playerid, DAFK+2, DIALOG_STYLE_MSGBOX, "Кик за AFK", "Вы хотите выключить кик за долгое AFK?\n\nИгрок сможет стоять в AFK сколько захочет.", "Далее","Назад");
}
case 2: return ShowPlayerDialog(playerid, DAFK+4, DIALOG_STYLE_INPUT, "Время кика за AFK", "Введите новое время определения AFK.\n\nСтандартное время: 1800 секунд.\nНельзя вводить число, менее 120 секунд.\nНельзя вводить время, менее времени по определению AFK.\nВремя вводится в секундах.","Далее","Отмена");
}
   return 1;
   }
   case DAFK+1:
{
   if(!response) return OnPlayerCommandText(playerid, "/setafk");
if(!strlen(inputtext) || strval(inputtext) < 60) return ShowPlayerDialog(playerid, DAFK+1, DIALOG_STYLE_INPUT, "Время определения AFK", "Введите новое время определения AFK.\n\nСтандартное время: 120 секунд.\nНельзя вводить число, менее 60 секунд.\nВремя вводится в секундах.","Далее","Отмена");
afkoprtime = strval(inputtext);
return 1;
}
case DAFK+2:
{
   if(!response) return OnPlayerCommandText(playerid, "/setafk");
afkkick = (afkkick == false) ? true : false;
   OnPlayerCommandText(playerid, "/setafk");
   return 1;
}
case DAFK+3: return 1;
case DAFK+4:
{
if(!response) return OnPlayerCommandText(playerid, "/setafk");
if(!strlen(inputtext) || strval(inputtext) < 120 || strval(inputtext) < afkoprtime) return ShowPlayerDialog(playerid, DAFK+4, DIALOG_STYLE_INPUT, "Время кика за AFK", "Введите новое время определения AFK.\n\nСтандартное время: 1800 секунд.\nНельзя вводить число, менее 120 секунд.\nНельзя вводить время, менее времени по определению AFK.\nВремя вводится в секундах.","Далее","Отмена");
afkmaxtime = strval(inputtext);
return 1;
}
}

 

Спойлер

@AFKUpdate(playerid);
@AFKUpdate(playerid)
{
if(afksystem == false) goto AFKTIMER;
afktime[playerid]++;
new string[20];
if(afktime[playerid] > afkoprtime) format(string,sizeof(string),"[AFK] %d секунд",afktime[playerid]), SetPlayerChatBubble(playerid,string,0xFFFFFFAA,10.0,1000);
if(afkkick == true && afktime[playerid] >= afkmaxtime) SendClientMessage(playerid, COLOR_WHITE, "[{0000FF}AFK{FFFFFF}] Вы были кикнуты за долгое бездействие (AFK)."), KickEx(playerid);
AFKTIMER: SetTimerEx("@AFKUpdate", 1000, false, "i", playerid);
return 1;
}
stock KickEx(playerid) return SetTimerEx("@KicK", 100, false, "i", playerid);
@KicK(playerid);
@KicK(playerid) return Kick(playerid);

stock DostupYes(playerid)
{
new nameplayerid[MAX_PLAYER_NAME];
GetPlayerName(playerid, nameplayerid, MAX_PLAYER_NAME);
new File:_File_Open = fopen("OP_AFK_Dostup.cfg", io_read);
if(_File_Open)
{
   new and[128];
   while(fread(_File_Open, and)) if(!strcmp(nameplayerid, and, true)) return 1;
   fclose(_File_Open);
}
else return print("Файл \"OP_AFK_Dostup.cfg\" не был создан. Вы можете создать файл вручную или перезапустить скрипт.") && 0;
return 0;
}

 

Спойлер

   post-3703-0-13365300-1442432842_thumb.jpg.51ea24b63d62bbd17693f4c2d6c691f3.jpgpost-3703-0-20049400-1442432841_thumb.jpg.95119ad2d27fd2eb8066ef6566ad32ee.jpgpost-3703-0-23128900-1442432840_thumb.jpg.7858782ccd8f3dcbc3b8b3779f5d0ff6.jpgpost-3703-0-61957800-1442432841_thumb.jpg.3821a81efe0c3f5337e88d484e6faba5.jpgpost-3703-0-68359000-1442432838_thumb.jpg.bb58989aa2ed626d91008b62d28b45d3.jpgpost-3703-0-69487300-1442432840_thumb.jpg.ead5a4208bf49bcf8a90367c0cfcaa1a.jpgpost-3703-0-72018300-1442432837_thumb.jpg.7c883e2193ca1e13a94e7e38ff7f336c.jpg

Автор: Oleg_Petrow

Edited by RASTAMAN

Share this post


Link to post
Share on other sites

Your content will need to be approved by a moderator

Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   You have pasted content with formatting.   Remove formatting

  Only 75 emoticons maximum are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

Loading...
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • warrion4ik
      By warrion4ik
      При телепорте по метке она тепает под текстуры и приходится перетелепортироваться, как это можно исправить?
      Видео: https://youtu.be/FLjer8lfGc0