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

Архів · 2013 crash94 Статті 2 242

Архівний матеріал ya-cs.ru (2013). Російською. Плагіни й збірки можуть не працювати з ReHLDS та AMXX 1.10.

В данной статье я расскажу как сделать ваши привилегии на определенный срок

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

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

Навсегда:

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

Привелегий нет, закончились:

Структура ini файла:

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

Приступим. топ онлайн игр mmorpg

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

Внимание, пропадают инклуды в теге
#include
#include

#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() вставляем

new g_LoadTestFile[81]

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

 
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") //Отключаем плагин с ошибкой, что файла нет
        }
}
 

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

Внимание, пропадают инклуды в теге
#include
#include

 
#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. Первое событие будет отвечать за получение данных, второе за сброс массивов при смене ника и пере получение данных

Создаем

 
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 Как видите в данных событиях есть несколько новых массивов, которые нужны для работы, поэтому их нужно создать. После

new g_LoadTestFile[81]

Добавляем

 
new szPlayerPeriod[33][2]
new szPlayerPeriodStr[33][1][32]
 

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

Внимание, пропадают инклуды в теге
#include
#include

 
#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% плагина :dance2: . Сейчас мы разберемся непосредственно фукнцию CheckPeriod, которая будет отвечать за получение данных из файла, делать расчеты и всякую ужасную вещь. Вы только не смотрите вниз, а то испугаетесь и не захотите ничего делать :-\

4. Создаем CheckPeriod

 
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. Если я начну расписывать каждый сток по отдельной, то данная статья выйдет на маленький учебник. Не думаю, что для вас будет интересные огромные математические вычисления, но срок на выходите мы получим точный с учетом высокосных годов, февраля и других факторов. Хотелось бы ещё сделать систему часового пояса для различных стран, но тем, кому это действительно потребуется – сделают сами или закажут.

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

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()

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

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

 
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привелегий") //Выводим, что он неудачник =)
        }
}
 

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

Внимание, пропадают инклуды в теге
#include
#include

 
#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”

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

При копировании материала указания автора и активная ссылка на сайт
ОБЯЗАТЕЛЬНА

Прошу которых личностей не пытаться менять авторство, тогда выложу ещё много интересных идей со временем.

p.s Прошу задавать вопросы только в теме, а так же у кого есть идеи по модернизированию кода – милости прошу в лс. Все ваши пожелания будут учтены.

Мітки:

Коментарі 18

  1. crash94

    А я хоть слово написал про "UTF-8( без BOOM)"? Я же написал,

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

    Відповісти

  2. crash94

    Что-то bb код не хочет отображать. Спасибо, исправить нет возможности, но хотя бы напишу

    #include <amxmodx>
    #include <amxmisc>

    Відповісти

  3. crash94

    Вам вообще не требуется ничего менять. Просто копируете код, вставляете, компилируете. Не понимаете?

    amx-x.ru/viewtopic.php?f=9&t=20681

    К сожалению проблему с неотображением решить не удалось. Так что берите код с amx-x или заменяйте

    #include
    #include

    на

    #include <amxmodx>
    #include <amxmisc>

    Відповісти

  4. crash007

    тут есть баг!
    тут обновления в минутах нету.
    Допустим поставишь чесло в ini файле сегоднешнее и зайдёшь на тест сервер у тебя так же будет показывать сколько осталось минут пиши и жди сколько угодно сёровно столько же.
    Приходиться перезаходить тогда показывает

    Відповісти

  5. crash007

    тоесть приходиться каждый раз перезаходить чтоб посмотреть реальное время сколько осталось

    Відповісти

  6. crash007

    ещё 1 баг
    если ты не прописан в ini файле или закончился срок,
    то пишет Ваши привелегии доступны до (10206 д)

    Відповісти

  7. crash007

    и сделай ещё в секундах
    Ваши привелегии кончаются сегодня, через 20:19:59
    тоесть в часах, минутах и в секундах

    Відповісти

  8. crash94

    ещё 1 баг
    если ты не прописан в ini файле или закончился срок,
    то пишет Ваши привелегии доступны до (10206 д)

    Подробнее. Воспроизвести не удалось

    Відповісти

Ваш коментар

Коментар з’явиться після перевірки. E-mail не публікується.