/*
* Обновление 28.02.2015
* v1.4 - Добавлен иммунитет для админов
* v1.5 - Исправлен выход индекса за пределы массива
* v1.6 - Сделано это:
* можешь для меня лично сделать так:
* живые СТ слышат живых СТ, Т
* живые Т слышат живых Т, СТ
* мертвые СТ слышат всех
* мертвые Т слышат всех
* инфа 5 сек
* админы слышат всех и могут говорить всем
* флаг для админа ADMIN_BAN
*
* Если ваша версия AMXX ниже 1.8.3, используйте colorchat.inc из архива
*/
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#if AMXX_VERSION_NUM < 183
#include <colorchat>
#define client_print_color ColorChat
#define print_team_red RED
#endif
#define PLUGIN "Voice Manager"
#define VERSION "1.6"
#define AUTHOR "Stimul"
#define get_bit(%1,%2) (%1 & (1 << (%2 & 31)))
#define set_bit(%1,%2) (%1 |= (1 << (%2 & 31)))
#define reset_bit(%1,%2) (%1 &= ~(1 << (%2 & 31)))
#define m_iTeam 114
#define fm_cs_get_user_team_index(%1) get_pdata_int(%1, m_iTeam)
#define MAX_CLIENTS 32
#define ACCESS_LEVEL ADMIN_BAN // Все флаги смотрите в amxconst.inc
new g_bIsConnected;
new g_bIsAlive;
new g_bIsAdmin;
new g_bInfo;
new g_iTeam[MAX_CLIENTS+1];
new g_pImmunity;
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
/*
Иммунитет для админов
* 1 - включен
* 0 - выключен
*/
g_pImmunity = register_cvar("vm_immunity", "1");
RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", true);
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled_Post", true);
register_forward(FM_Voice_SetClientListening, "fw_Voice_SetClientListening");
}
public fw_PlayerSpawn_Post(id)
{
if(is_user_alive(id))
{
set_bit(g_bIsAlive, id);
g_iTeam[id] = fm_cs_get_user_team_index(id);
}
}
public fw_PlayerKilled_Post(id)
{
if(g_bIsAdmin, id) return;
reset_bit(g_bIsAlive, id);
set_bit(g_bInfo, id);
set_task(5.0, "OffTimeInfo", id);
}
public OffTimeInfo(id)
{
if(get_bit(g_bIsConnected, id))
{
client_print_color(id, print_team_red, "^1[^4Info^1] Время инфы ^3[5сек]. ^1Tеперь тебя слышат только мёртвые игроки!");
reset_bit(g_bInfo, id);
}
}
public client_putinserver(id)
{
set_bit(g_bIsConnected, id);
get_user_flags(id) & ACCESS_LEVEL ? set_bit(g_bIsAdmin, id) : reset_bit(g_bIsAdmin, id);
reset_bit(g_bInfo, id);
}
public client_disconnect(id)
{
reset_bit(g_bIsConnected, id);
reset_bit(g_bIsAlive, id);
}
public fw_Voice_SetClientListening(receiver, sender, listen)
{
if(get_bit(g_bIsConnected, receiver) && get_bit(g_bIsConnected, sender) && receiver != sender && get_pcvar_num(g_pImmunity) && (!get_bit(g_bIsAdmin, receiver) || !get_bit(g_bIsAdmin, sender)))
{
if(get_bit(g_bInfo, sender))
return FMRES_IGNORED;
if(get_bit(g_bIsAlive, receiver) && g_iTeam[receiver] == 2 && ((get_bit(g_bIsAlive, sender) && g_iTeam[sender] == 2) || (get_bit(g_bIsAlive, sender) && g_iTeam[sender] == 1)))
return FMRES_IGNORED;
else if(get_bit(g_bIsAlive, receiver) && g_iTeam[receiver] == 1 && ((get_bit(g_bIsAlive, sender) && g_iTeam[sender] == 1) || (get_bit(g_bIsAlive, sender) && g_iTeam[sender] == 2)))
return FMRES_IGNORED;
else if((!get_bit(g_bIsAlive, receiver) && g_iTeam[receiver] == 1) || (!get_bit(g_bIsAlive, receiver) && g_iTeam[receiver] == 2))
return FMRES_IGNORED;
else
{
engfunc(EngFunc_SetClientListening, receiver, sender, false);
return FMRES_SUPERCEDE;
}
}
return FMRES_IGNORED;
}