Sistema de Grupos
#1
Buenas, encontré el plugin de Roccoxx para crear grupos (gremios, clanes, etc), creo que es un code muy bueno, pero se le podría agregar algunas mejoras para que quede más completo.

Por eso agregue fvault para guardar el grupo y también añadí que cuando hables salga el nombre de tu grupo en el chat junto con tu nombre.
([Mi grupo] Internel: Hola)


Esto me da algunos bugs, que prefiero preguntarles a ustedes para solucionarlos y así todos podremos usar el plugin bien cuando alguien lo necesite :3

Código PHP:
/* PLUGIN ORIGINAL POR Roccoxx, editado por Internel. */

#include <amxmodx>
#include <amxmisc>
#include <fvault>

/*.grupo <nombre> - Crear un grupo con el tag especificado
.add <nombre> - Invitar a el jugador con el tag especifico del grupo
.accept <nombre> - Unirse a un grupo
.leavegroup - Dejar el grupo que se encuentra actualmente */

#define MAX_CHR 20 // max group name lenght

new const nombre_vault[] = "INFO_GRUPOS"

new 
g_grupo[33], g_nombre[33][33], g_groupname[33][MAX_CHR]

public 
plugin_init(){
    
register_plugin("Group""1.0""Roccoxx")
    
register_clcmd("say""hook_say")
}

public 
hook_say(id){
    if(!
is_user_connected(id)) return PLUGIN_HANDLED;
    
    new 
say[40]
    
read_args(saycharsmax(say))
    
    if(
equal(say"")) return PLUGIN_HANDLED;
    
    
remove_quotes(say[0])
    
    if(
say[0] == '.'){    
        if(
say[1] == 'g' && say[2] == 'r' && say[3] == 'u' && say[4] == 'p' && say[5] == 'o')
        {
            if(
g_grupo[id]){
                
client_print(idprint_center"Ya tienes un grupo")
                return 
PLUGIN_HANDLED;
            }
            
            
replace_all(saycharsmax(say), ".grupo """)
            
replace_all(saycharsmax(say), ".grupo""")
            
            if(
strlen(say) > MAX_CHRclient_print(idprint_center"Nombre muy largo")
            else if(
equal(say"")) client_print(idprint_center"No escribiste Nada")
                else{
                
ChatColor(id"!gFelicitaciones !teamCreaste el grupo: !y%s",say)
                
formatex(g_groupname[id], charsmax(g_groupname), say)
                
format(saycharsmax(say), "[%s] "say)
                
add(say ,charsmax(say), g_nombre[id])
                
//set_user_info(id, "name", say);
                //client_cmd(id, "name ^"%s^"", say)
                
                
set_task(3.0"tiene_grupo"id)
            }
            return 
PLUGIN_HANDLED;
        }
        else if(
say[1] == 'a' && say[2] == 'd' && say[3] == 'd'){
            if(!
g_grupo[id]){
                
client_print(idprint_center"No tienes un grupo")
                return 
PLUGIN_HANDLED;
            }
            
            
replace_all(saycharsmax(say), ".add """)
            
replace_all(saycharsmax(say), ".add""")
            
            new 
player cmd_target(idsay8);
            
            if(!
playerclient_print(idprint_center"Jugador no encontrado")
            else if(
g_grupo[player]) client_print(idprint_center"El Jugador Ya pertenece a un Grupo")
                else{
                static 
name[33]; get_user_name(idnamecharsmax(name))
            
                
ChatColor(id"!teamInvitacion enviada a !y%s",say)
                
ChatColor(player"!g%s !yquiere invitarte a su grupo!",name)
            }
            
            return 
PLUGIN_HANDLED
        
}
        else if(
say[1] == 'a' && say[2] == 'c' && say[3] == 'c' && say[4] == 'e' && say[5] == 'p' && say[6] == 't'){
            
replace_all(saycharsmax(say), ".accept """)
            
replace_all(saycharsmax(say), ".accept""")
            
            new 
player cmd_target(idsay8);
            
            if(!
playerclient_print(idprint_center"Jugador no encontrado")        
            else if(!
g_grupo[player]) client_print(idprint_center"El Jugador no tiene un Grupo")
            else{
                static 
name[33]; get_user_name(idnamecharsmax(name))
            
                
ChatColor(id"!teamFelicitaciones te uniste al grupo de !y%s",say)
                
ChatColor(player"!g%s !ySe ha unido a tu grupo!",name)
                
                
formatex(g_groupname[id], charsmax(g_groupname), g_groupname[player])
                
format(saycharsmax(say), "[%s] "g_groupname[player])
                
add(say ,charsmax(say), g_nombre[id])
                
//set_user_info(id, "name", say);
                //client_cmd(id, "name ^"%s^"", say)
                
                
set_task(3.0"tiene_grupo"id)
            }
            
            return 
PLUGIN_HANDLED
        
}
        else if(
say[1] == 'l' && say[2] == 'e' && say[3] == 'a' && say[4] == 'v' && say[5] == 'e' && say[6] == 'g' 
        
&& say[7] == 'r' && say[8] == 'o' && say[9] == 'u' && say[10] == 'p'){
            if(!
g_grupo[id]){
                
client_print(idprint_center"No perteneces a ningun grupo")
                
guardar_grupo(id)
                return 
PLUGIN_HANDLED;
            }
            
            
g_grupo[id] = false
            
            
return PLUGIN_HANDLED
        
}
    }
    
    
chat(id)
    
    return 
PLUGIN_CONTINUE
}

public 
tiene_grupo(id){
    
g_grupo[id] = true
    get_user_name
(idg_nombre[id], charsmax(g_nombre))
    
guardar_grupo(id)
}

public 
client_putinserver(id){
    
//g_grupo[id] = false
    
get_user_name(idg_nombre[id], charsmax(g_nombre))
    
cargar_grupo(id)
}

public 
client_disconnect(id)
{
    
guardar_grupo(id)
}

public 
client_infochanged(id)
{
    new 
sNewName[33]
    
get_user_info(id"name"sNewNamecharsmax(sNewName));
    if(!
equali(sNewNameg_nombre[id]) && g_grupo[id])
    {
        
set_user_info(id"name"g_nombre[id]);
        
client_cmd(id"name ^"%s^""g_nombre[id]);
        
ChatColor(id"!team Atencion: No puedes cambiarte de nombre si perteneces a un !ggrupo!")
    }
    else if(!
equali(sNewNameg_nombre[id])) formatex(g_nombre[id], charsmax(g_nombre), sNewName)
}

stock ChatColor(const id, const input[], any:...)
{
    new 
count 1players[32];
    static 
msg[191];
    
vformat(msg190input3);
    
    
replace_all(msg190"!g""^4");
    
replace_all(msg190"!y""^1");
    
replace_all(msg190"!team""^3");
    
replace_all(msg190"!team2""^0");
    
    if (
idplayers[0] = id; else get_players(playerscount"ch");
    {
        for (new 
0counti++)
        {
            if (
is_user_connected(players[i]))
            {
                
message_begin(MSG_ONE_UNRELIABLEget_user_msgid("SayText"), _players[i]);
                
write_byte(players[i]);
                
write_string(msg);
                
message_end();
            }
        }
    }
}

public 
chat(id)
{
    new 
szSaid192 ], szName[35];
    
read_argsszSaidsizeofszSaid ) -);
    
get_user_name(idszName34);
    
remove_quotesszSaid );
    if(
g_grupo[id])
    {
        
ChatColor(id"!g[%s] !team%s: !y%s"g_groupname[id], szNameszSaid);
        return 
PLUGIN_HANDLED
    
}
    else if(!
g_grupo[id])
    {
        
ChatColor(id"!team%s: !y%s"szNameszSaid);
        return 
PLUGIN_HANDLED
    
}
    return 
PLUGIN_HANDLED
}

public 
cargar_grupo(id

    new 
data[128], name[32], tiene_grupo[32], nombre_grupo[32]
    
    
get_user_name(idnamecharsmax(name))
    
    if(!
fvault_get_data(nombre_vaultnamedatasizeof(data) - 1))
    {    
        return 
0
    
}
    
    
parse(datatiene_grupocharsmax(tiene_grupo), nombre_grupocharsmax(nombre_grupo))
    
    
    
g_grupo[id] = tiene_grupo[id]
    
formatex(g_groupname[id], charsmax(g_groupname), nombre_grupo)
    
ChatColor(id"Datos Cargados para !team %s"name)
    
client_print(idprint_console"Datos Cargados para !team %s"name)
    
    return 
1
}

guardar_grupo(id

    new 
data[128], name[32]
    
    
get_user_name(idnamecharsmax(name))
    
    
formatex(datacharsmax(data), "%s %s %s"name[id], g_grupo[id], g_groupname[id])
    
client_print(idprint_console"Datos Guardados para: %s %s %s"name[id], g_grupo[id], g_groupname[id])
    
fvault_set_data(nombre_vaultnamedata)


¿Cuál es el problema?

Son los siguientes:

1) Cuando alguien habla, aparecen 2 mensajes, uno el normal del juego y el otro es el que tiene el tag. ¿Cómo dejo el que tiene tag solamente? [Esa función la llamé chat(id) por siacaso] - Arreglado

2) Cuando se guarda el grupo y me reconecto, el nombre del grupo donde estoy pasa a llamarse [b]

3) Si dejo el grupo y me reconecto, me dice que aun tengo grupo

Son esas 3 cosas que me tienen medio complicado para solucionarlas, si alguien me podría ayudar sería lo mejor xD

saludos Sonrisa

Crédito total a Roccoxx por crear el plugin Lengua
Responder
#2
Esos bugs pasaban antes o despues que lo modificaras?
Ingeniero agrónomo y desarrollador de Software.

tutoriales-allied
buscas un zp?

"La imitación es la forma más sincera de admiración con la que puede pagar la mediocridad a la grandeza"

Merci Alliedmodders pour m'introduire dans la programmation.
Responder
#3
(02/01/2014, 05:39 PM)roccoxx escribió: Esos bugs pasaban antes o despues que lo modificaras?

con las modificaciones que le hice
Responder
#4
el chat en el hook del say:
Código PHP:
return PLUGIN_CONTINUE
//----->
return PLUGIN_HANDLED 
Responder
#5
(02/01/2014, 05:51 PM)[Anti] escribió: el chat en el hook del say:
Código PHP:
return PLUGIN_CONTINUE
//----->
return PLUGIN_HANDLED 

Muchas gracias XD, no se me habia ocurrido eso.


Ahora se arregló el problema del chat :3
Responder
#6
(02/01/2014, 06:09 PM)internel escribió: Ahora se arregló el problema del chat :3

Lo que haces con PLUGIN_HANDLED es bloquear la funcion de otros plugins, con PLUGIN_CONTINUE le das return solo a la misma funcion pero continua otros plugin...

es tan solo de hacer un test

Código PHP:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>

/*
#define PLUGIN_CONTINUE        0     Results returned by public functions 
#define PLUGIN_HANDLED        1     stop other plugins 
#define PLUGIN_HANDLED_MAIN    2     to use in client_command(), continue all plugins but stop the command 
*/
public plugin_init()
    
register_clcmd("say""fnTest")

public 
fnTest(id
{    
    static 
say_args[20]
    
read_args(say_argscharsmax(say_args))
    
remove_quotes(say_args)
    
    if(
say_args[0] != '/')return PLUGIN_CONTINUE
    
if(equal(say_args"/test"))return PLUGIN_HANDLED
    
if(equal(say_args"/test2"))return PLUGIN_CONTINUE
        
    
return PLUGIN_CONTINUE    

[Imagen: 76561197999970868.png]
Responder
#7
(03/01/2014, 12:04 PM)LA BANDA escribió:
(02/01/2014, 06:09 PM)internel escribió: Ahora se arregló el problema del chat :3

Lo que haces con PLUGIN_HANDLED es bloquear la funcion de otros plugins, con PLUGIN_CONTINUE le das return solo a la misma funcion pero continua otros plugin...

es tan solo de hacer un test

Código PHP:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>

/*
#define PLUGIN_CONTINUE        0     Results returned by public functions 
#define PLUGIN_HANDLED        1     stop other plugins 
#define PLUGIN_HANDLED_MAIN    2     to use in client_command(), continue all plugins but stop the command 
*/
public plugin_init()
    
register_clcmd("say""fnTest")

public 
fnTest(id
{    
    static 
say_args[20]
    
read_args(say_argscharsmax(say_args))
    
remove_quotes(say_args)
    
    if(
say_args[0] != '/')return PLUGIN_CONTINUE
    
if(equal(say_args"/test"))return PLUGIN_HANDLED
    
if(equal(say_args"/test2"))return PLUGIN_CONTINUE
        
    
return PLUGIN_CONTINUE    


con ese PLUGIN_HANDLED no se bloquean las funciones de otros plugins, porque de todas formas la persona puede hablar de la manera que quiero.

con PLUGIN_CONTINUE se mandan 2 mensajes iguales, y no es lo que busco ahora.

lo que me sirvió de tu ejemplo es el:
Código PHP:
if(equal(say_args"/test")) 

creo que con eso se puede optimizar bastante la función, saludos
Responder
#8
(03/01/2014, 09:45 PM)internel escribió: creo que con eso se puede optimizar bastante la función, saludos

Con plugin_handled bloqueas el mensaje y lo reemplazas por otro.
[Imagen: 76561197999970868.png]
Responder
#9
(03/01/2014, 10:14 PM)LA BANDA escribió:
(03/01/2014, 09:45 PM)internel escribió: creo que con eso se puede optimizar bastante la función, saludos

Con plugin_handled bloqueas el mensaje y lo reemplazas por otro.

exacto, eso es lo que trato de buscar. y por eso plugin_handled sirve para este propósito xDD

ahora lo que necesito es saber, como cargar bien el nombre del grupo en que uno está, y si se sale del grupo que eso se guarde. u.u
Responder
#10
Código PHP:
/* PLUGIN ORIGINAL POR Roccoxx, editado por Internel. */

#include <amxmodx>
#include <amxmisc>
#include <fvault>

/*.grupo <nombre> - Crear un grupo con el tag especificado
.add <nombre> - Invitar a el jugador con el tag especifico del grupo
.accept <nombre> - Unirse a un grupo
.leavegroup - Dejar el grupo que se encuentra actualmente */

#define MAX_CHR 20 // max group name lenght

new const nombre_vault[] = "INFO_GRUPOS"

new 
g_grupo[33], g_nombre[33][33], g_groupname[33][MAX_CHR]

public 
plugin_init(){
    
register_plugin("Group""1.0""Roccoxx")
    
register_clcmd("say""hook_say")
}

public 
hook_say(id)
{
    if(!
is_user_connected(id)) return PLUGIN_HANDLED;
    
    new 
say[40]
    
read_args(saycharsmax(say))
    
    if(
equal(say"")) return PLUGIN_HANDLED;
    
    
remove_quotes(say[0])
    
    if(
say[0] == '.')
    {    
        if(
say[1] == 'g' && say[2] == 'r' && say[3] == 'u' && say[4] == 'p' && say[5] == 'o')
        {
            if(
g_grupo[id])
            {
                
client_print(idprint_center"Ya tienes un grupo")
                return 
PLUGIN_HANDLED;
            }
            
            
replace_all(saycharsmax(say), ".grupo """)
            
replace_all(saycharsmax(say), ".grupo""")
            
            if(
strlen(say) > MAX_CHRclient_print(idprint_center"Nombre muy largo")
            else if(
equal(say"")) client_print(idprint_center"No escribiste Nada")
            else
            {
                
ChatColor(id"!gFelicitaciones !teamCreaste el grupo: !y%s",say)
                
formatex(g_groupname[id], charsmax(g_groupname), say)
                
format(saycharsmax(say), "[%s] "say)
                
add(say ,charsmax(say), g_nombre[id])
                
//set_user_info(id, "name", say);
                //client_cmd(id, "name ^"%s^"", say)
                
                
set_task(3.0"tiene_grupo"id)
            }
            return 
PLUGIN_HANDLED;
        }
        else if(
say[1] == 'a' && say[2] == 'd' && say[3] == 'd')
        {
            if(!
g_grupo[id])
            {
                
client_print(idprint_center"No tienes un grupo")
                return 
PLUGIN_HANDLED;
            }
            
            
replace_all(saycharsmax(say), ".add """)
            
replace_all(saycharsmax(say), ".add""")
            
            new 
player cmd_target(idsay8);
            
            if(!
playerclient_print(idprint_center"Jugador no encontrado")
            else if(
g_grupo[player]) client_print(idprint_center"El Jugador Ya pertenece a un Grupo")
            else{
                static 
name[33]; get_user_name(idnamecharsmax(name))
            
                
ChatColor(id"!teamInvitacion enviada a !y%s",say)
                
ChatColor(player"!g%s !yquiere invitarte a su grupo!",name)
            }
            
            return 
PLUGIN_HANDLED
        
}
        else if(
say[1] == 'a' && say[2] == 'c' && say[3] == 'c' && say[4] == 'e' && say[5] == 'p' && say[6] == 't')
        {
            
replace_all(saycharsmax(say), ".accept """)
            
replace_all(saycharsmax(say), ".accept""")
            
            new 
player cmd_target(idsay8);
            
            if(!
playerclient_print(idprint_center"Jugador no encontrado")        
            else if(!
g_grupo[player]) client_print(idprint_center"El Jugador no tiene un Grupo")
            else{
                static 
name[33]; get_user_name(idnamecharsmax(name))
            
                
ChatColor(id"!teamFelicitaciones te uniste al grupo de !y%s",say)
                
ChatColor(player"!g%s !ySe ha unido a tu grupo!",name)
                
                
formatex(g_groupname[id], charsmax(g_groupname), g_groupname[player])
                
format(saycharsmax(say), "[%s] "g_groupname[player])
                
add(say ,charsmax(say), g_nombre[id])
                
//set_user_info(id, "name", say);
                //client_cmd(id, "name ^"%s^"", say)
                
                
set_task(3.0"tiene_grupo"id)
            }
            
            return 
PLUGIN_HANDLED
        
}
        else if(
say[1] == 'l' && say[2] == 'e' && say[3] == 'a' && say[4] == 'v' && say[5] == 'e' && say[6] == 'g' 
        
&& say[7] == 'r' && say[8] == 'o' && say[9] == 'u' && say[10] == 'p')
        {
            if(!
g_grupo[id]){
                
client_print(idprint_center"No perteneces a ningun grupo")
                return 
PLUGIN_HANDLED// Si no tiene grupo se para aca
            
}
            
// Aca se sale del grupo
            
g_grupo[id] = false // Off Variable
            
guardar_grupo(id// Guardamos ??
            
            /*--Como se salio del grupo aca haces lo que se te plazca (Aca se guarda)*/
            
            
return PLUGIN_HANDLED
        
}
    }
    
    
chat(id)
    
    return 
PLUGIN_CONTINUE
}

public 
tiene_grupo(id)
{
    
g_grupo[id] = true
    get_user_name
(idg_nombre[id], charsmax(g_nombre))
    
guardar_grupo(id)
}

public 
client_putinserver(id)
{
    
g_grupo[id] = false
    get_user_name
(idg_nombre[id], charsmax(g_nombre))
    
cargar_grupo(id)
}

public 
client_disconnect(id)
{
    
guardar_grupo(id)
}

public 
client_infochanged(id)
{
    new 
sNewName[33]
    
get_user_info(id"name"sNewNamecharsmax(sNewName));
    
    if(!
equali(sNewNameg_nombre[id]) && g_grupo[id])
    {
        
set_user_info(id"name"g_nombre[id]);
        
client_cmd(id"name ^"%s^""g_nombre[id]);
        
ChatColor(id"!team Atencion: No puedes cambiarte de nombre si perteneces a un !ggrupo!")
    }
    else if(!
equali(sNewNameg_nombre[id])) formatex(g_nombre[id], charsmax(g_nombre), sNewName)
}

stock ChatColor(const id, const input[], any:...)
{
    new 
count 1players[32];
    static 
msg[191];
    
vformat(msg190input3);
    
    
replace_all(msg190"!g""^4");
    
replace_all(msg190"!y""^1");
    
replace_all(msg190"!team""^3");
    
replace_all(msg190"!team2""^0");
    
    if (
idplayers[0] = id; else get_players(playerscount"ch");
    {
        for (new 
0counti++)
        {
            if (
is_user_connected(players[i]))
            {
                
message_begin(MSG_ONE_UNRELIABLEget_user_msgid("SayText"), _players[i]);
                
write_byte(players[i]);
                
write_string(msg);
                
message_end();
            }
        }
    }
}

public 
chat(id)
{
    new 
szSaid192 ], szName[35];
    
read_argsszSaidsizeofszSaid ) -);
    
get_user_name(idszName34);
    
remove_quotesszSaid );
    
    if(
g_grupo[id])
    {
        
ChatColor(id"!g[%s] !team%s: !y%s"g_groupname[id], szNameszSaid);
        return 
PLUGIN_HANDLED
    
}
    else if(!
g_grupo[id])
    {
        
ChatColor(id"!team%s: !y%s"szNameszSaid);
        return 
PLUGIN_HANDLED
    
}
    return 
PLUGIN_HANDLED
}

public 
cargar_grupo(id

    new 
data[128], name[32], tiene_grupo[32], nombre_grupo[32]
    
    
get_user_name(idnamecharsmax(name))
    
    if(!
fvault_get_data(nombre_vaultnamedatasizeof(data) - 1))
        return 
0
    
    parse
(datatiene_grupocharsmax(tiene_grupo), nombre_grupocharsmax(nombre_grupo))
    
    
    
g_grupo[id] = tiene_grupo[id]
    
formatex(g_groupname[id], charsmax(g_groupname), nombre_grupo)
    
ChatColor(id"Datos Cargados para !team %s"name)
    
client_print(idprint_console"Datos Cargados para !team %s"name)
    
    return 
1
}

guardar_grupo(id

    new 
data[128], name[32]
    
get_user_name(idnamecharsmax(name))
    
    
formatex(datacharsmax(data), "%s %d %s"name[id], g_grupo[id], g_groupname[id]) // Aca estabas guardando g_grupo como string (%s)
    
client_print(idprint_console"Datos Guardados para: %s %d %s"name[id], g_grupo[id], g_groupname[id]) // group = int = %d
    
fvault_set_data(nombre_vaultnamedata)


Ahi usa ese, tu guardabas int como strings, ese fue el unico error.
[Imagen: 76561197999970868.png]
Responder
#11
no me funciona, me salgo de un grupo y se guarda como nombre de grupo "0", luego vuelvo a entrar y me dice que estoy en el grupo llamado "0".

S: u.u, de todas formas gracias por responder
Responder
#12
Ahi te dejo uno internel
[Imagen: 76561197999970868.png]
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)