Mute con chat y micrófono
#1
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(idmenu);
    return 
PLUGIN_HANDLED;
}

public 
handled_clcmd_mute(idmenuitem)
{
    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 
menuisztext[128], num[7], name[32];
    
format(sztextcharsmax(sztext), "\ySILENCIAR %s"TITTLE_MENUES[g_page[id]]);
    
menu menu_create(sztext"handled_show_players");
    
    switch(
g_page[id])
    {
        case 
MICROPHONE:
        {
            for (
1<= g_maxplayers{0}; i++)
            {
                if (!
is_user_connected(i))
                    continue;
                
                if (
== id)
                    continue;
                
                if (
get_user_flags(i) & ADMIN_IMMUNITY)
                    continue;
                
                
num_to_str(inumcharsmax(num));
                
get_user_name(inamecharsmax(name));
                
format(sztextcharsmax(sztext), "%s%s %s", (g_mute[id][MICROPHONE][i]) ? "\d" "\w"name, (g_mute[id][MICROPHONE][i]) ? "\y[SILENCIADO]" "");
                
menu_additem(menusztextnum);
            }
        }
        case 
CHAT:
        {
            for (
1<= g_maxplayers{0}; i++)
            {
                if (!
is_user_connected(i))
                    continue;
                
                if (
== id)
                    continue;
                
                if (
get_user_flags(i) & ADMIN_IMMUNITY)
                    continue;
                
                
num_to_str(inumcharsmax(num));
                
get_user_name(inamecharsmax(name));
                
format(sztextcharsmax(sztext), "%s%s %s", (g_mute[id][CHAT][i]) ? "\d" "\w"name, (g_mute[id][CHAT][i]) ? "\y[SILENCIADO]" "");
                
menu_additem(menusztextnum);
            }
        }
        case 
GAGGED:
        {
            if (!
is_user_admin(id))
            {
                
menu_destroy(menu);
                return;
            }
            
            for (
1<= g_maxplayers{0}; i++)
            {
                if (!
is_user_connected(i))
                    continue;
                
                if (
== id)
                    continue;
                
                if (
get_user_flags(i) & ADMIN_IMMUNITY)
                    continue;
                
                
num_to_str(inumcharsmax(num));
                
get_user_name(inamecharsmax(name));
                
format(sztextcharsmax(sztext), "%s%s %s", (g_gag[i][PLAYER]) ? "\d" "\w"name, (g_gag[i][PLAYER]) ? "[AMORDAZADO]" "");
                
menu_additem(menusztextnum);
            }
        }
    }
    
    
menu_setprop(menuMPROP_BACKNAME"ATRÁS");
    
menu_setprop(menuMPROP_NEXTNAME"SIGUIENTE");
    
menu_setprop(menuMPROP_EXITNAME"VOLVER");
    
    
set_pdata_int(idOFFSET_CSMENUCODEfalseOFFSET_MENU_OFFSET);
    
    
menu_display(idmenu);
}

public 
handled_show_players(idmenuitem)
{
    if (
item == MENU_EXIT)
    {
        
menu_destroy(menu);
        
clcmd_mute(id);
        return;
    }
    
    static 
targetnum[7], callbackdataname[32];
    
menu_item_getinfo(menuitemdatanumcharsmax(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(targetnamecharsmax(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(targetnamecharsmax(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(idnamecharsmax(name));
                    
get_user_name(targetname2charsmax(name2));
                    
                    
chat_color(0"%s !g%s!y desamordazó a !g%s!y."SZPREFIXnamename2);
                    
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(textcharsmax(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(idnamecharsmax(name));
    
get_user_name(g_gag[id][TARGET], name2charsmax(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."SZPREFIXname2,
    
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(idnamecharsmax(name));
    
    
g_gag[id][PLAYER] = false;
    
chat_color(0"%s !yEl jugador !g%s!y ya puede volver a hablar / escribir."SZPREFIXname);
}

public 
fw_Voice_SetClientListening(receiversenderlisten)
{
    if (
receiver == sender)
        return 
FMRES_IGNORED;
    
    if (
g_mute[receiver][MICROPHONE][sender] || g_gag[sender][PLAYER])
    {
        
engfunc(EngFunc_SetClientListeningreceiversenderfalse);
        return 
FMRES_SUPERCEDE;
    }
    
    return 
FMRES_IGNORED;
}

public 
message_saytext(msgiddestid)
{
    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(message190input3);
    
    
replace_all(message190"!g""^4");
    
replace_all(message190"!t""^3");
    
replace_all(message190"!y""^1");
    
    
message_begin((id) ? MSG_ONE_UNRELIABLE MSG_BROADCASTget_user_msgid("SayText"), .player id);
    
write_byte((id) ? id 33);
    
write_string(message);
    
message_end();

Responder
#2
Buen aporte Cristian, a varios les va a servir(inclusive a mi) NothingdohereProud

Responder
#3
porque no ahorrar lineas y juntar todo esto, lo bugea en algo ó funciona igual?

Código PHP:
enum _:MUTE_STRUCT MICROPHONECHATGAGGED };

enum _:GAG_STRUCT PLAYERTARGETTIME };

new 
g_mute[33][MUTE_STRUCT][33], g_gag[33][GAG_STRUCT], g_page[33], g_maxplayers[1 char], g_msgsaytext
Responder
#4
(06/07/2016, 01:14 PM)mlibre escribió: porque no ahorrar lineas y juntar todo esto, lo bugea en algo ó funciona igual?

Código PHP:
enum _:MUTE_STRUCT MICROPHONECHATGAGGED };

enum _:GAG_STRUCT PLAYERTARGETTIME };

new 
g_mute[33][MUTE_STRUCT][33], g_gag[33][GAG_STRUCT], g_page[33], g_maxplayers[1 char], g_msgsaytext

Ahorrar líneas así no te beneficia en absolutamente nada. Y de la otra forma es mucho más fácil de leer!

Tranquilamente podrías hacer un ZP en una sola línea de código y no habría ninguna mejora o penalización en performance. Eso si, si hay un bug suerte para encontrarlo...
[Imagen: paypalqr.png]
Responder
#5
Hola, perdon, pero lo probe en mi servidor y cuando "muteo" a alguien, aun lo sigo leyendo por que sera?
Responder
#6
(13/08/2016, 03:43 PM)Niper.-. escribió: Hola, perdon, pero lo probe en mi servidor y cuando "muteo" a alguien, aun lo sigo leyendo por que sera?
Seguramente tenes otro plugin que interfiere. Te recomiendo que pongas este plugin primero en la lista de plugins.ini para no tener interferencias :V
Responder
#7
Sigue igual :/ , otro plugin, emmm tengo uno que hookea el say. Pero el microfono tambien se sigue escuchando otra solucion (?
Responder
#8
Gran aporte , lo usare Mario
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)