Текущая версия SA-MP: 0.3.7


IP: 77.220.180.96:7777
  Новые сообщения · Поиск
  • Страница 1 из 1
  • 1
Модератор форума: KaTacTpOqpa  
Как определить, на паузе игрок или нет?
zmey7464 Сообщение # 1  | 11:46:48
Пользователи
Сообщений: 3
Репутация: 0
В павно уже давно не нуб, но так и не могу додуматься: Как правильнее и оптимальнее определить, на паузе игрок или нет?
[Sn1peR] Сообщение # 2  | 16:26:43
Пользователи
Сообщений: 32
Репутация: 47
В инете посмотри систему АФК

_|___|___|___|___|__­_|___|___|___|
___|___|___|___|___­|___|___|___|_
_|___|___|___|___|_­__|___|___|___|
VERGIL Сообщение # 3  | 09:32:51
Пользователи
Сообщений: 82
Репутация: 28
Вот система для афк:
Это все в начало
Code

#include <a_samp>

Code

// --------------- Время в секундах ---------------------------------
   #define MAX_AFK_TIME 60 // максимально время AFK до кика
   #define FIRST_CHECK 40 // первое предупреждение
   #define SECOND_CHECK 55 // второе предупреждение
   #define AFK_TEXT_SET 20 // время до появления надписи AFK над головой

   // --------------- Цвета --------------------------------------------
   #define T_COLOR 0xFF000080 // цвет 3Д текста
   #define M1_COLOR 0xFFFFFFFF // цвет текста первого предупреждения
   #define M2_COLOR 0xFFFFFFFF // цвет текста второго предупреждения
   #define MK_COLOR 0xFFFFFFFF // цвет текста оповещения о кике

   // --------------- Прочее -------------------------------------------
   #define T_DIST 20.0 // расстояние с которого видно 3Д текст

   // --------------- Структура данных ---------------------------------
   enum afk_info {
   AFK_Time, // время AFK
   Float:AFK_Coord, // последняя координата
   AFK_Stat // статус 3Д текста
   }

   // --------------- Объявление переменных ----------------------------
   new PlayerAFK[MAX_PLAYERS][afk_info]; // данные AFK игроков
   new AFK_Timer; // таймер фильтрскрипта для работы функции
   new Text3D:AFK_3DT[MAX_PLAYERS]; // 3Д тексты над головами игроков

   // --------------- Объявление функции проверки ----------------------
   forward AFKCheck();

Потом дальше:
создаем public AFKCheck
Code


   public AFKCheck()
   {
   new Float:AFKCoords[3];
   for(new i = 0;i<MAX_PLAYERS;i++)
   {
   if(!IsPlayerConnected(i)){continue;}
   if(IsPlayerNPC(i)){continue;}

   // получаем координаты игроков
   GetPlayerPos(i,AFKCoords[0],AFKCoords[1],AFKCoords[2]);

   // если координата не изменилась
   if(AFKCoords[0] == PlayerAFK[i][AFK_Coord])
   {
   PlayerAFK[i][AFK_Time]++;
   }
   else
   {
   PlayerAFK[i][AFK_Time] = 0;
   if(PlayerAFK[i][AFK_Stat] != 0) { Delete3DTextLabel(AFK_3DT[i]); PlayerAFK[i][AFK_Stat] = 0; }
   }

   // сохраняем текущую координату до следующей проверки
   PlayerAFK[i][AFK_Coord] = AFKCoords[0];

   // показываем 3Д текст
   if(PlayerAFK[i][AFK_Time] == AFK_TEXT_SET && PlayerAFK[i][AFK_Stat] == 0)
   {
   AFK_3DT[i] = Create3DTextLabel("AFK", T_COLOR, 0.00, 0.00, 10000.0, T_DIST, 0);
   Attach3DTextLabelToPlayer(AFK_3DT[i], i, 0.0, 0.0, 1.3);
   PlayerAFK[i][AFK_Stat] = 1;
   }

   // строка ниже исключает возможность кика админа за AFK
   if(IsPlayerAdmin(i)){continue;}

   // кикаем игрока
   if(PlayerAFK[i][AFK_Time] > MAX_AFK_TIME)
   {
   SendClientMessage(i, MK_COLOR,"  Вы были кикнуты за состояние AFK более " #MAX_AFK_TIME " секунд");
   Kick(i);
   continue;
   }

   // первое предупреждение
   if(PlayerAFK[i][AFK_Time] == FIRST_CHECK)
   {
   SendClientMessage(i, M1_COLOR,
   " AFK: Вы будете кикнуты через " #MAX_AFK_TIME - #FIRST_CHECK " секунд если не начнете двигаться!");
   continue;
   }

   // второе предупреждение
   if(PlayerAFK[i][AFK_Time] == SECOND_CHECK)
   {
   SendClientMessage(i, M2_COLOR,
   " AFK: Вы будете кикнуты через " #MAX_AFK_TIME - #SECOND_CHECK " секунд если не начнете двигаться!");
   continue;
   }
   }
   return 1;
   

Потом в OnGameModeInit
Code

public OnFilterScriptInit()// Поменяй на "OnGameModeInit" и "print" убери
   {
   print("FS Simple AFK 1.0 by VERGIL > Started");

   // запуск таймера для функции проверки
   AFK_Timer = SetTimer("AFKCheck",1000,1);
   return 1;
   }

   public OnFilterScriptExit()
   {
   for(new i=0;i<MAX_PLAYERS;i++)
   {
   Delete3DTextLabel(AFK_3DT[i]);
   }

   KillTimer(AFK_Timer);

   return 1;
   }

Дальше в OnPlayerConnect
Code

public OnPlayerConnect(playerid)
   {
   PlayerAFK[playerid][AFK_Time] = 0;
   PlayerAFK[playerid][AFK_Stat] = 0;
   return 1;
   }

И последнее...
Code

public OnPlayerDisconnect(playerid, reason)
   {
   PlayerAFK[playerid][AFK_Time] = 0;
   if(PlayerAFK[playerid][AFK_Stat] != 0) { Delete3DTextLabel(AFK_3DT[playerid]); PlayerAFK[playerid][AFK_Stat] = 0; }
   return 1;
   }


Все. Если я тебе помог ставь "+"
У меня в моде такая система стоит, если тызахочешь что либо удалить тебе все там подписал что нужно.


THIS IS POLCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
I your friend ;D



Редактировано VERGIL - Пятница, 10 Фев 2012, 09:36:29
[Sn1peR] Сообщение # 4  | 19:17:16
Пользователи
Сообщений: 32
Репутация: 47
VERGIL, а у тебя там написано АФК когда игрок просто тупо стоит на одном месте?

_|___|___|___|___|__­_|___|___|___|
___|___|___|___|___­|___|___|___|_
_|___|___|___|___|_­__|___|___|___|
  • Страница 1 из 1
  • 1
Поиск: