В данной статье я расскажу как сделать ваши привилегии на определенный срок
Много кто спрашивал, как я в некоторых плагинах(Например 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 Прошу задавать вопросы только в теме, а так же у кого есть идеи по модернизированию кода – милости прошу в лс. Все ваши пожелания будут учтены.
Молодец, спасибо!
У меня не компилит( Ошибку в 1 строчке выдает((
Стоит UTF-8( без BOOM)
А я хоть слово написал про "UTF-8( без BOOM)"? Я же написал,
А когда добавил инклюды ошибку выдает на 23 строке
get_configsdir(g_LoadDir, charsmax( g_LoadDir ))
Что-то bb код не хочет отображать. Спасибо, исправить нет возможности, но хотя бы напишу
все равно если делать кодировку ansi или utf8 то не компилиться(
ВСЕ СПАСИБо!!
Вам вообще не требуется ничего менять. Просто копируете код, вставляете, компилируете. Не понимаете?
amx-x.ru/viewtopic.php?f=9&t=20681
К сожалению проблему с неотображением решить не удалось. Так что берите код с amx-x или заменяйте
на
Крашик, молодец!)
тут есть баг!
тут обновления в минутах нету.
Допустим поставишь чесло в ini файле сегоднешнее и зайдёшь на тест сервер у тебя так же будет показывать сколько осталось минут пиши и жди сколько угодно сёровно столько же.
Приходиться перезаходить тогда показывает
тоесть приходиться каждый раз перезаходить чтоб посмотреть реальное время сколько осталось
crash007
Спасибо, дополнено
ещё 1 баг
если ты не прописан в ini файле или закончился срок,
то пишет Ваши привелегии доступны до (10206 д)
и сделай ещё в секундах
Ваши привелегии кончаются сегодня, через 20:19:59
тоесть в часах, минутах и в секундах
что за))) смайлик какойто вышел))
короче пример 20|18|59 это пример)
Подробнее. Воспроизвести не удалось
Как исправить ошибку?
Выдаёт в 1 строке,делаю в amxx studio.
zvorik, из за смены кодировки в инклудах может убраться "#"