Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Изменить плагин, waring

magis1337
сообщение 16.2.2015, 21:25
Сообщение #1
Стаж: 11 лет
Город: Odessa

Сообщений: 2782
Благодарностей: 1535
Полезность: 918

host5.ru
Меценат Меценат

Всем привет, не давно переделали плагин мне. Но не доделали, но плагин мне очень сильно надо.
Не могу изменить колор чат, что бы цветной чат был, и своя причина, своя причина, просто не отоброжается=( кто в скриптинге силен, помогите исправить
lang файл
lang
[ru]
WARNINGS_MENU_TITLE = Меню предупреждений
WARNINGS_MENU_SUBTITLE_PLAYERS = выберите игрока
WARNINGS_MENU_PUNISH = наказать
WARNINGS_MENU_NEXT = Далее
WARNINGS_MENU_BACK = Назад
WARNINGS_MENU_EXIT = Выход
WARNINGS_CHAT_WRITE_REASON = Введите причину для %L этого игрока
WARNINGS_CHAT_WRITE_REASON_PUNISHMENT = наказания
WARNINGS_CHAT_WRITE_REASON_WARNING = предупреждения
WARNINGS_MENU_SUBTITLE_REASONS = выберите причину
WARNINGS_MENU_SUBTITLE_PLAYER = Игрок
WARNINGS_MENU_TIME = мин.
WARNINGS_CHAT_CANT_BE_WARNED = Извините, данный игрок не может быть предупреждён сейчас
WARNINGS_DHUD_PART_1 = Вас предупредил\nадмин %s\nза %s (%d раз)
WARNINGS_DHUD_PART_2 = При повторных нарушениях\nВы будете наказаны!\nСоблюдайте правила!
WARNINGS_CHAT_WARNING = предупредил %s за %s (%d раз)
WARNINGS_MENU_SUBTITLE_ACTION = подтвердите действие
WARNINGS_MENU_SUBTITLE_REASON = Причина
WARNINGS_MENU_SUBTITLE_TIME = время
WARNINGS_MENU_ITEM_PUNISH = Наказать игрока
WARNINGS_MENU_ITEM_BACK = Вернуться назад

[en]
WARNINGS_MENU_TITLE = Warnings menu
WARNINGS_MENU_SUBTITLE_PLAYERS = select player
WARNINGS_MENU_PUNISH = punish
WARNINGS_MENU_NEXT = Next
WARNINGS_MENU_BACK = Back
WARNINGS_MENU_EXIT = Exit
WARNINGS_CHAT_WRITE_REASON = Enter a reason for %L this player
WARNINGS_CHAT_WRITE_REASON_PUNISHMENT = punishment
WARNINGS_CHAT_WRITE_REASON_WARNING = warning
WARNINGS_MENU_SUBTITLE_REASONS = select reason
WARNINGS_MENU_SUBTITLE_PLAYER = Player
WARNINGS_MENU_TIME = min
WARNINGS_CHAT_CANT_BE_WARNED = Sorry, this player can't be warned now
WARNINGS_DHUD_PART_1 = You have been warned\nadmin %s\nfor %s (%d times)
WARNINGS_DHUD_PART_2 = Repeated violations\nyou will be punished!\nFollow the rules!
WARNINGS_CHAT_WARNING = warned %s for %s (%d times)
WARNINGS_MENU_SUBTITLE_ACTION = confirmation
WARNINGS_MENU_SUBTITLE_REASON = Reason
WARNINGS_MENU_SUBTITLE_TIME = time
WARNINGS_MENU_ITEM_PUNISH = Punish player
WARNINGS_MENU_ITEM_BACK = Return back

исходник
Скрытый текст
Код:
#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, "^1%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, "^1%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, "^1%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);
show_activity(id, szAdmName, "%L", LANG_PLAYER, "WARNINGS_CHAT_WARNING", 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()
}
}
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя GOOD FELLOW
сообщение 17.2.2015, 0:24
Сообщение #2


Иконка группы

Стаж: 13 лет

Сообщений: 2294
Благодарностей: 1187
Полезность: 890

1. Подключи колорчат или заюзай сток колорчата.
Затем в ланг файле выставляешь в нужных местах нужные теги цвета (обязательно начиная с самого начала строки)
Пример (строка из ланга)
TEST = тут мой !gтекст - неверно
TEST = !yТут мой !gтекст - верно
2. Ток завтра смогу глянуть
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
magis1337
сообщение 17.2.2015, 0:43
Сообщение #3
Стаж: 11 лет
Город: Odessa

Сообщений: 2782
Благодарностей: 1535
Полезность: 918

host5.ru
Меценат Меценат

GOOD FELLOW, Потключил колор чат, все равно не работает
Пробовал в lag файле и !g и ^04
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя elfitaja
сообщение 17.2.2015, 4:38
Сообщение #4
Стаж: 13 лет

Сообщений: 124
Благодарностей: 4
Полезность: 32

Странно, у меня этот плагин изначально цветной шёл.. Исходника нет только уже =(
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
magis1337
сообщение 17.2.2015, 6:25
Сообщение #5
Стаж: 11 лет
Город: Odessa

Сообщений: 2782
Благодарностей: 1535
Полезность: 918

host5.ru
Меценат Меценат

elfitaja, ну не знаю, МБ у тебя другой плагин?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя GOOD FELLOW
сообщение 17.2.2015, 10:00
Сообщение #6


Иконка группы

Стаж: 13 лет

Сообщений: 2294
Благодарностей: 1187
Полезность: 890

C ColorChat
Код:
#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", 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_MENU_TITLE = Меню предупреждений
WARNINGS_MENU_SUBTITLE_PLAYERS = выберите игрока
WARNINGS_MENU_PUNISH = наказать
WARNINGS_MENU_NEXT = Далее
WARNINGS_MENU_BACK = Назад
WARNINGS_MENU_EXIT = Выход
WARNINGS_CHAT_WRITE_REASON = !yВведите причину для !g%L !yэтого игрока
WARNINGS_CHAT_WRITE_REASON_PUNISHMENT = наказания
WARNINGS_CHAT_WRITE_REASON_WARNING = предупреждения
WARNINGS_MENU_SUBTITLE_REASONS = выберите причину
WARNINGS_MENU_SUBTITLE_PLAYER = Игрок
WARNINGS_MENU_TIME = мин.
WARNINGS_CHAT_CANT_BE_WARNED = !yИзвините, данный игрок не может быть предупреждён !gсейчас
WARNINGS_DHUD_PART_1 = Вас предупредил\nадмин %s\nза %s (%d раз)
WARNINGS_DHUD_PART_2 = При повторных нарушениях\nВы будете наказаны!\nСоблюдайте правила!
WARNINGS_CHAT_WARNING = !yпредупредил !g%s !yза !g%s (%d раз)
WARNINGS_MENU_SUBTITLE_ACTION = подтвердите действие
WARNINGS_MENU_SUBTITLE_REASON = Причина
WARNINGS_MENU_SUBTITLE_TIME = время
WARNINGS_MENU_ITEM_PUNISH = Наказать игрока
WARNINGS_MENU_ITEM_BACK = Вернуться назад
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
magis1337
сообщение 17.2.2015, 10:02
Сообщение #7
Стаж: 11 лет
Город: Odessa

Сообщений: 2782
Благодарностей: 1535
Полезность: 918

host5.ru
Меценат Меценат

GOOD FELLOW, ты только колор чат сделал? или свою причину тоже?=)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя GOOD FELLOW
сообщение 17.2.2015, 10:09
Сообщение #8


Иконка группы

Стаж: 13 лет

Сообщений: 2294
Благодарностей: 1187
Полезность: 890

magis1337, пока только с КЧ
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Legend21
сообщение 17.2.2015, 10:13
Сообщение #9
Стаж: 14 лет
Город: Винница

Сообщений: 604
Благодарностей: 229
Полезность: 561

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

а так же регистр: register_dictionary_colored("warnings.txt")

получиться вот так.
client_print_color(0, Blue, "%L", LANG_PLAYER, "WARNINGS_CHAT_WARNING", szUsrName, g_szReason[id], g_iWarningsNum[pTarget])
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя GOOD FELLOW
сообщение 17.2.2015, 10:16
Сообщение #10


Иконка группы

Стаж: 13 лет

Сообщений: 2294
Благодарностей: 1187
Полезность: 890

Legend21, это вроде в AmxModX 1.8.3 так сделано
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
magis1337
сообщение 17.2.2015, 10:18
Сообщение #11
Стаж: 11 лет
Город: Odessa

Сообщений: 2782
Благодарностей: 1535
Полезность: 918

host5.ru
Меценат Меценат

GOOD FELLOW,
это так и должно быть?
bild 6027
amxmodx 1/8/2
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя GOOD FELLOW
сообщение 17.2.2015, 10:22
Сообщение #12


Иконка группы

Стаж: 13 лет

Сообщений: 2294
Благодарностей: 1187
Полезность: 890

Код:
#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 раз)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Legend21
сообщение 17.2.2015, 10:26
Сообщение #13
Стаж: 14 лет
Город: Винница

Сообщений: 604
Благодарностей: 229
Полезность: 561

GOOD FELLOW,

Теперь понял, без вопросов ok.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя GOOD FELLOW
сообщение 17.2.2015, 10:27
Сообщение #14


Иконка группы

Стаж: 13 лет

Сообщений: 2294
Благодарностей: 1187
Полезность: 890

Legend21, на самом деле в AmxModX 1.8.3 в этом плане удобнее, чем щас. Как по мне, так щас муторнее немного))
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
magis1337
сообщение 17.2.2015, 10:31
Сообщение #15
Стаж: 11 лет
Город: Odessa

Сообщений: 2782
Благодарностей: 1535
Полезность: 918

host5.ru
Меценат Меценат

GOOD FELLOW, Все равно
даже кажись ошибка пошла, что игрок 107 раз предупрежден. Хотя первые вижу

Прикрепленное изображение
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя GOOD FELLOW
сообщение 17.2.2015, 10:33
Сообщение #16


Иконка группы

Стаж: 13 лет

Сообщений: 2294
Благодарностей: 1187
Полезность: 890

так ясно, добавь мну в скайп
я вечером помогу, а то щас опаздываю уже)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
magis1337
сообщение 17.2.2015, 10:34
Сообщение #17
Стаж: 11 лет
Город: Odessa

Сообщений: 2782
Благодарностей: 1535
Полезность: 918

host5.ru
Меценат Меценат

GOOD FELLOW, Хорошо. Сейчас-))
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
magis1337
сообщение 17.2.2015, 23:44
Сообщение #18
Стаж: 11 лет
Город: Odessa

Сообщений: 2782
Благодарностей: 1535
Полезность: 918

host5.ru
Меценат Меценат

спасибо GOOD FELLOW
очень помог =)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: