У MastaMan-а есть подобные плагины, но мне нужна только та функция. Вы можете выложить только эту функцию?
MastaMan motd
Код:
#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <colorchat>
#define PLUGIN "MastaMotd's"
#define VERSION "2.5.0"
#define AUTHOR "MastaMan"
#define ACCESS ADMIN_SLAY
#define HTM_EXT "htm"
#define MAX_FILES 10
#define MSG_MAXSIZE 255
#define MSG_MINSIZE 64
#define URL_MAXSIZE 1024
#define MOTD_MAXSIZE 1200
// Предварительное кеширование дополнительных файлов шаблона.
// Если, вы используете свой шаблон, можете исопльзовать свои
// необходимые файлы.
// ПРИМЕЧАНИЕ: используйте не больше 30 файлов.
// ПРИМЕЧАНИЕ: помните, чем меньший размер файла, тем быстрее
// он закешируется!
// Просто измените, или допишите пути по аналогии.
new g_szGenericIMG[][] =
{
"addons/amxmodx/configs/mastamotds/images/template/tip.png",
"addons/amxmodx/configs/mastamotds/images/template/rb.jpg",
"addons/amxmodx/configs/mastamotds/images/template/lb.jpg",
"addons/amxmodx/configs/mastamotds/images/template/rt.jpg",
"addons/amxmodx/configs/mastamotds/images/template/lt.jpg",
"addons/amxmodx/configs/mastamotds/images/logo.png"
}
new g_szGeneratedCache[MAX_FILES + 1][MSG_MINSIZE]
new a_szFilesName[MAX_FILES + 1][MSG_MAXSIZE]
new a_szChatMessage[MAX_FILES + 1][MSG_MAXSIZE]
new g_CvarPluginEnable = 1
new g_szMotdIndex
new bool:NOW_VIEW[33]
/*---------------------------------------------------*/
/////////////////////////////////////////////////////////////////////
// ПРЕДВАРИТЕЛЬНОЕ КЕШИРОВАНИЕ ФАЙЛОВ
/////////////////////////////////////////////////////////////////////
// В этой функции так же происходит конфигурирование плагина!
public plugin_precache()
{
// Загрузка конфигурации
new szCfgDir[MSG_MINSIZE]
get_configsdir(szCfgDir, MSG_MINSIZE - 1)
formatex(szCfgDir, sizeof (szCfgDir) -1 , "%s/mastamotds/mastamotds.cfg", szCfgDir)
server_cmd("exec %s", szCfgDir)
// Если не найден файл конфигурации
if(!file_exists (szCfgDir))
{
g_CvarPluginEnable = 0
}
if(g_CvarPluginEnable)
{
// Отключаем все функции плагина, если конфигурация не найдена
// Админ-команды
// Формирование консольной команды показа MOTD окон
register_concmd("mm_showmotd", "f_CmdForceMotd", ACCESS, "<name or #userid> <name HTML file> - show MOTD")
// Команда для открытия меню показа MOTD окон
register_concmd ("mm_showmotd_menu", "player_menu", ACCESS, "Open player menu show MOTD")
// Разбор файла конфигурации
new szData[MSG_MAXSIZE]
new g_szFile = fopen(szCfgDir, "rt")
while(!feof(g_szFile))
{
fgets(g_szFile, szData, MSG_MAXSIZE - 1)
// Пропускаем разбор, если есть комментарии или строчка очень короткая
if(szData[0] == ';' || szData[0] == '/' || strlen(szData) < 3)
{
continue
}
// Парсим файл конфигурации, и автоматически создаем переменные
new g_szParam1[MSG_MINSIZE], g_szParam2[MSG_MINSIZE]
parse(szData, g_szParam1, sizeof (g_szParam1), g_szParam2, sizeof(g_szParam2));
register_cvar(g_szParam1, g_szParam2)
}
}
// Регистрация переменных
// Время в секундах между показами подсказок в чате.
new Float:szChatAnonse = get_cvar_float("mm_mastamotds_chat_time_anonce")
if(szChatAnonse != 0)
{
set_task(szChatAnonse, "f_ChatAnonse", 0, "", 0, "b")
}
// Создаем клиентские команды
new t_szCvarNum[MSG_MAXSIZE]
new t_szCvarFName[MSG_MAXSIZE]
new t_szClCmd[MSG_MAXSIZE]
new szSeparator[2] = ","
new g_szFilesPath[MSG_MAXSIZE]
new szCachedHTML[MSG_MAXSIZE], szDate[32], g_szRandomChar[5], g_szTmpCacheFile[MSG_MAXSIZE]
new szCacheDir[MSG_MAXSIZE], g_szTmpStr[2048],iLen
new bool:writeCache[MAX_FILES + 1]
for(new i = 1; i <= MAX_FILES; i++)
{
formatex(t_szCvarNum,MSG_MAXSIZE-1, "mm_mastamotds_file%d",i)
if(get_cvar_num(t_szCvarNum) == 1)
{
// Записываем в массив имена файлов из конфигурации
formatex(t_szCvarFName, MSG_MAXSIZE - 1, "mm_mastamotds_file%d_fname",i)
get_cvar_string(t_szCvarFName, a_szFilesName[i], MSG_MAXSIZE - 1)
// Создаем чат-команды
formatex(t_szClCmd, MSG_MAXSIZE - 1, "say /%s", a_szFilesName[i])
register_clcmd (t_szClCmd, "f_CmdChatMOTD", 0)
formatex(t_szClCmd, MSG_MAXSIZE - 1, "say_team /%s", a_szFilesName[i])
register_clcmd (t_szClCmd, "f_CmdChatMOTD", 0)
// Формируем подсказку в чате
if(i == 2 || equali(a_szFilesName[i-1], "") )
{
szSeparator = ""
}
else
{
szSeparator = ","
}
formatex(a_szChatMessage[i], MSG_MAXSIZE - 1, "%s /%s", szSeparator, a_szFilesName[i])
// Предварительное кешироване файлов, имена которых указаны в
// файле конфигурации плагина
if(!equali(a_szFilesName[i], "") || !equali(a_szFilesName[i], " ") || !equali(a_szFilesName[i], " ") /*|| equali(szMotdWeb, "") || equali(szMotdWeb, " ") || equali(szMotdWeb, " ")*/)
{
formatex(g_szFilesPath, MSG_MAXSIZE - 1, "addons/amxmodx/configs/mastamotds/%s.%s", a_szFilesName[i], HTM_EXT)
// Кеширование файлов во временную папку сервера
// Инициализация файла для хранения префиксов кеша
get_datadir(szCacheDir, MSG_MAXSIZE - 1)
formatex(szCacheDir, MSG_MAXSIZE - 1, "%s/mastamotds_cache.ini", szCacheDir)
// Проверка или файл для хранения префиксов существует, если нет, тогда создаем
if(!file_exists(szCacheDir))
{
writeCache[i] = true;
mm_log(2, "Не найден ^"%s^". Файл будет автоматически создан!", szCacheDir)
}
else
{
writeCache[i] = false;
read_file(szCacheDir, i - 1, g_szGeneratedCache[i - 1], MSG_MAXSIZE - 1, iLen)
if(strlen(g_szGeneratedCache[i - 1]) < 4 && !writeCache[i])
{
writeCache[i] = true
mm_log(2, "Не найден префикс кеша в ^"%s^", строчка ^"%d^" для файла %s.%s. Префикс будет автоматически сгенерирован!", szCacheDir, i, a_szFilesName[i], HTM_EXT)
}
formatex(g_szTmpCacheFile, MSG_MAXSIZE - 1, "cache/%s%s.%s", g_szGeneratedCache[i - 1], a_szFilesName[i], HTM_EXT)
if(!file_exists(g_szTmpCacheFile) && !writeCache[i])
{
writeCache[i] = true;
mm_log(2, "Не найден ^"%s^". Файл будет автоматически создан!", g_szTmpCacheFile)
}
if(file_size(g_szFilesPath, 0) != file_size(g_szTmpCacheFile, 0) && !writeCache[i])
{
writeCache[i] = true;
delete_file(g_szTmpCacheFile)
mm_log(2, "Обновление кеша! Возможно файл был изменен. CRC файла ^"%s^" не совпадает с ^"%s^"!", g_szFilesPath, g_szTmpCacheFile)
}
}
if(writeCache[i])
{
// Генерируем произвольное название файла кеша
format_time(szDate, sizeof(szDate) - 1, "%d%m%Y")
formatex(g_szRandomChar, sizeof(g_szRandomChar) - 1, "%c%c%c%c", random_num('a', 'z'), random_num('a', 'z'), random_num('a', 'z'), random_num('a', 'z'))
formatex(szCachedHTML, MSG_MAXSIZE - 1, "%s%s", g_szRandomChar, szDate)
// Записываем в файл новое значение кеша
write_file(szCacheDir, szCachedHTML, i - 1)
mm_log(1, "Сгенерирован новый префикс ^"%s^", для файла ^"%s.%s^"", szCachedHTML, a_szFilesName[i], HTM_EXT)
read_file(szCacheDir, i - 1, g_szGeneratedCache[i - 1], MSG_MAXSIZE - 1, iLen)
formatex(g_szTmpCacheFile, MSG_MAXSIZE - 1, "cache/%s%s.%s", g_szGeneratedCache[i - 1], a_szFilesName[i], HTM_EXT)
new file = fopen(g_szFilesPath, "rt")
new cachefile = fopen(g_szTmpCacheFile, "wt")
while(!feof(file))
{
fgets(file, g_szTmpStr, sizeof(g_szTmpStr))
fputs(cachefile, g_szTmpStr)
}
fclose(file)
fclose(cachefile)
mm_log(1, "Создан новый файл кеша ^"%s^"", g_szTmpCacheFile)
writeCache[i] = false;
}
if(file_exists(g_szFilesPath))
{
precache_generic(g_szTmpCacheFile)
}
else
{
mm_log(3, "Ошибка кеширования файла %s!", g_szTmpCacheFile)
}
}
else
{
mm_log(3, "Попытка кеширования файлов не удачна! Ошибка чтения имени файла из конфигурации!")
}
}
else
{
a_szChatMessage[i] = ""
}
}
// Предварительное кеширование рисунков
for(new i = 0; i < sizeof(g_szGenericIMG); i++)
{
if(file_exists(g_szGenericIMG[i]))
{
precache_generic(g_szGenericIMG[i])
}
else
{
server_cmd("echo [MastaMOTD's] Bad cache file %s", g_szGenericIMG[i])
mm_log(3, "Невозможно закешировать дополнительный файл ^"%s^"", g_szGenericIMG[i])
}
}
return PLUGIN_CONTINUE
}
/////////////////////////////////////////////////////////////////////
// ИНИЦИАЛИЗАЦИЯ ПЛАГИНА
/////////////////////////////////////////////////////////////////////
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
// Регистрация переменной версии плагина
register_cvar("mastamotd_ver", VERSION, FCVAR_SPONLY | FCVAR_SERVER)
// Загрузка словаря
register_dictionary("mastamotds.txt")
// Загрузка конфигурации
new szCfgDir[MSG_MINSIZE]
get_configsdir(szCfgDir, MSG_MINSIZE - 1)
formatex(szCfgDir, sizeof (szCfgDir) -1 , "%s/mastamotds/mastamotds.cfg", szCfgDir)
server_cmd("exec %s", szCfgDir)
// Если не найден файл конфигурации
if(!file_exists (szCfgDir))
{
server_cmd("echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
server_cmd("echo ")
server_cmd("echo ==============================================")
server_cmd("echo [MastaMOTD's] Not found ^"%s^"", szCfgDir)
server_cmd("echo [MastaMOTD's] Please reinstall plugin %s for solve this problem!", PLUGIN)
server_cmd("echo [MastaMOTD's] Visit www.amx-server.blogspot.com for check new version and more info")
server_cmd("echo ==============================================")
server_cmd("echo ")
server_cmd("echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
mm_log(3, "Не найден файл конфигурации ^"%s^". Переустановите плагин или посетите www.amx-server.blogspot.com, для подробной информации", szCfgDir)
g_CvarPluginEnable = 0
}
}
/////////////////////////////////////////////////////////////////////
// ЧАТ-КОМАНДЫ
/////////////////////////////////////////////////////////////////////
public f_CmdChatMOTD(UID)
{
// Получаем индетификатор из массива с именами файлов
new szMotdFName[MSG_MAXSIZE]
read_argv(1, szMotdFName, MSG_MAXSIZE - 1)
for(new i = 2; i <= MAX_FILES; i++)
{
if(containi(szMotdFName, a_szFilesName[i]) != -1)
{
g_szMotdIndex = i
set_task(0.15, "f_ChatHandleMOTD", UID)
}
else
{
continue
}
}
return PLUGIN_HANDLED
}
public f_ChatHandleMOTD(UID)
{
// Объявляем используемые переменные
new szMotdTitle[MSG_MAXSIZE], szMotdFName[MSG_MAXSIZE], szMotdWeb[URL_MAXSIZE], szMotdBgColor[MSG_MAXSIZE]
new szMotdWidth[MSG_MAXSIZE], szMotdHeight[MSG_MAXSIZE]
// Парсим переменные
formatex(szMotdTitle, MSG_MAXSIZE - 1, "mm_mastamotds_file%d_title", g_szMotdIndex)
get_cvar_string(szMotdTitle, szMotdTitle, MSG_MAXSIZE - 1)
formatex(szMotdWeb, URL_MAXSIZE - 1, "mm_mastamotds_file%d_web", g_szMotdIndex)
get_cvar_string(szMotdWeb, szMotdWeb, sizeof(szMotdWeb) - 1)
formatex(szMotdWidth, MSG_MAXSIZE - 1, "mm_mastamotds_file%d_width", g_szMotdIndex)
get_cvar_string(szMotdWidth,szMotdWidth, MSG_MAXSIZE - 1)
formatex(szMotdHeight, MSG_MAXSIZE - 1, "mm_mastamotds_file%d_height", g_szMotdIndex)
get_cvar_string(szMotdHeight,szMotdHeight, MSG_MAXSIZE - 1)
get_cvar_string("mm_mastamotds_bgcolor", szMotdBgColor, MSG_MAXSIZE - 1)
//Сообщение об ошибке
// Проверяем на ввод пустых символов вместо имени файла
if(equali(a_szFilesName[g_szMotdIndex], "") || equali(a_szFilesName[g_szMotdIndex], " "))
{
ColorChat(UID, RED,"%L", UID, "MM_LANG_MOTD_FILE_NOT_FOUND2")
}
// Проверяем или есть запись в перменной mm_mastamotds_file_web
if(equali(szMotdWeb[0], "") || equali(szMotdWeb[0], " ") || equali(szMotdWeb[0], " "))
{
// Проверяем на физическое существование данного файла
formatex(szMotdFName, MSG_MAXSIZE - 1, "\addons\amxmodx\configs\mastamotds\%s.%s",a_szFilesName[g_szMotdIndex], HTM_EXT)
if(!file_exists(szMotdFName))
{
ColorChat (UID, RED,"%L", UID, "MM_LANG_MOTD_FILE_NOT_FOUND", a_szFilesName[g_szMotdIndex], HTM_EXT)
server_cmd("echo ")
server_cmd("echo ==============================================")
server_cmd("echo Not found ^"%s^"", a_szFilesName[g_szMotdIndex])
server_cmd("echo Please reinstall plugin %s for solve this problem or check your cfg!", PLUGIN)
server_cmd("echo ")
server_cmd("echo Visit www.amx-server.blogspot.com for check new version and more info")
server_cmd("echo ==============================================")
server_cmd("echo ")
mm_log(3, "Не найден файл ^"%s^".", a_szFilesName[g_szMotdIndex])
return PLUGIN_HANDLED
}
// Формируем html страницу при помощи тега iframe
formatex(szMotdFName, MOTD_MAXSIZE - 1, "<body style=^"padding:0px; margin:0px; background:%s^"><iframe src=^"cache/%s%s.%s^" width=^"%s^" height=^"%s^" frameborder=^"0^" scrolling=^"no^" align=^"center^">",szMotdBgColor, g_szGeneratedCache[g_szMotdIndex - 1], a_szFilesName[g_szMotdIndex], HTM_EXT, szMotdWidth, szMotdHeight)
}
else
{
// Формируем html страницу при помощи тега iframe
formatex(szMotdFName, MOTD_MAXSIZE - 1, "<body style=^"padding:0px; margin:0px; background:%s^"><iframe src=^"%s^" width=^"%s^" height=^"%s^" frameborder=^"0^" scrolling=^"no^" align=^"center^">",szMotdBgColor, szMotdWeb, szMotdWidth, szMotdHeight)
}
// Уведомление в чате об использовании команды игроком
if(get_cvar_num("mm_mastamotds_chat_use_cmd") == 1)
{
new szChat_UseCMD[MSG_MAXSIZE]
new szUserName[MSG_MINSIZE]
get_user_name(UID, szUserName, MSG_MINSIZE-1)
formatex(szChat_UseCMD, MSG_MAXSIZE - 1, "%L", UID, "MM_LANG_CHAT_USE_CMD", szUserName, szMotdTitle, a_szFilesName[g_szMotdIndex])
client_print (0, print_chat,szChat_UseCMD)
mm_log(1, "Игрок %s посмотрел ^"%s^".", szUserName, a_szFilesName[g_szMotdIndex])
}
// Показываем MOTD
show_motd (UID, szMotdFName, szMotdTitle)
return PLUGIN_HANDLED
}
/////////////////////////////////////////////////////////////////////
// КОНСОЛЬНЫЕ КОМАНДЫ
/////////////////////////////////////////////////////////////////////
// Объявляем используемые переменные
new szMotdTitle2[33][MSG_MAXSIZE], szMotdFName2[33][MSG_MAXSIZE], szMotdWeb2[33][URL_MAXSIZE]
new szUserName2, TIMER[33]
new g_szMotdShow2[33], g_szMotdHeight2[33][MSG_MAXSIZE], g_szMotdWidth2[33][MSG_MAXSIZE]
public f_CmdForceMotd(id, level, cid)
{
// Проверяем или пользователь - администратор
if (!cmd_access(id, level, cid, 2))
{
return PLUGIN_HANDLED
}
// Объявляем дополнительные переменные
new szMotdBgColor2[MSG_MAXSIZE]
new szMotdShow2[MSG_MAXSIZE]
new szMotdWidth2[MSG_MAXSIZE], szMotdHeight2[MSG_MAXSIZE]
new szPlayerName2[MSG_MAXSIZE], g_szMotdForceIndex, g_szAdminName[MSG_MINSIZE], g_szUserName2[MSG_MINSIZE]
new szChat_ADM_USE[MSG_MAXSIZE]
// Парсим консольную команду
read_argv(1, szPlayerName2, MSG_MAXSIZE - 1)
// Получаем ID игрока
szUserName2 = cmd_target(id, szPlayerName2, 0)
read_argv(2, szMotdFName2[szUserName2], MSG_MAXSIZE - 1)
// Проверяем или правильно получили имя
if(!szUserName2)
{
return PLUGIN_HANDLED
}
// Получаем индитификатор из массива с именами файлов
for(new i = 1; i <= MAX_FILES; i++)
{
if(containi(szMotdFName2[szUserName2], a_szFilesName[i]) != -1)
{
g_szMotdForceIndex = i
}
else
{
continue
}
}
// Парсим переменные
get_user_name(szUserName2, g_szUserName2, MSG_MINSIZE - 1)
get_user_name(id, g_szAdminName, MSG_MINSIZE - 1)
formatex(szMotdTitle2[szUserName2], MSG_MAXSIZE - 1, "mm_mastamotds_file%d_title", g_szMotdForceIndex)
get_cvar_string(szMotdTitle2[szUserName2], szMotdTitle2[szUserName2], MSG_MAXSIZE - 1)
formatex(szMotdWeb2[szUserName2], URL_MAXSIZE - 1, "mm_mastamotds_file%d_web", g_szMotdForceIndex)
get_cvar_string(szMotdWeb2[szUserName2], szMotdWeb2[szUserName2], URL_MAXSIZE - 1)
get_cvar_string("mm_mastamotds_bgcolor", szMotdBgColor2, MSG_MAXSIZE - 1)
/*----------------------------------*/
formatex(szMotdWidth2, MSG_MAXSIZE - 1, "mm_mastamotds_file%d_width", g_szMotdForceIndex)
get_cvar_string(szMotdWidth2, g_szMotdWidth2[szUserName2], MSG_MAXSIZE - 1)
formatex(szMotdHeight2, MSG_MAXSIZE - 1, "mm_mastamotds_file%d_height", g_szMotdForceIndex)
get_cvar_string(szMotdHeight2, g_szMotdHeight2[szUserName2], MSG_MAXSIZE - 1)
formatex(szMotdShow2, MSG_MINSIZE - 1, "mm_mastamotds_file%d_show", g_szMotdForceIndex)
g_szMotdShow2[szUserName2] = get_cvar_num(szMotdShow2)
// Сообщение об ошибке
// Проверяем на ввод пустых символов вместо имени файла
if(equali(szMotdFName2[szUserName2], "") || equali(szMotdFName2[szUserName2], " "))
{
console_print(id, "Please enter correct file name")
ColorChat (id, RED,"%L", id, "MM_LANG_MOTD_FILE_NOT_FOUND2")
return PLUGIN_HANDLED
}
// Проверяем или есть запись в перменной mm_mastamotds_file_web
if(equali(szMotdWeb2[szUserName2], "") || equali(szMotdWeb2[szUserName2], " ") || equali(szMotdWeb2[szUserName2], " "))
{
// Проверяем на физическое существование файла
formatex(szMotdFName2[szUserName2], MSG_MAXSIZE - 1, "\addons\amxmodx\configs\mastamotds\%s.%s",a_szFilesName[g_szMotdForceIndex], HTM_EXT)
if(!file_exists(szMotdFName2[szUserName2]))
{
read_argv(2, szMotdFName2[szUserName2], MSG_MAXSIZE - 1)
new szUnknownFile[MSG_MAXSIZE]
formatex(szUnknownFile, MSG_MAXSIZE - 1, "\addons\amxmodx\configs\mastamotds\%s.%s",szMotdFName2[szUserName2], HTM_EXT)
ColorChat (id, RED,"%L", id, "MM_LANG_MOTD_FILE_NOT_FOUND3", szUnknownFile)
server_cmd("echo ")
server_cmd("echo ==============================================")
server_cmd("echo File %s Not found", szUnknownFile)
server_cmd("echo Please enter correct file name or check your cfg.", PLUGIN)
server_cmd("echo ")
server_cmd("echo Visit www.amx-server.blogspot.com for check new version and more info...")
server_cmd("echo ==============================================")
server_cmd("echo ")
mm_log(3, "Не найден файл ^"%s^", или название введено не правильно!", szUnknownFile)
return PLUGIN_HANDLED
}
// Формируем html страницу при помощи тега iframe
formatex(szMotdFName2[szUserName2], MOTD_MAXSIZE - 1, "<body style=^"padding:0px; margin:0px; background:%s^"><iframe src=^"cache/%s%s.%s^" width=^"%s^" height=^"%s^" frameborder=^"0^" scrolling=^"no^" align=^"center^">", szMotdBgColor2, g_szGeneratedCache[g_szMotdForceIndex - 1], a_szFilesName[g_szMotdForceIndex], HTM_EXT, g_szMotdWidth2[szUserName2], g_szMotdHeight2[szUserName2])
}
else
{
// Формируем html страницу при помощи тега iframe
formatex(szMotdFName2[szUserName2], MOTD_MAXSIZE - 1, "<body style=^"padding:0px; margin:0px; background:%s^"><iframe src=^"%s^" width=^"%s^" height=^"%s^" frameborder=^"0^" scrolling=^"no^" align=^"center^">",szMotdBgColor2, szMotdWeb2[szUserName2], g_szMotdWidth2[szUserName2], g_szMotdHeight2[szUserName2])
}
// В зависимости от значения переменной формируем не закрывающиеся MOTD
if(g_szMotdShow2[szUserName2] < 2)
{
if(!NOW_VIEW[szUserName2])
{
// Уведомление в чате об использовании команды
if(get_cvar_num("mm_mastamotds_chat_use_cmd") == 1)
{
// Формируем чат - сообщение
formatex(szChat_ADM_USE, MSG_MAXSIZE - 1, "%L",0, "MM_LANG_CHAT_ADM_CMD", g_szAdminName, g_szUserName2, szMotdTitle2[szUserName2])
ColorChat(id, GREY, szChat_ADM_USE)
}
// Показываем MOTD
show_motd(szUserName2, szMotdFName2[szUserName2], szMotdTitle2[szUserName2])
mm_log(1, "Администратор ^"%s^" показал игроку ^'%s^" MOTD", g_szAdminName, g_szUserName2)
}
else
{
ColorChat(id, RED, "%L", id, "MM_LANG_CHAT_ADM_CMD3")
mm_log(1, "Администратор пытался показать MOTD несколько раз подряд")
return PLUGIN_HANDLED
}
}
else
{
// Проверяем или пользователь уже смотрит MOTD
if(!NOW_VIEW[szUserName2])
{
NOW_VIEW[szUserName2] = true
if(get_cvar_num("mm_mastamotds_chat_use_cmd") == 1)
{
// Формируем чат - сообщение
formatex(szChat_ADM_USE, MSG_MAXSIZE - 1, "%L",0, "MM_LANG_CHAT_ADM_CMD2", g_szAdminName, g_szUserName2, szMotdTitle2[szUserName2], g_szMotdShow2[szUserName2])
ColorChat(id, RED, szChat_ADM_USE)
}
// Устанавливаем таймер в зависимости от переменной, и компенисируем 1 секунду
TIMER[szUserName2] = g_szMotdShow2[szUserName2] - 1
set_task(1.0, "f_HUD_TIMER", szUserName2, _, 0, "a", TIMER[szUserName2])
// Следующая строка отвечает за "Не закрывающиеся MOTD"
// Открываем каждые 0.1 секунду MOTD, на определенный период
// Если возникает нагрузка на сервер - измените параметр 0.5 на 1.0
// и в конце строки удалите "* 2"
set_task(0.5, "f_CmdForceMotd_Handle", szUserName2, _, 0, "a", g_szMotdShow2[szUserName2] * 2)
// Включаем еффекты
if(get_cvar_num("mm_mastamotds_effect"))
{
f_EffectsStart(szUserName2)
client_cmd(szUserName2, "spk buttons/button1")
}
// Очищаем все 4 канала HUD сообщений, надписей итак не будет видно
for(new i = 1; i <= 4; i++)
{
set_hudmessage(_,_,_,_,_,_,_,_,_,_,i)
show_hudmessage(0, " ")
}
}
else
{
ColorChat(id, RED, "%L", id, "MM_LANG_CHAT_ADM_CMD3")
mm_log(1, "Администратор пытался показать MOTD несколько раз подряд")
return PLUGIN_HANDLED
}
}
return PLUGIN_HANDLED
}
public f_CmdForceMotd_Handle(szUserName2)
{
// Показываем MOTD
show_motd(szUserName2, szMotdFName2[szUserName2], szMotdTitle2[szUserName2])
}
public f_HUD_CLOSE_WINDOW(szUserName2)
{
if(!NOW_VIEW[szUserName2])
{
// Показываем сообщение о том что уже можно закрыть MOTD
set_hudmessage(0, 255, 0, -1.0, 0.01, 0, 0.0, 2.0, 2.0, 2.0, -1)
show_hudmessage(szUserName2, "%L", szUserName2, "MM_LANG_MOTD_CONTINUE")
}
}
public f_HUD_TIMER(szUserName2)
{
// Таймер обратного отсчета
// Если время таймера закончилось, выключаем еффекты и показываем сообщение
if(TIMER[szUserName2] <= 1)
{
NOW_VIEW[szUserName2] = false
if(get_cvar_num("mm_mastamotds_effect") == 1)
{
f_EffectsEnd(szUserName2)
}
set_task(3.0, "f_HUD_CLOSE_WINDOW", szUserName2)
}
TIMER[szUserName2]--
set_hudmessage(255, 0, 0, -1.0, 0.01, 2, 0.5, 2.0, 0.03, 0.1, -1)
show_hudmessage(szUserName2, "%L", szUserName2, "MM_LANG_MOTD_WARNING")
// Показываем оставшиеся секунды разным цветом
set_hudmessage(255, 0, 0, 0.7, 0.01, 0, 6.0, 1.05, 0.0, 0.0, -1)
if(TIMER[szUserName2] <= 8)
{
set_hudmessage(255, 255, 0, 0.7, 0.01, 0, 6.0, 1.05, 0.0, 0.0, -1)
}
if (TIMER[szUserName2] <= 4)
{
set_hudmessage(0, 255, 0, 0.7, 0.01, 0, 6.0, 1.05, 0.0, 0.0, -1)
}
show_hudmessage(0, " ")
show_hudmessage(szUserName2, "%L", szUserName2, "MM_LANG_MOTD_SEC", TIMER[szUserName2])
return PLUGIN_HANDLED
}
/////////////////////////////////////////////////////////////////////
// ПОДСКАЗКА В ЧАТЕ
/////////////////////////////////////////////////////////////////////
public f_ChatAnonse(id)
{
ColorChat (id, RED, "* %L^x04 %s%s%s%s%s%s%s%s%s", id, "MM_LANG_CHAT_ANONCE", a_szChatMessage[2], a_szChatMessage[3], a_szChatMessage[4], a_szChatMessage[5], a_szChatMessage[6], a_szChatMessage[7], a_szChatMessage[8], a_szChatMessage[9], a_szChatMessage[10])
}
///////////////////////////////
// !!!ЕФФЕКТЫ!!!
///////////////////////////////
#define EFFECT_TASK_ID 666
// Альфа-прозрачность затемненного экрана
// От 0 (прозрачный) до 255 (непрозрачный)
#define EFFECT_SCREEN_ALPHA 220
// Время затухания экрана
// в секундах
#define EFFECT_SCREEN_FADE 2
// Цвет экрана затухания в формате RGB
#define EFFECT_SCREEN_R 0
#define EFFECT_SCREEN_G 0
#define EFFECT_SCREEN_B 0
// Амплитуда потряхивания экрана
#define EFFECT_SHAKE_AMP 10
// Время в секундах потряхивания экрана
// От 0 до 10
#define EFFECT_SHAKE_DUR 10
// Частота потряхивания экрана
#define EFFECT_SHAKE_FREC 10
///////////////////////////////
public f_EffectsStart(szUserName2)
{
set_task(2.0, "f_Effects", szUserName2 + EFFECT_TASK_ID, "", 0, "b")
if(is_user_connected(szUserName2))
{
message_begin(MSG_ONE, get_user_msgid("ScreenFade"), _, szUserName2)
write_short((1<<12) * EFFECT_SCREEN_FADE) // Время затухания
write_short(1<<12) // Продолжительность показа
write_short(0x0001) // Тип затухания
write_byte(EFFECT_SCREEN_R) // Red
write_byte(EFFECT_SCREEN_G) // Green
write_byte(EFFECT_SCREEN_B) // Blue
write_byte(EFFECT_SCREEN_ALPHA) // Альфа-прозрачность
message_end()
message_begin(MSG_ONE, get_user_msgid("ScreenShake"), _, szUserName2)
write_short((1<<12) * EFFECT_SHAKE_AMP) // Амплитуда
write_short((1<<12) * EFFECT_SHAKE_DUR) // Продолжительность
write_short((1<<12) * EFFECT_SHAKE_FREC) // Частота
message_end()
}
}
public f_Effects(UID)
{
new szUserName2 = UID - EFFECT_TASK_ID
if(is_user_connected(szUserName2))
{
message_begin(MSG_ONE, get_user_msgid("ScreenFade"), _, szUserName2)
write_short(1<<0) // Время затухания
write_short(1<<0) // Продолжительность показа
write_short(0x0004) // Тип затухания
write_byte(EFFECT_SCREEN_R) // Red
write_byte(EFFECT_SCREEN_G) // Green
write_byte(EFFECT_SCREEN_B) // Blue
write_byte(EFFECT_SCREEN_ALPHA) // Альфа-прозрачность
message_end()
message_begin(MSG_ONE, get_user_msgid("ScreenShake"), _, szUserName2)
write_short((1<<12) * EFFECT_SHAKE_AMP) // Амплитуда
write_short((1<<12) * EFFECT_SHAKE_DUR) // Продолжительность
write_short((1<<12) * EFFECT_SHAKE_FREC) // Частота
message_end()
}
}
public f_EffectsEnd(szUserName2)
{
remove_task(szUserName2 + EFFECT_TASK_ID)
if(is_user_connected(szUserName2))
{
message_begin(MSG_ONE, get_user_msgid("ScreenFade"), _, szUserName2)
write_short((1<<12) * EFFECT_SCREEN_FADE) // Время затухания
write_short((1<<12) * 1) // Продолжительность показа
write_short(0x0002) // Тип затухания
write_byte(EFFECT_SCREEN_R) // Red
write_byte(EFFECT_SCREEN_G) // Green
write_byte(EFFECT_SCREEN_B) // Blue
write_byte(EFFECT_SCREEN_ALPHA) // Альфа-прозрачность
message_end()
}
}
public client_disconnect(id)
{
remove_task(id + EFFECT_TASK_ID)
}
/////////////////////////////////////////////////////////////////////
// МЕНЮ
/////////////////////////////////////////////////////////////////////
new MM_LANG_TMP[MSG_MAXSIZE], szPlayerName[32]
// Формируем меню со списком игроков
public player_menu(id)
{
// Формируем заголовок меню
formatex(MM_LANG_TMP, MSG_MAXSIZE - 1, "\r%L", id, "MM_LANG_MENU1_TITLE")
// Создаем меню
new menu = menu_create (MM_LANG_TMP, "player_menu_handler")
// Объявляем новые переменные
new Players[32], pNum, tempid
new szName[32], szTempid[10]
get_players(Players, pNum)
// Строим меню с именами игроков
for ( new i; i<pNum; i++ )
{
tempid = Players[i]
get_user_name(tempid, szName, 31)
num_to_str (tempid, szTempid, 9)
// Добавляем новый пункт меню
menu_additem (menu, szName, szTempid, ACCESS)
}
// Добавляем пустой пункт меню
menu_addblank (menu, 1)
// Изменяем настройку, кол-во пунктов меню на 1 страницу меню.
// Устанавливаем 7 пунктов меню
menu_setprop (menu, MPROP_PERPAGE, 7)
// Переименовываем стандартный пункт меню BACK
formatex(MM_LANG_TMP, 127, "%L", id, "MM_LANG_MENU_BACK")
menu_setprop (menu, MPROP_BACKNAME, MM_LANG_TMP)
// Переименовываем стандартный пункт меню NEXT
formatex(MM_LANG_TMP, 127, "%L", id, "MM_LANG_MENU_NEXT")
menu_setprop (menu, MPROP_NEXTNAME, MM_LANG_TMP)
// Переименовываем стандартный пункт меню EXIT
formatex(MM_LANG_TMP, 127, "%L", id, "MM_LANG_MENU_EXIT")
menu_setprop (menu, MPROP_EXITNAME, MM_LANG_TMP)
// Отображаем меню
menu_display (id, menu, 0)
return PLUGIN_HANDLED
}
// Получение индитификаторов игрков
public player_menu_handler (id, menu, item)
{
if (item == MENU_EXIT)
{
// Прячем меню
menu_destroy (menu)
return PLUGIN_HANDLED
}
new Data[6], iName[MSG_MINSIZE]
new access, callback, tempid
// Получаем информацию по нажатию на один из пунктов меню
menu_item_getinfo (menu, item, access, Data, 5, iName, MSG_MINSIZE - 1, callback)
// Получаем ID игрока
tempid = str_to_num (Data)
get_user_name(tempid, szPlayerName, 31)
if (is_user_connected(tempid))
{
// Переход к следующему меню
choice_motd_menu(id)
}
// Прячем меню
menu_destroy (menu)
return PLUGIN_HANDLED
}
// Меню выбора MOTD
public choice_motd_menu(id)
{
// Формируем заголовок меню
formatex(MM_LANG_TMP, MSG_MAXSIZE - 1, "\r%L", id, "MM_LANG_MENU2_TITLE")
// Создаем меню
new menu = menu_create (MM_LANG_TMP, "choice_motd_menu_handler")
// Формируем список всех MOTD
new szMotdShow3[MSG_MINSIZE], g_szMotdShow3[MAX_FILES + 1], szTempid[5]
for(new i = 1; i <= MAX_FILES; i++)
{
if(equali(a_szFilesName[i], "") || equali(a_szFilesName[i], " "))
{
continue
}
// Парсим настройку времени показа MOTD
formatex(szMotdShow3, MSG_MINSIZE - 1, "mm_mastamotds_file%d_show", i)
g_szMotdShow3[i] = get_cvar_num(szMotdShow3)
// Меняем цвет пунктов меню в зависимости от времени показа
if(g_szMotdShow3[i] < 2)
{
formatex(MM_LANG_TMP, MSG_MAXSIZE - 1, "\w%s", a_szFilesName[i])
}
if(2 < g_szMotdShow3[i] <= 10)
{
formatex(MM_LANG_TMP, MSG_MAXSIZE - 1, "\y%s (%L)", a_szFilesName[i], id, "MM_LANG_MOTD_SEC", g_szMotdShow3[i])
}
if(g_szMotdShow3[i] > 10)
{
formatex(MM_LANG_TMP, MSG_MAXSIZE - 1, "\r%s (%L)", a_szFilesName[i], id, "MM_LANG_MOTD_SEC", g_szMotdShow3[i])
}
szTempid[0] = i
// Добавляем пункт меню
menu_additem (menu, MM_LANG_TMP, szTempid, ACCESS)
}
menu_setprop (menu, MPROP_EXIT, MEXIT_ALL)
// Переименовываем стандартный пункт меню BACK
formatex(MM_LANG_TMP, 127, "%L", id, "MM_LANG_MENU_BACK")
menu_setprop (menu, MPROP_BACKNAME, MM_LANG_TMP)
// Переименовываем стандартный пункт меню NEXT
formatex(MM_LANG_TMP, 127, "%L", id, "MM_LANG_MENU_NEXT")
menu_setprop (menu, MPROP_NEXTNAME, MM_LANG_TMP)
// Переименовываем стандартный пункт меню EXIT
formatex(MM_LANG_TMP, 127, "%L", id, "MM_LANG_MENU_BACK_LIST")
menu_setprop (menu, MPROP_EXITNAME, MM_LANG_TMP)
// Отображаем меню
menu_display(id, menu, 0)
}
public choice_motd_menu_handler (id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy (menu)
if (is_user_connected(id))
{
player_menu (id)
}
return PLUGIN_HANDLED
}
new data[6], iName[MSG_MINSIZE];
new access, callback;
// Получаем информацию от нажатого пункта меню
menu_item_getinfo (menu, item, access, data,5, iName, MSG_MINSIZE - 1, callback);
// Показываем MOTD
server_cmd ("mm_showmotd ^"%s^" ^"%s^"", szPlayerName, iName[2])
// Выходим из меню
menu_destroy (menu)
// Возвращаемся назад к первому меню
player_menu (id)
return PLUGIN_HANDLED;
}
/////////////////////////////////////////////////////////////////////
// Ведение логов
/////////////////////////////////////////////////////////////////////
// Объявляем новые переменные
new szLogDir[256]
new szTmpLogMsg[256]
new szLogMsg[1024]
mm_log(type, text[], any:...)
{
// Проверяем настройку, разрешающая логгирование
if(get_cvar_num("mm_mastamotds_log"))
{
if(type)
{
// Объявляем новые переменные
new szDate[32], szTime[32]
// Формируем Дату и Время
format_time(szDate, sizeof(szDate) - 1, "%d-%m-%Y")
format_time(szTime, sizeof(szTime) - 1, "%H:%M:%S")
// Назначаем в какой файл писать лог
get_localinfo("amxx_logs", szLogDir, sizeof(szLogDir) - 1)
formatex(szLogDir, sizeof(szLogDir) - 1, "%s/mastamotds(%s).txt", szLogDir, szDate)
// Формируем в единую строку текст и параметры
format_args(szTmpLogMsg, sizeof(szTmpLogMsg) - 1, 1)
// Формируем заново дату
format_time(szDate, sizeof(szDate) - 1, "%d/%m/%Y")
// В зависимости от типа формируем тип сообщения
switch(type)
{
case 1:
{
formatex(szLogMsg, sizeof(szLogMsg) - 1, "Дата: %s | Время: %s | [*] [СООБЩЕНИЕ]: %s", szDate, szTime, szTmpLogMsg)
}
case 2:
{
formatex(szLogMsg, sizeof(szLogMsg) - 1, "Дата: %s | Время: %s | [?] [НЕПОЛАДКА]: %s", szDate, szTime, szTmpLogMsg)
}
case 3:
{
formatex(szLogMsg, sizeof(szLogMsg) - 1, "Дата: %s | Время: %s | [!] [КРИТИЧЕСКАЯ ОШИБКА]: %s", szDate, szTime, szTmpLogMsg)
}
}
// Формируем первую строку в логе
formatex(szTmpLogMsg, MSG_MAXSIZE - 1, "Файл сгенерирован MastaMOTD's %s. Последнее обновление лога %s %s", VERSION, szDate, szTime)
// Записываем в лог первую строку
write_file(szLogDir, szTmpLogMsg, 0)
// Записываем в лог сообщение
write_file(szLogDir, "---------------------------------------------------", -1)
write_file(szLogDir, szLogMsg, -1)
}
}
// Это здесь не обязательно, но без этой записи возникает ошибка
if (text[0] == 0)
{
return
}
}
вроде вот отсюда начинается думаю: 558 // Проверяем или пользователь уже смотрит MOTD
Отредактировал: CH0CAPIC, - 14.5.2014, 19:45