Моя неудачная попытка......
Код:
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "Amxmodmenu"
#define VERSION "1.0"
#define AUTHOR ""
new g_LoadTestFile[81]
new szPlayerPeriod[33][2]
new szPlayerPeriodStr[33][1][32]
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") //Отключаем плагин с ошибкой, что файла нет
}
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("amxmodmenu", "AmxMenu")
}
public AmxMenu(id)
{
if(get_user_flags(id) & ADMIN_MENU)
{
new amxmenu = menu_create("\rАдминка ©", "AmxMenu_Func")
menu_additem(amxmenu, "\wКик", "1", 0)
menu_additem(amxmenu, "\wЗабанить", "2", 0)
menu_additem(amxmenu, "\wУдарить\r/\wубить", "3", 0)
menu_additem(amxmenu, "\wДать кляп", "4", 0)
menu_additem(amxmenu, "\wХалявная оружка", "5", 0)
menu_additem(amxmenu, "\wКоманда игрока", "6", 0)
menu_additem(amxmenu, "\wСмена Карты", "7", 0)
menu_additem(amxmenu, "\wГолосование за смену карты", "8", 0)
menu_addblank(amxmenu, 1)
menu_additem(amxmenu, "Выход ", "0", 0)
menu_setprop(amxmenu, MPROP_PERPAGE, 0)
menu_display(id, amxmenu, 0)
return PLUGIN_HANDLED
}
}
public AmxMenu_Func(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED
}
new s_Data[6], s_Name[64], i_Access, i_Callback
menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
new i_Key = str_to_num(s_Data)
switch(i_Key)
{
case 1: client_cmd(id, "amx_kickmenu")
case 2: client_cmd(id, "amx_banmenu")
case 3: client_cmd(id, "amx_slapmenu")
case 4: client_cmd(id, "amx_gagmenu")
case 5: client_cmd(id, "amx_weaponmenu")
case 6: client_cmd(id, "amx_teammenu")
case 7: client_cmd(id, "amx_mapmenu")
case 8: client_cmd(id, "amx_votemapmenu")
}
return PLUGIN_HANDLED
}
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")) //Если в сроке стоит 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 //Заканчиваем, игрок был найден
}
}
}
}
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();
}
}
}
}