06/07/2016, 12:24 AM
Bueno, ya que ando muy retirado de la programación (AMXX) voy a publicar este plugin que hice hace tiempo, que consiste en un mute que mutear CHAT y MICRÓFONO, aparte de tener incorporado la opción de amordazar / desamordazar mediante menú (SOLO ADMIN). Espero que les sea útil.
Código PHP:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#pragma semicolon 1
#define SZPREFIX "!g[MUTE]"
const OFFSET_CSMENUCODE = 205;
const OFFSET_MENU_OFFSET = 5;
enum _:MUTE_STRUCT
{
MICROPHONE,
CHAT,
GAGGED
};
enum _:GAG_STRUCT
{
PLAYER,
TARGET,
TIME
};
new const TITTLE_MENUES[][] = { "MICRÓFONO", "CHAT", "TODO \d[GAG]" };
new g_mute[33][MUTE_STRUCT][33];
new g_gag[33][GAG_STRUCT];
new g_page[33];
new g_maxplayers[1 char];
new g_msgsaytext;
public plugin_init()
{
register_plugin("Mute Menú", "1.0", "Cristian'");
register_clcmd("say", "clcmd_say");
register_clcmd("say_team", "clcmd_say");
register_clcmd("say /mute", "clcmd_mute");
register_clcmd("say_team /mute", "clcmd_mute");
register_clcmd("AMORDAZAR_TIEMPO", "clcmd_gag");
register_forward(FM_Voice_SetClientListening, "fw_Voice_SetClientListening");
g_msgsaytext = get_user_msgid("SayText");
register_message(g_msgsaytext, "message_saytext");
g_maxplayers{0} = get_maxplayers();
set_task(120.0, "print_message", 0, _, _, "b");
}
public print_message()
chat_color(0, "%s !yEscribí !g/mute!y para silenciar a un jugador molesto.", SZPREFIX);
public clcmd_say(id)
{
if (g_gag[id][PLAYER])
{
chat_color(id, "%s !yEstás amordazado. No podés hablar ni escribir.", SZPREFIX);
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
public clcmd_mute(id)
{
static menu;
menu = menu_create("\r[MUTE] \yMUTE MENÚ", "handled_clcmd_mute");
menu_additem(menu, "SILENCIAR MICRÓFONO", "1", 0);
menu_additem(menu, "SILENCIAR CHAT", "2", 0);
if (is_user_admin(id))
menu_additem(menu, "AMORDAZAR JUGADOR", "3", 0);
menu_display(id, menu);
return PLUGIN_HANDLED;
}
public handled_clcmd_mute(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu);
return;
}
g_page[id] = item;
show_menu_players(id);
menu_destroy(menu);
}
public show_menu_players(id)
{
static menu, i, sztext[128], num[7], name[32];
format(sztext, charsmax(sztext), "\ySILENCIAR %s", TITTLE_MENUES[g_page[id]]);
menu = menu_create(sztext, "handled_show_players");
switch(g_page[id])
{
case MICROPHONE:
{
for (i = 1; i <= g_maxplayers{0}; i++)
{
if (!is_user_connected(i))
continue;
if (i == id)
continue;
if (get_user_flags(i) & ADMIN_IMMUNITY)
continue;
num_to_str(i, num, charsmax(num));
get_user_name(i, name, charsmax(name));
format(sztext, charsmax(sztext), "%s%s %s", (g_mute[id][MICROPHONE][i]) ? "\d" : "\w", name, (g_mute[id][MICROPHONE][i]) ? "\y[SILENCIADO]" : "");
menu_additem(menu, sztext, num);
}
}
case CHAT:
{
for (i = 1; i <= g_maxplayers{0}; i++)
{
if (!is_user_connected(i))
continue;
if (i == id)
continue;
if (get_user_flags(i) & ADMIN_IMMUNITY)
continue;
num_to_str(i, num, charsmax(num));
get_user_name(i, name, charsmax(name));
format(sztext, charsmax(sztext), "%s%s %s", (g_mute[id][CHAT][i]) ? "\d" : "\w", name, (g_mute[id][CHAT][i]) ? "\y[SILENCIADO]" : "");
menu_additem(menu, sztext, num);
}
}
case GAGGED:
{
if (!is_user_admin(id))
{
menu_destroy(menu);
return;
}
for (i = 1; i <= g_maxplayers{0}; i++)
{
if (!is_user_connected(i))
continue;
if (i == id)
continue;
if (get_user_flags(i) & ADMIN_IMMUNITY)
continue;
num_to_str(i, num, charsmax(num));
get_user_name(i, name, charsmax(name));
format(sztext, charsmax(sztext), "%s%s %s", (g_gag[i][PLAYER]) ? "\d" : "\w", name, (g_gag[i][PLAYER]) ? "[AMORDAZADO]" : "");
menu_additem(menu, sztext, num);
}
}
}
menu_setprop(menu, MPROP_BACKNAME, "ATRÁS");
menu_setprop(menu, MPROP_NEXTNAME, "SIGUIENTE");
menu_setprop(menu, MPROP_EXITNAME, "VOLVER");
set_pdata_int(id, OFFSET_CSMENUCODE, false, OFFSET_MENU_OFFSET);
menu_display(id, menu);
}
public handled_show_players(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu);
clcmd_mute(id);
return;
}
static target, num[7], callback, data, name[32];
menu_item_getinfo(menu, item, data, num, charsmax(num), _, _, callback);
target = str_to_num(num);
if (is_user_connected(target))
{
switch(g_page[id])
{
case MICROPHONE:
{
g_mute[id][MICROPHONE][target] = !(g_mute[id][MICROPHONE][target]);
get_user_name(target, name, charsmax(name));
chat_color(id, "%s !yLe %s el micrófono a !g%s!y.", SZPREFIX, (g_mute[id][MICROPHONE][target]) ? "deshabilitaste" : "habilitaste", name);
}
case CHAT:
{
g_mute[id][CHAT][target] = !(g_mute[id][CHAT][target]);
get_user_name(target, name, charsmax(name));
chat_color(id, "%s !yLe %s el chat a !g%s!y.", SZPREFIX, (g_mute[id][CHAT][target]) ? "deshabilitaste" : "habilitaste", name);
}
case GAGGED:
{
if (!is_user_admin(id))
{
menu_destroy(menu);
return;
}
if (g_gag[target][PLAYER])
{
static name[32], name2[32];
get_user_name(id, name, charsmax(name));
get_user_name(target, name2, charsmax(name2));
chat_color(0, "%s !g%s!y desamordazó a !g%s!y.", SZPREFIX, name, name2);
g_gag[target][PLAYER] = false;
return;
}
g_gag[id][TARGET] = target;
client_cmd(id, "messagemode ^"AMORDAZAR_TIEMPO^"");
}
}
}
else
chat_color(id, "%s !yEl jugador que seleccionaste se desconectó del servidor.", SZPREFIX);
menu_destroy(menu);
show_menu_players(id);
}
public clcmd_gag(id)
{
if (!g_gag[id][TARGET])
return;
static text[12], name[32], name2[32];
read_args(text, charsmax(text));
remove_quotes(text);
trim(text);
if (!isdigit(text[0]))
{
chat_color(id, "%s !ySólo números.", SZPREFIX);
return;
}
if (!strlen(text) || strlen(text) < 1)
{
chat_color(id, "%s !yTenés que poner un valor mayor a 0.", SZPREFIX);
return;
}
get_user_name(id, name, charsmax(name));
get_user_name(g_gag[id][TARGET], name2, charsmax(name2));
g_gag[id][TIME] = str_to_num(text);
g_gag[g_gag[id][TARGET]][PLAYER] = true;
chat_color(0, "%s !g!g%s!y fue amordazado para que no pueda hablar/escribir durante !g%d %s!y.", SZPREFIX, name2,
g_gag[id][TIME], (g_gag[id][TIME] > 1) ? "minutos" : "minuto");
set_task(float(g_gag[id][TIME]) * 60.0, "task_player_gag", g_gag[id][TARGET]);
}
public task_player_gag(id)
{
static name[32];
get_user_name(id, name, charsmax(name));
g_gag[id][PLAYER] = false;
chat_color(0, "%s !yEl jugador !g%s!y ya puede volver a hablar / escribir.", SZPREFIX, name);
}
public fw_Voice_SetClientListening(receiver, sender, listen)
{
if (receiver == sender)
return FMRES_IGNORED;
if (g_mute[receiver][MICROPHONE][sender] || g_gag[sender][PLAYER])
{
engfunc(EngFunc_SetClientListening, receiver, sender, false);
return FMRES_SUPERCEDE;
}
return FMRES_IGNORED;
}
public message_saytext(msgid, dest, id)
{
if (g_mute[id][CHAT][get_msg_arg_int(1)])
return PLUGIN_HANDLED;
return PLUGIN_CONTINUE;
}
stock chat_color(id, const input[], any:...)
{
static message[191];
vformat(message, 190, input, 3);
replace_all(message, 190, "!g", "^4");
replace_all(message, 190, "!t", "^3");
replace_all(message, 190, "!y", "^1");
message_begin((id) ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, get_user_msgid("SayText"), .player = id);
write_byte((id) ? id : 33);
write_string(message);
message_end();
}