Код:
// Required admin access level
#define ADMIN_VOICE ADMIN_CHAT
// Delay before a connected player see the text announce
#define ANNOUNCE_TASK_DELAY 30.0
// Comment this out if you don't want that a "no sound" player can hear admins using +adminvoice
// All other player settings are respected whatever this is commented or not.
#define SUPER_ADMIN_PRIORITY
/* ** END OF EDITABLE ** */
/* Changelog
*
* v1.0.2 (04/19/08)
* -few code corrections
* -updated player spawn detection
* -added HLTV & BOT checks
*
* v1.0.1 (03/31/08)
* -added colored chat
* -added chat command /vm that display voices settings
* -inform new players about /vm command
* -display adminlisten status when toggle_adminlisten command is used
* -added support for amx_show_activity cvar on amx_(un)mute command
*
* v1.0.0 (03/26/08)
* First release
*
*/
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#define VERSION "1.1.0"
#define MAX_PLAYERS 32
#define XO_PLAYER 5
#define m_iTeam 114
#define cs_get_user_team_index(%0) get_pdata_int(%0, m_iTeam, XO_PLAYER)
new g_iClientSettings[MAX_PLAYERS+1][2]
#define HasUserVoicesOn(%0) g_iClientSettings[%0][0]
#define HasUserMutedPlayer(%0,%1) g_iClientSettings[%0][1] & (1<<(%1-1))
new g_bitAdminListen
#define MarkAdminListening(%0) g_bitAdminListen |= 1<<(%0&31)
#define ClearAdminListening(%0) g_bitAdminListen &= ~(1<<(%0&31))
#define IsAdminListening(%0) ( g_bitAdminListen & 1<<(%0&31) )
new g_iAdminVoice
new g_bitInterAdminSpeek
#define MarkUserSpeakingToAdmins(%0) g_bitInterAdminSpeek |= 1<<(%0&31)
#define ClearUserSpeakingToAdmins(%0) g_bitInterAdminSpeek &= ~(1<<(%0&31))
#define IsUserSpeakingToAdmins(%0) ( g_bitInterAdminSpeek & 1<<(%0&31) )
new g_bitAdmins
#define MarkUserAdmin(%0) g_bitAdmins |= 1<<(%0&31)
#define ClearUserAdmin(%0) g_bitAdmins &= ~(1<<(%0&31))
#define IsUserAdmin(%0) ( g_bitAdmins & 1<<(%0&31) )
new Trie:g_tMutedPlayersIps
new g_bitMutedPlayers
#define MarkUserMuted(%0) g_bitMutedPlayers |= 1<<(%0&31)
#define ClearUserMuted(%0) g_bitMutedPlayers &= ~(1<<(%0&31))
#define IsUserMuted(%0) ( g_bitMutedPlayers & 1<<(%0&31) )
new const bitAllEnabled = (1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<4)
new g_iReceiverStatus[5]
new g_iSayText
new g_pCvarAmxShowActivity, g_iShowActivityValue
public plugin_init()
{
register_plugin("Voices Management", VERSION, "ConnorMcLeod")
register_dictionary_colored("voicesmanagement.txt")
register_dictionary("common.txt")
register_forward(FM_Voice_SetClientListening, "SetClientListening")
register_event("VoiceMask", "Event_VoiceMask", "b")
register_clcmd("+adminvoice", "AdminCommand_VoiceOn")
register_clcmd("-adminvoice", "AdminCommand_VoiceOff")
register_clcmd("+interadminvoice", "AdminCommand_InterAdminOn")
register_clcmd("-interadminvoice", "AdminCommand_InterAdminOff")
register_clcmd("+adminlisten", "AdminCommand_ListenOn")
register_clcmd("-adminlisten", "AdminCommand_ListenOff")
register_clcmd("toggle_adminlisten", "AdminCommand_ListenToggle")
register_concmd("amx_mute", "AdminCommand_Mute", ADMIN_VOICE, "<name/#userid>")
register_concmd("amx_unmute", "AdminCommand_UnMute", ADMIN_VOICE, "<name/#userid>")
register_concmd("amx_set_vm_status", "ConCmd_SetStatus", ADMIN_CFG, "- <receiver> <flags>")
register_clcmd("say /vm", "ClientCommand_SayStatus")
register_clcmd("say_team /vm", "ClientCommand_SayStatus")
}
public plugin_cfg()
{
set_cvar_num("sv_alltalk", 1)
g_tMutedPlayersIps = TrieCreate()
g_iSayText = get_user_msgid("SayText")
g_pCvarAmxShowActivity = get_cvar_pointer("amx_show_activity")
}
public ConCmd_SetStatus(id, lvl, cid)
{
if( cmd_access(id, lvl, cid, 3) )
{
new szWho[2], szFlags[6]
read_argv(1, szWho, charsmax(szWho))
read_argv(2, szFlags, charsmax(szFlags))
g_iReceiverStatus[str_to_num(szWho)] = read_flags(szFlags)
}
return PLUGIN_HANDLED
}
public ClientCommand_SayStatus(id)
{
static const szMlKeys[][] = { "VM_SPECTATORS", "VM_DEAD_T", "VM_DEAD_CT", "VM_ALIVE_T", "VM_ALIVE_CT" }
new szHearable[256], n, bRemove, iStatus
for(new i, j; i<5; i++)
{
iStatus = g_iReceiverStatus[i]
bRemove = false
n = formatex(szHearable, charsmax(szHearable), "^4%L ^1%L : ", id, szMlKeys[i], id, "VM_CAN_HEAR")
if( !iStatus )
{
n += formatex(szHearable[n], charsmax(szHearable)-n, "^4%L", id, "VM_NOBODY")
}
else if( iStatus == bitAllEnabled )
{
n += formatex(szHearable[n], charsmax(szHearable)-n, "^4%L", id, "VM_EVERYBODY")
}
else
{
for(j=0; j<5; j++)
{
if( iStatus & 1<<j )
{
bRemove = true
n += formatex(szHearable[n], charsmax(szHearable)-n, "^3%L ^1| ", id, szMlKeys[j])
}
}
if( bRemove )
{
szHearable[n-3] = 0
}
}
col_mess(id, id, szHearable)
}
}
public taskAnnounce(id)
{
if( is_user_connected(id) )
{
col_mess(id, id, "%L", id, "VM_ANNOUCE")
}
}
public client_authorized(id)
{
UpdateAdminAccess(id)
}
public client_infochanged(id)
{
UpdateAdminAccess(id)
}
UpdateAdminAccess(id)
{
if( get_user_flags(id) & ADMIN_VOICE )
{
MarkUserAdmin(id)
}
else
{
ClearUserAdmin(id)
}
}
public client_putinserver(id)
{
ClearAdminListening(id)
ClearUserSpeakingToAdmins(id)
if(is_user_bot(id) || is_user_hltv(id))
return
new szIp[22]
get_user_ip(id, szIp, charsmax(szIp))
if( TrieKeyExists(g_tMutedPlayersIps, szIp) )
{
MarkUserMuted(id)
}
else
{
ClearUserMuted(id)
}
set_task(ANNOUNCE_TASK_DELAY, "taskAnnounce", id)
}
public client_disconnect(id)
{
if(g_iAdminVoice == id)
{
g_iAdminVoice = 0
}
}
public Event_VoiceMask(id)
{
g_iClientSettings[id][0] = read_data(1)
g_iClientSettings[id][1] = read_data(2)
}
public SetClientListening(iReceiver, iSender, bool:bListen)
{
if( !is_user_connected(iReceiver) || !is_user_connected(iSender) )
{
return FMRES_IGNORED
}
new bReturn = false
#if defined SUPER_ADMIN_PRIORITY
if(g_iAdminVoice)
{
bReturn = g_iAdminVoice == iSender
}
else if( !HasUserVoicesOn(iReceiver) || HasUserMutedPlayer(iReceiver,iSender) )
{
return FMRES_IGNORED
}
#else
if( !HasUserVoicesOn(iReceiver) || HasUserMutedPlayer(iReceiver,iSender) )
{
return FMRES_IGNORED
}
else if(g_iAdminVoice)
{
bReturn = g_iAdminVoice == iSender
}
#endif
else if(IsUserMuted(iSender))
{
/* bReturn = false */
}
else if( IsUserSpeakingToAdmins(iSender) )
{
bReturn = IsUserAdmin(iReceiver)
}
else if( IsAdminListening(iReceiver) )
{
bReturn = true
}
else
{
bReturn = ShouldReceiverHearSender(iReceiver, iSender)
}
engfunc(EngFunc_SetClientListening, iReceiver, iSender, bReturn)
forward_return(FMV_CELL, bReturn)
return FMRES_SUPERCEDE
}
bool:ShouldReceiverHearSender(iReceiver, iSender)
{
new iStatus, iTeam
iTeam = cs_get_user_team_index( iReceiver )
if( 1 <= iTeam <= 2 )
{
iStatus += iTeam
if( is_user_alive( iReceiver ) )
{
iStatus += 2
}
}
new bitHearable = g_iReceiverStatus[ iStatus ]
if( !bitHearable )
{
return false
}
else if( bitHearable & bitAllEnabled == bitAllEnabled )
{
return true
}
iStatus = 0
iTeam = cs_get_user_team_index( iSender )
if( 1 <= iTeam <= 2 )
{
iStatus += iTeam
if( is_user_alive( iSender ) )
{
iStatus += 2
}
}
return !!( bitHearable & 1<<iStatus )
}
public AdminCommand_ListenOn(id)
{
if( IsUserAdmin(id) )
{
MarkAdminListening(id)
}
return PLUGIN_HANDLED
}
public AdminCommand_ListenOff(id)
{
ClearAdminListening(id)
return PLUGIN_HANDLED
}
public AdminCommand_ListenToggle(id)
{
if( !IsUserAdmin(id) )
{
return PLUGIN_HANDLED
}
g_bitAdminListen ^= 1<<(id&31)
col_mess(id, id, "%L", id, "VM_LISTEN_STATUS", IsAdminListening(id) ? "ON" : "OFF")
return PLUGIN_HANDLED
}
public AdminCommand_VoiceOn(id)
{
if(!IsUserAdmin(id))
{
return PLUGIN_HANDLED
}
if(g_iAdminVoice)
{
col_mess(id, id, "%L", id, "VM_ALREADY_INUSE")
return PLUGIN_HANDLED
}
g_iAdminVoice = id
new szName[32]
get_user_name(id, szName, charsmax(szName))
new iPlayers[32], iNum, iPlayer
get_players(iPlayers, iNum, "ch")
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
col_mess(iPlayer, id, "%L", iPlayer, "VM_ADMIN_TALK", szName)
engfunc(EngFunc_SetClientListening, iPlayer, id, true)
}
client_cmd(id, "+voicerecord")
return PLUGIN_HANDLED
}
public AdminCommand_VoiceOff(id)
{
if( !IsUserAdmin(id) )
{
return PLUGIN_HANDLED
}
if(g_iAdminVoice != id)
{
client_cmd(id, "-voicerecord")
return PLUGIN_HANDLED
}
client_cmd(id, "-voicerecord")
g_iAdminVoice = 0
return PLUGIN_HANDLED
}
public AdminCommand_InterAdminOn(id)
{
if( !IsUserAdmin(id) )
{
return PLUGIN_HANDLED
}
MarkUserSpeakingToAdmins(id)
client_cmd(id, "+voicerecord")
new szName[32]
get_user_name(id, szName, charsmax(szName))
new iPlayers[32], iNum, iPlayer
get_players(iPlayers, iNum, "ch")
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
if( IsUserAdmin(iPlayer) )
{
col_mess(iPlayer, id, "%L", iPlayer, "VM_INTER_START", szName)
engfunc(EngFunc_SetClientListening, iPlayer, id, true)
}
else
{
engfunc(EngFunc_SetClientListening, iPlayer, id, false)
}
}
return PLUGIN_HANDLED
}
public AdminCommand_InterAdminOff(id)
{
if(!IsUserSpeakingToAdmins(id) )
return PLUGIN_HANDLED
ClearUserSpeakingToAdmins(id)
client_cmd(id, "-voicerecord")
new szName[32]
get_user_name(id, szName, charsmax(szName))
new iPlayers[32], iNum, iPlayer
get_players(iPlayers, iNum, "ch")
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
if( IsUserAdmin(iPlayer) )
{
col_mess(iPlayer, id, "%L", iPlayer, "VM_INTER_STOP", szName)
}
}
return PLUGIN_HANDLED
}
public AdminCommand_Mute(id, level, cid)
{
if( !cmd_access(id, level, cid, 2, true) )
{
return PLUGIN_HANDLED
}
new szPlayer[32]
read_argv(1, szPlayer, 31)
new iPlayer = cmd_target(id, szPlayer, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS)
if( !iPlayer )
{
return PLUGIN_HANDLED
}
if( IsUserAdmin(iPlayer) )
{
console_print(id, "%L", id, "VM_MUTE_ADMIN")
return PLUGIN_HANDLED
}
if( IsUserMuted(iPlayer) )
{
console_print(id, "%L", id, "VM_AR_MUTED")
return PLUGIN_HANDLED
}
new szIp[22]
get_user_ip(iPlayer, szIp, charsmax(szIp))
TrieSetCell(g_tMutedPlayersIps, szIp, 1)
MarkUserMuted(iPlayer)
console_print(id, "%L", id, "VM_MUTED")
if(g_pCvarAmxShowActivity && (g_iShowActivityValue = get_pcvar_num(g_pCvarAmxShowActivity)) )
{
new name[32], name2[32]
get_user_name(id, name, charsmax(name))
get_user_name(iPlayer, name2, charsmax(name2))
show_activity_col(id, name, name2, "VM_MUTE_ACTIVITY")
}
return PLUGIN_HANDLED
}
public AdminCommand_UnMute(id, level, cid)
{
if( !cmd_access(id, level, cid, 2, true) )
{
return PLUGIN_HANDLED
}
new szPlayer[32], iPlayer
read_argv(1, szPlayer, 31)
iPlayer = cmd_target(id, szPlayer, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_NO_BOTS)
if( !iPlayer )
{
return PLUGIN_HANDLED
}
if( !IsUserMuted(iPlayer) )
{
console_print(id, "%L", id, "VM_NOT_MUTED")
return PLUGIN_HANDLED
}
ClearUserMuted(iPlayer)
new szIp[22]
get_user_ip(iPlayer, szIp, charsmax(szIp))
TrieDeleteKey(g_tMutedPlayersIps, szIp)
console_print(id, "%L", id, "VM_UNMUTED")
if(g_pCvarAmxShowActivity && (g_iShowActivityValue = get_pcvar_num(g_pCvarAmxShowActivity)) )
{
new name[32], name2[32]
get_user_name(id, name, charsmax(name))
get_user_name(iPlayer, name2, charsmax(name2))
show_activity_col(id, name, name2, "VM_UNMUTE_ACTIVITY")
}
return PLUGIN_HANDLED
}
col_mess(id, sender, fmt[], any:...)
{
new szMessage[192]
szMessage[0] = 0x01
vformat(szMessage[1], charsmax(szMessage)-1, fmt, 4)
message_begin(MSG_ONE_UNRELIABLE, g_iSayText, .player=id)
write_byte(sender)
write_string(szMessage)
message_end()
}
show_activity_col(id, name[], name2[], ML_KEY[])
{
new iPlayers[32], iNum, iPlayer
get_players(iPlayers, iNum, "ch")
switch( g_iShowActivityValue )
{
case 5: // hide name only to admins, show nothing to normal users
{
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
if (is_user_admin(iPlayer))
{
col_mess(iPlayer, id, " ^4[CSHUB.RU] ^1%L: %L", iPlayer, "ADMIN", iPlayer, ML_KEY, name2)
}
}
}
case 4: // show name only to admins, show nothing to normal users
{
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
if (is_user_admin(iPlayer))
{
col_mess(iPlayer, id, " ^4[CSHUB.RU] ^1%L ^3%s^1: %L", iPlayer, "ADMIN", name, iPlayer, ML_KEY, name2)
}
}
}
case 3: // show name only to admins, hide name from normal users
{
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
if( is_user_admin(iPlayer) )
{
col_mess(iPlayer, id, " ^4[CSHUB.RU] ^1%L ^3%s^1: %L", iPlayer, "ADMIN", name, iPlayer, ML_KEY, name2)
}
else
{
col_mess(iPlayer, id, " ^4[CSHUB.RU] ^1%L: %L", iPlayer, "ADMIN", iPlayer, ML_KEY, name2)
}
}
}
case 2: // show name to all
{
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
col_mess(iPlayer, id, " ^4[CSHUB.RU] ^1%L ^3%s^1: %L", iPlayer, "ADMIN", name, iPlayer, ML_KEY, name2)
}
}
case 1: // hide name to all
{
for(new i; i<iNum; i++)
{
iPlayer = iPlayers[i]
col_mess(iPlayer, id, " ^4[CSHUB.RU] ^1%L: %L", iPlayer, "ADMIN", iPlayer, ML_KEY, name2)
}
}
}
}
register_dictionary_colored(const filename[])
{
if( !register_dictionary(filename) )
{
return 0
}
new szFileName[192]
get_localinfo("amxx_datadir", szFileName, charsmax(szFileName))
format(szFileName, charsmax(szFileName), "%s/lang/%s", szFileName, filename)
new fp = fopen(szFileName, "rt")
if( !fp )
{
log_amx("Failed to open %s", szFileName)
return 0
}
new szBuffer[512], szLang[3], szKey[64], szTranslation[256], TransKey:iKey
while( !feof(fp) )
{
fgets(fp, szBuffer, charsmax(szBuffer))
trim(szBuffer)
if( szBuffer[0] == '[' )
{
strtok(szBuffer[1], szLang, charsmax(szLang), szBuffer, 1, ']')
}
else if( szBuffer[0] )
{
strbreak(szBuffer, szKey, charsmax(szKey), szTranslation, charsmax(szTranslation))
iKey = GetLangTransKey(szKey)
if( iKey != TransKey_Bad )
{
while( replace(szTranslation, charsmax(szTranslation), "!g", "^4") ){}
while( replace(szTranslation, charsmax(szTranslation), "!t", "^3") ){}
while( replace(szTranslation, charsmax(szTranslation), "!n", "^1") ){}
AddTranslation(szLang, iKey, szTranslation[2])
}
}
}
fclose(fp)
return 1
}
Флаги для настройки (Пример заполнения кваров ниже)
Цитата
Кто слышит :
0 : Наблюдатели
1 : Мертвы Т
2 : Мертвы СТ
3 : Живые Т
4 : Живые СТ
Кого слышат :
a : Наблюдатели
b : Мертвые Т
c : Мертвы СТ
d : Живые Т
e : Живые СТ
Код
amx_set_vm_status "0" "abcde"
amx_set_vm_status "1" "abcde"
amx_set_vm_status "2" "abcde"
amx_set_vm_status "3" "de"
amx_set_vm_status "4" "de"
Живые обеих команд слышат друг друга но не слышат мертвых и спектров, спектры и мертвые слышат всех.

Архив перезалил, забыл словарь.
Это кстати последняя рабочая версия для amxx 1.8.1-1.8.2
Следующие версии идут уже под 1.8.3
Отредактировал: Bloo, - 10.4.2014, 8:22