17.06.2010, 22:59
(
Последний раз редактировалось TheChaoz; 21.05.2012 в 03:24.
Причина: Added Tag
)
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
2є Paso la definicion de dcmd
3є Paso definicion de los colores que usaremos para facilitar el uso de los mismos y dos arrays
4є Paso Creacion de arrays para almacenar los datos del jugador
5є Paso Empezaremos con la definicion los comandos
6є Paso Los comandos en si, es decir las funciones de cada uno y su respectivo codigo
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
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
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
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.
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;
}
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");
}