Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
#define MAX_IMMUNITY_LEVELS 5 //максимальное количество уровней доступа "cms_gag_immunity_lvl"
#define MAX_IMMUNITY_LEVEL_LEN 5 //максимальное количество флагов в одном уровне доступа
#define MAX_BLOCK_TYPES 3 //типов блокировки (все, чат, голос)
new const sqlTable[] = "comms";
new const g_szSoundFilePath[] = "../valve/sound/buttons/blip2.wav";
new Trie:g_trhWhiteListCmdArray, Trie:g_trhBlockedUsers;
new Array:g_arhBlockTime, Array:g_arhBlockReasons;
new Handle:g_hSqlHandle;
new szQuery[MAX_QUERY_SMALL_LEN*2], plBlockInfo[MAX_PLAYERS+1][BlockInfo], g_szPlayerMuteType[MAX_PLAYERS + 1];
new g_bitPlayerMuted[MAX_PLAYERS+1], CsTeams:g_iPlayerTeam[MAX_PLAYERS+1], bool:g_isAlivePlayer[MAX_PLAYERS+1], g_iImmunLevel[MAX_PLAYERS+1];
new g_szBlockType[MAX_BLOCK_TYPES][MAX_NAME_LENGTH], g_bitAccessLvl[MAX_IMMUNITY_LEVELS];
new g_iEntSpamChecker[MAX_PLAYERS+1], Float:g_flPlayerSpamTimer[MAX_PLAYERS+1];
new g_bitBlockedVoice, g_bitBlockedChat, g_bitBlockedFully, g_bitUseTeamVoice;
new g_iTimeMenu, g_iReasonMenuId, g_iTypeMenu, g_iStaticMenuCallback;
new g_iAddTime, g_iAddLastId, g_iMenuAccessNull, g_iImmunLevelsNum;
new g_bitApiAllow, g_iCmdGagMenu, g_iServerId, bool:g_bRoundEnd;
//cvars
new cpTime, cpImmunityLvl, cpWhiteCmds, cpDeadAdmTalk, cpAmxShowActivity, cpAllTalk, cpBlockVoiceSpam;
new cv_iDeadAdmTalk, cv_iAllTalk, cv_iBlockSpam, cv_iMuteTypeChoose, Float:cv_flBlockSpamTimer, Float:cv_flTimeForInfo;
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_cvar("gamecms_gagmanager", VERSION, FCVAR_SERVER);
/*======== Ловим соединение с БД от API =========*/
public OnAPIPluginLoaded(Handle:sqlTuple)
{
g_hSqlHandle = sqlTuple;
g_bitApiAllow |= UseGameCms;
g_iServerId = cmsapi_get_server_id();
SQL_SetCharset(g_hSqlHandle, "utf8");
if(get_playersnum()) //Если игроки зашли ДО соединения с БД
{
new szAuthid[MAX_AUTHID_LENGTH];
for(new i = 1; i <= MaxClients; i++)
{
if(!is_user_connected(i))
continue;
public FnCreateStaticMenu()
{
new iSize = ArraySize(g_arhBlockReasons);
new szReasonInfo[eReasonData];
for(new i; i < iSize; i++)
{
ArrayGetArray(g_arhBlockReasons, i, szReasonInfo, sizeof(szReasonInfo));
/*======== Запрос на сохранение блока =========*/
/*
id- client index
iFuncType - тип операции блокировки(1- создание, 2- удаление)
iBlockType - тип блока (чат / голос)
szBlockReason - причина
iTime - время
public CanPlayerHearPlayer(Receiver, Sender, bool:Listen)
{
if(Receiver == Sender)
return FMRES_IGNORED;
//Мертвого админа слышат все, если он говорит в командный чат или включен параметр cms_gag_deadadmtalk
if(!g_isAlivePlayer[Sender] && g_iImmunLevel[Sender] > 1 && (GetBit(g_bitUseTeamVoice, Sender) || cv_iDeadAdmTalk))
return FnCanHearSender(Receiver, Sender, true);
//если регейм, то учесть время на инфу
#if defined _reapi_included
if(GetBit(g_bitUseTeamVoice, Sender))
{
if(IsEnemy(Receiver, Sender))
return FnCanHearSender(Receiver, Sender, false);
}
/*
Проверка текущего блока от Админа
@index - индекс игрока
0- voice + chat
1- chat
2- voice
-1- not blocked
*/
public native_cmsgag_is_user_blocked()
{
new id = get_param(1);
return GetBit(g_bitBlockedFully, id) ?
BLOCK_STATUS_ALL : GetBit(g_bitBlockedChat, id) ?
BLOCK_STATUS_CHAT : GetBit(g_bitBlockedVoice, id) ?
BLOCK_STATUS_VOICE : BLOCK_STATUS_NONE;
}
/*
Проверка текущего блока от игрока
@iSender - индекс отправителя
@receiver - индекс получателя
*/
public native_cmsgag_is_user_muted_by()
{
static iClient;
iClient = get_param(1);
АМХModX версии 1.8.3 и выше
Модуль Metamod: VoiceTrancoder 2017
Модуль для AMXModX: VTC_Api ИЛИ ReAPI (в зависимости он параметра компиляции #define REAPI)
Плагин GameCMS API Server (опционально)