Код:
#include <amxmodx>
#include <amxmisc>
#include <dhudmessage>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#include <nvault>
//#pragma semicolon 1
#define MAX_PLAYERS 32 // Максимальное кол-во игроков на сервере, заменить своим (по умолчанию 32)
#define REASON_STRLEN 48
#define USE_LOGGING // Закомментируйте эту строку, если не желаете использовать функцию логирования
#define MENU_KEYS_PUNISHMENT MENU_KEY_1|MENU_KEY_2
#define WARNINGS_DELAY 10 // Кол-во времени в секундах, по истечении которого будет возможно вновь предупредить этого же игрока (только целые числа; по умолчанию 60)
#define REMOVE_WARNINGS_DELAY 0 // Кол-во времени в секундах, по истечении которого с игрока автоматически будут списаны все предупреждения (только целые числа; по умолчанию 86400 или 1 сутки)
#define FADE_IN_TIME 2.0
#define FADE_HOLD_TIME 6.0
#define FADE_OUT_TIME 4.0
#define FADE_TIME (FADE_IN_TIME + FADE_HOLD_TIME + FADE_OUT_TIME)
#define TASK_PROPERTIES_REMOVE 7595
#define bit_add(%0,%1) (%1 |= (1<<%0))
#define bit_sub(%0,%1) (%1 &= ~(1<<%0))
#define bit_valid(%0,%1) (%1 & (1<<%0))
#define LEVEL_ACCESS ADMIN_BAN // Уровень доступа, необходимый для использования плагина (по умолчанию ADMIN_BAN)
#define ITEMS_PER_PAGE 7
//#define LEVEL_IMMUNITY ADMIN_IMMUNITY // Уровень доступа, необходимый для определения игрока, защищённого иммунитетом (по умолчанию ADMIN_IMMUNITY)
#define MAX_WARNINGS 3 // Максимальное кол-во предупреждений, которое возможно выдать игроку перед наказанием (по умолчанию 3)
#define USE_TIME_IN_PUNISHMENT_COMMAND // Закомментируйте эту строку, если тег <time> не будет задействован в команде наказания
#define m_flNextAttack 83
#define LINUX_DIFF_PLAYER 5
#define DHUD_PART_1_COLOR 200, 100, 0 // Цвет первого DHUD сообщения в RGB формате (по умолчанию 200, 100, 0)
#define DHUD_PART_1_COORD -1.0, 0.35 // Координаты первого DHUD сообщения (только дробные числа; по умолчанию -1.0, 0.35)
#define DHUD_PART_2_COLOR 200, 0, 0 // Цвет второго DHUD сообщения в RGB формате (по умолчанию 200, 0, 0)
#define DHUD_PART_2_COORD -1.0, 0.55 // Координаты второго DHUD сообщения (только дробные числа; по умолчанию -1.0, 0.55)
#define FADE_COLOR 0, 0, 0 // Цвет экрана игрока в RGB формате, которому было выдано предупреждение (по умолчанию 0, 0, 0)
#define FADE_ALPHA 255 // Уровень непрозрачности экрана игрока, которому было выдано предупреждение (по умолчанию 255)
#define MESSAGE_SEND_AUDIO 100
#define MESSAGE_SCREEN_FADE 98
#define FFADE_OUT 0x0001
#define FFADE_IN 0x0000
#define USE_SERVER_PUNISHMENT_COMMAND // Закомментируйте эту строку, если команда наказания должна будет выполняться от имени администратора, который выдал наказание, а не от имени сервера
enum _:DATA_REASONS_SIZE
{
DRS_Reason[REASON_STRLEN],
DRS_Time
}
enum _:DATA_SCREENFADE_SIZE
{
Float:DSS_OutTime,
DSS_Red,
DSS_Green,
DSS_Blue,
DSS_Alpha
}
new const SOUND_FILE[] = "events/friend_died.wav";
new const WRITE_REASON_COMMAND[] = "warnings_write_reason";
new const PUNISHMENT_COMMAND[] = "kick <userid> '<reason>'"; // Команда наказания, заменить своей (по умолчанию "banid <time> <userid>;kick <userid> '<reason>'")
new Array:g_aDataReasons;
new bool:g_bUseVaultFile, bool:g_bUseMenuReasons;
new g_iWarningsDelay, g_pVaultFile, g_iWarningsNum[MAX_PLAYERS + 1], g_iLastWarningTime[MAX_PLAYERS + 1], g_iIsAliveBitsum, g_iInFadeBitsum, g_iReasonsNum, g_iPosition[MAX_PLAYERS + 1],
g_iPlayers[MAX_PLAYERS + 1][32], g_pTarget[MAX_PLAYERS + 1], g_szReason[MAX_PLAYERS + 1][REASON_STRLEN], g_iTime[MAX_PLAYERS + 1];
#if defined USE_LOGGING
new g_szLogsDir[64];
#endif
public plugin_precache()
{
precache_sound(SOUND_FILE);
}
public plugin_init()
{
register_plugin("Warnings", "0.0.3 beta", "Subb98");
register_dictionary("warnings.txt");
register_clcmd("warnmenu", "CmdWarn");
register_clcmd("say /warn", "CmdWarn");
register_clcmd("say_team /warn", "CmdWarn");
register_menucmd(register_menuid("_warnings_menu_players"), 1023, "HandleMenuPlayers");
register_menucmd(register_menuid("_warnings_menu_punishment"), MENU_KEYS_PUNISHMENT, "HandleMenuPunishment");
register_event("HLTV", "EventHLTV", "a", "1=0", "2=0");
RegisterHam(Ham_Spawn, "player", "HamSpawnPlayerPost", 1);
RegisterHam(Ham_TakeDamage, "player", "HamTakeDamagePlayerPre");
RegisterHam(Ham_Killed, "player", "HamKilledPlayerPre");
g_iWarningsDelay = WARNINGS_DELAY > FADE_TIME ? WARNINGS_DELAY : floatround(FADE_TIME);
#if REMOVE_WARNINGS_DELAY > 0
#define INVALID_VAULT -1
#define CLEAN_VAULT_FILE_DELAY 15.0 // Кол-во времени в секундах, через которое вновь будет произведена очистка устаревших записей из .vault файла (только дробные числа; по умолчанию 15.0)
g_pVaultFile = nvault_open("warnings");
if(g_pVaultFile != INVALID_VAULT)
{
g_bUseVaultFile = true;
set_task(CLEAN_VAULT_FILE_DELAY, "CleanVaultFile", _, _, _, "b");
}
#endif
new szCfgFile[64];
get_localinfo("amxx_configsdir", szCfgFile, charsmax(szCfgFile));
add(szCfgFile, charsmax(szCfgFile), "/warnings.ini");
if(file_exists(szCfgFile))
{
g_aDataReasons = ArrayCreate(DATA_REASONS_SIZE);
ReadFile(szCfgFile);
}
else
{
register_clcmd(WRITE_REASON_COMMAND, "CmdWriteReason");
}
#if defined USE_LOGGING
get_localinfo("amxx_logs", g_szLogsDir, charsmax(g_szLogsDir));
add(g_szLogsDir, charsmax(g_szLogsDir), "/warnings");
if(!dir_exists(g_szLogsDir))
{
mkdir(g_szLogsDir);
}
#endif
}
public client_putinserver(id)
{
if(!is_user_bot(id) && !is_user_hltv(id))
{
if(g_bUseVaultFile)
{
new szAuthId[24];
get_user_authid(id, szAuthId, charsmax(szAuthId));
g_iWarningsNum[id] = nvault_get(g_pVaultFile, szAuthId);
}
else
{
g_iWarningsNum[id] = 0;
}
g_iLastWarningTime[id] = 0;
}
}
public client_disconnect(id)
{
if(task_exists(id))
{
remove_task(id);
}
if(task_exists(id + TASK_PROPERTIES_REMOVE))
{
remove_task(id + TASK_PROPERTIES_REMOVE);
}
if(bit_valid(id, g_iIsAliveBitsum))
{
bit_sub(id, g_iIsAliveBitsum);
}
if(bit_valid(id, g_iInFadeBitsum))
{
bit_sub(id, g_iInFadeBitsum);
}
g_iWarningsNum[id] = 0;
g_iLastWarningTime[id] = 0;
}
#if REMOVE_WARNINGS_DELAY > 0
public plugin_end()
{
if(g_bUseVaultFile)
{
nvault_close(g_pVaultFile);
}
}
public CleanVaultFile()
{
nvault_prune(g_pVaultFile, 0, get_systime() - REMOVE_WARNINGS_DELAY);
}
#endif
ReadFile(const szFile[])
{
new szBuffer[128], aData[DATA_REASONS_SIZE], szTime[10], pFile = fopen(szFile, "rt");
while(!feof(pFile))
{
szBuffer[0] = '^0';
fgets(pFile, szBuffer, charsmax(szBuffer));
if(szBuffer[0] && szBuffer[0] != ';' && szBuffer[0] != '#')
{
aData[DRS_Reason][0] = '^0', szTime[0] = '^0';
parse(szBuffer, aData[DRS_Reason], charsmax(aData[DRS_Reason]), szTime, charsmax(szTime));
if(aData[DRS_Reason][0] && szTime[0])
{
aData[DRS_Time] = str_to_num(szTime);
ArrayPushArray(g_aDataReasons, aData);
}
}
}
fclose(pFile);
g_iReasonsNum = ArraySize(g_aDataReasons);
if(g_iReasonsNum)
{
g_bUseMenuReasons = true;
register_menucmd(register_menuid("_warnings_menu_reasons"), 1023, "HandleMenuReasons");
}
else
{
ArrayDestroy(g_aDataReasons);
register_clcmd(WRITE_REASON_COMMAND, "CmdWriteReason");
#define DEFAULT_PUNISHMENT_TIME 60 // Кол-во времени в минутах, которое будет определять время наказания по умолчанию (только целые числа; по умолчанию 60)
}
}
public EventHLTV()
{
static iPlayers[32], iPlayersNum, i, id;
get_players(iPlayers, iPlayersNum, "ch");
for(i = 0; i < iPlayersNum; i++)
{
id = iPlayers[i];
CancelAll(id);
}
}
public HamSpawnPlayerPost(const id)
{
if(is_user_alive(id))
{
bit_add(id, g_iIsAliveBitsum);
}
}
public HamTakeDamagePlayerPre(const pVictim, const pInflictor, const pAttacker, const Float:fDamage, const iDamageBitsum)
{
if(bit_valid(pVictim, g_iInFadeBitsum))
{
if(~iDamageBitsum & DMG_BLAST || pAttacker != pInflictor)
{
return HAM_SUPERCEDE;
}
}
return HAM_IGNORED;
}
public HamKilledPlayerPre(const pVictim)
{
bit_sub(pVictim, g_iIsAliveBitsum);
CancelAll(pVictim);
}
CancelAll(const id)
{
if(bit_valid(id, g_iInFadeBitsum))
{
if(task_exists(id))
{
remove_task(id);
}
if(task_exists(id + TASK_PROPERTIES_REMOVE))
{
remove_task(id + TASK_PROPERTIES_REMOVE);
PropertiesRemove(id + TASK_PROPERTIES_REMOVE);
}
}
}
public CmdWarn(const id)
{
if(get_user_flags(id) & LEVEL_ACCESS)
{
return ShowMenuPlayers(id, g_iPosition[id] = 0);
}
return PLUGIN_HANDLED;
}
ShowMenuPlayers(const id, iPos)
{
if(iPos < 0)
{
return PLUGIN_HANDLED;
}
new iPlayersNum, iStart, iEnd, iPagesNum, iLen, szMenu[512], i, szName[32], b, iKeys = MENU_KEY_0;
get_players(g_iPlayers[id], iPlayersNum, "ch");
iStart = iPos * ITEMS_PER_PAGE;
if(iStart >= iPlayersNum)
{
iStart = iPos = g_iPosition[id] = 0;
}
iEnd = iStart + ITEMS_PER_PAGE;
if(iEnd > iPlayersNum)
{
iEnd = iPlayersNum;
}
iPagesNum = iPlayersNum / ITEMS_PER_PAGE + (iPlayersNum % ITEMS_PER_PAGE ? 1 : 0);
if(iPagesNum == 1)
{
iLen = formatex(szMenu, charsmax(szMenu), "\y%L: %L^n^n", id, "WARNINGS_MENU_TITLE", id, "WARNINGS_MENU_SUBTITLE_PLAYERS");
}
else
{
iLen = formatex(szMenu, charsmax(szMenu), "\y%L: %L \d(%d/%d)^n^n", id, "WARNINGS_MENU_TITLE", id, "WARNINGS_MENU_SUBTITLE_PLAYERS", iPos + 1, iPagesNum);
}
for(new a = iStart; a < iEnd; a++)
{
i = g_iPlayers[id][a];
get_user_name(i, szName, charsmax(szName));
if(i != id && get_user_flags(i) & LEVEL_IMMUNITY)
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d%d. %s^n", ++b, szName);
}
else
{
if(g_iWarningsNum[i])
{
if(g_iWarningsNum[i] >= MAX_WARNINGS)
{
if(get_systime() - g_iLastWarningTime[i] > g_iWarningsDelay)
{
iKeys |= (1<<b);
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y%d. \w%s \d[%L]%s^n", ++b, szName, id, "WARNINGS_MENU_PUNISH", i == id ? " \r*" : "");
}
else
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d%d. %s [%L]%s^n", ++b, szName, id, "WARNINGS_MENU_PUNISH", i == id ? " *" : "");
}
}
else
{
if(get_systime() - g_iLastWarningTime[i] > g_iWarningsDelay)
{
iKeys |= (1<<b);
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y%d. \w%s \d[%d]%s^n", ++b, szName, g_iWarningsNum[i], i == id ? " \r*" : "");
}
else
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d%d. %s [%d]%s^n", ++b, szName, g_iWarningsNum[i], i == id ? " *" : "");
}
}
}
else
{
iKeys |= (1<<b);
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y%d. \w%s%s^n", ++b, szName, i == id ? " \r*" : "");
}
}
}
if(iEnd < iPlayersNum)
{
iKeys |= MENU_KEY_9;
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y9. \w%L^n\y0. \w%L", id, "WARNINGS_MENU_NEXT", id, iPos ? "WARNINGS_MENU_BACK" : "WARNINGS_MENU_EXIT");
}
else
{
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y0. \w%L", id, iPos ? "WARNINGS_MENU_BACK" : "WARNINGS_MENU_EXIT");
}
return show_menu(id, iKeys, szMenu, -1, "_warnings_menu_players");
}
public HandleMenuPlayers(const id, const iKey)
{
switch(iKey)
{
case 8:
{
ShowMenuPlayers(id, ++g_iPosition[id]);
}
case 9:
{
ShowMenuPlayers(id, --g_iPosition[id]);
}
default:
{
g_pTarget[id] = g_iPlayers[id][g_iPosition[id] * ITEMS_PER_PAGE + iKey];
if(g_bUseMenuReasons)
{
ShowMenuReasons(id, g_iPosition[id] = 0);
}
else
{
client_cmd(id, "messagemode %s", WRITE_REASON_COMMAND);
ChatColor(id, "%L", id, "WARNINGS_CHAT_WRITE_REASON", id, g_iWarningsNum[g_pTarget[id]] >= MAX_WARNINGS ? "WARNINGS_CHAT_WRITE_REASON_PUNISHMENT" : "WARNINGS_CHAT_WRITE_REASON_WARNING");
}
}
}
}
ShowMenuReasons(const id, iPos)
{
if(iPos < 0)
{
return ShowMenuPlayers(id, g_iPosition[id] = 0);
}
new iStart, iEnd, iPagesNum, iLen, szMenu[512], szName[32], iKeys = MENU_KEY_0, b, aData[DATA_REASONS_SIZE];
iStart = iPos * ITEMS_PER_PAGE;
if(iStart >= g_iReasonsNum)
{
iStart = iPos = g_iPosition[id] = 0;
}
iEnd = iStart + ITEMS_PER_PAGE;
if(iEnd > g_iReasonsNum)
{
iEnd = g_iReasonsNum;
}
iPagesNum = g_iReasonsNum / ITEMS_PER_PAGE + (g_iReasonsNum % ITEMS_PER_PAGE ? 1 : 0);
get_user_name(g_pTarget[id], szName, charsmax(szName));
if(iPagesNum == 1)
{
iLen = formatex(szMenu, charsmax(szMenu), "\y%L: %L^n\d%L: %s^n^n", id, "WARNINGS_MENU_TITLE", id, "WARNINGS_MENU_SUBTITLE_REASONS", id, "WARNINGS_MENU_SUBTITLE_PLAYER", szName);
}
else
{
iLen = formatex(szMenu, charsmax(szMenu), "\y%L: %L \d(%d/%d)^n%L: %s^n^n", id, "WARNINGS_MENU_TITLE", id, "WARNINGS_MENU_SUBTITLE_REASONS", iPos + 1, iPagesNum, id, "WARNINGS_MENU_SUBTITLE_PLAYER", szName);
}
for(new a = iStart; a < iEnd; a++)
{
iKeys |= (1<<b);
ArrayGetArray(g_aDataReasons, a, aData);
#if defined USE_TIME_IN_PUNISHMENT_COMMAND
if(g_iWarningsNum[g_pTarget[id]] >= MAX_WARNINGS)
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y%d. \w%s \d(%d %L)^n", ++b, aData[DRS_Reason], aData[DRS_Time], id, "WARNINGS_MENU_TIME");
}
else
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y%d. \w%s^n", ++b, aData[DRS_Reason]);
}
#else
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y%d. \w%s^n", ++b, aData[DRS_Reason]);
#endif
}
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y8. \wСвоя причина^n");
if(iEnd < g_iReasonsNum)
{
iKeys |= MENU_KEY_9;
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y9. \w%L^n\y0. \w%L", id, "WARNINGS_MENU_NEXT", id, "WARNINGS_MENU_BACK");
}
else
{
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y0. \w%L", id, "WARNINGS_MENU_BACK");
}
return show_menu(id, iKeys, szMenu, -1, "_warnings_menu_reasons");
}
public HandleMenuReasons(const id, const iKey)
{
switch(iKey)
{
case 7:
{
client_cmd(id, "messagemode %s", WRITE_REASON_COMMAND);
ChatColor(id, "%L", id, "WARNINGS_CHAT_WRITE_REASON", id, g_iWarningsNum[g_pTarget[id]] >= MAX_WARNINGS ? "WARNINGS_CHAT_WRITE_REASON_PUNISHMENT" : "WARNINGS_CHAT_WRITE_REASON_WARNING");
}
case 8:
{
ShowMenuReasons(id, ++g_iPosition[id]);
}
case 9:
{
ShowMenuReasons(id, --g_iPosition[id]);
}
default:
{
new aData[DATA_REASONS_SIZE];
ArrayGetArray(g_aDataReasons, g_iPosition[id] * ITEMS_PER_PAGE + iKey, aData);
copy(g_szReason[id], charsmax(g_szReason[]), aData[DRS_Reason]);
g_iTime[id] = aData[DRS_Time];
ChooseAction(id, g_pTarget[id]);
}
}
}
public CmdWriteReason(const id)
{
read_args(g_szReason[id], charsmax(g_szReason[]));
remove_quotes(g_szReason[id]);
ChooseAction(id, g_pTarget[id]);
}
ChooseAction(const id, const pTarget)
{
if(g_iWarningsNum[pTarget] >= MAX_WARNINGS)
{
ShowMenuPunishment(id);
}
else
{
if(is_user_connected(pTarget))
{
ShowWarning(id, pTarget);
}
else
{
ChatColor(id, "%L", id, "WARNINGS_CHAT_CANT_BE_WARNED");
}
}
}
ShowWarning(const id, const pTarget)
{
new szAdmName[32], szUsrName[32], szUsrAuthId[24], szWarningsNum[10], szMessage1[256], szMessage2[256];
get_user_name(id, szAdmName, charsmax(szAdmName));
get_user_name(pTarget, szUsrName, charsmax(szUsrName));
get_user_authid(pTarget, szUsrAuthId, charsmax(szUsrAuthId));
g_iWarningsNum[pTarget]++;
g_iLastWarningTime[pTarget] = get_systime();
num_to_str(g_iWarningsNum[pTarget], szWarningsNum, charsmax(szWarningsNum));
#if REMOVE_WARNINGS_DELAY > 0
if(g_bUseVaultFile)
{
nvault_set(g_pVaultFile, szUsrAuthId, szWarningsNum);
}
#endif
bit_add(pTarget, g_iInFadeBitsum);
set_pev(pTarget, pev_flags, pev(pTarget, pev_flags) | FL_FROZEN);
set_pdata_float(pTarget, m_flNextAttack, FADE_TIME, LINUX_DIFF_PLAYER);
formatex(szMessage1, charsmax(szMessage1), "%L", pTarget, "WARNINGS_DHUD_PART_1", szAdmName, g_szReason[id], g_iWarningsNum[pTarget]);
formatex(szMessage2, charsmax(szMessage2), "%L", pTarget, "WARNINGS_DHUD_PART_2");
while(replace(szMessage1, charsmax(szMessage1), "\n", "^n")) {}
while(replace(szMessage2, charsmax(szMessage2), "\n", "^n")) {}
set_dhudmessage(DHUD_PART_1_COLOR, DHUD_PART_1_COORD, 1, _, FADE_TIME, _, 0.2);
show_dhudmessage(pTarget, szMessage1);
set_dhudmessage(DHUD_PART_2_COLOR, DHUD_PART_2_COORD, 1, _, FADE_TIME, _, 0.2);
show_dhudmessage(pTarget, szMessage2);
MessageSendAudio(pTarget, SOUND_FILE);
MessageScreenFade(pTarget, FADE_IN_TIME, FADE_HOLD_TIME, FADE_OUT_TIME, FADE_COLOR, FADE_ALPHA);
ChatColor(id, "%L", LANG_PLAYER, "WARNINGS_CHAT_WARNING", szAdmName, szUsrName, g_szReason[id], g_iWarningsNum[pTarget]);
#if defined USE_LOGGING
Logging(id, pTarget, 1);
#endif
}
MessageSendAudio(const id, const szSound[])
{
message_begin(MSG_ONE, MESSAGE_SEND_AUDIO, _, id);
write_byte(id);
write_string(szSound);
write_short(100); // pitch
message_end();
}
MessageScreenFade(const id, const Float:fInTime, const Float:fHoldTime, const Float:fOutTime, const iRed, const iGreen, const iBlue, const iAlpha)
{
message_begin(MSG_ONE, MESSAGE_SCREEN_FADE, _, id);
write_short(min(floatround(fInTime * 4096), 65535)); // в данном случае, short - это word, максимум ~16 секунд (без 1/4096)
write_short(65535);
write_short(FFADE_OUT);
write_byte(iRed);
write_byte(iGreen);
write_byte(iBlue);
write_byte(iAlpha);
message_end();
new aData[DATA_SCREENFADE_SIZE];
aData[DSS_OutTime] = _:fOutTime;
aData[DSS_Red] = iRed;
aData[DSS_Green] = iGreen;
aData[DSS_Blue] = iBlue;
aData[DSS_Alpha] = iAlpha;
set_task(fInTime + fHoldTime, "MessageScreenFadeOut", id, aData, sizeof aData);
set_task(FADE_TIME, "PropertiesRemove", id + TASK_PROPERTIES_REMOVE);
}
public MessageScreenFadeOut(const aData[DATA_SCREENFADE_SIZE], const id)
{
message_begin(MSG_ONE, MESSAGE_SCREEN_FADE, _, id);
write_short(min(floatround(aData[DSS_OutTime] * 4096), 65535)); // в данном случае, short - это word, максимум ~16 секунд (без 1/4096)
write_short(0);
write_short(FFADE_IN);
write_byte(aData[DSS_Red]);
write_byte(aData[DSS_Green]);
write_byte(aData[DSS_Blue]);
write_byte(aData[DSS_Alpha]);
message_end();
}
public PropertiesRemove(id)
{
id -= TASK_PROPERTIES_REMOVE;
bit_sub(id, g_iInFadeBitsum);
set_pev(id, pev_flags, pev(id, pev_flags) & ~FL_FROZEN);
set_pdata_float(id, m_flNextAttack, 0.0, LINUX_DIFF_PLAYER);
}
ShowMenuPunishment(const id)
{
new szUsrName[32], szMenu[512];
get_user_name(g_pTarget[id], szUsrName, charsmax(szUsrName));
#if defined USE_TIME_IN_PUNISHMENT_COMMAND
formatex(szMenu, charsmax(szMenu), "\y%L: %L^n\d%L: %s^n%L: %s, %L: %d %L^n^n\y1. \w%L^n\y2. \w%L", id, "WARNINGS_MENU_TITLE", id, "WARNINGS_MENU_SUBTITLE_ACTION", id, "WARNINGS_MENU_SUBTITLE_PLAYER", szUsrName,
id, "WARNINGS_MENU_SUBTITLE_REASON", g_szReason[id], id, "WARNINGS_MENU_SUBTITLE_TIME", g_bUseMenuReasons ? g_iTime[id] : DEFAULT_PUNISHMENT_TIME, id, "WARNINGS_MENU_TIME", id, "WARNINGS_MENU_ITEM_PUNISH", id, "WARNINGS_MENU_ITEM_BACK");
#else
formatex(szMenu, charsmax(szMenu), "\y%L: %L^n\d%L: %s^n%L: %s^n^n\y1. \w%L^n\y2. \w%L", id, "WARNINGS_MENU_TITLE", id, "WARNINGS_MENU_SUBTITLE_ACTION", id, "WARNINGS_MENU_SUBTITLE_PLAYER", szUsrName,
id, "WARNINGS_MENU_SUBTITLE_REASON", g_szReason[id], id, "WARNINGS_MENU_ITEM_PUNISH", id, "WARNINGS_MENU_ITEM_BACK");
#endif
show_menu(id, MENU_KEYS_PUNISHMENT, szMenu, -1, "_warnings_menu_punishment");
}
public HandleMenuPunishment(const id, const iKey)
{
if(!iKey)
{
Punish(id, g_pTarget[id]);
}
else
{
ShowMenuPlayers(id, g_iPosition[id] = 0);
}
}
Punish(const id, const pTarget)
{
new szName[32], szAuthId[24], szIp[16], szUserId[10], szTime[10], szPunishCmd[256];
get_user_name(pTarget, szName, charsmax(szName));
get_user_authid(pTarget, szAuthId, charsmax(szAuthId));
get_user_ip(pTarget, szIp, charsmax(szIp));
formatex(szUserId, charsmax(szUserId), "#%d", get_user_userid(pTarget));
num_to_str(g_bUseMenuReasons ? g_iTime[id] : DEFAULT_PUNISHMENT_TIME, szTime, charsmax(szTime));
copy(szPunishCmd, charsmax(szPunishCmd), PUNISHMENT_COMMAND);
while(replace(szPunishCmd, charsmax(szPunishCmd), "'", "^"")) {}
while(replace(szPunishCmd, charsmax(szPunishCmd), "<userid>", szUserId)) {}
while(replace(szPunishCmd, charsmax(szPunishCmd), "<authid>", szAuthId)) {}
while(replace(szPunishCmd, charsmax(szPunishCmd), "<ip>", szIp)) {}
while(replace(szPunishCmd, charsmax(szPunishCmd), "<name>", szName)) {}
while(replace(szPunishCmd, charsmax(szPunishCmd), "<time>", szTime)) {}
while(replace(szPunishCmd, charsmax(szPunishCmd), "<reason>", g_szReason[id])) {}
#if defined USE_SERVER_PUNISHMENT_COMMAND
server_cmd(szPunishCmd);
#else
client_cmd(id, szPunishCmd);
#endif
#if defined USE_LOGGING
Logging(id, pTarget, 0);
#endif
}
stock Logging(const id, const pTarget, const iType)
{
new szTime[8], szLogFile[96], szAdmName[32], szUsrName[32], szAdmAuthId[24], szUsrAuthId[24];
get_time("%Y%m%d", szTime, charsmax(szTime));
formatex(szLogFile, charsmax(szLogFile), "%s/%s.log", g_szLogsDir, szTime);
get_user_name(id, szAdmName, charsmax(szAdmName));
get_user_name(pTarget, szUsrName, charsmax(szUsrName));
get_user_authid(id, szAdmAuthId, charsmax(szAdmAuthId));
get_user_authid(pTarget, szUsrAuthId, charsmax(szUsrAuthId));
if(iType)
{
log_to_file(szLogFile, "%s <%s> warned %s <%s> | reason: ^"%s^" | warnings num: %d", szAdmName, szAdmAuthId, szUsrName, szUsrAuthId, g_szReason[id], g_iWarningsNum[pTarget]);
}
else
{
log_to_file(szLogFile, "%s <%s> punished %s <%s> | reason: ^"%s^"", szAdmName, szAdmAuthId, szUsrName, szUsrAuthId, g_szReason[id]);
}
}
stock ChatColor(const id, const input[], any:...)
{
static msg[191], count, players[32], i, iSayText
vformat(msg, 190, input, 3)
replace_all(msg, 190, "!g", "^4")
replace_all(msg, 190, "!y", "^1")
replace_all(msg, 190, "!t", "^3")
count = 1
if(id) players[0] = id
else get_players(players, count, "ch")
if(!iSayText) iSayText = get_user_msgid("SayText")
for (i = 0; i < count; i++)
{
if (is_user_connected(players[i]))
{
message_begin(MSG_ONE_UNRELIABLE, iSayText, _, players[i])
write_byte(players[i])
write_string(msg)
message_end()
}
}
}
А в lang file замени
Цитата
WARNINGS_CHAT_WARNING = !yпредупредил !g%s !yза !g%s (%d раз)
на
Цитата
WARNINGS_CHAT_WARNING = !g%s предупредил!g %s!y за!g %s (%d раз)