27/09/2023, 07:15 PM
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
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"
Cualquier sugerencia es bienvenida
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; i <= MaxClients; i++)
{
if (IsClientInGame(i) && !IsFakeClient(i))
{
AdminId AdminUser = GetUserAdmin(i);
if (clientPACCall)
{
GeoipCountry(gc_ip[clientOnServer], gc_country, sizeof(gc_country));
GeoipCity(gc_ip[clientOnServer], gc_city, sizeof(gc_city));
GetClientAuthId(clientOnServer, AuthId_Steam2, authId, sizeof(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 )", authId, gc_country, gc_city);
}
clientPACCall = false;
}
if (clientConnectedCall && AdminUser != INVALID_ADMIN_ID)
{
GetClientIP(clientOnServer, gc_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;
}
}
}
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(client, gc_ip[client], sizeof(gc_ip), false);
for (int i = 1; i <= MaxClients; i++)
{
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_country, sizeof(gc_country));
GeoipCity(gc_ip[client], gc_city, sizeof(gc_city));
GetClientAuthId(client, AuthId_Steam2, authId, sizeof(authId), true);
for (int i = 1; i <= MaxClients; i++)
{
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 )", authId, gc_country, gc_city);
}
}
}
}
}
}
Cualquier sugerencia es bienvenida