PDA

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



Salvacore
13.04.2014, 06:07
Ко всем new:


const MAX_AFK_TIME = 10*60; // макс. время в AFK - 10 минут
new afk_time[MAX_PLAYERS];
new Float:afk_pos[MAX_PLAYERS][3];


В OnGameModeInit:


SetTimer("AFKCheck",1000,1);


В OnPlayerConnect:


afk_time[playerid] = 0;


В конец скрипта:


forward AFKCheck();
public AFKCheck()
{
static const str[] = " кикнут за АФК.";
new string[MAX_PLAYER_NAME+sizeof(str)];
new Float:x, Float:y, Float:z;
foreach(new i:Player)
{
GetPlayerPos(i, x, y, z);
if(IsPlayerInRangeOfPoint(i, 2.0, afk_pos[i][0], afk_pos[i][1], afk_pos[i][2]))
{
if(++afk_time[i] == MAX_AFK_TIME)
{
GetPlayerName(i, string, sizeof(string));
strcat(string, str);
SendClientMessageToAll(-1, string);
Kick(i);
}
}
else
afk_time[i] = 0;
afk_pos[i][0] = x, afk_pos[i][1] = y, afk_pos[i][2] = z;
}
return 1;
}

Автор: Pro-Pawn Team

DeimoS
13.04.2014, 06:49
Kick(playerid); //Кикаем игрока
ололо

Salvacore
13.04.2014, 06:51
Kick(playerid); //Кикаем игрока
ололо
Объяснил бы....

DeimoS
13.04.2014, 07:04
public AFKCheck();
public AFKCheck()
{
new Float:Pos[3];
foreach(new i:Player) // Перебираем игроков
{
GetPlayerPos(i,Pos[0],Pos[1],Pos[2]); // Получает позицию игрока и сохраняем в своих переменных.
if(IsPlayerInRangeOfPoint(i,2,Pos[0],Pos[1],Pos[2])) // Если игрок находится на одном месте
{
AFK[i]++; // Увеличиваем переменную АФК (за каждую секунду, если игрок находится на том же месте, увеличиваем переменную АФК на 1)
}
if(AFK[i] == 60) // Если игрок на том же месте N-ое кол-во секунд
{
AFK[i] = 0; // Сбрасываем переменную афк
static const fmt_str[] = "%s кикнуло за афк.";
const fmt_size = sizeof(fmt_str)-2+MAX_PLAYER_NAME;
new string[fmt_size];
format(string,sizeof(string),fmt_str,pName(i));
SendClientMessageToAll(COLOR_WHITE,string);//Передаём всем какой он лох.
Kick(playerid); //Кикаем игрока
}
}
return 1;
}


foreach(new i:Player) // Перебираем игроков


Kick(playerid); //Кикаем игрока

Salvacore
13.04.2014, 07:07
public AFKCheck();
public AFKCheck()
{
new Float:Pos[3];
foreach(new i:Player) // Перебираем игроков
{
GetPlayerPos(i,Pos[0],Pos[1],Pos[2]); // Получает позицию игрока и сохраняем в своих переменных.
if(IsPlayerInRangeOfPoint(i,2,Pos[0],Pos[1],Pos[2])) // Если игрок находится на одном месте
{
AFK[i]++; // Увеличиваем переменную АФК (за каждую секунду, если игрок находится на том же месте, увеличиваем переменную АФК на 1)
}
if(AFK[i] == 60) // Если игрок на том же месте N-ое кол-во секунд
{
AFK[i] = 0; // Сбрасываем переменную афк
static const fmt_str[] = "%s кикнуло за афк.";
const fmt_size = sizeof(fmt_str)-2+MAX_PLAYER_NAME;
new string[fmt_size];
format(string,sizeof(string),fmt_str,pName(i));
SendClientMessageToAll(COLOR_WHITE,string);//Передаём всем какой он лох.
Kick(playerid); //Кикаем игрока
}
}
return 1;
}


foreach(new i:Player) // Перебираем игроков


Kick(playerid); //Кикаем игрока
Спасибо :3

(Wh)AnGeL
13.04.2014, 07:46
Исправь с
public AFKCheck();
на
forward AFKCheck();

Salvacore
13.04.2014, 15:05
Исправь с
public AFKCheck();
на
forward AFKCheck();
No.

^_^
13.04.2014, 15:18
No.
Думаю он имел ввиду:

public AFKCheck();
public AFKCheck()

XemyL
13.04.2014, 15:21
Тестирование (ну или хотя бы визуальная проверка кода) для слабаков!

Felix
13.04.2014, 15:22
Принимайте баги, господин разработчик. Я всё время двигался, а секунды то шли, потом меня кикнуло.
http://imgdepo.ru/id/i6469944
У кого не грузит - http://imgdepo.ru/id/i6469944

public AFKCheck()
{
new Float:Pos[3], string[100];
for(new i,zx = GetMaxPlayers( ); i < zx; i++)
{
GetPlayerPos(i,Pos[0],Pos[1],Pos[2]);
if(IsPlayerInRangeOfPoint(i,2,Pos[0],Pos[1],Pos[2]))
{
AFK[i]++;
format(string,sizeof(string), "%d сек.",AFK[i]);
SendClientMessage(i,COLOR_YELLOW,string);
}
if(AFK[i] == 10)
{
AFK[i] = 0;
format(string,sizeof(string), "Игрок %s кикнут сервером, причина: AFK более 10 секунд.",pNick(i));
SendClientMessageToAll(COLOR_WHITE,string);
SKick(i);
}
}
return true;
}

public OnPlayerConnect(playerid)
{
RemovePlayerInfo(playerid);
GetPlayerName(playerid,pInfo[playerid][pName],MAX_PLAYER_NAME);
AFKTime[playerid] = SetTimer("AFKCheck",1000,1);
new account[37];
format(account,sizeof(account),"users/%s.ini",pNick(playerid));
if(!fexist(account)) ShowRegisterDialog(playerid);
else if(fexist(account)) ShowLoginDialog(playerid);
return true;
}

XemyL
13.04.2014, 15:28
static const fmt_str[] = "%s кикнуло за афк.";
const fmt_size = sizeof(fmt_str)-2+MAX_PLAYER_NAME;
new string[fmt_size];
format(string,sizeof(string),fmt_str,pName(i));

Воу воу, полегче, мы не на конкурсе извращенцев.


new string[16+MAX_PLAYER_NAME];
format(string,sizeof(string),"%s кикнуло за афк.",pName(i));

-----------------------


Принимайте баги, господин разработчик. Я всё время двигался, а секунды то шли, потом меня кикнуло.
http://imgdepo.ru/id/i6469944
У кого не грузит - http://imgdepo.ru/id/i6469944

public AFKCheck()
{
new Float:Pos[3], string[100];
for(new i,zx = GetMaxPlayers( ); i < zx; i++)
{
GetPlayerPos(i,Pos[0],Pos[1],Pos[2]);
if(IsPlayerInRangeOfPoint(i,2,Pos[0],Pos[1],Pos[2]))
{
AFK[i]++;
format(string,sizeof(string), "%d сек.",AFK[i]);
SendClientMessage(i,COLOR_YELLOW,string);
}
if(AFK[i] == 10)
{
AFK[i] = 0;
format(string,sizeof(string), "Игрок %s кикнут сервером, причина: AFK более 10 секунд.",pNick(i));
SendClientMessageToAll(COLOR_WHITE,string);
SKick(i);
}
}
return true;
}

public OnPlayerConnect(playerid)
{
RemovePlayerInfo(playerid);
GetPlayerName(playerid,pInfo[playerid][pName],MAX_PLAYER_NAME);
AFKTime[playerid] = SetTimer("AFKCheck",1000,1);
new account[37];
format(account,sizeof(account),"users/%s.ini",pNick(playerid));
if(!fexist(account)) ShowRegisterDialog(playerid);
else if(fexist(account)) ShowLoginDialog(playerid);
return true;
}

Я конечно всё понимаю, но эту гениальность тоже стоило бы исправить, не?


GetPlayerPos(i,Pos[0],Pos[1],Pos[2]);
if(IsPlayerInRangeOfPoint(i,2,Pos[0],Pos[1],Pos[2]))

Salvacore
13.04.2014, 15:41
Закрою пожалуй.

Salvacore
14.04.2014, 16:34
Система переделана.
Открыто.
Отдельное спасибо : Daniel_Cortez

Salvacore
16.04.2014, 11:29
UP(3s)

Zeror_Dalglish
23.06.2014, 02:51
UP(3s)

Если на одном месте стоит, то время идет.
Гениально бля*ь

Daniel_Cortez
23.06.2014, 10:40
Если на одном месте стоит, то время идет.
Гениально бля*ь

А какой тогда смысл в anti-AFK, если любой игрок сможет просто выключить экран и уйти по своим делам, при этом каждый час получая зарплату и опыт (ну или что там на других серверах) ?
Тем более, игроку даётся 10 минут, чтобы сдвинуться с места.

Camelot
25.06.2014, 14:09
Может быть, так лучше будет?


GetPlayerPos(i, afk_pos[i][0], afk_pos[i][1], afk_pos[i][2]);
if(IsPlayerInRangeOfPoint(i, 2.0, afk_pos[i][0], afk_pos[i][1], afk_pos[i][2])

Daniel_Cortez
25.06.2014, 16:04
Может быть, так лучше будет?


GetPlayerPos(i, afk_pos[i][0], afk_pos[i][1], afk_pos[i][2]);
if(IsPlayerInRangeOfPoint(i, 2.0, afk_pos[i][0], afk_pos[i][1], afk_pos[i][2])
Ага, и сравнивать координаты игрока с самими собой, из-за чего античит будет думать, что игрок в АФК, даже если он движется.

Zeror_Dalglish
26.06.2014, 11:35
А какой тогда смысл в anti-AFK, если любой игрок сможет просто выключить экран и уйти по своим делам, при этом каждый час получая зарплату и опыт (ну или что там на других серверах) ?
Тем более, игроку даётся 10 минут, чтобы сдвинуться с места.

Ну это анти-афк.

А не система АФКа

Salvacore
26.06.2014, 15:27
Ну это анти-афк.

А не система АФКа
Что ты несешь вообще?

Zeror_Dalglish
26.06.2014, 20:11
Что ты несешь вообще?

Систему афк это, афк.
А вот это от длинного простоя на одном месте...........

DeimoS
26.06.2014, 21:03
Систему афк это, афк.
А вот это от длинного простоя на одном месте...........

Эта система отловит и афк, и если игрок долго стоит на месте. Хотя если игрок как пассажир будет сидеть...

Daniel_Cortez
26.06.2014, 23:25
Хотя если игрок как пассажир будет сидеть...
Ты не оставляшь другого выбора, кроме как написать инклуд. В голове сейчас столько идей, что для мануала будет уже слишком (особенно с кучей перехватов функций).
Попробую взяться за него, как только выложу другую, уже почти готовую работу.

DeimoS
26.06.2014, 23:40
Ты не оставляшь другого выбора, кроме как написать инклуд. В голове сейчас столько идей, что для мануала будет уже слишком (особенно с кучей перехватов функций).
Попробую взяться за него, как только выложу другую, уже почти готовую работу.

Ты угрожаешь мне!?

Dima_Turkow
09.08.2014, 09:18
if(IsPlayerInRangeOfPoint(i, 2.0, afk_pos[i][0], afk_pos[i][1], afk_pos[i][2]) мдяяяя... Скобку посеял, поправь

Salvacore
09.08.2014, 18:35
if(IsPlayerInRangeOfPoint(i, 2.0, afk_pos[i][0], afk_pos[i][1], afk_pos[i][2]) мдяяяя... Скобку посеял, поправь
ок.

plakapenka
11.08.2014, 01:33
Из такой простой системы сделал хуй пойми что


new AFKtime[MAX_PLAYERS];

конект:

AFKtime[playerid] = 0;

секундный таймер для игрока, или прогонять циклом


AFKtime[playerid] ++;
if(AFKtime[playerid] > 3) {
new mes[25];
format(mes,sizeof(mes),"[AFK] [%d секунд]",AFKtime[playerid]);
SetPlayerChatBubble(playerid,mes,0x33AA33AA,5.0,1200);
}
if(AFKtime[playerid] > 700) {
SendClientMessage(playerid,-1,"Вы были отсоеденены от сервера! (AFK)");
Kick(playerid);
}


OnPlayerUpdate

AFKtime[playerid] = 0;

KShaddix
11.08.2014, 01:58
Из такой простой системы сделал хуй пойми что


new AFKtime[MAX_PLAYERS];

конект:

AFKtime[playerid] = 0;

секундный таймер для игрока, или прогонять циклом


AFKtime[playerid] ++;
if(AFKtime[playerid] > 3) {
new mes[25];
format(mes,sizeof(mes),"[AFK] [%d секунд]",AFKtime[playerid]);
SetPlayerChatBubble(playerid,mes,0x33AA33AA,5.0,1200);
}
if(AFKtime[playerid] > 700) {
SendClientMessage(playerid,-1,"Вы были отсоеденены от сервера! (AFK)");
Kick(playerid);
}


OnPlayerUpdate

AFKtime[playerid] = 0;

По твоей системе игрока не будет кикать, если игрок не свернёт игру. Но и у него нет того, что сделал ты: т.е. отображение AFK, если игрок всё-таки свернулся.

Salvacore
11.08.2014, 02:11
Из такой простой системы сделал хуй пойми что


new AFKtime[MAX_PLAYERS];

конект:

AFKtime[playerid] = 0;

секундный таймер для игрока, или прогонять циклом


AFKtime[playerid] ++;
if(AFKtime[playerid] > 3) {
new mes[25];
format(mes,sizeof(mes),"[AFK] [%d секунд]",AFKtime[playerid]);
SetPlayerChatBubble(playerid,mes,0x33AA33AA,5.0,1200);
}
if(AFKtime[playerid] > 700) {
SendClientMessage(playerid,-1,"Вы были отсоеденены от сервера! (AFK)");
Kick(playerid);
}


OnPlayerUpdate

AFKtime[playerid] = 0;

Из RLS вырезал?

duck_123
29.01.2016, 04:09
AFK — (англ. away from keyboard) отошёл (имеется в виду, что пользователь в данный момент не у компьютера)
Такой скрипт не сможет определить находится ли чел у компа или нет)
Поэтому разумнее называть вещи своими именами, например 'Система обнаружения Паузы', а не 'Система AFK'.
Я раньше тоже так думал, но когда мне объяснили, то стало более менее всё ясно)

DeimoS
29.01.2016, 08:23
AFK — (англ. away from keyboard) отошёл (имеется в виду, что пользователь в данный момент не у компьютера)
Такой скрипт не сможет определить находится ли чел у компа или нет)
Поэтому разумнее называть вещи своими именами, например 'Система обнаружения Паузы', а не 'Система AFK'.
Я раньше тоже так думал, но когда мне объяснили, то стало более менее всё ясно)

А можно тогда пример программ, где система AFK работает 100% правильно (определяет, что я именно отошёл от ПК, а не просто перестал использовать ту программу)?

wAx
29.01.2016, 13:01
А можно тогда пример программ, где система AFK работает 100% правильно (определяет, что я именно отошёл от ПК, а не просто перестал использовать ту программу)?

да нет таких программ... И вообще, иногда общепринятые условные обозначения, сленговые слова иногда не соответствуют точной трактовке и(или) переводу, и иногда применяются в абсолютно разных случаях. Поэтому бредово докапываться до названия 'Система AFK', хотя-бы потому что, под таким названием систему используют уж очень долгое время.

DeimoS
29.01.2016, 14:33
да нет таких программ... И вообще, иногда общепринятые условные обозначения, сленговые слова иногда не соответствуют точной трактовке и(или) переводу, и иногда применяются в абсолютно разных случаях. Поэтому бредово докапываться до названия 'Система AFK', хотя-бы потому что, под таким названием систему используют уж очень долгое время.

Ну раз duck_123 решил сделать замечание, значит у него должны быть примеры правильного использования, не? :)

duck_123
29.01.2016, 23:03
В сампе я не встречал таких скриптов, которые определят реально ли чел у компа щас или нет)
Наврят ли можно реализовать такое именно для сампа.
Данный скрипт норм, просто опять-таки это не определение AFK вот и всё)

DeimoS
30.01.2016, 08:33
В сампе я не встречал таких скриптов, которые определят реально ли чел у компа щас или нет)
Наврят ли можно реализовать такое именно для сампа.
Данный скрипт норм, просто опять-таки это не определение AFK вот и всё)

Так я и не прошу скинуть скрипт для SA-MP. Покажи мне любую другую программу, где такая система реализована правильно

SliM
30.01.2016, 09:47
Skype + Web Cam, lol

duck_123, на какую-то ерунду обращаешь столько внимания.

VVWVV
30.01.2016, 13:29
Так я и не прошу скинуть скрипт для SA-MP. Покажи мне любую другую программу, где такая система реализована правильно

Что-то подобное видел на Типичном (вроде бы гуглы реализовали).