[Tutorial] Crear sistema de administracion con registro y pequeсo anticheat
#1

Bueno como mi post numero 1000 se me ocurrio hacer algo lindo pero util, asi q despues de un rato de pensar, se me ocurrio hacer este tutorial, en el cual

explicare paso a paso como crear un sistema de administracion, relativamente sensillo, el cual tendra un sistema de registro por dialogos y varios comandos

utiles, ademas de un pequeсo sistema de anti-cheat(dinero y armas)

Lo que necesitaremos para nuesto FS.
•el pawno
•conocimientos basicos sobre pawn, ya que no se explicaran todas las funciones usadas.
dudb (include) por DracoBlue
DUtils por DracoBlue (neesario para el dudb)
DINI por DracoBlue (neesario para el dudb)
•ganas de leer y trabajar un poquito:P

bueno, una vez q tenemos todo esto, manos a la obra:

1є Paso los includes
pawn Код:
//arriba del todo
#include <a_samp>
#include <dudb>
#pragma unused ret_memcpy
2є Paso la definicion de dcmd
pawn Код:
//debajo de los includes
#define dcmd(%1,%2,%3) if (!strcmp((%3)[1], #%1, true, (%2)) && ((((%3)[(%2) + 1] == '\0') && (dcmd_%1(playerid, ""))) || (((%3)[(%2) + 1] == ' ') && (dcmd_%1

(playerid, (%3)[(%2) + 2]))))) return 1
3є Paso definicion de los colores que usaremos para facilitar el uso de los mismos y dos arrays
pawn Код:
//debajo de la definicion de dcmd
#define COLOR_ROJO 0xFF0000AA
#define COLOR_BLANCO 0xFFFFFFAA
#define COLOR_AZUL 0x004FD8F6
#define COLOR_NARANJA 0xFF9900AA
#define COLOR_AMARILLO 0xF6F600F6
#define COLOR_VERDE 0x33AA33AA
#define COLOR_GRIS 0xAFAFAFAA
//dialogos
#define REGISTRO 0
#define LOGIN 1
//modos de spec
#define ADMIN_SPEC_TYPE_NONE 0
#define ADMIN_SPEC_TYPE_PLAYER 1
#define ADMIN_SPEC_TYPE_VEHICLE 2
4є Paso Creacion de arrays para almacenar los datos del jugador
pawn Код:
enum Datos //crea un array de variables.
{
  registrado,
  logueado,
  asesinatos,
  muertes,
  dinero,
  congelado,
  callado,
  mirandoID,
  nivel,
  SpecType,
}

new pInfo[MAX_PLAYERS][Datos]; //Datos puede tomar cualquier variable de las anteriormente definidas.
5є Paso Empezaremos con la definicion los comandos
pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
  //definimos los comandos que usaremos
  //dcmd(comando, 7, cmdtext): dcmd(nombre del comando, largo del nombre, cmdtext).
  dcmd(ban, 3, cmdtext);
  dcmd(mirar, 5, cmdtext);
  dcmd(callar, 6, cmdtext);
  dcmd(nomirar, 7, cmdtext);
  dcmd(darvida, 7, cmdtext);
  dcmd(darnivel, 8, cmdtext);
  dcmd(expulsar, 8, cmdtext);
  dcmd(congelar, 8, cmdtext);
  dcmd(ingresar, 8, cmdtext);
  dcmd(registrar, 9, cmdtext);
  dcmd(darchaleco, 10, cmdtext);
  dcmd(limpiarchat, 11, cmdtext);
  return 0;
}
6є Paso Los comandos en si, es decir las funciones de cada uno y su respectivo codigo
pawn Код:
dcmd_ban(playerid, params[]){
  if(pInfo[playerid][nivel] >= 4 || IsPlayerAdmin(playerid)){//restriccion para que solo los admins de nivel 4 o superior puedan usar el comando
    new tmp[256], tmp2[256], Index;//arrays
    tmp = strtok(params, Index);//tomara el 1 valor del comando, es decir la id del jugador
    tmp2 = strtok(params, Index);//tomara el 2 valor del comando, es decir la razon del ban
    if(!strlen(params) || !IsNumeric(tmp))return SendClientMessage(playerid, COLOR_BLANCO, "USO: /ban <playerid> <razуn>");//comprobamos que hayan igresado los argumentos, y que la id sea un numero.
    if(!strlen(tmp2))return SendClientMessage(playerid, COLOR_ROJO, "ERROR: Debes ingresar una razуn");
    new jugador, name[MAX_PLAYER_NAME], admin[MAX_PLAYER_NAME], str[128]; //arrays que usaremos para almacenar nombres, la id del jugador y un mensaje
    jugador = strval(tmp);//jugador =valor de tmp es decir la id.
    if(IsPlayerConnected(jugador) || jugador != INVALID_PLAYER_ID){ //restriccion para saber si el jugador que se quiere banear esta conectado o no, y si la id es valida
      if(pInfo[jugador][nivel] < pInfo[playerid][nivel] || !IsPlayerAdmin(jugador)){ //restriccion para saber si el jugador que se quiere banear posee un nivel de admin mayor o es admin RCON
        GetPlayerName(jugador, name, sizeof(name));
        GetPlayerName(playerid, admin, sizeof(admin));
        if(pInfo[jugador][registrado] == 1 && pInfo[jugador][logueado] == 1){//si el jugador esta registrado, entonces tambien baneamos su cuenta
          dUserSetINT(name).("Baneado",1);
        }
        format(str, sizeof(str), "El administrador %s ha baneado a %s [Razуn: %s]", admin, name, params[2]);
        SendClientMessageToAll(COLOR_GRIS, str);
        format(str, sizeof(str), "Has sido baneado por el administrador %s, [Razуn: %s]", admin, params[2]);
        return BanEx(jugador, str);
      }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No puedes usar este comando sobre este jugador");
    }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: El jugador no esta conectado o la id no es correcta");
  }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No posees el nivel suficiente para usar este comando");
}

dcmd_mirar(playerid, params[]){
  if(pInfo[playerid][nivel] >= 5 || IsPlayerAdmin(playerid)){
    new tmp[256], Index;
    tmp = strtok(params, Index);
    if(!strlen(params))return SendClientMessage(playerid, COLOR_BLANCO, "USO: /mirar <playerid>");
    new jugador;
    jugador = strval(tmp);
    if(IsPlayerConnected(jugador) || jugador != INVALID_PLAYER_ID){
      if(pInfo[jugador][nivel] < pInfo[playerid][nivel] || !IsPlayerAdmin(jugador)){
        if(pInfo[jugador][mirandoID] == -1){
          return StartSpectate(playerid, jugador);
        }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: Este jugador ya esta espectando a alguien");
      }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No puedes usar este comando sobre este jugador");
    }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: El jugador no esta conectado o la id no es correcta");
  }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No posees el nivel suficiente para usar este comando");
}

dcmd_callar(playerid, params[]){
  if(pInfo[playerid][nivel] >= 1 || IsPlayerAdmin(playerid)){
    new tmp[256], tmp2[256], Index;
    tmp = strtok(params, Index);
    tmp2 = strtok(params, Index);
    if(!strlen(params) || !IsNumeric(tmp))return SendClientMessage(playerid, COLOR_BLANCO, "USO: /callar <playerid> opcional <razуn>");
    new jugador, name[MAX_PLAYER_NAME], admin[MAX_PLAYER_NAME], str[128];
    jugador = strval(tmp);
    if(IsPlayerConnected(jugador) || jugador != INVALID_PLAYER_ID){
      if(pInfo[jugador][nivel] < pInfo[playerid][nivel] || !IsPlayerAdmin(jugador)){
        GetPlayerName(jugador, name, sizeof(name));
        GetPlayerName(playerid, admin, sizeof(admin));
        if(pInfo[jugador][callado] == 0){
          if(!strlen(tmp2)){
            format(str, sizeof(str), "El administrador %s ha callado a %s. [Razуn: No ha dado]", admin, name);
          }else{
            format(str, sizeof(str), "El administrador %s ha callado a %s. [Razуn: %s]", admin, name, params[2]);
          }
          SendClientMessageToAll(COLOR_GRIS, str);
          return pInfo[jugador][callado] = 1;
        }
        else{
          format(str, sizeof(str), "El administrador %s le ha permitido hablar a %s.", admin, name);
          pInfo[jugador][callado] = 0;
          return SendClientMessageToAll(COLOR_GRIS, str);
        }
      }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No puedes usar este comando sobre este jugador");
    }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: El jugador no esta conectado o la id no es correcta");
  }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No posees el nivel suficiente para usar este comando");
}

dcmd_nomirar(playerid, params[]){
  #pragma unused params
  if(pInfo[playerid][nivel] >= 1 || IsPlayerAdmin(playerid)){
    if(pInfo[playerid][mirandoID] != 0){
      StopSpectate(playerid);
      pInfo[playerid][mirandoID] = -1;
      return 1;
    }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No estas spectando");
  }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No posees el nivel suficiente para usar este comando");
}

dcmd_darnivel(playerid, params[]){
  if(pInfo[playerid][nivel] >= 5 || IsPlayerAdmin(playerid)){
    new tmp[256], tmp2[256], Index;
    tmp = strtok(params, Index);
    tmp2 = strtok(params, Index);
    if(!strlen(tmp) || !strlen(tmp2) || !IsNumeric(tmp) || !IsNumeric(tmp2))return SendClientMessage(playerid, COLOR_BLANCO, "USO: /darnivel <playerid> <nivel>");
    new jugador, Nivel, name[MAX_PLAYER_NAME], admin[MAX_PLAYER_NAME], str[128];
    jugador = strval(tmp);
    Nivel = strval(tmp2);
    if(IsPlayerConnected(jugador) || jugador != INVALID_PLAYER_ID){
      if(pInfo[jugador][nivel] < pInfo[playerid][nivel] || !IsPlayerAdmin(jugador)){
        if(Nivel <= pInfo[playerid][nivel]){
          GetPlayerName(jugador, name, sizeof(name));
          GetPlayerName(playerid, admin, sizeof(admin));
          format(str, sizeof(str), "El administrador %s ha seteado tu nivel a %d.", admin, Nivel);
          SendClientMessage(jugador, COLOR_AMARILLO, str);
          pInfo[jugador][nivel] = Nivel;
          return 1;
        }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No puedes dar un nivel mayor al tuyo");
      }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No puedes usar este comando sobre este jugador");
    }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: El jugador no esta conectado o la id no es correcta");
  }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No posees el nivel suficiente para usar este comando");
}

dcmd_darvida(playerid, params[]){
  if(pInfo[playerid][nivel] >= 1 || IsPlayerAdmin(playerid)){
    new tmp[256], tmp2[256], Index;
    tmp = strtok(params, Index);
    tmp2 = strtok(params, Index);
    if(!strlen(tmp) || !strlen(tmp2) || !IsNumeric(tmp) || !IsNumeric(tmp2))return SendClientMessage(playerid, COLOR_BLANCO, "USO: /darvida <playerid> <vida>");
    new jugador, vida, name[MAX_PLAYER_NAME], admin[MAX_PLAYER_NAME], str[128];
    jugador = strval(tmp);
    vida = strval(tmp2);
    if(IsPlayerConnected(jugador) || jugador != INVALID_PLAYER_ID){
      if(pInfo[jugador][nivel] < pInfo[playerid][nivel] || !IsPlayerAdmin(jugador)){
        GetPlayerName(jugador, name, sizeof(name));
        GetPlayerName(playerid, admin, sizeof(admin));
        format(str, sizeof(str), "El administrador %s ha seteado tu vida a %d.", admin, vida);
        SendClientMessage(jugador, COLOR_AMARILLO, str);
        return SetPlayerHealth(jugador, vida);
      }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No puedes usar este comando sobre este jugador");
    }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: El jugador no esta conectado o la id no es correcta");
  }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No posees el nivel suficiente para usar este comando");
}

dcmd_expulsar(playerid, params[]){
  if(pInfo[playerid][nivel] >= 1 || IsPlayerAdmin(playerid)){
    new tmp[256], tmp2[256], Index;
    tmp = strtok(params, Index);
    tmp2 = strtok(params, Index);
    if(!strlen(params) || !IsNumeric(tmp))return SendClientMessage(playerid, COLOR_BLANCO, "USO: /expulsar <playerid> opcional <razуn>");
    new jugador, name[MAX_PLAYER_NAME], admin[MAX_PLAYER_NAME], str[128];
    jugador = strval(tmp);
    if(IsPlayerConnected(jugador) || jugador != INVALID_PLAYER_ID){
      if(pInfo[jugador][nivel] < pInfo[playerid][nivel] || !IsPlayerAdmin(jugador)){
        GetPlayerName(jugador, name, sizeof(name));
        GetPlayerName(playerid, admin, sizeof(admin));
        if(!strlen(tmp2)){//si no hay razon, entonces....
          format(str, sizeof(str), "El administrador %s ha kickeado a %s. [Razуn: No ha dado]", admin, name);
        }else{//si no...
          format(str, sizeof(str), "El administrador %s ha kickeado a %s. [Razуn: %s]", admin, name, params[2]);
        }
        SendClientMessageToAll(COLOR_GRIS, str);
        return Kick(jugador);
      }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No puedes usar este comando sobre este jugador");
    }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: El jugador no esta conectado o la id no es correcta");
  }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No posees el nivel suficiente para usar este comando");
}

dcmd_congelar(playerid, params[]){
  if(pInfo[playerid][nivel] >= 1 || IsPlayerAdmin(playerid)){
    new tmp[256], tmp2[256], Index;
    tmp = strtok(params, Index);
    tmp2 = strtok(params, Index);
    if(!strlen(params) || !IsNumeric(tmp))return SendClientMessage(playerid, COLOR_BLANCO, "USO: /congelar <playerid> opcional <razуn>");
    new jugador, name[MAX_PLAYER_NAME], admin[MAX_PLAYER_NAME], str[128];
    jugador = strval(tmp);
    if(IsPlayerConnected(jugador) || jugador != INVALID_PLAYER_ID){
      if(pInfo[jugador][nivel] < pInfo[playerid][nivel] || !IsPlayerAdmin(jugador)){
        GetPlayerName(jugador, name, sizeof(name));
        GetPlayerName(playerid, admin, sizeof(admin));
        if(pInfo[jugador][congelado] == 0){
          if(!strlen(tmp2)){
            format(str, sizeof(str), "El administrador %s ha congelado a %s. [Razуn: No ha dado]", admin, name);
          }else{
            format(str, sizeof(str), "El administrador %s ha congelado a %s. [Razуn: %s]", admin, name, params[2]);
          }
          SendClientMessageToAll(COLOR_GRIS, str);
          pInfo[jugador][congelado] = 1;
          return TogglePlayerControllable(jugador, 0);
        }
        else{
          format(str, sizeof(str), "El administrador %s ha descongelado a %s.", admin, name);
          SendClientMessageToAll(COLOR_GRIS, str);
          pInfo[jugador][congelado] = 0;
          return TogglePlayerControllable(jugador, 1);
        }
      }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No puedes usar este comando sobre este jugador");
    }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: El jugador no esta conectado o la id no es correcta");
  }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No posees el nivel suficiente para usar este comando");
}

dcmd_ingresar(playerid, params[]){
  #pragma unused params
  new name[MAX_PLAYER_NAME];
  GetPlayerName(playerid, name, sizeof(name));
  if(pInfo[playerid][logueado] == 1) return SendClientMessage(playerid, COLOR_ROJO, "ERROR: Ya estas registrado y logueado");
  if(!udb_Exists(name))
  {
    SendClientMessage(playerid, COLOR_ROJO, "ERROR: La cuenta no existe, por favor usa");
    return SendClientMessage(playerid, COLOR_ROJO, "/register para poder registrarla");
  }
  return ShowPlayerDialog(playerid, LOGIN, 1, "Login", "Ingresa la contraseсa para loguearte con esta cuenta", "Aceptar", "Cancelar");
}

dcmd_registrar(playerid, params[]){
  #pragma unused params
  new name[MAX_PLAYER_NAME];
  GetPlayerName(playerid, name, sizeof(name));
  if(pInfo[playerid][logueado] == 1) return SendClientMessage(playerid, COLOR_ROJO, "ERROR: Ya estas registrado y logueado");
  if(udb_Exists(name)){
    SendClientMessage(playerid, COLOR_ROJO, "ERROR: La cuenta ya esta registrada, por favor usa");
    return SendClientMessage(playerid, COLOR_ROJO, "/login para poder loguearte");
  }
  return ShowPlayerDialog(playerid, REGISTRO, 1, "Registro", "Ingresa la contraseсa para registrar tu cuenta", "Aceptar", "Cancelar");
}

dcmd_darchaleco(playerid, params[]){
  if(pInfo[playerid][nivel] >= 1 || IsPlayerAdmin(playerid)){
    new tmp[256], tmp2[256], Index;
    tmp = strtok(params, Index);
    tmp2 = strtok(params, Index);
    if(!strlen(tmp) || !strlen(tmp2) || !IsNumeric(tmp) || !IsNumeric(tmp2))return SendClientMessage(playerid, COLOR_BLANCO, "USO: /darchaleco <playerid> <chaleco>");
    new jugador, chaleco, name[MAX_PLAYER_NAME], admin[MAX_PLAYER_NAME], str[128];
    jugador = strval(tmp);
    chaleco = strval(tmp2);
    if(IsPlayerConnected(jugador) || jugador != INVALID_PLAYER_ID){
      if(pInfo[jugador][nivel] < pInfo[playerid][nivel] || !IsPlayerAdmin(jugador)){
        GetPlayerName(jugador, name, sizeof(name));
        GetPlayerName(playerid, admin, sizeof(admin));
        format(str, sizeof(str), "El administrador %s ha seteado tu chaleco a %d.", admin, chaleco);
        SendClientMessage(jugador, COLOR_AMARILLO, str);
        return SetPlayerArmour(jugador, chaleco);
      }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No puedes usar este comando sobre este jugador");
    }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: El jugador no esta conectado o la id no es correcta");
  }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No posees el nivel suficiente para usar este comando");
}

dcmd_limpiarchat(playerid, params[]){
  #pragma unused params //con esto indicamos que no usaremos los parametros.
  if(pInfo[playerid][nivel] >= 1 || IsPlayerAdmin(playerid)){
    for(new i=0; i<60; i++){//creamos un loop o bucle que toma todos los valores de 0 a 60.
      for(new p=0; p<MAX_PLAYERS; p++){//creamos un loop o bucle que toma todos los valores de los jugadores
        if(IsPlayerConnected(p)){
          if(pInfo[p][nivel] == 0 || !IsPlayerAdmin(p)){//si el jugador p esta conectado, y no es admin, entonces...
            SendClientMessage(p, COLOR_BLANCO, " ");
          }
        }
      }
    }
    return 1;
  }else return SendClientMessage(playerid, COLOR_ROJO, "ERROR: No posees el nivel suficiente para usar este comando");
}
Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 2 Guest(s)