[Tutorial] Crea tu sistema de Administracion! [Dini, SSCANF & zCMD]
#1

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.

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[]);
Ahora que tenemos eso, podemos hacer la parte mas linda del script: los creditos!

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;
}
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!

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;
}
Ahora viene OnPlayerDisconnect :B


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;
}
Ahora viene OnPlayerSpawn, pondremos un timer que le dara al jugador 1 minuto para loguearse/registrarse o sera kickeado. :B

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;
}
Hasta aca tenemos todo bien, no deberнan tener ningъn error.
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;
}
Hasta acб venimos bien por lo que veo, ahora vienen el /login, /ban, y /kick.

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;
}
Ahora el SpawnKick!

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;
}
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:

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;
}
Reply
#2

MUY bueno, gracias por el aporte...

...lo usarй ...

Un momento...

pawn Код:
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 ((Te olvidaste de ponerle //))
    {
        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;
}
**EDIT**

Me reн mucho con lo de "TuMamaSystem" LOL
Reply
#3

Listo Edu, justo estaba arreglando eso. En el post principal ya fue arreglado!
Reply
#4

Quote:
Originally Posted by leaNN!
Посмотреть сообщение
Listo Edu, justo estaba arreglando eso. En el post principal ya fue arreglado!
Bello, bello, pero, їes para 0.3c? es que lo estoy usando en 0.3d y no sale nada

PL0X: El SAM[P]CE me crashea cuando trato de abrirlo lol
Reply
#5

Es para 0.3c hasta donde se, en 0.3d no lo probe, y hasta que no haya una versiуn estable, voy a seguir haciendo las cosas para el 0.3c .
SAM[P]CE? que es eso? Y cuando tratas de abrir que? No entendi xD
Reply
#6

Quote:
Originally Posted by leaNN!
Посмотреть сообщение
Es para 0.3c hasta donde se, en 0.3d no lo probe, y hasta que no haya una versiуn estable, voy a seguir haciendo las cosas para el 0.3c .
SAM[P]CE? que es eso? Y cuando tratas de abrir que? No entendi xD

Spam en tu topic xD

Si no sabes lo que es, usa este link, crashea cuando trato de abrir tu script
Reply
#7

Crashea cuando intentas compilarlo? What da faq .
Prueba con pawno, yo siempre uso pawno y me funciona de 10 puntos xD.
No sabria darte soporte sobre el SAM[P]CE, nunca lo use y por ahora no creo usarlo :B.
Reply
#8

solo un par de correcciones:
# pInfo no es un array es un enum
# їPor quй 256 cells para archivo?
# їQuй pasaria si en OnGameModeInit, el archivo no existe? (Crash)
#(CBK OnPlayerSpawn) їPor quй formateas un texto que podes enviar directamente?
#(CMD registrar) "WAZA" nunca tendra una longitud mayor a 24 caracteres debido al format.
#(CMD registrar) El chequeo de si esta o no registado, deberias realizarlo antes de crear las variables y hacer todo lo que haces antes.
#(CMD registrar) їPor quй no trabajar directamente con "params"? їQuй funcion cumple "WAZA"?
#(CMD registrar) їPor quй no realizar todos los formateos, obtener el nombre del jugador, y demas luego de sabes si la contraseсa es o no valida (longitud correcta) ?
#(CMD login) їPor quй no realizar los formateos luego de los chequeos (si esta registrado, logueado, si los parametros no son nulos)?
#(CMD login) їQuй funcion cumple tmp? їPor quй no usar directamente Dini_Int en el chequeo?
#(CMD kick)isnull esta completamente de mas, sscanf realiza ese chequeo automaticamente, y si los parametros no coinciden o son nulos devuelve verdadero.
#(CMD kick & ban)Siempre va a terminar con "Uso: /kick <playerid> <razon>", ya que te olvidaste el "else" o "return"
#(spawnkick) їY cuбndo lo kickea? solo le manda el mensaje xD
# їY ese "forward MessageToAdmins(...);"?

Recomendaciones:
#їPor quй no chequeas si esta baneado al ingresar? (En vez de cuando se loguea)
#Elimina baneado, realiza los chequeos directamente desde el archivo, esa variable no tendria que existir.
#Se podria optimizar mas cambiando varios else x returns bien colocados.
Reply
#9

Uh vos sos como MrDeath, trollean todo ¬ asjaja.
Lo de pInfo es cierto, pifie ahi.

Porque vengo usando 256 desde que empece a usar Dini, intente dejarlo y de a poco voy pudiendo, pero es la costumbre.

Esto no lo entendi.

Sinceramente, no se. Me di cuenta de eso cuando lo iba haciendo pero no se, en algunos casos me parece mas lindo usar format que SendClientMessage directo JAJAAJJA.

Hm, es cierto, eso no lo pense.

Buen punto, se ahorraria algo de memoria.

No use params directamente porque algunas veces he tenido problemas usando params directo (no me preguntes porque, ya que nunca pude descubrirlo), entonces prefiero hacer un format con otro string.

Buen punto, se ahorraria algo de memoria.

Buen punto, se ahorraria algo de memoria.

Buen punto, se ahorraria algo de memoria.

Buen punto, eso lo fui sacando en algunos lados a medida que lo vi, pero en este caso no lo vi xD.

Ooooooooooh, es cierto. De ahi a que me siga dando los mensajes xD!

JAJAJAJAJAJAJAAJAJAJ AJAJAJAJAJAAJJAJAJAAJJAJA DIOS MIO, ahi esta el tema de que no funcione. Ahi lo agreguй.

Es para el AdminChat, y para el "Lector de Comandos".

||||||||||||||||||||||||||||||||||||||

Nose, para darle la oportunidad de leer el chat (? ajaja. En el update cambio eso.

Ok, cuando updatйe lo arreglo!

Vos sabes que de optimizacion no entiendo mucho, yo hago scripts que funcionen nada mas ajajaa.
Reply
#10

dentro de OnPlayerDisconnect seteas valores a un archivo, el cual de no existir crasheara el servidor.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)