Cuál es el error en este código que no logro ver...
#1
Hice dos códigos para un plugin en dónde los dos técnicamente hacen lo mismo. el detalle está en que una de las versiones del código funciona hasta ahora bien (me parece) y la otra versión funciona sólo en ciertas condiciones. Quiero destacar enormemente que no soy programador, no soy experto en este lenguaje (sourcepawn) y en ningún otro. Estoy tratando de hacer mis propios plugins porque honestamente no consigo mucha asistencia en los sitios webs destinados a esto. Generalmente cuando hago un plugin (que he hecho varios) y si encuentro algún error, consigo el porque de la falla pero, en esta ocasión, me intriga el no entender por qué no está funcionando y necesito verdaderos conocedores que me digan que estoy haciendo mal o qué estoy interpretando mal.

La intención del plugin es muy simple, enviar un mensaje cuando un cliente se conecta, listo, Eso es algo que se puede hacer en técnicamente en menos de 10 líneas de código pero mi intención es personalizar los mensajes si el usuario que lee el mensaje es un administrador o no, por ende en mi completa ignorancia, el código me llegó 8 veces esa cantidad de líneas.

Acá les dejo el código con el error
Código PHP:
#include <sourcemod>
#include <geoip>

char gc_ip[MAXPLAYERS+1][18];
char gc_country[32];
char gc_city[128];
char authId[32];
bool clientConnectedCall false;
bool clientPACCall false;
int clientOnServer = -1;

public 
void OnClientConnected(int client)
{
    if (!
IsFakeClient(client))
    {
        
clientConnectedCall true;
        
clientOnServer client;
        
Message();
    }
}

public 
void OnClientDisconnect(int client)
{
    if (!
IsFakeClient(client))
    {
        
gc_ip[client][0] = '\0';
    }
}

public 
void OnClientPostAdminCheck(int client)
{
    if (!
IsFakeClient(client))
    {
        
clientPACCall true;
        
clientOnServer client;
        
Message();
    }
}

public 
void Message()
{
    for (
int i 1<= MaxClientsi++)
    {
        if (
IsClientInGame(i) && !IsFakeClient(i))
        {
            
AdminId AdminUser GetUserAdmin(i);
            if (
clientPACCall)
            {
                
GeoipCountry(gc_ip[clientOnServer], gc_countrysizeof(gc_country));
                
GeoipCity(gc_ip[clientOnServer], gc_citysizeof(gc_city));
                
GetClientAuthId(clientOnServerAuthId_Steam2authIdsizeof(authId), true);
                
PrintToChat(i"\x05%N\x01 ha ingresado a la partida"clientOnServer);
                if (
AdminUser != INVALID_ADMIN_ID)
                {
                    
PrintToChat(i"\x04(SteamID: %s ) (Pais: %s ) (Ciudad: %s )"authIdgc_countrygc_city);
                }
                
clientPACCall false;
            }
            if (
clientConnectedCall && AdminUser != INVALID_ADMIN_ID)
            {
                
GetClientIP(clientOnServergc_ip[clientOnServer], sizeof(gc_ip), false);
                
PrintToChat(i"\x05%N\x01 Se ha Conectado"clientOnServer);
                
PrintToChat(i"\x04(IP: %s )"gc_ip[clientOnServer]);
                
clientConnectedCall false;
            }
        }
        else
        {
            
clientConnectedCall false;
        }
    }

Y cuál es el Error? pues está en que si yo por ejemplo creo una sala y soy Digamos que el "primer cliente" que se une al servidor (que es mío), los mensajes se muestran bien por lo menos para mí con toda la información que necesito pero, me parece que no se le muestran los demás. porque digo esto? porque si por ejemplo salgo del servidor y vuelvo a ingresar, los mensajes ya no se muestran, como si simplemente el plugin hubiese dejado de funcionar, pero sigue estando ahí "funcionando".

Caso contrario está otra versión, (Que por cierto tiene líneas menos), Este código hace exactamente lo mismo Y al parecer funciona bien lo único es que el otro código lo quería usar porque me ahorraba una iteración, en cambio en este código tengo dos iteraciones para ambos "forwards"
Código PHP:
#include <sourcemod>
#include <geoip>

char gc_ip[MAXPLAYERS+1][18];
char gc_country[32];
char gc_city[128];
char authId[32];

public 
void OnClientConnected(int client)
{
    if (!
IsFakeClient(client))
    {
        
GetClientIP(clientgc_ip[client], sizeof(gc_ip), false);
        for (
int i 1<= MaxClientsi++)
        {
            if (
IsClientInGame(i))
            {
                if (!
IsFakeClient(i))
                {
                    
AdminId AdminMSJ GetUserAdmin(i);
                    if (
AdminMSJ != INVALID_ADMIN_ID)
                    {
                        
PrintToChat(i"\x05%N\x01 Se ha Conectado"client);
                        
PrintToChat(i"\x04(IP: %s )"gc_ip[client]);
                    }
                }
            }
        }
    }
}

public 
void OnClientDisconnect(int client)
{
    if (!
IsFakeClient(client))
    {
        
gc_ip[client][0] = '\0';
    }
}

public 
void OnClientPostAdminCheck(int client)
{
    if (!
IsFakeClient(client))
    {
        
GeoipCountry(gc_ip[client], gc_countrysizeof(gc_country));
        
GeoipCity(gc_ip[client], gc_citysizeof(gc_city));
        
GetClientAuthId(clientAuthId_Steam2authIdsizeof(authId), true);
        for (
int i 1<= MaxClientsi++)
        {
            if (
IsClientInGame(i))
            {
                if (!
IsFakeClient(i))
                {
                    
AdminId AdminMSJ GetUserAdmin(i);
                    
PrintToChat(i"\x05%N\x01 ha ingresado a la partida"client);
                    if (
AdminMSJ != INVALID_ADMIN_ID)
                    {
                        
PrintToChat(i"\x04(SteamID: %s ) (Pais: %s ) (Ciudad: %s )"authIdgc_countrygc_city);
                    }
                }
            }
        }
    }


Cualquier sugerencia es bienvenida
Responder
#2
te recomiendo que te vayas al foro ingles, aca nunca se le dio bola al sourcemod
Responder
#3
(27/09/2023, 07:23 PM)Nelo escribió: te recomiendo que te vayas al foro ingles, aca nunca se le dio bola al sourcemod

Uh que mal loco me imaginé

(27/09/2023, 07:15 PM)SilverSP3d escribió: Hice dos códigos para un plugin en dónde los dos técnicamente hacen lo mismo. el detalle está en que una de las versiones del código funciona hasta ahora bien (me parece) y la otra versión funciona sólo en ciertas condiciones. Quiero destacar enormemente que no soy programador, no soy experto en este lenguaje (sourcepawn) y en ningún otro. Estoy tratando de hacer mis propios plugins porque honestamente no consigo mucha asistencia en los sitios webs destinados a esto. Generalmente cuando hago un plugin (que he hecho varios) y si encuentro algún error, consigo el porque de la falla pero, en esta ocasión, me intriga el no entender por qué no está funcionando y necesito verdaderos conocedores que me digan que estoy haciendo mal o qué estoy interpretando mal.

La intención del plugin es muy simple, enviar un mensaje cuando un cliente se conecta, listo, Eso es algo que se puede hacer en técnicamente en menos de 10 líneas de código pero mi intención es personalizar los mensajes si el usuario que lee el mensaje es un administrador o no, por ende en mi completa ignorancia, el código me llegó 8 veces esa cantidad de líneas.

Acá les dejo el código con el error
Código PHP:
#include <sourcemod>
#include <geoip>

char gc_ip[MAXPLAYERS+1][18];
char gc_country[32];
char gc_city[128];
char authId[32];
bool clientConnectedCall false;
bool clientPACCall false;
int clientOnServer = -1;

public 
void OnClientConnected(int client)
{
    if (!
IsFakeClient(client))
    {
        
clientConnectedCall true;
        
clientOnServer client;
        
Message();
    }
}

public 
void OnClientDisconnect(int client)
{
    if (!
IsFakeClient(client))
    {
        
gc_ip[client][0] = '\0';
    }
}

public 
void OnClientPostAdminCheck(int client)
{
    if (!
IsFakeClient(client))
    {
        
clientPACCall true;
        
clientOnServer client;
        
Message();
    }
}

public 
void Message()
{
    for (
int i 1<= MaxClientsi++)
    {
        if (
IsClientInGame(i) && !IsFakeClient(i))
        {
            
AdminId AdminUser GetUserAdmin(i);
            if (
clientPACCall)
            {
                
GeoipCountry(gc_ip[clientOnServer], gc_countrysizeof(gc_country));
                
GeoipCity(gc_ip[clientOnServer], gc_citysizeof(gc_city));
                
GetClientAuthId(clientOnServerAuthId_Steam2authIdsizeof(authId), true);
                
PrintToChat(i"\x05%N\x01 ha ingresado a la partida"clientOnServer);
                if (
AdminUser != INVALID_ADMIN_ID)
                {
                    
PrintToChat(i"\x04(SteamID: %s ) (Pais: %s ) (Ciudad: %s )"authIdgc_countrygc_city);
                }
                
clientPACCall false;
            }
            if (
clientConnectedCall && AdminUser != INVALID_ADMIN_ID)
            {
                
GetClientIP(clientOnServergc_ip[clientOnServer], sizeof(gc_ip), false);
                
PrintToChat(i"\x05%N\x01 Se ha Conectado"clientOnServer);
                
PrintToChat(i"\x04(IP: %s )"gc_ip[clientOnServer]);
                
clientConnectedCall false;
            }
        }
        else
        {
            
clientConnectedCall false;
        }
    }

Y cuál es el Error? pues está en que si yo por ejemplo creo una sala y soy Digamos que el "primer cliente" que se une al servidor (que es mío), los mensajes se muestran bien por lo menos para mí con toda la información que necesito pero, me parece que no se le muestran los demás. porque digo esto? porque si por ejemplo salgo del servidor y vuelvo a ingresar, los mensajes ya no se muestran, como si simplemente el plugin hubiese dejado de funcionar, pero sigue estando ahí "funcionando".

Caso contrario está otra versión, (Que por cierto tiene líneas menos), Este código hace exactamente lo mismo Y al parecer funciona bien lo único es que el otro código lo quería usar porque me ahorraba una iteración, en cambio en este código tengo dos iteraciones para ambos "forwards"
Código PHP:
#include <sourcemod>
#include <geoip>

char gc_ip[MAXPLAYERS+1][18];
char gc_country[32];
char gc_city[128];
char authId[32];

public 
void OnClientConnected(int client)
{
    if (!
IsFakeClient(client))
    {
        
GetClientIP(clientgc_ip[client], sizeof(gc_ip), false);
        for (
int i 1<= MaxClientsi++)
        {
            if (
IsClientInGame(i))
            {
                if (!
IsFakeClient(i))
                {
                    
AdminId AdminMSJ GetUserAdmin(i);
                    if (
AdminMSJ != INVALID_ADMIN_ID)
                    {
                        
PrintToChat(i"\x05%N\x01 Se ha Conectado"client);
                        
PrintToChat(i"\x04(IP: %s )"gc_ip[client]);
                    }
                }
            }
        }
    }
}

public 
void OnClientDisconnect(int client)
{
    if (!
IsFakeClient(client))
    {
        
gc_ip[client][0] = '\0';
    }
}

public 
void OnClientPostAdminCheck(int client)
{
    if (!
IsFakeClient(client))
    {
        
GeoipCountry(gc_ip[client], gc_countrysizeof(gc_country));
        
GeoipCity(gc_ip[client], gc_citysizeof(gc_city));
        
GetClientAuthId(clientAuthId_Steam2authIdsizeof(authId), true);
        for (
int i 1<= MaxClientsi++)
        {
            if (
IsClientInGame(i))
            {
                if (!
IsFakeClient(i))
                {
                    
AdminId AdminMSJ GetUserAdmin(i);
                    
PrintToChat(i"\x05%N\x01 ha ingresado a la partida"client);
                    if (
AdminMSJ != INVALID_ADMIN_ID)
                    {
                        
PrintToChat(i"\x04(SteamID: %s ) (Pais: %s ) (Ciudad: %s )"authIdgc_countrygc_city);
                    }
                }
            }
        }
    }


Cualquier sugerencia es bienvenida
Me parece que di con el porqué del problema, No estoy 100% seguro aún pero me parece que quizás sea por el hecho de que cuando yo "Hago un forward" Que en este caso sería el Message(), Este último me va a devolver "Algo" bien sea un valor, un estado, lo que sea pero, me va a devolver "algo" Y ese algo es un valor "único", es decir y Disculpen que esté usando una terminología incorrecta pero como les dije yo no soy conocedor de este tema, Si bien la iteración tiene como objetivo buscar entre todos los clientes cuál de esos es administrador y conforme a eso realizar o no acciones, al yo hacer esta iteración "llamándola como nuevo forward", me va a devolver solamente un valor y no los "múltiples valores" que yo quiero obtener si la iteración no fuese dentro de ese tal forward. 

No sé si se entiende algo, porque honestamente en un tiempo si vuelvo a leer esto no lo voy a entender. Pero lo dejo acá en el caso de que alguien conocedor de este tema lo llegase a leer y me confirme si es así o no. Algo similar hice en otro código donde también use una iteración para crear una "variable bool" y el retorno era true o false dependiendo de las condiciones.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)