#include <amxmodx>
#tryinclude <reapi>
#if !defined _reapi_included
#include <fakemeta>
#endif
#if AMXX_VERSION_NUM < 183
#define client_disconnected client_disconnect
#endif
const ACCESS_FLAG = ADMIN_BAN // 'd'
new g_iSpeakBitSum
public plugin_init() {
register_plugin("Admin Voice Chat", "0.3", "mx?!")
#if defined _reapi_included
RegisterHookChain(RG_CSGameRules_CanPlayerHearPlayer, "CanPlayerHearPlayer_Pre")
#else
register_forward(FM_Voice_SetClientListening, "OnSetClientListening_Pre")
#endif
register_clcmd("+adminvoice", "func_AdminVoiceOn")
register_clcmd("-adminvoice", "func_AdminVoiceOff")
}
#if defined _reapi_included
public CanPlayerHearPlayer_Pre(iReceiver, iSender) {
if(!IsSpeak(iSender)) {
return HC_CONTINUE
}
SetHookChainReturn(ATYPE_BOOL, (get_user_flags(iReceiver) & ACCESS_FLAG) ? true : false)
return HC_SUPERCEDE
}
#else
public OnSetClientListening_Pre(iReceiver, iSender, bool:bCanHear) {
if(!IsSpeak(iSender)) {
return FMRES_IGNORED
}
engfunc(EngFunc_SetClientListening, iReceiver, iSender, (get_user_flags(iReceiver) & ACCESS_FLAG) ? true : false)
return FMRES_SUPERCEDE
}
#endif
public func_AdminVoiceOn(id) {
if((get_user_flags(id) & ACCESS_FLAG) && !IsSpeak(id)) {
SetSpeak(id)
client_cmd(id, "+voicerecord")
}
return PLUGIN_HANDLED
}
public func_AdminVoiceOff(id) {
if((get_user_flags(id) & ACCESS_FLAG) && IsSpeak(id)) {
ClearSpeak(id)
client_cmd(id, "-voicerecord")
}
return PLUGIN_HANDLED
}
public client_disconnected(id) {
ClearSpeak(id)
}
stock SetSpeak(id) (g_iSpeakBitSum |= (1 << id))
stock IsSpeak(id) return (g_iSpeakBitSum & (1 << id))
stock ClearSpeak(id) (g_iSpeakBitSum &= ~(1 << id))