15.09.2011, 02:26
(
Последний раз редактировалось leaNN!; 15.09.2011 в 04:19.
)
Hola gente!
Bueno, estoy creando mi propio sistema de administraciуn (bбsico, obviamente), y dije "U re pinta hacer un tutorial para aportar a la comunidad". Entonces aca estoy, escribiendo.
So madafakaiea, LET'S GO
!
Mas que un tutorial es una "guнa de creaciуn" en la que voy indicando que hace cada cosa.
Para empezar, creamos un archivo nuevo, y borramos absolutamente todo lo que haya en el.
[Watafakyeah.]
Agregamos los includes, y los defines/variables necesarias.
Ahora que tenemos eso, podemos hacer la parte mas linda del script: los creditos!
La idea era que mi nick aca en el foro fuera rooT. o .root, pero no puedo cambiarlo.
Ya tenemos eso para empezar! Ahora viene OnPlayerConnect!
Ahora viene OnPlayerDisconnect :B
Ahora viene OnPlayerSpawn, pondremos un timer que le dara al jugador 1 minuto para loguearse/registrarse o sera kickeado. :B
Hasta aca tenemos todo bien, no deberнan tener ningъn error.
Ahora empiezan los comandos.
Hasta acб venimos bien por lo que veo, ahora vienen el /login, /ban, y /kick.
Ahora el SpawnKick!
Casi muero. Bueno, eso es todo lo que voy a darles por ahora, dentro de poco voy a ir agregando mas cosas.
Si falta algo o algo esta mal, me avisan.
NO ME CRITIQUEN PORQUE USO SSCANF & DINI, A MI ME GUSTA Y ME FUNCIONA BIEN ASI
No hay comando de setlevel porque realmente no tengo mas ganas de seguir escribiendo y editando, asique mas tarde lo agrego.
PD: La carpeta "TuMamaSystem" (o el nombre que le den) la deben crear ustedes, sino cada vez que alguien intente registrarse va a crashear el server.
No veo necesario decirles que para usarlo necesitan el plugin SSCANF2, y su respectivo include, ademas de los includes zCMD, Dini, y dudb.
No tengo ganas de buscar links, busquen por aca por el foro.
Creditos:
Me.
ZeeX.
******
Dracoblue.
Esto deberia quedar asi:
Bueno, estoy creando mi propio sistema de administraciуn (bбsico, obviamente), y dije "U re pinta hacer un tutorial para aportar a la comunidad". Entonces aca estoy, escribiendo.
So madafakaiea, LET'S GO

Mas que un tutorial es una "guнa de creaciуn" en la que voy indicando que hace cada cosa.
Para empezar, creamos un archivo nuevo, y borramos absolutamente todo lo que haya en el.
[Watafakyeah.]
Agregamos los includes, y los defines/variables necesarias.
pawn Код:
#include <a_samp>
#include <Dini>
#include <dudb>
#include <zcmd>
#include <sscanf2>
#pragma tabsize 0
#define COLOR_YELLOW 0xFFFF00AA
#define COLOR_LIGHTGREEN 0x38FF06FF
#define COLOR_LIGHTBLUE 0x91C8FF
#define COLOR_GREEN 0x66CC99AA
#define COLOR_RED 0xFF0000AA
//===============================NEWS Y MAS=====================================
new str[128], pname[MAX_PLAYER_NAME]; // Creacion de str y pname, para no crearlos constantemente.
new archivo[256]; // Creacion del string "archivo", donde almacenaremos la informaciуn.
enum pInfo //Array donde se guardara la info del jugador!
{
Registrado,
Logueado,
Baneado,
Admin,
};
new aInfo[MAX_PLAYERS][pInfo]; // Variable que incluye todos los datos del jugador
#define Users "TuMamaSystem/%s.ini" //Carpeta donde se guardaran los archivos dentro de scriptfiles!
forward SpawnKick(playerid);
forward MessageToAdmins(color,const string[]);
pawn Код:
public OnFilterScriptInit()
{
print("----------------------------------------");
print("---Sistema de Login&Registro by rooT.---");
print("-----------------Loaded-----------------");
print("----------------------------------------");
return 1;
}
public OnFilterScriptExit()
{
print("----------------------------------------");
print("---Sistema de Login&Registro by rooT.---");
print("----------------Unloaded----------------");
print("----------------------------------------");
return 1;
}
Ya tenemos eso para empezar! Ahora viene OnPlayerConnect!
pawn Код:
public OnPlayerConnect(playerid)
{
//Seteamos todos los valores a 0, ya que quedan "guardados" los del jugador anterior.
aInfo[playerid][Registrado] = 0;
aInfo[playerid][Logueado] = 0;
aInfo[playerid][Admin] = 0;
aInfo[playerid][Baneado] = 0;
GetPlayerName(playerid, pname, sizeof(pname)); //Obtenemos el nombre del jugador y lo guardamos en la variable pname.
format(archivo, sizeof(archivo), Users, udb_encode(pname)); // Con el nombre del jugador, le damos "nombre" al string "archivo".
if(!dini_Exists(archivo)) // Si el archivo PLAYERNAME.ini no existe...
{
format(str, sizeof(str), "Bienvenido %s! Tu cuenta no esta registrada! Utiliza /registrar para registrarla!", pname); // Le damos formato a la string "str" con un texto.
SendClientMessage(playerid, COLOR_YELLOW, str); // Enviamos el texto al jugador.
aInfo[playerid][Registrado] = 0; // Indicamos que este jugador no esta registrado.
}
else //En caso de que el archivo PLAYERNAME.ini SI exista...
{
format(str, sizeof(str), "Bienvenido %s! Utiliza /login para ingresar a tu cuenta", pname); // Le damos formato a la string "str" con un texto.
SendClientMessage(playerid, COLOR_LIGHTGREEN, str); // Enviamos el texto al jugador.
aInfo[playerid][Registrado] = 1; // Indicamos que este jugador esta registrado.
}
format(str, sizeof(str), "%s Ingreso al servidor!", pname); //Damos formato a "str"...
SendClientMessageToAll(COLOR_LIGHTGREEN, str); // y la enviamos a todos los jugadores conectados.
return 1;
}
pawn Код:
public OnPlayerDisconnect(playerid, reason)
{
switch(reason)
{
case 0: format(str, sizeof(str), "%s dejo el servidor. (Crash)", pname); //Si el jugador se desconecto por un crash
case 1: format(str, sizeof(str), "%s dejo el servidor. (Salio)", pname); //Si se desconecto por haber salido.
case 2: format(str, sizeof(str), "%s dejo el servidor. (Kickeado/Baneado)", pname); // Si se desconecto a causa de las funciones kick/ban.
}
SendClientMessageToAll(COLOR_GREEN, str); // Enviamos la razon a los jugadores.
GetPlayerName(playerid, pname, sizeof(pname)); //Guardamos el nombre del player en la variable pname
format(archivo, sizeof(archivo), Users, udb_encode(pname)); // Damos formato a "archivo"
// Guardamos los datos del jugador en su archivo!
dini_IntSet(archivo, "Admin", aInfo[playerid][Admin]);
dini_IntSet(archivo, "Baneado", aInfo[playerid][Baneado]);
return 1;
}
pawn Код:
public OnPlayerSpawn(playerid)
{
if(aInfo[playerid][Registrado] == 0) // Si el jugador no esta registrado
{
format(str, sizeof(str), "Tienes 60 segundos para registrarte o seras kickeado!"); // Damos formato a str.
SendClientMessage(playerid, COLOR_LIGHTGREEN, str); // Enviamos str al jugador.
format(str, sizeof(str), "Utiliza /registrar para hacerlo"); // Damos formato a str
SendClientMessage(playerid, COLOR_LIGHTBLUE, str); // Enviamos str al jugador
SetTimerEx("SpawnKick", 60000, 0, "i", playerid); // Creamos el timer de un minuto
TogglePlayerControllable(playerid, 0); // Frezeamos al jugador.
return 0;
}
if(aInfo[playerid][Logueado] == 0)
{
format(str, sizeof(str), "Tienes 60 segundos para loguear o seras kickeado!"); // Damos formato a str
SendClientMessage(playerid, COLOR_LIGHTGREEN, str); // Enviamos str al jugador
format(str, sizeof(str), "Utiliza /login para hacerlo"); // Damos formato a str
SendClientMessage(playerid, COLOR_LIGHTBLUE, str); // Enviamos str al jugador
SetTimerEx("SpawnKick", 60000, 0, "i", playerid); // Creamos el timer de un minuto
TogglePlayerControllable(playerid, 0); // Frezeamos al jugador.
return 0;
}
return 1;
}
Ahora empiezan los comandos.
pawn Код:
CMD:registrar(playerid, params[])
{
new WAZAA[24]; // String que almacena hasta 24 caracteres.
GetPlayerName(playerid, pname, sizeof(pname)); // Obtenemos el nombre del jugador
format(archivo, sizeof(archivo), Users, udb_encode(pname)); // Damos formato a "archivo"
format(WAZAA, sizeof(WAZAA), "%s", params); // Damos formato a "WAZAA" con el valor de "params"
if(aInfo[playerid][Registrado] == 1) return SendClientMessage(playerid, COLOR_YELLOW, "Esta cuenta esta registrada! Utiliza /login para ingresar"); // En caso de que el jugador ya este registrado-
if(strlen(WAZAA) > 4 && strlen(WAZAA) < 24) // Si WAZAA es mayor a 4 / Menor a 24
{
dini_Create(archivo); // Creacion del archivo PLAYERNAME.ini
dini_IntSet(archivo, "pass", udb_hash(WAZAA)); // Guardamos la password con un hash, para que no sea "visible".
dini_IntSet(archivo, "Admin", 0); // Indicamos que el jugador no es admin.
dini_IntSet(archivo, "Baneado", 0); // Indicamos que el jugador no esta baneado.
format(str, sizeof(str), "[rAdmin] Registraste el nombre %s bajo la contraseсa %s. Fuiste logueado automaticamente!", pname, WAZAA); // Damos formato a str con el nombre de la cuenta, la contraseсa y le informamos que quedo automaticamente logueado.
SendClientMessage(playerid, COLOR_LIGHTGREEN, str); // Enviamos str.
aInfo[playerid][Logueado] = 1; // Indicamos que el jugador esta logueado.
aInfo[playerid][Registrado] = 1; // Indicamos que el jugador esta registrado.
TogglePlayerControllable(playerid, 1); // Le damos movilidad al jugador (por si ya habia spawneado y estaba frezeado)
}
else return SendClientMessage(playerid, COLOR_RED, "Su contraseсa debe tener entre 4 & 24 caracteres!"); // En caso de que la pass tenga menos de 4 caraceters/mas de 24, va a dar error.
return 1;
}
pawn Код:
CMD:login(playerid, params[])
{
GetPlayerName(playerid, pname, sizeof(pname)); //Obtenemos el nombre del player.
format(archivo, sizeof(archivo), Users, udb_encode(pname));//Damos formato a archivo.
if(aInfo[playerid][Registrado] == 0) return SendClientMessage(playerid, COLOR_YELLOW, "Esta cuenta no esta registrada! Utiliza /registrar para registrarla!");// Si el jugador no esta registrado
if(aInfo[playerid][Logueado] == 1) return SendClientMessage(playerid, COLOR_YELLOW, "Ya estas logueado!");// Si el jugador ya esta logueado
if(isnull(params)) return SendClientMessage(playerid, COLOR_RED, "Uso: /login <password>");// Si no indico su pass.
new tmp; // creamos tmp, donde se va a almacenar la pass del archivo.
tmp = dini_Int(archivo, "pass"); //almacenamos la pass
if(udb_hash(params) != tmp) //comparamos, y si es distinta:
{
format(str, sizeof(str), "La contraseсa que ingresaste es incorrecta!"); //damos formato a str
SendClientMessage(playerid, COLOR_RED, str);// enviamos str al jugador
}
else // si la pass indicada es la correcta:
{
aInfo[playerid][Admin] = dini_Int(archivo, "Admin"); // Guardamos el nivel de Admin del archivo en la variable.
aInfo[playerid][Baneado] = dini_Int(archivo, "Baneado"); // Guardamos el valor de "Baneado" del archivo en la variable.
aInfo[playerid][Logueado] = 1; // Indicamos que el jugador esta logueado
if(aInfo[playerid][Baneado] == 1) // Si el jugador esta baneado
{
SendClientMessage(playerid, COLOR_RED, "Estas baneado en el servidor!"); // Le enviamos un mensaje
return Kick(playerid); // Lo kickeamos.
}else{ // Si no esta baneado
if(aInfo[playerid][Admin] > 0) //Si su nivel de admin es mayor a 0
{
format(str, sizeof(str), "Bienvenido %s! Admin Level: %d.! Utiliza /acmds para ver tus comandos de administracion!", pname, aInfo[playerid][Admin]); // Formateamos str con los datos del nombre, nivel, etc.
SendClientMessage(playerid, COLOR_LIGHTGREEN, str); //Enviamos el str
SendClientMessage(playerid, COLOR_RED, "[rAdmin] Logueado satisfactoriamente!"); // Informamos que ha sido logueado.
}
else //Si su nivel de admin no es mayor a 0
{
format(str, sizeof(str), "Bienvenido %s! Utiliza /comandos para ver los comandos disponibles!", pname); //Damos formato a str con el nombre del jugador.
SendClientMessage(playerid, COLOR_YELLOW, str); //Enviamos el str.
SendClientMessage(playerid, COLOR_RED, "[rAdmin] Logueado satisfactoriamente!"); // Informamos que ha sido logueado.
}
TogglePlayerControllable(playerid, 1);} //Unfezeamos al jugador (por si spawneo antes de loguearse)
}
return 1;
}
CMD:kick(playerid, params[])
{
new playerid2, pname2[MAX_PLAYER_NAME], reason[128]; // Creamos las variables necesarias
if(aInfo[playerid][Admin] >= 1) //Si el nivel de admin del jugador es mayor a 0
{
GetPlayerName(playerid, pname, sizeof(pname)); //Guardamos su nombre en pname
if(isnull(params)) return SendClientMessage(playerid, COLOR_RED, "Uso: /kick <playerid> <razon>"); //Si no hay params
if(!sscanf(params, "rs", playerid2, reason)) //Si los params son correctos
{
if(!IsPlayerConnected(playerid2)) return SendClientMessage(playerid, COLOR_RED, "ID Incorrecto."); //Si el jugador no esta conectado
if(aInfo[playerid2][Admin] > aInfo[playerid][Admin]) return SendClientMessage(playerid, COLOR_RED, "Imposible afectar a un admin de mayor nivel!"); //Si el nivel del playerid es menor al del jugador a kickear
GetPlayerName(playerid2, pname2, sizeof(pname2)); //Guardamos el nombre del playerid2 en pname2.
format(str, sizeof(str), "El jugador %s [ID: %d] fue kickeado por el administrador %s ~ Razon: %s", pname2, playerid2, pname, reason); //Formateamos str
SendClientMessageToAll(COLOR_YELLOW, str); //Enviamos str a todos
Kick(playerid2); //Kickeamos al jugador.
}
SendClientMessage(playerid, COLOR_RED, "Uso: /kick <playerid> <razon>"); //Si los params no estan
}
else return SendClientMessage(playerid, COLOR_RED, "Este comando es solo para Admins"); //Si no es admin
return 1;
}
CMD:ban(playerid, params[])
{
new playerid2, pname2[MAX_PLAYER_NAME], reason[128]; //Creamos variables necesarias.
if(aInfo[playerid][Admin] >= 1) //Si el nivel de admin del player es mayor o igual a 1
{
GetPlayerName(playerid, pname, sizeof(pname)); //Obtenemos el nombre del admin
if(!sscanf(params, "rs", playerid2, reason)) //Si los params estan completos
{
if(!IsPlayerConnected(playerid2)) return SendClientMessage(playerid, COLOR_RED, "ID Incorrecto."); //Si el jugador no esta conectado
if(aInfo[playerid2][Admin] > aInfo[playerid][Admin]) return SendClientMessage(playerid, COLOR_RED, "Imposible afectar a un admin de mayor nivel!"); //Si el nivel del jugador es mayor al del que intenta kickearlo
GetPlayerName(playerid2, pname2, sizeof(pname2)); //Obtenemos el nombre del jugador
format(str, sizeof(str), "El jugador %s [ID: %d] fue baneado por el administrador %s ~ Razon: %s", pname2, playerid2, pname, reason); //Damos formato a str
SendClientMessageToAll(COLOR_YELLOW, str); //La enviamos a todos
aInfo[playerid2][Baneado] = 1; //Seteamos que el jugador esta baneado
BanEx(playerid2, reason); //Baneamos la IP del jugador (samp.ban)
}
SendClientMessage(playerid, COLOR_RED, "Uso: /ban <playerid> <razon>"); //Si los params no estan completos
}
else return SendClientMessage(playerid, COLOR_RED, "Este comando es solo para Admins"); //Si no es admin
return 1;
}
pawn Код:
public SpawnKick(playerid)
{
if(aInfo[playerid][Registrado] == 0 || aInfo[playerid][Logueado] == 0)
{
SendClientMessage(playerid, COLOR_RED, "[rAdmin] Fuiste kickeado por no registrarte/loguearte en los primeros 60 segundos!");
Kick(playerid);
}
return 1;
}
Si falta algo o algo esta mal, me avisan.
NO ME CRITIQUEN PORQUE USO SSCANF & DINI, A MI ME GUSTA Y ME FUNCIONA BIEN ASI

No hay comando de setlevel porque realmente no tengo mas ganas de seguir escribiendo y editando, asique mas tarde lo agrego.
PD: La carpeta "TuMamaSystem" (o el nombre que le den) la deben crear ustedes, sino cada vez que alguien intente registrarse va a crashear el server.
No veo necesario decirles que para usarlo necesitan el plugin SSCANF2, y su respectivo include, ademas de los includes zCMD, Dini, y dudb.
No tengo ganas de buscar links, busquen por aca por el foro.
Creditos:
Me.
ZeeX.
******
Dracoblue.
Esto deberia quedar asi:
pawn Код:
#include <a_samp>
#include <Dini>
#include <dudb>
#include <zcmd>
#include <sscanf2>
#pragma tabsize 0
#define COLOR_YELLOW 0xFFFF00AA
#define COLOR_LIGHTGREEN 0x38FF06FF
#define COLOR_LIGHTBLUE 0x91C8FF
#define COLOR_GREEN 0x66CC99AA
#define COLOR_RED 0xFF0000AA
//===============================NEWS Y MAS=====================================
new str[128], pname[MAX_PLAYER_NAME]; // Creacion de str y pname, para no crearlos constantemente.
new archivo[256]; // Creacion del string "archivo", donde almacenaremos la informaciуn.
enum pInfo //Array donde se guardara la info del jugador!
{
Registrado,
Logueado,
Baneado,
Admin,
};
new aInfo[MAX_PLAYERS][pInfo]; // Variable que incluye todos los datos del jugador
#define Users "TuMamaSystem/%s.ini" //Carpeta donde se guardaran los archivos dentro de scriptfiles!
forward SpawnKick(playerid);
forward MessageToAdmins(color,const string[]);
public OnFilterScriptInit()
{
print("----------------------------------------");
print("---Sistema de Login&Registro by rooT.---");
print("-----------------Loaded-----------------");
print("----------------------------------------");
return 1;
}
public OnFilterScriptExit()
{
print("----------------------------------------");
print("---Sistema de Login&Registro by rooT.---");
print("----------------Unloaded----------------");
print("----------------------------------------");
return 1;
}
public OnPlayerConnect(playerid)
{
//Seteamos todos los valores a 0, ya que quedan "guardados" los del jugador anterior.
aInfo[playerid][Registrado] = 0;
aInfo[playerid][Logueado] = 0;
aInfo[playerid][Admin] = 0;
aInfo[playerid][Baneado] = 0;
GetPlayerName(playerid, pname, sizeof(pname)); //Obtenemos el nombre del jugador y lo guardamos en la variable pname.
format(archivo, sizeof(archivo), Users, udb_encode(pname)); // Con el nombre del jugador, le damos "nombre" al string "archivo".
if(!dini_Exists(archivo)) // Si el archivo PLAYERNAME.ini no existe...
{
format(str, sizeof(str), "Bienvenido %s! Tu cuenta no esta registrada! Utiliza /registrar para registrarla!", pname); // Le damos formato a la string "str" con un texto.
SendClientMessage(playerid, COLOR_YELLOW, str); // Enviamos el texto al jugador.
aInfo[playerid][Registrado] = 0; // Indicamos que este jugador no esta registrado.
}
else //En caso de que el archivo PLAYERNAME.ini SI exista...
{
format(str, sizeof(str), "Bienvenido %s! Utiliza /login para ingresar a tu cuenta", pname); // Le damos formato a la string "str" con un texto.
SendClientMessage(playerid, COLOR_LIGHTGREEN, str); // Enviamos el texto al jugador.
aInfo[playerid][Registrado] = 1; // Indicamos que este jugador esta registrado.
}
format(str, sizeof(str), "%s Ingreso al servidor!", pname); //Damos formato a "str"...
SendClientMessageToAll(COLOR_LIGHTGREEN, str); // y la enviamos a todos los jugadores conectados.
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
switch(reason)
{
case 0: format(str, sizeof(str), "%s dejo el servidor. (Crash)", pname); //Si el jugador se desconecto por un crash
case 1: format(str, sizeof(str), "%s dejo el servidor. (Salio)", pname); //Si se desconecto por haber salido.
case 2: format(str, sizeof(str), "%s dejo el servidor. (Kickeado/Baneado)", pname); // Si se desconecto a causa de las funciones kick/ban.
}
SendClientMessageToAll(COLOR_GREEN, str); // Enviamos la razon a los jugadores.
GetPlayerName(playerid, pname, sizeof(pname)); //Guardamos el nombre del player en la variable pname
format(archivo, sizeof(archivo), Users, udb_encode(pname)); // Damos formato a "archivo"
// Guardamos los datos del jugador en su archivo!
dini_IntSet(archivo, "Admin", aInfo[playerid][Admin]);
dini_IntSet(archivo, "Baneado", aInfo[playerid][Baneado]);
return 1;
}
public OnPlayerSpawn(playerid)
{
if(aInfo[playerid][Registrado] == 0) // Si el jugador no esta registrado
{
format(str, sizeof(str), "Tienes 60 segundos para registrarte o seras kickeado!"); // Damos formato a str.
SendClientMessage(playerid, COLOR_LIGHTGREEN, str); // Enviamos str al jugador.
format(str, sizeof(str), "Utiliza /registrar para hacerlo"); // Damos formato a str
SendClientMessage(playerid, COLOR_LIGHTBLUE, str); // Enviamos str al jugador
SetTimerEx("SpawnKick", 60000, 0, "i", playerid); // Creamos el timer de un minuto
TogglePlayerControllable(playerid, 0); // Frezeamos al jugador.
return 0;
}
if(aInfo[playerid][Logueado] == 0)
{
format(str, sizeof(str), "Tienes 60 segundos para loguear o seras kickeado!"); // Damos formato a str
SendClientMessage(playerid, COLOR_LIGHTGREEN, str); // Enviamos str al jugador
format(str, sizeof(str), "Utiliza /login para hacerlo"); // Damos formato a str
SendClientMessage(playerid, COLOR_LIGHTBLUE, str); // Enviamos str al jugador
SetTimerEx("SpawnKick", 60000, 0, "i", playerid); // Creamos el timer de un minuto
TogglePlayerControllable(playerid, 0); // Frezeamos al jugador.
return 0;
}
return 1;
}
CMD:registrar(playerid, params[])
{
new WAZAA[24]; // String que almacena hasta 24 caracteres.
GetPlayerName(playerid, pname, sizeof(pname)); // Obtenemos el nombre del jugador
format(archivo, sizeof(archivo), Users, udb_encode(pname)); // Damos formato a "archivo"
format(WAZAA, sizeof(WAZAA), "%s", params); // Damos formato a "WAZAA" con el valor de "params"
if(aInfo[playerid][Registrado] == 1) return SendClientMessage(playerid, COLOR_YELLOW, "Esta cuenta esta registrada! Utiliza /login para ingresar"); // En caso de que el jugador ya este registrado-
if(strlen(WAZAA) > 4 && strlen(WAZAA) < 24) // Si WAZAA es mayor a 4 / Menor a 24
{
dini_Create(archivo); // Creacion del archivo PLAYERNAME.ini
dini_IntSet(archivo, "pass", udb_hash(WAZAA)); // Guardamos la password con un hash, para que no sea "visible".
dini_IntSet(archivo, "Admin", 0); // Indicamos que el jugador no es admin.
dini_IntSet(archivo, "Baneado", 0); // Indicamos que el jugador no esta baneado.
format(str, sizeof(str), "[rAdmin] Registraste el nombre %s bajo la contraseсa %s. Fuiste logueado automaticamente!", pname, WAZAA); // Damos formato a str con el nombre de la cuenta, la contraseсa y le informamos que quedo automaticamente logueado.
SendClientMessage(playerid, COLOR_LIGHTGREEN, str); // Enviamos str.
aInfo[playerid][Logueado] = 1; // Indicamos que el jugador esta logueado.
aInfo[playerid][Registrado] = 1; // Indicamos que el jugador esta registrado.
TogglePlayerControllable(playerid, 1); // Le damos movilidad al jugador (por si ya habia spawneado y estaba frezeado)
}
else return SendClientMessage(playerid, COLOR_RED, "Su contraseсa debe tener entre 4 & 24 caracteres!"); // En caso de que la pass tenga menos de 4 caraceters/mas de 24, va a dar error.
return 1;
}
CMD:login(playerid, params[])
{
GetPlayerName(playerid, pname, sizeof(pname)); //Obtenemos el nombre del player.
format(archivo, sizeof(archivo), Users, udb_encode(pname));//Damos formato a archivo.
if(aInfo[playerid][Registrado] == 0) return SendClientMessage(playerid, COLOR_YELLOW, "Esta cuenta no esta registrada! Utiliza /registrar para registrarla!");// Si el jugador no esta registrado
if(aInfo[playerid][Logueado] == 1) return SendClientMessage(playerid, COLOR_YELLOW, "Ya estas logueado!");// Si el jugador ya esta logueado
if(isnull(params)) return SendClientMessage(playerid, COLOR_RED, "Uso: /login <password>");// Si no indico su pass.
new tmp; // creamos tmp, donde se va a almacenar la pass del archivo.
tmp = dini_Int(archivo, "pass"); //almacenamos la pass
if(udb_hash(params) != tmp) //comparamos, y si es distinta:
{
format(str, sizeof(str), "La contraseсa que ingresaste es incorrecta!"); //damos formato a str
SendClientMessage(playerid, COLOR_RED, str);// enviamos str al jugador
}
else // si la pass indicada es la correcta:
{
aInfo[playerid][Admin] = dini_Int(archivo, "Admin"); // Guardamos el nivel de Admin del archivo en la variable.
aInfo[playerid][Baneado] = dini_Int(archivo, "Baneado"); // Guardamos el valor de "Baneado" del archivo en la variable.
aInfo[playerid][Logueado] = 1; // Indicamos que el jugador esta logueado
if(aInfo[playerid][Baneado] == 1) // Si el jugador esta baneado
{
SendClientMessage(playerid, COLOR_RED, "Estas baneado en el servidor!"); // Le enviamos un mensaje
return Kick(playerid); // Lo kickeamos.
}else{ // Si no esta baneado
if(aInfo[playerid][Admin] > 0) //Si su nivel de admin es mayor a 0
{
format(str, sizeof(str), "Bienvenido %s! Admin Level: %d.! Utiliza /acmds para ver tus comandos de administracion!", pname, aInfo[playerid][Admin]); // Formateamos str con los datos del nombre, nivel, etc.
SendClientMessage(playerid, COLOR_LIGHTGREEN, str); //Enviamos el str
SendClientMessage(playerid, COLOR_RED, "[rAdmin] Logueado satisfactoriamente!"); // Informamos que ha sido logueado.
}
else //Si su nivel de admin no es mayor a 0
{
format(str, sizeof(str), "Bienvenido %s! Utiliza /comandos para ver los comandos disponibles!", pname); //Damos formato a str con el nombre del jugador.
SendClientMessage(playerid, COLOR_YELLOW, str); //Enviamos el str.
SendClientMessage(playerid, COLOR_RED, "[rAdmin] Logueado satisfactoriamente!"); // Informamos que ha sido logueado.
}
TogglePlayerControllable(playerid, 1);} //Unfezeamos al jugador (por si spawneo antes de loguearse)
}
return 1;
}
CMD:kick(playerid, params[])
{
new playerid2, pname2[MAX_PLAYER_NAME], reason[128]; // Creamos las variables necesarias
if(aInfo[playerid][Admin] >= 1) //Si el nivel de admin del jugador es mayor a 0
{
GetPlayerName(playerid, pname, sizeof(pname)); //Guardamos su nombre en pname
if(isnull(params)) return SendClientMessage(playerid, COLOR_RED, "Uso: /kick <playerid> <razon>"); //Si no hay params
if(!sscanf(params, "rs", playerid2, reason)) //Si los params son correctos
{
if(!IsPlayerConnected(playerid2)) return SendClientMessage(playerid, COLOR_RED, "ID Incorrecto."); //Si el jugador no esta conectado
if(aInfo[playerid2][Admin] > aInfo[playerid][Admin]) return SendClientMessage(playerid, COLOR_RED, "Imposible afectar a un admin de mayor nivel!"); //Si el nivel del playerid es menor al del jugador a kickear
GetPlayerName(playerid2, pname2, sizeof(pname2)); //Guardamos el nombre del playerid2 en pname2.
format(str, sizeof(str), "El jugador %s [ID: %d] fue kickeado por el administrador %s ~ Razon: %s", pname2, playerid2, pname, reason); //Formateamos str
SendClientMessageToAll(COLOR_YELLOW, str); //Enviamos str a todos
Kick(playerid2); //Kickeamos al jugador.
}
SendClientMessage(playerid, COLOR_RED, "Uso: /kick <playerid> <razon>"); //Si los params no estan
}
else return SendClientMessage(playerid, COLOR_RED, "Este comando es solo para Admins"); //Si no es admin
return 1;
}
CMD:ban(playerid, params[])
{
new playerid2, pname2[MAX_PLAYER_NAME], reason[128]; //Creamos variables necesarias.
if(aInfo[playerid][Admin] >= 1)// Si el nivel de admin del player es mayor o igual a 1
{
GetPlayerName(playerid, pname, sizeof(pname)); //Obtenemos el nombre del admin
if(!sscanf(params, "rs", playerid2, reason)) //Si los params estan completos
{
if(!IsPlayerConnected(playerid2)) return SendClientMessage(playerid, COLOR_RED, "ID Incorrecto."); //Si el jugador no esta conectado
if(aInfo[playerid2][Admin] > aInfo[playerid][Admin]) return SendClientMessage(playerid, COLOR_RED, "Imposible afectar a un admin de mayor nivel!"); //Si el nivel del jugador es mayor al del que intenta kickearlo
GetPlayerName(playerid2, pname2, sizeof(pname2)); //Obtenemos el nombre del jugador
format(str, sizeof(str), "El jugador %s [ID: %d] fue baneado por el administrador %s ~ Razon: %s", pname2, playerid2, pname, reason); //Damos formato a str
SendClientMessageToAll(COLOR_YELLOW, str); //La enviamos a todos
aInfo[playerid2][Baneado] = 1; //Seteamos que el jugador esta baneado
BanEx(playerid2, reason); //Baneamos la IP del jugador (samp.ban)
}
SendClientMessage(playerid, COLOR_RED, "Uso: /ban <playerid> <razon>"); //Si los params no estan completos
}
else return SendClientMessage(playerid, COLOR_RED, "Este comando es solo para Admins"); //Si no es admin
return 1;
}
public SpawnKick(playerid)
{
if(aInfo[playerid][Registrado] == 0 || aInfo[playerid][Logueado] == 0)
{
SendClientMessage(playerid, COLOR_RED, "[rAdmin] Fuiste kickeado por no registrarte/loguearte en los primeros 60 segundos!");
Kick(playerid);
}
return 1;
}