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

[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]Присвоение привелегий на определенный срок

Сообщение Retro-kolt Lincoln » 23 авг 2013, 17:06

Plrip писал(а):DJ_WEST, а нельзя починить нормальное отображение этих картинок?

Каким образом? Они удалены с хостинга картинок.
Предлагаю услуги гаранта. Написание плагинов на заказ.
Статус:
на заслуженном отдыхе
Отзывы: Нажми
Обратиться ко мне: Нажми

- - - - - - - - - - - - - - - -
Если ваше ЛС было проигнорировано мною, знайте, оно мне не интересно.
Аватара пользователя
Retro-kolt Lincoln
 
Сообщения: 1283
Зарегистрирован: 28 авг 2010, 19:16
Благодарил (а): 321 раз.
Поблагодарили: 581 раз.
Опыт программирования: Больше трех лет
Языки программирования: ╚►Counter-Strike 1.6

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

Сообщение Plrip » 23 авг 2013, 20:54

Retro-kolt Lincoln, я про то, что когда сделали зимний евент на amx-x.ru, появилась куча багов и перестали отображаться все картинки.

Status:
Аватара пользователя
Plrip
Скриптер
 
Сообщения: 2903
Зарегистрирован: 03 дек 2011, 19:33
Откуда: Ukraine
Благодарил (а): 237 раз.
Поблагодарили: 603 раз.
Языки программирования: Counter-Strike 1.6
X-Ray
Killing-Floor [low]

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

Сообщение Bagto » 09 сен 2013, 23:28

Как к users.ini присобачить? То есть адаптировать под админки
Аватара пользователя
Bagto
 
Сообщения: 229
Зарегистрирован: 18 мар 2013, 17:49
Благодарил (а): 211 раз.
Поблагодарили: 14 раз.
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Team Fortress II
Left 4 Dead

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

Сообщение Bagto » 09 сен 2013, 23:47

Я так понимаю, просто удалится строчка?
Хочу под users.ini подогнать
Аватара пользователя
Bagto
 
Сообщения: 229
Зарегистрирован: 18 мар 2013, 17:49
Благодарил (а): 211 раз.
Поблагодарили: 14 раз.
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Team Fortress II
Left 4 Dead

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

Сообщение nickname » 28 сен 2013, 19:36

Интересует привязка к users.ini.можно ли так? :-)
Аватара пользователя
nickname
 
Сообщения: 23
Зарегистрирован: 03 сен 2013, 20:47
Благодарил (а): 22 раз.
Поблагодарили: 4 раз.

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

Сообщение GaMeRs » 28 сен 2013, 20:12

Аватара пользователя
GaMeRs
 
Сообщения: 1574
Зарегистрирован: 12 мар 2012, 17:25
Благодарил (а): 84 раз.
Поблагодарили: 468 раз.

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

Сообщение PRoSToTeM@ » 28 сен 2013, 23:38

Не проще ли использовать get_systime
Аватара пользователя
PRoSToTeM@
Скриптер
 
Сообщения: 2498
Зарегистрирован: 26 мар 2010, 00:12
Благодарил (а): 438 раз.
Поблагодарили: 1125 раз.

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

Сообщение nickname » 29 сен 2013, 18:55

crash94 Отличный Скриптер!Спасибо ему огромное за плагины!работает всё как часики.
Аватара пользователя
nickname
 
Сообщения: 23
Зарегистрирован: 03 сен 2013, 20:47
Благодарил (а): 22 раз.
Поблагодарили: 4 раз.

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

Сообщение PRoSToTeM@ » 29 сен 2013, 22:20

remove_task где?
Аватара пользователя
PRoSToTeM@
Скриптер
 
Сообщения: 2498
Зарегистрирован: 26 мар 2010, 00:12
Благодарил (а): 438 раз.
Поблагодарили: 1125 раз.

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

Сообщение Vaillante » 03 дек 2013, 19:43

Прикрутил эту штучку к менюшке. Спасибо
Аватара пользователя
Vaillante
 
Сообщения: 493
Зарегистрирован: 28 окт 2013, 14:56
Откуда: ты?
Благодарил (а): 131 раз.
Поблагодарили: 90 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Counter-Strike 1.6

Пред.След.

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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 9