Русское сообщество по скриптингу

[TUT]Присвоение привелегий на определенный срок

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

[TUT]Присвоение привелегий на определенный срок

Сообщение crash94 » 18 июл 2013, 11:07

Привет формучане.

Много кто спрашивал, как я в некоторых плагинах(Например HookManager) замутил присвоение на определенный срок каких-либо привилегий и раз уж я обосновался тут - думаю многим будет интересно

В конце данной статьи у вас должно получится что-то вроде этого

[align=center]Срок 30 лет:
Вы должны зарегистрироваться, чтобы видеть ссылки.

Навсегда:
Вы должны зарегистрироваться, чтобы видеть ссылки.

Осталось менее суток( Часы, минуты ):
Вы должны зарегистрироваться, чтобы видеть ссылки.

Привелегий нет, закончились:
Вы должны зарегистрироваться, чтобы видеть ссылки.

Структура ini файла:
Вы должны зарегистрироваться, чтобы видеть ссылки.[/align]

В данной статье мы разберем полностью готовую систему с пропиской через файл, дабы в дальнейшем не терять времени на создание примеров.

Приступим.

1. Берем дефолтный шаблон плагина, выглядит он так
[pawn]
  1.  

  2. #include <amxmodx>

  3. #include <amxmisc>

  4.  

  5. #define PLUGIN  "Period of Privilege"

  6. #define VERSION         "1.0"

  7. #define AUTHOR  "CrAsH"

  8.  

  9. public plugin_init()

  10. {

  11.         register_plugin(PLUGIN, VERSION, AUTHOR)

  12. }

  13.  
[/pawn]

2. Первым делом будет целесообразно подключить ini файл, откуда будем брать и проверять игроков на наличии

2.1 Создаем массив, который будет хранить информацию о пути к ini файлу. Перед plugin_init() вставляем

[pawn]
  1. new g_LoadTestFile[81]
[/pawn]

2.2 Сделаем инициализацию ini файла через plugin_cfg()
[pawn]
  1.  

  2. public plugin_cfg()

  3. {

  4.         new g_LoadDir[81] //Здесь будет путь до папки configs

  5.         get_configsdir(g_LoadDir, charsmax( g_LoadDir )) //Получаем

  6.  

  7.         formatex(g_LoadTestFile, charsmax( g_LoadTestFile ), "%s/testfile.ini", g_LoadDir) //Записываем путь

  8.  

  9.         if(!file_exists( g_LoadTestFile )) //Если файл не существует

  10.         {

  11.                 set_fail_state("No file testfile.ini") //Отключаем плагин с ошибкой, что файла нет

  12.         }

  13. }

  14.  
[/pawn]

Собственно и всё. С файлом покончено. У вас должно получиться что-то вроде этого

[pawn]
  1.  

  2. #include <amxmodx>

  3. #include <amxmisc>

  4.  

  5. #define PLUGIN  "Period of Privilege"

  6. #define VERSION         "1.0"

  7. #define AUTHOR  "CrAsH"

  8.  

  9. new g_LoadTestFile[81]

  10.  

  11. public plugin_init()

  12. {

  13.         register_plugin(PLUGIN, VERSION, AUTHOR)

  14. }

  15.  

  16. public plugin_cfg()

  17. {

  18.         new g_LoadDir[81]

  19.         get_configsdir(g_LoadDir, charsmax( g_LoadDir ))

  20.  

  21.         formatex(g_LoadTestFile, charsmax( g_LoadTestFile ), "%s/testfile.ini", g_LoadDir)

  22.  

  23.         if(!file_exists( g_LoadTestFile ))

  24.         {

  25.                 set_fail_state("No file testfile.ini")

  26.         }

  27. }

  28.  
[/pawn]

3. Теперь перейдем к подготовке к получению данных. Нам понадобиться 2 события - client_authorized и client_infochanged. Первое событие будет отвечать за получение данных, второе за сброс массивов при смене ника и пере получение данных

Создаем

[pawn]
  1.  

  2. public client_authorized(id)

  3. {

  4.         if(!is_user_bot(id) || !is_user_hltv(id)) //Если игрок не бот и не демка

  5.         {

  6.                 //Сбрасываем всё, а то мало ли =)

  7.                 szPlayerPeriod[id][0] = 0

  8.                 szPlayerPeriod[id][1] = 0

  9.                 szPlayerPeriodStr[id][0] = ""

  10.  

  11.                 set_task(1.0, "CheckPeriod", id) //Начинаем проверку

  12.         }

  13. }

  14.  

  15. public client_infochanged(id)

  16. {

  17.         if(!is_user_connected(id)) //Если игрок не подключен

  18.                 return PLUGIN_CONTINUE //То нефиг тут делать

  19.  

  20.         new szNewName[32], szOldName[32] //Будем записывать старый и новый ник

  21.                

  22.         get_user_name(id, szOldName, charsmax( szOldName )) //Получаем старый ник

  23.         get_user_info(id, "name", szNewName, charsmax( szNewName )) //Получаем новый ник

  24.        

  25.         if(!equal(szNewName, szOldName)) //Если они не равны

  26.         {

  27.                 //Сбрасываем всё, а то мало ли =)

  28.                 szPlayerPeriod[id][0] = 0

  29.                 szPlayerPeriod[id][1] = 0

  30.                 szPlayerPeriodStr[id][0] = ""

  31.  

  32.                 set_task(1.0, "CheckPeriod", id) //Начинаем проверку

  33.         }

  34.         return PLUGIN_CONTINUE

  35. }

  36.  
[/pawn]

3.1 Как видите в данных событиях есть несколько новых массивов, которые нужны для работы, поэтому их нужно создать. После

[pawn]
  1. new g_LoadTestFile[81]
[/pawn]

Добавляем

[pawn]
  1.  

  2. new szPlayerPeriod[33][2]

  3. new szPlayerPeriodStr[33][1][32]

  4.  
[/pawn]

Так, с этим мы тоже закончили. У вас должно получиться что-то вроде этого

[pawn]
  1.  

  2. #include <amxmodx>

  3. #include <amxmisc>

  4.  

  5. #define PLUGIN  "Period of Privilege"

  6. #define VERSION         "1.0"

  7. #define AUTHOR  "CrAsH"

  8.  

  9. new g_LoadTestFile[81]

  10.  

  11. new szPlayerPeriod[33][2]

  12. new szPlayerPeriodStr[33][1][32]

  13.  

  14. public plugin_init()

  15. {

  16.         register_plugin(PLUGIN, VERSION, AUTHOR)

  17. }

  18.  

  19. public plugin_cfg()

  20. {

  21.         new g_LoadDir[81]

  22.         get_configsdir(g_LoadDir, charsmax( g_LoadDir ))

  23.  

  24.         formatex(g_LoadTestFile, charsmax( g_LoadTestFile ), "%s/testfile.ini", g_LoadDir)

  25.  

  26.         if(!file_exists( g_LoadTestFile ))

  27.         {

  28.                 set_fail_state("No file testfile.ini")

  29.         }

  30. }

  31.  

  32. public client_authorized(id)

  33. {

  34.         if(!is_user_bot(id) || !is_user_hltv(id))

  35.         {

  36.                 szPlayerPeriod[id][0] = 0

  37.                 szPlayerPeriod[id][1] = 0

  38.                 szPlayerPeriodStr[id][0] = ""

  39.  

  40.                 set_task(1.0, "CheckPeriod", id)

  41.         }

  42. }

  43.  

  44. public client_infochanged(id)

  45. {

  46.         if(!is_user_connected(id))

  47.                 return PLUGIN_CONTINUE

  48.  

  49.         new szNewName[32], szOldName[32]

  50.                

  51.         get_user_name(id, szOldName, charsmax( szOldName ))

  52.         get_user_info(id, "name", szNewName, charsmax( szNewName ))

  53.        

  54.         if(!equal(szNewName, szOldName))

  55.         {

  56.                 szPlayerPeriod[id][0] = 0

  57.                 szPlayerPeriod[id][1] = 0

  58.                 szPlayerPeriodStr[id][0] = ""

  59.  

  60.                 set_task(1.0, "CheckPeriod", id)

  61.         }

  62.         return PLUGIN_CONTINUE

  63. }

  64.  
[/pawn]

Ну что же. Мы уже сделали 50% плагина :dance2: . Сейчас мы разберемся непосредственно фукнцию CheckPeriod, которая будет отвечать за получение данных из файла, делать расчеты и всякую ужасную вещь. Вы только не смотрите вниз, а то испугаетесь и не захотите ничего делать :-\

4. Создаем CheckPeriod
[pawn]
  1.  

  2. public CheckPeriod(id)

  3. {

  4.         new szName[64], szIP[32], szSteam[32] //Запишем ник, стим, ип игрока

  5.         new szParse[128] //Строка, которую будем парсить

  6.         new szParseData[64], szParsePeriod[32] //Отпарсенные данные

  7.         new szLine, szNum //Прочая хрень

  8.  

  9.         get_user_name(id, szName, charsmax( szName )) //Получаем ник

  10.         get_user_ip(id, szIP, charsmax( szIP ), 1) //Получаем ип

  11.         get_user_authid(id, szSteam, charsmax( szSteam )) //Получаем стим

  12.  

  13.         for(szLine = 0; read_file(g_LoadTestFile, szLine, szParse, charsmax( szParse ), szNum); szLine++) //Читаем файл

  14.         {

  15.                 if(szNum > 0 && szParse[0] != ';') //Если строка не закоментированна и в ней есть символы

  16.                 {

  17.                         //Парсим строку

  18.                         parse(szParse,

  19.                                 szParseData,

  20.                                 charsmax( szParseData ),

  21.                                 szParsePeriod,

  22.                                 charsmax( szParsePeriod )

  23.                         )

  24.  

  25.                         if(equal(szName, szParseData)) //Если ник совпал

  26.                         {

  27.                                 if(equal(szParsePeriod, "0")) //Если в сроке стоит 0( это навсегда )

  28.                                 {

  29.                                         szPlayerPeriod[id][0] = 0 //Собственно записывать нечего

  30.                                         szPlayerPeriod[id][1] = 0 //Собственно записывать нечего

  31.                                         szPlayerPeriodStr[id][0] = szParsePeriod //Собственно записывать нечего

  32.                                 }else

  33.                                 if(RealDate() < DatePeriod( szParsePeriod )) //Если же там что-то другое и реальная дата меньше даты из файла

  34.                                 {

  35.                                         szPlayerPeriod[id][0] = (DatePeriod( szParsePeriod ) - RealDate()) / 86400 //Так запишем дни

  36.                                         szPlayerPeriod[id][1] = DatePeriod( szParsePeriod ) - RealDate() //А так секунды до 23:59:59

  37.                                         szPlayerPeriodStr[id][0] = szParsePeriod

  38.  

  39.                                         replace_all(szPlayerPeriodStr[id][0], 31, " ", "/") //т.к мы в стоках произведем замену - вернем назад и запишем дату в читабельном формате

  40.                                 }else{ //Если же срок в файле меньше текущеё даты

  41.                                         new szBlock[512] //Просто массивчик

  42.        

  43.                                         formatex(szBlock, charsmax( szBlock ), ";%s", szParse) //Комментируем строку

  44.                                         write_file(g_LoadTestFile, szBlock, szLine) //Записываем на тоже место

  45.                                 }

  46.                                 break //Заканчиваем, игрок был найден

  47.                         }else

  48.                         if(equal(szSteam, szParseData)) //Если стим совпал

  49.                         {

  50.                                 if(equal(szParsePeriod, "0")) //Если в сроке стоит 0( это навсегда )

  51.                                 {

  52.                                         szPlayerPeriod[id][0] = 0 //Собственно записывать нечего

  53.                                         szPlayerPeriod[id][1] = 0 //Собственно записывать нечего

  54.                                         szPlayerPeriodStr[id][0] = szParsePeriod //Собственно записывать нечего

  55.                                 }else

  56.                                 if(RealDate() < DatePeriod( szParsePeriod )) //Если же там что-то другое и реальная дата меньше даты из файла

  57.                                 {

  58.                                         szPlayerPeriod[id][0] = (DatePeriod( szParsePeriod ) - RealDate()) / 86400 //Так запишем дни

  59.                                         szPlayerPeriod[id][1] = DatePeriod( szParsePeriod ) - RealDate() //А так секунды до 23:59:59

  60.                                         szPlayerPeriodStr[id][0] = szParsePeriod

  61.  

  62.                                         replace_all(szPlayerPeriodStr[id][0], 31, " ", "/") //т.к мы в стоках произведем замену - вернем назад и запишем дату в читабельном формате

  63.                                 }else{ //Если же срок в файле меньше текущеё даты

  64.                                         new szBlock[512] //Просто массивчик

  65.        

  66.                                         formatex(szBlock, charsmax( szBlock ), ";%s", szParse) //Комментируем строку

  67.                                         write_file(g_LoadTestFile, szBlock, szLine) //Записываем на тоже место

  68.                                 }

  69.                                 break //Заканчиваем, игрок был найден

  70.                         }else

  71.                         if(equal(szIP, szParseData)) //Если ип совпал

  72.                         {

  73.                                 if(equal(szParsePeriod, "0")) //Если в сроке стоит 0( это навсегда )

  74.                                 {

  75.                                         szPlayerPeriod[id][0] = 0 //Собственно записывать нечего

  76.                                         szPlayerPeriod[id][1] = 0 //Собственно записывать нечего

  77.                                         szPlayerPeriodStr[id][0] = szParsePeriod //Собственно записывать нечего

  78.                                 }else

  79.                                 if(RealDate() < DatePeriod( szParsePeriod )) //Если же там что-то другое и реальная дата меньше даты из файла

  80.                                 {

  81.                                         szPlayerPeriod[id][0] = (DatePeriod( szParsePeriod ) - RealDate()) / 86400 //Так запишем дни

  82.                                         szPlayerPeriod[id][1] = DatePeriod( szParsePeriod ) - RealDate() //А так секунды до 23:59:59

  83.                                         szPlayerPeriodStr[id][0] = szParsePeriod

  84.  

  85.                                         replace_all(szPlayerPeriodStr[id][0], 31, " ", "/") //т.к мы в стоках произведем замену - вернем назад и запишем дату в читабельном формате

  86.                                 }else{ //Если же срок в файле меньше текущеё даты

  87.                                         new szBlock[512] //Просто массивчик

  88.        

  89.                                         formatex(szBlock, charsmax( szBlock ), ";%s", szParse) //Комментируем строку

  90.                                         write_file(g_LoadTestFile, szBlock, szLine) //Записываем на тоже место

  91.                                 }

  92.                                 break //Заканчиваем, игрок был найден

  93.                         }

  94.                 }

  95.         }

  96. }

  97.  
[/pawn]

Хух. Надоело писать, а вам наверное читать. Внимательные наверное заметили, что при проверке срока идет обращение к 2-м функциям RealDate() и DatePeriod( ), но это обман зрения. На самом деле стоков всего 7. Если я начну расписывать каждый сток по отдельной, то данная статья выйдет на маленький учебник. Не думаю, что для вас будет интересные огромные математические вычисления, но срок на выходите мы получим точный с учетом высокосных годов, февраля и других факторов. Хотелось бы ещё сделать систему часового пояса для различных стран, но тем, кому это действительно потребуется - сделают сами или закажут.

Я лишь приведу их.

[pawn]
  1. stock RealDate()

  2. {

  3.         new szTime[32]

  4.         new szParseDay[32], szParseMouth[32], szParseYear[32], szParseHour[32], szParseMin[32], szParseSec[32]

  5.         new szDay, szMouth, szYear, szHour, szMin, szSec

  6.  

  7.         get_time("%d %m %Y %H %M %S", szTime, charsmax( szTime ))

  8.  

  9.         parse(szTime ,

  10.                 szParseDay,

  11.                 charsmax( szParseDay ),

  12.                 szParseMouth,

  13.                 charsmax( szParseMouth ),

  14.                 szParseYear,

  15.                 charsmax( szParseYear ),

  16.                 szParseHour,

  17.                 charsmax( szParseHour ),

  18.                 szParseMin,

  19.                 charsmax( szParseMin ),

  20.                 szParseSec,

  21.                 charsmax( szParseSec )

  22.         )

  23.  

  24.         szDay = str_to_num( szParseDay )

  25.         szMouth = str_to_num( szParseMouth )

  26.         szYear = str_to_num( szParseYear )

  27.         szHour = str_to_num( szParseHour ) * 3600

  28.         szMin = str_to_num( szParseMin ) * 60

  29.         szSec = str_to_num( szParseSec )

  30.  

  31.         return DateSecond(szDay, szMouth, szYear) + (szHour + szMin + szSec)

  32. }

  33.  

  34. stock DatePeriod(szSysTime[32])

  35. {

  36.         new szParseDay[32], szParseMouth[32], szParseYear[32]

  37.         new szDay, szMouth, szYear

  38.  

  39.         replace_all(szSysTime, charsmax( szSysTime ), "/", " ")

  40.  

  41.         parse(szSysTime,

  42.                 szParseDay,

  43.                 charsmax( szParseDay ),

  44.                 szParseMouth,

  45.                 charsmax( szParseMouth ),

  46.                 szParseYear,

  47.                 charsmax( szParseYear )

  48.         )

  49.  

  50.         szDay = str_to_num( szParseDay )

  51.         szMouth = str_to_num( szParseMouth )

  52.         szYear = str_to_num( szParseYear )

  53.  

  54.         return DateSecond(szDay, szMouth, szYear) + 86399

  55. }

  56.  

  57. stock DateSecond(szDay, szMouth, szYear)

  58. {

  59.         return YearSeconds( szYear ) + MonthSeconds(szYear, szMouth ) + DaysSeconds( szDay )

  60. }

  61.  

  62. stock YearSeconds(szYear)

  63. {

  64.         new szVar[5]

  65.  

  66.         szVar[1] = szYear / 4

  67.         szVar[2] = szYear - szVar[1]

  68.         szVar[3] = szVar[1] - 492

  69.         szVar[4] = szVar[2] - 1478

  70.    

  71.         szVar[3] *= 31622400

  72.         szVar[4] *= 31536000

  73.    

  74.         return szVar[3] + szVar[4]

  75. }

  76.  

  77. stock MonthSeconds(szYear, szMonth)

  78. {

  79.         new szResult

  80.  

  81.         szMonth -= 1

  82.    

  83.         switch( szMonth )

  84.         {

  85.                 case 1, 3, 5, 7, 8, 10 :

  86.                 {

  87.                         szResult = 2678400

  88.                 }

  89.  

  90.                 case 2 :

  91.                 {

  92.                         if (szYear % 4 == 0)

  93.                         {

  94.                                 szResult = 2505600

  95.                         }else{

  96.                                 szResult = 2419200

  97.                         }

  98.                 }

  99.  

  100.                 case 4, 6, 9, 11 :

  101.                 {

  102.                         szResult = 2592000

  103.                 }

  104.         }

  105.    

  106.         if(szMonth > 1)

  107.         {

  108.                 szResult += MonthSeconds(szYear, szMonth)

  109.         }

  110.         return szResult;

  111. }

  112.  

  113. stock DaysSeconds(szDay)

  114. {

  115.         szDay -= 1

  116.         return szDay * 86400

  117. }

  118.  

  119. stock ChatColor(const id, const input[], any:...)

  120. {

  121.         new count = 1, players[32]

  122.         static msg[191]

  123.         vformat(msg, 190, input, 3)

  124.        

  125.         replace_all(msg, 190, "!g", "^4")

  126.         replace_all(msg, 190, "!y", "^1")

  127.         replace_all(msg, 190, "!t", "^3")

  128.        

  129.         if (id) players[0] = id; else get_players(players, count, "ch")

  130.         {

  131.                 for (new i = 0; i < count; i++)

  132.                 {

  133.                         if (is_user_connected(players[i]))

  134.                         {

  135.                                 message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);

  136.                                 write_byte(players[i]);

  137.                                 write_string(msg);

  138.                                 message_end();

  139.                         }

  140.                 }

  141.         }

  142. }
[/pawn]

Ну, собственно и всё. Мы сделали всю систему, но вам наверное хочется протестировать то, что вы сделали?Нет проблем

5. Создаем тестовую команду и добавляем её в plugin_init()
[pawn]
  1. register_clcmd("say /test", "TestResuit")
[/pawn]

Ну и в конец плагина вставляем
p.s Строки уже сделаны в utf8 с целью экономии времени. Пример вы можете посмотреть и наверху или же не менять кодировку файла ни в коем случаи

[pawn]
  1.  

  2. public TestResuit(id)

  3. {

  4.         szPlayerPeriod[id][0] = (DatePeriod( szPlayerPeriodStr[id][0] ) - RealDate()) / 86400

  5.         szPlayerPeriod[id][1] = DatePeriod( szPlayerPeriodStr[id][0] ) - RealDate()

  6.  

  7.         if(equal(szPlayerPeriodStr[id][0], "0")) //Если у игрока права навсегда

  8.         {

  9.                 ChatColor(id, "!tВаши !tпривелегии !gнавсегда!!!!!") //Выводим

  10.         }else

  11.         if(szPlayerPeriod[id][0] > 0) //Если дней больше 0

  12.         {

  13.                 ChatColor(id, "!yВаши привелегии доступны РґРѕ !g%s !t( !g%d !yРґ !t)", szPlayerPeriodStr[id][0], szPlayerPeriod[id][0]) //Выводим

  14.         }else

  15.         if(szPlayerPeriod[id][1] < 86400 && szPlayerPeriod[id][1] > 0) //Если до окончания срока меньше суток

  16.         {

  17.                 new szTime[64] //Массив, чтобы сделать красивое время

  18.                 new szHour, szMin //Конвертируем в понятный формат

  19.  

  20.                 szHour = szPlayerPeriod[id][1] / 3600 //Это часы

  21.                 szMin = (szPlayerPeriod[id][1] - ( szHour * 3600 )) / 60 //Это минуты

  22.  

  23.                 if(szMin <= 9) //Если минут меньше или ровно 9, то добавим к цифре 0

  24.                 {

  25.                         formatex(szTime, charsmax( szTime ), "%d:0%d", szHour, szMin)

  26.                 }else{ //а если нет, то просто сделаем красиво

  27.                         formatex(szTime, charsmax( szTime ), "%d:%d", szHour, szMin)

  28.                 }

  29.                 ChatColor(id, "!yВаши привелегии !tкончаются !gсегодня!y, через !g%s", szTime) //Выведем

  30.         }else{ //Если у игрока нет ничего вышеперечисленного

  31.                 ChatColor(id, "!yВаш СЃСЂРѕРє !tзакончился !tили РІС‹ РІРѕРІСЃРµ РЅРµ имели !gпривелегий") //Выводим, что он неудачник =)

  32.         }

  33. }

  34.  
[/pawn]

Вот теперь уж точно всё. Готовый плагин должен выглядеть примерно так

[pawn]
  1.  

  2. #include <amxmodx>

  3. #include <amxmisc>

  4.  

  5. #define PLUGIN  "Period of Privilege"

  6. #define VERSION         "1.0"

  7. #define AUTHOR  "CrAsH"

  8.  

  9. new g_LoadTestFile[81]

  10.  

  11. new szPlayerPeriod[33][2]

  12. new szPlayerPeriodStr[33][1][32]

  13.  

  14. public plugin_init()

  15. {

  16.         register_plugin(PLUGIN, VERSION, AUTHOR)

  17.  

  18.         register_clcmd("say /test", "TestResuit")

  19. }

  20.  

  21. public plugin_cfg()

  22. {

  23.         new g_LoadDir[81]

  24.         get_configsdir(g_LoadDir, charsmax( g_LoadDir ))

  25.  

  26.         formatex(g_LoadTestFile, charsmax( g_LoadTestFile ), "%s/testfile.ini", g_LoadDir)

  27.  

  28.         if(!file_exists( g_LoadTestFile ))

  29.         {

  30.                 set_fail_state("No file testfile.ini")

  31.         }

  32. }

  33.  

  34. public client_authorized(id)

  35. {

  36.         if(!is_user_bot(id) || !is_user_hltv(id))

  37.         {

  38.                 szPlayerPeriod[id][0] = 0

  39.                 szPlayerPeriod[id][1] = 0

  40.                 szPlayerPeriodStr[id][0] = ""

  41.  

  42.                 set_task(1.0, "CheckPeriod", id)

  43.         }

  44. }

  45.  

  46. public client_infochanged(id)

  47. {

  48.         if(!is_user_connected(id))

  49.                 return PLUGIN_CONTINUE

  50.  

  51.         new szNewName[32], szOldName[32]

  52.                

  53.         get_user_name(id, szOldName, charsmax( szOldName ))

  54.         get_user_info(id, "name", szNewName, charsmax( szNewName ))

  55.        

  56.         if(!equal(szNewName, szOldName))

  57.         {

  58.                 szPlayerPeriod[id][0] = 0

  59.                 szPlayerPeriod[id][1] = 0

  60.                 szPlayerPeriodStr[id][0] = ""

  61.  

  62.                 set_task(1.0, "CheckPeriod", id)

  63.         }

  64.         return PLUGIN_CONTINUE

  65. }

  66.  

  67. public CheckPeriod(id)

  68. {

  69.         new szName[64], szIP[32], szSteam[32]

  70.         new szParse[128]

  71.         new szParseData[64], szParsePeriod[32]

  72.         new szLine, szNum

  73.  

  74.         get_user_name(id, szName, charsmax( szName ))

  75.         get_user_ip(id, szIP, charsmax( szIP ), 1)

  76.         get_user_authid(id, szSteam, charsmax( szSteam ))

  77.  

  78.         for(szLine = 0; read_file(g_LoadTestFile, szLine, szParse, charsmax( szParse ), szNum); szLine++)

  79.         {

  80.                 if(szNum > 0 && szParse[0] != ';')

  81.                 {

  82.                         parse(szParse,

  83.                                 szParseData,

  84.                                 charsmax( szParseData ),

  85.                                 szParsePeriod,

  86.                                 charsmax( szParsePeriod )

  87.                         )

  88.  

  89.                         if(equal(szName, szParseData))

  90.                         {

  91.                                 if(equal(szParsePeriod, "0"))

  92.                                 {

  93.                                         szPlayerPeriod[id][0] = 0

  94.                                         szPlayerPeriod[id][1] = 0

  95.                                         szPlayerPeriodStr[id][0] = szParsePeriod

  96.                                 }else

  97.                                 if(RealDate() < DatePeriod( szParsePeriod ))

  98.                                 {

  99.                                         szPlayerPeriod[id][0] = (DatePeriod( szParsePeriod ) - RealDate()) / 86400

  100.                                         szPlayerPeriod[id][1] = DatePeriod( szParsePeriod ) - RealDate()

  101.                                         szPlayerPeriodStr[id][0] = szParsePeriod

  102.  

  103.                                         replace_all(szPlayerPeriodStr[id][0], 31, " ", "/")

  104.                                 }else{

  105.                                         new szBlock[512]

  106.        

  107.                                         formatex(szBlock, charsmax( szBlock ), ";%s", szParse)

  108.                                         write_file(g_LoadTestFile, szBlock, szLine)

  109.                                 }

  110.                                 break

  111.                         }else

  112.                         if(equal(szSteam, szParseData)) //Если стим совпал

  113.                         {

  114.                                 if(equal(szParsePeriod, "0"))

  115.                                 {

  116.                                         szPlayerPeriod[id][0] = 0

  117.                                         szPlayerPeriod[id][1] = 0

  118.                                         szPlayerPeriodStr[id][0] = szParsePeriod

  119.                                 }else

  120.                                 if(RealDate() < DatePeriod( szParsePeriod ))

  121.                                 {

  122.                                         szPlayerPeriod[id][0] = (DatePeriod( szParsePeriod ) - RealDate()) / 86400

  123.                                         szPlayerPeriod[id][1] = DatePeriod( szParsePeriod ) - RealDate()

  124.                                         szPlayerPeriodStr[id][0] = szParsePeriod

  125.  

  126.                                         replace_all(szPlayerPeriodStr[id][0], 31, " ", "/")

  127.                                 }else{

  128.                                         new szBlock[512]

  129.        

  130.                                         formatex(szBlock, charsmax( szBlock ), ";%s", szParse)

  131.                                         write_file(g_LoadTestFile, szBlock, szLine)

  132.                                 }

  133.                                 break

  134.                         }else

  135.                         if(equal(szIP, szParseData)) //Если ип совпал

  136.                         {

  137.                                 if(equal(szParsePeriod, "0"))

  138.                                 {

  139.                                         szPlayerPeriod[id][0] = 0

  140.                                         szPlayerPeriod[id][1] = 0

  141.                                         szPlayerPeriodStr[id][0] = szParsePeriod

  142.                                 }else

  143.                                 if(RealDate() < DatePeriod( szParsePeriod ))

  144.                                 {

  145.                                         szPlayerPeriod[id][0] = (DatePeriod( szParsePeriod ) - RealDate()) / 86400

  146.                                         szPlayerPeriod[id][1] = DatePeriod( szParsePeriod ) - RealDate()

  147.                                         szPlayerPeriodStr[id][0] = szParsePeriod

  148.  

  149.                                         replace_all(szPlayerPeriodStr[id][0], 31, " ", "/")

  150.                                 }else{

  151.                                         new szBlock[512]

  152.        

  153.                                         formatex(szBlock, charsmax( szBlock ), ";%s", szParse)

  154.                                         write_file(g_LoadTestFile, szBlock, szLine)

  155.                                 }

  156.                                 break

  157.                         }

  158.                 }

  159.         }

  160. }

  161.  

  162. public TestResuit(id)

  163. {

  164.         szPlayerPeriod[id][0] = (DatePeriod( szPlayerPeriodStr[id][0] ) - RealDate()) / 86400

  165.         szPlayerPeriod[id][1] = DatePeriod( szPlayerPeriodStr[id][0] ) - RealDate()

  166.  

  167.         if(equal(szPlayerPeriodStr[id][0], "0"))

  168.         {

  169.                 ChatColor(id, "!tВаши !tпривелегии !gнавсегда!!!!!")

  170.         }else

  171.         if(szPlayerPeriod[id][0] > 0)

  172.         {

  173.                 ChatColor(id, "!yВаши привелегии доступны РґРѕ !g%s !t( !g%d !yРґ !t)", szPlayerPeriodStr[id][0], szPlayerPeriod[id][0])

  174.         }else

  175.         if(szPlayerPeriod[id][1] < 86400 && szPlayerPeriod[id][1] > 0)

  176.         {

  177.                 new szTime[64]

  178.                 new szHour, szMin

  179.  

  180.                 szHour = szPlayerPeriod[id][1] / 3600

  181.                 szMin = (szPlayerPeriod[id][1] - ( szHour * 3600 )) / 60

  182.  

  183.                 if(szMin <= 9)

  184.                 {

  185.                         formatex(szTime, charsmax( szTime ), "%d:0%d", szHour, szMin)

  186.                 }else{

  187.                         formatex(szTime, charsmax( szTime ), "%d:%d", szHour, szMin)

  188.                 }

  189.                 ChatColor(id, "!yВаши привелегии !tкончаются !gсегодня!y, через !g%s", szTime)

  190.         }else{

  191.                 ChatColor(id, "!yВаш СЃСЂРѕРє !tзакончился !tили РІС‹ РІРѕРІСЃРµ РЅРµ имели !gпривелегий")

  192.         }

  193. }

  194.  

  195. stock RealDate()

  196. {

  197.         new szTime[32]

  198.         new szParseDay[32], szParseMouth[32], szParseYear[32], szParseHour[32], szParseMin[32], szParseSec[32]

  199.         new szDay, szMouth, szYear, szHour, szMin, szSec

  200.  

  201.         get_time("%d %m %Y %H %M %S", szTime, charsmax( szTime ))

  202.  

  203.         parse(szTime ,

  204.                 szParseDay,

  205.                 charsmax( szParseDay ),

  206.                 szParseMouth,

  207.                 charsmax( szParseMouth ),

  208.                 szParseYear,

  209.                 charsmax( szParseYear ),

  210.                 szParseHour,

  211.                 charsmax( szParseHour ),

  212.                 szParseMin,

  213.                 charsmax( szParseMin ),

  214.                 szParseSec,

  215.                 charsmax( szParseSec )

  216.         )

  217.  

  218.         szDay = str_to_num( szParseDay )

  219.         szMouth = str_to_num( szParseMouth )

  220.         szYear = str_to_num( szParseYear )

  221.         szHour = str_to_num( szParseHour ) * 3600

  222.         szMin = str_to_num( szParseMin ) * 60

  223.         szSec = str_to_num( szParseSec )

  224.  

  225.         return DateSecond(szDay, szMouth, szYear) + (szHour + szMin + szSec)

  226. }

  227.  

  228. stock DatePeriod(szSysTime[32])

  229. {

  230.         new szParseDay[32], szParseMouth[32], szParseYear[32]

  231.         new szDay, szMouth, szYear

  232.  

  233.         replace_all(szSysTime, charsmax( szSysTime ), "/", " ")

  234.  

  235.         parse(szSysTime,

  236.                 szParseDay,

  237.                 charsmax( szParseDay ),

  238.                 szParseMouth,

  239.                 charsmax( szParseMouth ),

  240.                 szParseYear,

  241.                 charsmax( szParseYear )

  242.         )

  243.  

  244.         szDay = str_to_num( szParseDay )

  245.         szMouth = str_to_num( szParseMouth )

  246.         szYear = str_to_num( szParseYear )

  247.  

  248.         return DateSecond(szDay, szMouth, szYear) + 86399

  249. }

  250.  

  251. stock DateSecond(szDay, szMouth, szYear)

  252. {

  253.         return YearSeconds( szYear ) + MonthSeconds(szYear, szMouth ) + DaysSeconds( szDay )

  254. }

  255.  

  256. stock YearSeconds(szYear)

  257. {

  258.         new szVar[5]

  259.  

  260.         szVar[1] = szYear / 4

  261.         szVar[2] = szYear - szVar[1]

  262.         szVar[3] = szVar[1] - 492

  263.         szVar[4] = szVar[2] - 1478

  264.    

  265.         szVar[3] *= 31622400

  266.         szVar[4] *= 31536000

  267.    

  268.         return szVar[3] + szVar[4]

  269. }

  270.  

  271. stock MonthSeconds(szYear, szMonth)

  272. {

  273.         new szResult

  274.  

  275.         szMonth -= 1

  276.    

  277.         switch( szMonth )

  278.         {

  279.                 case 1, 3, 5, 7, 8, 10 :

  280.                 {

  281.                         szResult = 2678400

  282.                 }

  283.  

  284.                 case 2 :

  285.                 {

  286.                         if (szYear % 4 == 0)

  287.                         {

  288.                                 szResult = 2505600

  289.                         }else{

  290.                                 szResult = 2419200

  291.                         }

  292.                 }

  293.  

  294.                 case 4, 6, 9, 11 :

  295.                 {

  296.                         szResult = 2592000

  297.                 }

  298.         }

  299.    

  300.         if(szMonth > 1)

  301.         {

  302.                 szResult += MonthSeconds(szYear, szMonth)

  303.         }

  304.         return szResult;

  305. }

  306.  

  307. stock DaysSeconds(szDay)

  308. {

  309.         szDay -= 1

  310.         return szDay * 86400

  311. }

  312.  

  313. stock ChatColor(const id, const input[], any:...)

  314. {

  315.         new count = 1, players[32]

  316.         static msg[191]

  317.         vformat(msg, 190, input, 3)

  318.        

  319.         replace_all(msg, 190, "!g", "^4")

  320.         replace_all(msg, 190, "!y", "^1")

  321.         replace_all(msg, 190, "!t", "^3")

  322.        

  323.         if (id) players[0] = id; else get_players(players, count, "ch")

  324.         {

  325.                 for (new i = 0; i < count; i++)

  326.                 {

  327.                         if (is_user_connected(players[i]))

  328.                         {

  329.                                 message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);

  330.                                 write_byte(players[i]);

  331.                                 write_string(msg);

  332.                                 message_end();

  333.                         }

  334.                 }

  335.         }

  336. }

  337.  
[/pawn]

Осталось дело за малым - создать ini файл. Создаем файл testfile.ini, открываем его и вставляем туда

;Конфигурационный файл тестового плагина
;Формат
;"Ник/Стим/IP" "Срок датой - (Пример: 18/07/2013, 0 - навсегда)"

"CrAsH" "18/08/2013"


Ну на этом всё. Желаю всем хорошего вдохновения и плагинов без ошибок =)

[align=center]При копировании материала указания автора и активная ссылка на сайт
ОБЯЗАТЕЛЬНА
Прошу которых личностей не пытаться менять авторство, тогда выложу ещё много интересных идей со временем.[/align]

p.s Прошу задавать вопросы только в теме, а так же у кого есть идеи по модернизированию кода - милости прошу в лс. Все ваши пожелания будут учтены.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось crash94 19 июл 2013, 02:35, всего редактировалось 2 раз(а).
Аватара пользователя
crash94
 
Сообщения: 683
Зарегистрирован: 25 фев 2010, 16:34
Забанен
Благодарил (а): 80 раз.
Поблагодарили: 317 раз.

Re: [TUT]Присвоение привелегий на определенный срок

Сообщение DiMaN2036 » 15 июл 2014, 19:38

Как сделать чтобы в меню показывало скоко дней осталось ?!
Аватара пользователя
DiMaN2036
 
Сообщения: 7
Зарегистрирован: 19 июн 2014, 20:38
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Team Fortress II
Left 4 Dead

Re: [TUT]Присвоение привелегий на определенный срок

Сообщение L4D2 » 18 сен 2014, 01:20

Если интегрировать в amxmodx
и привязать такую связку в users.ini:
Код: Выделить всё
;"Testing Users" "AMXMODX" "abcdefghijklmnopqrstu" "a" "01/01/2016"

После чего в других админ меню прикручивать через натив

Возможно ли так ?
Интересно просто стало, попробовать хочу сделать.

==============================================
|| Пишу не большие плагины под заказ: Заказ онлайн (Кликабельно)
|| Ссылка на официальный топик: заказ плагинов.
|| Желаешь оставить отзыв: тебе сюда(кликни).
==============================================
Аватара пользователя
L4D2
 
Сообщения: 792
Зарегистрирован: 25 июн 2011, 19:26
Благодарил (а): 240 раз.
Поблагодарили: 100 раз.
Языки программирования: Counter-Strike 1.6

Re: [TUT]Присвоение привелегий на определенный срок

Сообщение kirja151 » 26 ноя 2017, 02:15

Как поставить привилегию например на 5 часов?

Осталось менее суток( Часы, минуты ):

Напишите, как правильно прописывать нужно :)
Аватара пользователя
kirja151
 
Сообщения: 6
Зарегистрирован: 25 июл 2016, 15:22
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Языки программирования: Counter-Strike 1.6

Пред.

Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9