Много кто спрашивал, как я в некоторых плагинах(Например HookManager) замутил присвоение на определенный срок каких-либо привилегий и раз уж я обосновался тут - думаю многим будет интересно
В конце данной статьи у вас должно получится что-то вроде этого
[align=center]Срок 30 лет:
Вы должны зарегистрироваться, чтобы видеть ссылки.
Навсегда:
Вы должны зарегистрироваться, чтобы видеть ссылки.
Осталось менее суток( Часы, минуты ):
Вы должны зарегистрироваться, чтобы видеть ссылки.
Привелегий нет, закончились:
Вы должны зарегистрироваться, чтобы видеть ссылки.
Структура ini файла:
Вы должны зарегистрироваться, чтобы видеть ссылки.[/align]
В данной статье мы разберем полностью готовую систему с пропиской через файл, дабы в дальнейшем не терять времени на создание примеров.
Приступим.
1. Берем дефолтный шаблон плагина, выглядит он так
[pawn]
- #include <amxmodx>
- #include <amxmisc>
- #define PLUGIN "Period of Privilege"
- #define VERSION "1.0"
- #define AUTHOR "CrAsH"
- public plugin_init()
- {
- register_plugin(PLUGIN, VERSION, AUTHOR)
- }
2. Первым делом будет целесообразно подключить ini файл, откуда будем брать и проверять игроков на наличии
2.1 Создаем массив, который будет хранить информацию о пути к ini файлу. Перед plugin_init() вставляем
[pawn]
- new g_LoadTestFile[81]
2.2 Сделаем инициализацию ini файла через plugin_cfg()
[pawn]
- public plugin_cfg()
- {
- new g_LoadDir[81] //Здесь будет путь до папки configs
- get_configsdir(g_LoadDir, charsmax( g_LoadDir )) //Получаем
- formatex(g_LoadTestFile, charsmax( g_LoadTestFile ), "%s/testfile.ini", g_LoadDir) //Записываем путь
- if(!file_exists( g_LoadTestFile )) //Если файл не существует
- {
- set_fail_state("No file testfile.ini") //Отключаем плагин с ошибкой, что файла нет
- }
- }
Собственно и всё. С файлом покончено. У вас должно получиться что-то вроде этого
[pawn]
- #include <amxmodx>
- #include <amxmisc>
- #define PLUGIN "Period of Privilege"
- #define VERSION "1.0"
- #define AUTHOR "CrAsH"
- new g_LoadTestFile[81]
- public plugin_init()
- {
- register_plugin(PLUGIN, VERSION, AUTHOR)
- }
- public plugin_cfg()
- {
- new g_LoadDir[81]
- get_configsdir(g_LoadDir, charsmax( g_LoadDir ))
- formatex(g_LoadTestFile, charsmax( g_LoadTestFile ), "%s/testfile.ini", g_LoadDir)
- if(!file_exists( g_LoadTestFile ))
- {
- set_fail_state("No file testfile.ini")
- }
- }
3. Теперь перейдем к подготовке к получению данных. Нам понадобиться 2 события - client_authorized и client_infochanged. Первое событие будет отвечать за получение данных, второе за сброс массивов при смене ника и пере получение данных
Создаем
[pawn]
- public client_authorized(id)
- {
- if(!is_user_bot(id) || !is_user_hltv(id)) //Если игрок не бот и не демка
- {
- //Сбрасываем всё, а то мало ли =)
- szPlayerPeriod[id][0] = 0
- szPlayerPeriod[id][1] = 0
- szPlayerPeriodStr[id][0] = ""
- set_task(1.0, "CheckPeriod", id) //Начинаем проверку
- }
- }
- public client_infochanged(id)
- {
- if(!is_user_connected(id)) //Если игрок не подключен
- return PLUGIN_CONTINUE //То нефиг тут делать
- new szNewName[32], szOldName[32] //Будем записывать старый и новый ник
- get_user_name(id, szOldName, charsmax( szOldName )) //Получаем старый ник
- get_user_info(id, "name", szNewName, charsmax( szNewName )) //Получаем новый ник
- if(!equal(szNewName, szOldName)) //Если они не равны
- {
- //Сбрасываем всё, а то мало ли =)
- szPlayerPeriod[id][0] = 0
- szPlayerPeriod[id][1] = 0
- szPlayerPeriodStr[id][0] = ""
- set_task(1.0, "CheckPeriod", id) //Начинаем проверку
- }
- return PLUGIN_CONTINUE
- }
3.1 Как видите в данных событиях есть несколько новых массивов, которые нужны для работы, поэтому их нужно создать. После
[pawn]
- new g_LoadTestFile[81]
Добавляем
[pawn]
- new szPlayerPeriod[33][2]
- new szPlayerPeriodStr[33][1][32]
Так, с этим мы тоже закончили. У вас должно получиться что-то вроде этого
[pawn]
- #include <amxmodx>
- #include <amxmisc>
- #define PLUGIN "Period of Privilege"
- #define VERSION "1.0"
- #define AUTHOR "CrAsH"
- new g_LoadTestFile[81]
- new szPlayerPeriod[33][2]
- new szPlayerPeriodStr[33][1][32]
- public plugin_init()
- {
- register_plugin(PLUGIN, VERSION, AUTHOR)
- }
- public plugin_cfg()
- {
- new g_LoadDir[81]
- get_configsdir(g_LoadDir, charsmax( g_LoadDir ))
- formatex(g_LoadTestFile, charsmax( g_LoadTestFile ), "%s/testfile.ini", g_LoadDir)
- if(!file_exists( g_LoadTestFile ))
- {
- set_fail_state("No file testfile.ini")
- }
- }
- public client_authorized(id)
- {
- if(!is_user_bot(id) || !is_user_hltv(id))
- {
- szPlayerPeriod[id][0] = 0
- szPlayerPeriod[id][1] = 0
- szPlayerPeriodStr[id][0] = ""
- set_task(1.0, "CheckPeriod", id)
- }
- }
- public client_infochanged(id)
- {
- if(!is_user_connected(id))
- return PLUGIN_CONTINUE
- new szNewName[32], szOldName[32]
- get_user_name(id, szOldName, charsmax( szOldName ))
- get_user_info(id, "name", szNewName, charsmax( szNewName ))
- if(!equal(szNewName, szOldName))
- {
- szPlayerPeriod[id][0] = 0
- szPlayerPeriod[id][1] = 0
- szPlayerPeriodStr[id][0] = ""
- set_task(1.0, "CheckPeriod", id)
- }
- return PLUGIN_CONTINUE
- }
Ну что же. Мы уже сделали 50% плагина . Сейчас мы разберемся непосредственно фукнцию CheckPeriod, которая будет отвечать за получение данных из файла, делать расчеты и всякую ужасную вещь. Вы только не смотрите вниз, а то испугаетесь и не захотите ничего делать
4. Создаем CheckPeriod
[pawn]
- public CheckPeriod(id)
- {
- new szName[64], szIP[32], szSteam[32] //Запишем ник, стим, ип игрока
- new szParse[128] //Строка, которую будем парсить
- new szParseData[64], szParsePeriod[32] //Отпарсенные данные
- new szLine, szNum //Прочая хрень
- get_user_name(id, szName, charsmax( szName )) //Получаем ник
- get_user_ip(id, szIP, charsmax( szIP ), 1) //Получаем ип
- get_user_authid(id, szSteam, charsmax( szSteam )) //Получаем стим
- for(szLine = 0; read_file(g_LoadTestFile, szLine, szParse, charsmax( szParse ), szNum); szLine++) //Читаем файл
- {
- if(szNum > 0 && szParse[0] != ';') //Если строка не закоментированна и в ней есть символы
- {
- //Парсим строку
- parse(szParse,
- szParseData,
- charsmax( szParseData ),
- szParsePeriod,
- charsmax( szParsePeriod )
- )
- if(equal(szName, szParseData)) //Если ник совпал
- {
- if(equal(szParsePeriod, "0")) //Если в сроке стоит 0( это навсегда )
- {
- szPlayerPeriod[id][0] = 0 //Собственно записывать нечего
- szPlayerPeriod[id][1] = 0 //Собственно записывать нечего
- szPlayerPeriodStr[id][0] = szParsePeriod //Собственно записывать нечего
- }else
- if(RealDate() < DatePeriod( szParsePeriod )) //Если же там что-то другое и реальная дата меньше даты из файла
- {
- szPlayerPeriod[id][0] = (DatePeriod( szParsePeriod ) - RealDate()) / 86400 //Так запишем дни
- szPlayerPeriod[id][1] = DatePeriod( szParsePeriod ) - RealDate() //А так секунды до 23:59:59
- szPlayerPeriodStr[id][0] = szParsePeriod
- replace_all(szPlayerPeriodStr[id][0], 31, " ", "/") //т.к мы в стоках произведем замену - вернем назад и запишем дату в читабельном формате
- }else{ //Если же срок в файле меньше текущеё даты
- new szBlock[512] //Просто массивчик
- formatex(szBlock, charsmax( szBlock ), ";%s", szParse) //Комментируем строку
- write_file(g_LoadTestFile, szBlock, szLine) //Записываем на тоже место
- }
- break //Заканчиваем, игрок был найден
- }else
- if(equal(szSteam, szParseData)) //Если стим совпал
- {
- if(equal(szParsePeriod, "0")) //Если в сроке стоит 0( это навсегда )
- {
- szPlayerPeriod[id][0] = 0 //Собственно записывать нечего
- szPlayerPeriod[id][1] = 0 //Собственно записывать нечего
- szPlayerPeriodStr[id][0] = szParsePeriod //Собственно записывать нечего
- }else
- if(RealDate() < DatePeriod( szParsePeriod )) //Если же там что-то другое и реальная дата меньше даты из файла
- {
- szPlayerPeriod[id][0] = (DatePeriod( szParsePeriod ) - RealDate()) / 86400 //Так запишем дни
- szPlayerPeriod[id][1] = DatePeriod( szParsePeriod ) - RealDate() //А так секунды до 23:59:59
- szPlayerPeriodStr[id][0] = szParsePeriod
- replace_all(szPlayerPeriodStr[id][0], 31, " ", "/") //т.к мы в стоках произведем замену - вернем назад и запишем дату в читабельном формате
- }else{ //Если же срок в файле меньше текущеё даты
- new szBlock[512] //Просто массивчик
- formatex(szBlock, charsmax( szBlock ), ";%s", szParse) //Комментируем строку
- write_file(g_LoadTestFile, szBlock, szLine) //Записываем на тоже место
- }
- break //Заканчиваем, игрок был найден
- }else
- if(equal(szIP, szParseData)) //Если ип совпал
- {
- if(equal(szParsePeriod, "0")) //Если в сроке стоит 0( это навсегда )
- {
- szPlayerPeriod[id][0] = 0 //Собственно записывать нечего
- szPlayerPeriod[id][1] = 0 //Собственно записывать нечего
- szPlayerPeriodStr[id][0] = szParsePeriod //Собственно записывать нечего
- }else
- if(RealDate() < DatePeriod( szParsePeriod )) //Если же там что-то другое и реальная дата меньше даты из файла
- {
- szPlayerPeriod[id][0] = (DatePeriod( szParsePeriod ) - RealDate()) / 86400 //Так запишем дни
- szPlayerPeriod[id][1] = DatePeriod( szParsePeriod ) - RealDate() //А так секунды до 23:59:59
- szPlayerPeriodStr[id][0] = szParsePeriod
- replace_all(szPlayerPeriodStr[id][0], 31, " ", "/") //т.к мы в стоках произведем замену - вернем назад и запишем дату в читабельном формате
- }else{ //Если же срок в файле меньше текущеё даты
- new szBlock[512] //Просто массивчик
- formatex(szBlock, charsmax( szBlock ), ";%s", szParse) //Комментируем строку
- write_file(g_LoadTestFile, szBlock, szLine) //Записываем на тоже место
- }
- break //Заканчиваем, игрок был найден
- }
- }
- }
- }
Хух. Надоело писать, а вам наверное читать. Внимательные наверное заметили, что при проверке срока идет обращение к 2-м функциям RealDate() и DatePeriod( ), но это обман зрения. На самом деле стоков всего 7. Если я начну расписывать каждый сток по отдельной, то данная статья выйдет на маленький учебник. Не думаю, что для вас будет интересные огромные математические вычисления, но срок на выходите мы получим точный с учетом высокосных годов, февраля и других факторов. Хотелось бы ещё сделать систему часового пояса для различных стран, но тем, кому это действительно потребуется - сделают сами или закажут.
Я лишь приведу их.
[pawn]
- stock RealDate()
- {
- new szTime[32]
- new szParseDay[32], szParseMouth[32], szParseYear[32], szParseHour[32], szParseMin[32], szParseSec[32]
- new szDay, szMouth, szYear, szHour, szMin, szSec
- get_time("%d %m %Y %H %M %S", szTime, charsmax( szTime ))
- parse(szTime ,
- szParseDay,
- charsmax( szParseDay ),
- szParseMouth,
- charsmax( szParseMouth ),
- szParseYear,
- charsmax( szParseYear ),
- szParseHour,
- charsmax( szParseHour ),
- szParseMin,
- charsmax( szParseMin ),
- szParseSec,
- charsmax( szParseSec )
- )
- szDay = str_to_num( szParseDay )
- szMouth = str_to_num( szParseMouth )
- szYear = str_to_num( szParseYear )
- szHour = str_to_num( szParseHour ) * 3600
- szMin = str_to_num( szParseMin ) * 60
- szSec = str_to_num( szParseSec )
- return DateSecond(szDay, szMouth, szYear) + (szHour + szMin + szSec)
- }
- stock DatePeriod(szSysTime[32])
- {
- new szParseDay[32], szParseMouth[32], szParseYear[32]
- new szDay, szMouth, szYear
- replace_all(szSysTime, charsmax( szSysTime ), "/", " ")
- parse(szSysTime,
- szParseDay,
- charsmax( szParseDay ),
- szParseMouth,
- charsmax( szParseMouth ),
- szParseYear,
- charsmax( szParseYear )
- )
- szDay = str_to_num( szParseDay )
- szMouth = str_to_num( szParseMouth )
- szYear = str_to_num( szParseYear )
- return DateSecond(szDay, szMouth, szYear) + 86399
- }
- stock DateSecond(szDay, szMouth, szYear)
- {
- return YearSeconds( szYear ) + MonthSeconds(szYear, szMouth ) + DaysSeconds( szDay )
- }
- stock YearSeconds(szYear)
- {
- new szVar[5]
- szVar[1] = szYear / 4
- szVar[2] = szYear - szVar[1]
- szVar[3] = szVar[1] - 492
- szVar[4] = szVar[2] - 1478
- szVar[3] *= 31622400
- szVar[4] *= 31536000
- return szVar[3] + szVar[4]
- }
- stock MonthSeconds(szYear, szMonth)
- {
- new szResult
- szMonth -= 1
- switch( szMonth )
- {
- case 1, 3, 5, 7, 8, 10 :
- {
- szResult = 2678400
- }
- case 2 :
- {
- if (szYear % 4 == 0)
- {
- szResult = 2505600
- }else{
- szResult = 2419200
- }
- }
- case 4, 6, 9, 11 :
- {
- szResult = 2592000
- }
- }
- if(szMonth > 1)
- {
- szResult += MonthSeconds(szYear, szMonth)
- }
- return szResult;
- }
- stock DaysSeconds(szDay)
- {
- szDay -= 1
- return szDay * 86400
- }
- stock ChatColor(const id, const input[], any:...)
- {
- new count = 1, players[32]
- static msg[191]
- vformat(msg, 190, input, 3)
- replace_all(msg, 190, "!g", "^4")
- replace_all(msg, 190, "!y", "^1")
- replace_all(msg, 190, "!t", "^3")
- if (id) players[0] = id; else get_players(players, count, "ch")
- {
- for (new i = 0; i < count; i++)
- {
- if (is_user_connected(players[i]))
- {
- message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
- write_byte(players[i]);
- write_string(msg);
- message_end();
- }
- }
- }
- }
Ну, собственно и всё. Мы сделали всю систему, но вам наверное хочется протестировать то, что вы сделали?Нет проблем
5. Создаем тестовую команду и добавляем её в plugin_init()
[pawn]
- register_clcmd("say /test", "TestResuit")
Ну и в конец плагина вставляем
p.s Строки уже сделаны в utf8 с целью экономии времени. Пример вы можете посмотреть и наверху или же не менять кодировку файла ни в коем случаи
[pawn]
- public TestResuit(id)
- {
- szPlayerPeriod[id][0] = (DatePeriod( szPlayerPeriodStr[id][0] ) - RealDate()) / 86400
- szPlayerPeriod[id][1] = DatePeriod( szPlayerPeriodStr[id][0] ) - RealDate()
- if(equal(szPlayerPeriodStr[id][0], "0")) //Если у игрока права навсегда
- {
- ChatColor(id, "!tВаши !tпривелегии !gнавсегда!!!!!") //Выводим
- }else
- if(szPlayerPeriod[id][0] > 0) //Если дней больше 0
- {
- ChatColor(id, "!yВаши привелегии доступны РґРѕ !g%s !t( !g%d !yРґ !t)", szPlayerPeriodStr[id][0], szPlayerPeriod[id][0]) //Выводим
- }else
- if(szPlayerPeriod[id][1] < 86400 && szPlayerPeriod[id][1] > 0) //Если до окончания срока меньше суток
- {
- new szTime[64] //Массив, чтобы сделать красивое время
- new szHour, szMin //Конвертируем в понятный формат
- szHour = szPlayerPeriod[id][1] / 3600 //Это часы
- szMin = (szPlayerPeriod[id][1] - ( szHour * 3600 )) / 60 //Это минуты
- if(szMin <= 9) //Если минут меньше или ровно 9, то добавим к цифре 0
- {
- formatex(szTime, charsmax( szTime ), "%d:0%d", szHour, szMin)
- }else{ //а если нет, то просто сделаем красиво
- formatex(szTime, charsmax( szTime ), "%d:%d", szHour, szMin)
- }
- ChatColor(id, "!yВаши привелегии !tкончаются !gсегодня!y, через !g%s", szTime) //Выведем
- }else{ //Если у игрока нет ничего вышеперечисленного
- ChatColor(id, "!yВаш СЃСЂРѕРє !tзакончился !tили РІС‹ РІРѕРІСЃРµ РЅРµ имели !gпривелегий") //Выводим, что он неудачник =)
- }
- }
Вот теперь уж точно всё. Готовый плагин должен выглядеть примерно так
[pawn]
- #include <amxmodx>
- #include <amxmisc>
- #define PLUGIN "Period of Privilege"
- #define VERSION "1.0"
- #define AUTHOR "CrAsH"
- new g_LoadTestFile[81]
- new szPlayerPeriod[33][2]
- new szPlayerPeriodStr[33][1][32]
- public plugin_init()
- {
- register_plugin(PLUGIN, VERSION, AUTHOR)
- register_clcmd("say /test", "TestResuit")
- }
- public plugin_cfg()
- {
- new g_LoadDir[81]
- get_configsdir(g_LoadDir, charsmax( g_LoadDir ))
- formatex(g_LoadTestFile, charsmax( g_LoadTestFile ), "%s/testfile.ini", g_LoadDir)
- if(!file_exists( g_LoadTestFile ))
- {
- set_fail_state("No file testfile.ini")
- }
- }
- public client_authorized(id)
- {
- if(!is_user_bot(id) || !is_user_hltv(id))
- {
- szPlayerPeriod[id][0] = 0
- szPlayerPeriod[id][1] = 0
- szPlayerPeriodStr[id][0] = ""
- set_task(1.0, "CheckPeriod", id)
- }
- }
- public client_infochanged(id)
- {
- if(!is_user_connected(id))
- return PLUGIN_CONTINUE
- new szNewName[32], szOldName[32]
- get_user_name(id, szOldName, charsmax( szOldName ))
- get_user_info(id, "name", szNewName, charsmax( szNewName ))
- if(!equal(szNewName, szOldName))
- {
- szPlayerPeriod[id][0] = 0
- szPlayerPeriod[id][1] = 0
- szPlayerPeriodStr[id][0] = ""
- set_task(1.0, "CheckPeriod", id)
- }
- return PLUGIN_CONTINUE
- }
- public CheckPeriod(id)
- {
- new szName[64], szIP[32], szSteam[32]
- new szParse[128]
- new szParseData[64], szParsePeriod[32]
- new szLine, szNum
- get_user_name(id, szName, charsmax( szName ))
- get_user_ip(id, szIP, charsmax( szIP ), 1)
- get_user_authid(id, szSteam, charsmax( szSteam ))
- for(szLine = 0; read_file(g_LoadTestFile, szLine, szParse, charsmax( szParse ), szNum); szLine++)
- {
- if(szNum > 0 && szParse[0] != ';')
- {
- parse(szParse,
- szParseData,
- charsmax( szParseData ),
- szParsePeriod,
- charsmax( szParsePeriod )
- )
- if(equal(szName, szParseData))
- {
- if(equal(szParsePeriod, "0"))
- {
- szPlayerPeriod[id][0] = 0
- szPlayerPeriod[id][1] = 0
- szPlayerPeriodStr[id][0] = szParsePeriod
- }else
- if(RealDate() < DatePeriod( szParsePeriod ))
- {
- szPlayerPeriod[id][0] = (DatePeriod( szParsePeriod ) - RealDate()) / 86400
- szPlayerPeriod[id][1] = DatePeriod( szParsePeriod ) - RealDate()
- szPlayerPeriodStr[id][0] = szParsePeriod
- replace_all(szPlayerPeriodStr[id][0], 31, " ", "/")
- }else{
- new szBlock[512]
- formatex(szBlock, charsmax( szBlock ), ";%s", szParse)
- write_file(g_LoadTestFile, szBlock, szLine)
- }
- break
- }else
- if(equal(szSteam, szParseData)) //Если стим совпал
- {
- if(equal(szParsePeriod, "0"))
- {
- szPlayerPeriod[id][0] = 0
- szPlayerPeriod[id][1] = 0
- szPlayerPeriodStr[id][0] = szParsePeriod
- }else
- if(RealDate() < DatePeriod( szParsePeriod ))
- {
- szPlayerPeriod[id][0] = (DatePeriod( szParsePeriod ) - RealDate()) / 86400
- szPlayerPeriod[id][1] = DatePeriod( szParsePeriod ) - RealDate()
- szPlayerPeriodStr[id][0] = szParsePeriod
- replace_all(szPlayerPeriodStr[id][0], 31, " ", "/")
- }else{
- new szBlock[512]
- formatex(szBlock, charsmax( szBlock ), ";%s", szParse)
- write_file(g_LoadTestFile, szBlock, szLine)
- }
- break
- }else
- if(equal(szIP, szParseData)) //Если ип совпал
- {
- if(equal(szParsePeriod, "0"))
- {
- szPlayerPeriod[id][0] = 0
- szPlayerPeriod[id][1] = 0
- szPlayerPeriodStr[id][0] = szParsePeriod
- }else
- if(RealDate() < DatePeriod( szParsePeriod ))
- {
- szPlayerPeriod[id][0] = (DatePeriod( szParsePeriod ) - RealDate()) / 86400
- szPlayerPeriod[id][1] = DatePeriod( szParsePeriod ) - RealDate()
- szPlayerPeriodStr[id][0] = szParsePeriod
- replace_all(szPlayerPeriodStr[id][0], 31, " ", "/")
- }else{
- new szBlock[512]
- formatex(szBlock, charsmax( szBlock ), ";%s", szParse)
- write_file(g_LoadTestFile, szBlock, szLine)
- }
- break
- }
- }
- }
- }
- public TestResuit(id)
- {
- szPlayerPeriod[id][0] = (DatePeriod( szPlayerPeriodStr[id][0] ) - RealDate()) / 86400
- szPlayerPeriod[id][1] = DatePeriod( szPlayerPeriodStr[id][0] ) - RealDate()
- if(equal(szPlayerPeriodStr[id][0], "0"))
- {
- ChatColor(id, "!tВаши !tпривелегии !gнавсегда!!!!!")
- }else
- if(szPlayerPeriod[id][0] > 0)
- {
- ChatColor(id, "!yВаши привелегии доступны до !g%s !t( !g%d !yд !t)", szPlayerPeriodStr[id][0], szPlayerPeriod[id][0])
- }else
- if(szPlayerPeriod[id][1] < 86400 && szPlayerPeriod[id][1] > 0)
- {
- new szTime[64]
- new szHour, szMin
- szHour = szPlayerPeriod[id][1] / 3600
- szMin = (szPlayerPeriod[id][1] - ( szHour * 3600 )) / 60
- if(szMin <= 9)
- {
- formatex(szTime, charsmax( szTime ), "%d:0%d", szHour, szMin)
- }else{
- formatex(szTime, charsmax( szTime ), "%d:%d", szHour, szMin)
- }
- ChatColor(id, "!yВаши привелегии !tкончаются !gсегодня!y, через !g%s", szTime)
- }else{
- ChatColor(id, "!yВаш срок !tзакончился !tили вы вовсе не имели !gпривелегий")
- }
- }
- stock RealDate()
- {
- new szTime[32]
- new szParseDay[32], szParseMouth[32], szParseYear[32], szParseHour[32], szParseMin[32], szParseSec[32]
- new szDay, szMouth, szYear, szHour, szMin, szSec
- get_time("%d %m %Y %H %M %S", szTime, charsmax( szTime ))
- parse(szTime ,
- szParseDay,
- charsmax( szParseDay ),
- szParseMouth,
- charsmax( szParseMouth ),
- szParseYear,
- charsmax( szParseYear ),
- szParseHour,
- charsmax( szParseHour ),
- szParseMin,
- charsmax( szParseMin ),
- szParseSec,
- charsmax( szParseSec )
- )
- szDay = str_to_num( szParseDay )
- szMouth = str_to_num( szParseMouth )
- szYear = str_to_num( szParseYear )
- szHour = str_to_num( szParseHour ) * 3600
- szMin = str_to_num( szParseMin ) * 60
- szSec = str_to_num( szParseSec )
- return DateSecond(szDay, szMouth, szYear) + (szHour + szMin + szSec)
- }
- stock DatePeriod(szSysTime[32])
- {
- new szParseDay[32], szParseMouth[32], szParseYear[32]
- new szDay, szMouth, szYear
- replace_all(szSysTime, charsmax( szSysTime ), "/", " ")
- parse(szSysTime,
- szParseDay,
- charsmax( szParseDay ),
- szParseMouth,
- charsmax( szParseMouth ),
- szParseYear,
- charsmax( szParseYear )
- )
- szDay = str_to_num( szParseDay )
- szMouth = str_to_num( szParseMouth )
- szYear = str_to_num( szParseYear )
- return DateSecond(szDay, szMouth, szYear) + 86399
- }
- stock DateSecond(szDay, szMouth, szYear)
- {
- return YearSeconds( szYear ) + MonthSeconds(szYear, szMouth ) + DaysSeconds( szDay )
- }
- stock YearSeconds(szYear)
- {
- new szVar[5]
- szVar[1] = szYear / 4
- szVar[2] = szYear - szVar[1]
- szVar[3] = szVar[1] - 492
- szVar[4] = szVar[2] - 1478
- szVar[3] *= 31622400
- szVar[4] *= 31536000
- return szVar[3] + szVar[4]
- }
- stock MonthSeconds(szYear, szMonth)
- {
- new szResult
- szMonth -= 1
- switch( szMonth )
- {
- case 1, 3, 5, 7, 8, 10 :
- {
- szResult = 2678400
- }
- case 2 :
- {
- if (szYear % 4 == 0)
- {
- szResult = 2505600
- }else{
- szResult = 2419200
- }
- }
- case 4, 6, 9, 11 :
- {
- szResult = 2592000
- }
- }
- if(szMonth > 1)
- {
- szResult += MonthSeconds(szYear, szMonth)
- }
- return szResult;
- }
- stock DaysSeconds(szDay)
- {
- szDay -= 1
- return szDay * 86400
- }
- stock ChatColor(const id, const input[], any:...)
- {
- new count = 1, players[32]
- static msg[191]
- vformat(msg, 190, input, 3)
- replace_all(msg, 190, "!g", "^4")
- replace_all(msg, 190, "!y", "^1")
- replace_all(msg, 190, "!t", "^3")
- if (id) players[0] = id; else get_players(players, count, "ch")
- {
- for (new i = 0; i < count; i++)
- {
- if (is_user_connected(players[i]))
- {
- message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
- write_byte(players[i]);
- write_string(msg);
- message_end();
- }
- }
- }
- }
Осталось дело за малым - создать ini файл. Создаем файл testfile.ini, открываем его и вставляем туда
;Конфигурационный файл тестового плагина
;Формат
;"Ник/Стим/IP" "Срок датой - (Пример: 18/07/2013, 0 - навсегда)"
"CrAsH" "18/08/2013"
Ну на этом всё. Желаю всем хорошего вдохновения и плагинов без ошибок =)
[align=center]При копировании материала указания автора и активная ссылка на сайт
ОБЯЗАТЕЛЬНА
Прошу которых личностей не пытаться менять авторство, тогда выложу ещё много интересных идей со временем.[/align]
p.s Прошу задавать вопросы только в теме, а так же у кого есть идеи по модернизированию кода - милости прошу в лс. Все ваши пожелания будут учтены.