вот исходник
- Код: Выделить всё
#include <amxmodx>
#include <nvault>
#include <geoip>
#include <fakemeta>
#define is_vip(%1) get_user_flags(%1) & ADMIN_KICK
#define is_admin(%1) get_user_flags(%1) & ADMIN_RCON
new g_szIp[33][24], bool:g_iPermMute[33]
new g_iMenuPosition[33], g_iMenuList[33][64], g_iNum[33]
new g_nVault, szPrefix[] = "!g***"
new Trie:g_tMutePidors
new g_iMaxPlayers
new const szDontSpeakCountry[][] =
{
"UZB",//uzbeki
"KZH",//kazahi
"USA"//america
}
new const szMenuNames[][] =
{
"Заглушить",
"Снять заглушку",
"Заглушить навсегда"
}
public plugin_init()
{
register_plugin("Mute Menu", "2.0", "pro")
register_clcmd("say", "cmd_say")
register_clcmd("say_team", "cmd_say")
register_menucmd(register_menuid("show_mutemenu"), (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9), "mutemenu_handler")
register_cvar("mute_country", "1")
register_forward(FM_Voice_SetClientListening, "Fwd_Voice_ClientListening")
g_nVault = nvault_open("PermMute")
if(g_nVault == INVALID_HANDLE)
{
new szError[218]
formatex(szError, charsmax(szError), "Invalid handle Nvault %s", g_nVault)
set_fail_state(szError)
return
}
g_tMutePidors = TrieCreate()
g_iMaxPlayers = get_maxplayers()
}
public client_putinserver(id)
{
get_user_ip(id, g_szIp[id], charsmax(g_szIp[]))
if(get_cvar_num("mute_country"))
{
new g_iCountry[33][4]
geoip_code3_ex(g_szIp[id], g_iCountry[id])
for(new i = 0; i < sizeof szDontSpeakCountry; i++)
if(equal(g_iCountry[id], szDontSpeakCountry[i]))
TrieSetCell(g_tMutePidors, g_szIp[id], 1)
}
CheckPermMute(id)
}
#if AMXX_VERSION_NUM < 183
public client_disconnect(id) g_szIp[id] = ""
#else
public client_disconnected(id) g_szIp[id] = ""
#endif
public cmd_say(id)
{
if(native_get_mute(id))
{
client_printc(id, "%s^x01 Вам %sзапрещено писать в чат и говорить в микрофон.", szPrefix, g_iPermMute[id] ? "навсегда " : "")
return PLUGIN_HANDLED
}
static szArgs[64]
read_args(szArgs, charsmax(szArgs)); remove_quotes(szArgs)
if(equal(szArgs, "/mute")) native_showmenus(id, 0)
else if(equal(szArgs, "/speak")) native_showmenus(id, 1)
else if(equal(szArgs, "/pmute")) native_showmenus(id, 2)
return PLUGIN_CONTINUE
}
public Fwd_Voice_ClientListening(iReceiver, iSender, listen)
{
if(iReceiver == iSender)
return FMRES_IGNORED
if(!is_user_connected(iSender))
return FMRES_IGNORED
if(native_get_mute(iSender))
{
engfunc(EngFunc_SetClientListening, iReceiver, iSender, false)
return FMRES_SUPERCEDE
}
return FMRES_IGNORED
}
public native_showmenus(id, num)
{
if(!num && is_vip(id))
{
g_iNum[id] = 0
show_mutemenu(id, g_iMenuPosition[id] = 0)
}
else if(num == 1 && is_vip(id))
{
g_iNum[id] = 1
show_mutemenu(id, g_iMenuPosition[id] = 0)
}
else if(num == 2 && is_admin(id))
{
g_iNum[id] = 2
show_mutemenu(id, g_iMenuPosition[id] = 0)
}
}
show_mutemenu(id, iPos)
{
if(iPos < 0)
return PLUGIN_HANDLED
static g_iPlayersNum; g_iPlayersNum = 0
for(new i = 1; i < g_iMaxPlayers; i++)
{
if(!is_user_connected(i) || is_vip(i) || is_user_hltv(i) || is_user_bot(i)) continue
g_iMenuList[id][g_iPlayersNum++] = i
}
new iStart = iPos * 8
if(iStart > g_iPlayersNum) iStart = g_iPlayersNum
iStart = iStart - (iStart % 8)
g_iMenuPosition[id] = iStart / 8
new iEnd = iStart + 8
if(iEnd > g_iPlayersNum) iEnd = g_iPlayersNum
new menu[512], len, pagesnum = (g_iPlayersNum / 8 + ((g_iPlayersNum % 8) ? 1 : 0))
switch(pagesnum)
{
case 0: return PLUGIN_HANDLED
default: len = formatex(menu, charsmax(menu), "%s \d[%d|%d]^n^n", szMenuNames[g_iNum[id]], iPos + 1, pagesnum)
}
new keys = (1<<9), b, szName[32], i
for(new a = iStart; a < iEnd; a++)
{
i = g_iMenuList[id][a]
get_user_name(i, szName, charsmax(szName))
if((g_iNum[id] == 0 || g_iNum[id] == 2) && native_get_mute(i) || g_iNum[id] == 1 && !native_get_mute(i))
len += formatex(menu[len], charsmax(menu) - len, "\d[%d] \y~ \d%s^n", ++b, szName)
else
{
keys |= (1<<b)
len += formatex(menu[len], charsmax(menu) - len, "\d[%d] \y~ \w%s %s^n", ++b, szName)
}
}
for(new i = b; i < 8; i++) len += formatex(menu[len], charsmax(menu) - len, "^n")
if(iEnd < g_iPlayersNum)
{
keys |= (1<<8)
formatex(menu[len], charsmax(menu) - len, "^n\d[9] \y~ \wВперёд^n\d[0] \y~ \w%s", iPos ? "Назад" : "Выход")
}
else formatex(menu[len], charsmax(menu) - len, "^n\d[0] \y~ \w%s", iPos ? "Назад" : "Закрыть")
if(pev_valid(id) == 2) set_pdata_int(id, 205, 0, 5)
return show_menu(id, keys, menu, -1, "show_mutemenu")
}
public mutemenu_handler(id, key)
{
switch(key)
{
case 8: return show_mutemenu(id, ++g_iMenuPosition[id])
case 9: return show_mutemenu(id, --g_iMenuPosition[id])
default: Cmd_MuteUnmute(id, g_iMenuList[id][g_iMenuPosition[id] * 8 + key])
}
return PLUGIN_HANDLED
}
public Cmd_MuteUnmute(id, iTarget)
{
if(!iTarget)
{
static szArg[5]
read_argv(1, szArg, charsmax(szArg))
if(!is_str_num(szArg))
{
client_printc(id, "%s ^x01Игрок не найден.", szPrefix)
return PLUGIN_HANDLED
}
iTarget = str_to_num(szArg)
}
if(!is_user_connected(iTarget))
{
client_printc(id, "%s ^x01Игрок отключился.", szPrefix)
return PLUGIN_HANDLED
}
static szName[33], szName2[33]
get_user_name(id, szName, charsmax(szName))
get_user_name(iTarget, szName2, charsmax(szName2))
static data[16], logfile[32], map[32]
get_mapname(map, charsmax(map))
get_time("%d-%m-%Y", data, charsmax(data))
formatex(logfile, charsmax(logfile), "Mute_%s.log", data)
switch(g_iNum[id])
{
case 0:
{
if(native_get_mute(iTarget))
{
client_printc(id, "%s ^x01Игрок уже заглушен!", szPrefix)
return PLUGIN_HANDLED
}
TrieSetCell(g_tMutePidors, g_szIp[iTarget], 1)
client_cmd(iTarget, "-voicerecord")
client_printc(0, "%s^x03 %s ^x01заткнул^x03 %s", szPrefix, szName, szName2)
log_to_file(logfile, "%s Заткнул %s", szName, szName2)
}
case 1:
{
if(!native_get_mute(iTarget))
{
client_printc(id, "%s ^x01Игрок не заглушен!", szPrefix)
return PLUGIN_HANDLED
}
TrieDeleteKey(g_tMutePidors, g_szIp[iTarget])
if(g_iPermMute[iTarget]) RemovePermMute(iTarget)
client_printc(0, "%s^x03 %s^x01 размутил^x03 %s", szPrefix, szName, szName2)
log_to_file(logfile, "%s размутил %s", szName, get_flags2(id, "o") ? "а" : "", szName2)
}
case 2:
{
if(native_get_mute(iTarget))
{
client_printc(id, "%s^x01 Игрок уже заглушен!", szPrefix)
return PLUGIN_HANDLED
}
TrieSetCell(g_tMutePidors, g_szIp[iTarget], 1)
SetPermMute(iTarget)
g_iPermMute[iTarget] = true
client_cmd(iTarget, "-voicerecord")
client_printc(0, "%s^x03 %s ^x01заткнул навсегда^x03 %s", szPrefix, szName, szName2)
log_to_file(logfile, "%s заткнул навсегда %s", szName, szName2)
}
}
return PLUGIN_HANDLED
}
public bool:native_get_mute(id)
{
if(TrieKeyExists(g_tMutePidors, g_szIp[id]))
return true
return false
}
public CheckPermMute(id)
{
static szData[256], szKey[6], iTimeStamp
if(nvault_lookup(g_nVault, g_szIp[id], szData, charsmax(szData), iTimeStamp))
{
replace_all(szData, charsmax(szData), "|", " ")
parse(szData, szKey, charsmax(szKey))
if(str_to_num(szKey))
{
TrieSetCell(g_tMutePidors, g_szIp[id], 1)
g_iPermMute[id] = true
}
}
}
public SetPermMute(id)
{
if(TrieKeyExists(g_tMutePidors, g_szIp[id]))
nvault_set(g_nVault, g_szIp[id], "|1|")
}
public RemovePermMute(id)
{
nvault_remove(g_nVault, g_szIp[id])
g_iPermMute[id] = false
}
stock get_flags2(id, const flags[])
return get_user_flags(id) & read_flags(flags)
public plugin_end()
{
TrieDestroy(g_tMutePidors)
nvault_close(g_nVault)
}
stock client_printc(target, const message[], any:...)
{
static buffer[191]
static i, argscount
argscount = numargs()
if(!target)
{
static player
for(player = 1; player <= g_iMaxPlayers; player++)
{
if(!is_user_connected(player))
continue
static changed[5], changedcount
changedcount = 0
for(i = 2; i < argscount; i++)
{
if(getarg(i) == LANG_PLAYER)
{
setarg(i, 0, player)
changed[changedcount] = i
changedcount++
}
}
vformat(buffer, charsmax(buffer), message, 3)
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, player)
write_byte(player)
write_string(buffer)
message_end()
for(i = 0; i < changedcount; i++)
setarg(changed[i], 0, LANG_PLAYER)
}
}
else
{
if(is_user_connected(target))
{
vformat(buffer, charsmax(buffer), message, 3)
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, target)
write_byte(target)
write_string(buffer)
message_end()
}
}
}
Название темы скорректировано // Subb98