El siguiente plugin muestra como mediante un archivo .ini se pueden proteger y/o registrar nicks y pw para que nadie mas los use
Aclaro que no es como el tutorial/plugin que armo L//, este plugin usa un archivo .ini, donde "el dueño del server" pone los nicks y las pw para proteger los nicks, no permite que se registren dentro del juego o sea, solo se puede modificando el archivo y tampoco se puede cambiar de nicks, para evitar problemas.
Por ahi el plugin no lo use nadie que es lo que creo, pero me tome el trabajo de hacerlo como un tutorial explicando funciones y demas.. asi como tambien pueden saber como sacar los datos de un archivo cfg o ini
Si hay algo mal o me falto poner algo en la explicacion, avisen asi lo corrijo.
En la cfg, si alguien usa el plugin, la pw se setea mediante
PHP Code:
setinfo _asd "password"
el prefijo del setinfo puede ser cambiado
Aca les dejo el codigo
PHP Code:
#include <amxmodx>
#include <amxmisc>
#define VERSION "1.0"
#define AUTHOR "Maartin!"
#define TITLE "Nickname Protection"
#define MAX_NAMES 100
//Definimos la cantidad maxima de nombres que queremos que haya en el archivo ini
new szPath[128]
new szFilename[136]
new szPassStore[MAX_NAMES][32]
new szNameStore[MAX_NAMES][32]
new iNumWords
new const szPasswordTag[] = "_asd" //Prefijo del setinfo
public plugin_init() {
//registramos el plugin
register_plugin(TITLE,VERSION,AUTHOR)
// registramos un comando para ver todos los nombres y pw que haya en el archivo
register_concmd("amx_nicks_list","CmdTaglist",ADMIN_LEVEL_A)
//registremos un mensaje para prevenir un bug cuando se cambia de nombre, mas adelante lo explico
register_message(get_user_msgid("SayText"), "MessageNameChange")
}
public plugin_cfg(){
get_configsdir(szPath, 128) //Obtenemos la ubicacion de los archivos de configuracion
format(szFilename, 128, "%s/registro_de_nicks.ini",szPath)//Le damos formato al archivo
if (file_exists(szFilename)){ // Si el archivo existe..
log_amx("Archivo %s ejecutado correctamente",szFilename)// logueamos que el archivo fue ejecutado
//creamos variables para obtener la data del archivo
new szData[64], iLen, iPos = 0
//mientras la cantidad de entradas sea menor o igual a la cantidad maxima que definimos antes
// leemos la data del archivo mediante read_file
while (iNumWords <= MAX_NAMES && read_file(szFilename, iPos++, szData,63,iLen)){
//analicemos un poco el read_file
//el primer parametro es el archivo del cual queremos obtener la data
//el segundo parametro es la cantidad de lineas escritas que tiene el archivo
//el tercer parametro recien es la data que contiene cada renglon
// el cuarto la longitud de cada renglon (cantidad de letras de cada renglon)
//y el quinto la longitud de todo el archivo, o sea cuantas letras se usaron en total
if (iLen == 0 || equal(szData, ";", 1)) //esto es para que cuando haya un ; esa linea no sea tenida en cuenta
continue
//lo que hace el parse es separar en 2 variables o mas el texto inicial y la cantidad de letras que se quiere
// en este caso tenemos el texto inicial (szData), donde queremos que se guarde (szNameStore) y la cantidad de
// letras por asi decirlo que se guarda en cada variable, despues se repite lo mismo para la password
parse(szData,szNameStore[iNumWords],sizeof szNameStore, szPassStore[iNumWords],sizeof szPassStore)
++iNumWords
//aumentamos la cantidad de entradas en el archivo
}
}
else { // Si no se creo el archivo, lo creamos
log_amx("Archivo %s No encontrado -- Creando...",szFilename) //logueamos que no se pudo crear
// A partir de aca se crea el archivo
write_file(szFilename,";Archivo creado correctamente..")
write_file(szFilename,";")
write_file(szFilename,";")
write_file(szFilename,";Ejemplo")
write_file(szFilename,"; ^"Starsailor^" ^"mi_password^"")
write_file(szFilename,";Añadi tus nicknames aca abajo..")
// Hasta aca
}
}
// esto es la funcion publica de nuestro comando amx_nicks_list
public CmdTaglist(id,level,cid){
if (!cmd_access(id,level,cid,1)) //si no tiene acceso al comando, bloqueamos
return PLUGIN_HANDLED
console_print(id,"^nEntradas en el archivo^nNick - Password") // Mostramos en la consola
for(new i = 0; i < iNumWords; ++i)// creamos un loop entre la cantidad de entradas en el archivo
console_print(id,"%s - %s", szNameStore[i], szPassStore[i])// mostramos los nombres y las passwords almacenadas en el archivo
console_print(id,"Total %d", iNumWords)//mostramos la cantidad total de entradas
return PLUGIN_HANDLED //bloqueamos
}
// Esto es para que no se cambie de nombre
public client_infochanged(id){
if(is_user_connected(id)){
new szNewname[32], szOldname[32]
get_user_info(id, "name", szNewname,31)// Nombre que tiene en la cfg
get_user_name(id,szOldname,31) //Nombre que tiene cuando entra al sv
if (!equal(szOldname,szNewname)){ //Si son distintos...
client_print(id,print_chat,"** No podes cambiate el nombre")//Mostramos el mensaje
set_user_info(id,"name", szOldname)// Le ponemos el nombre anterior a que lo cambie
}
}
}
public client_connect(id){ //Lo pongo en client_connect para que checkee en el momento de entrar al sv
// algunas variables
new szName[32], iOutput
new szPassword[32],szTemp[32]
get_user_info(id,szPasswordTag,szPassword,31) //sacamos la pw que tiene en la cfg
get_user_name(id,szName,31) // el nombre que tiene al conectar
for(new i = 0; i < iNumWords; ++i){ //loop entre las entradas del archivo
if (equali(szName,szNameStore[i])){ // si el nombre que tiene esta en el archivo...
if(equali(szPassword,szPassStore[i])){ // si la pw que tiene esta en el archivo...
format(szTemp,31,"%s",szPassStore[i]) // le damos formato a una variable que va a ser usada mas adelante
iOutput = 2 //Esto es para despues mediante un switch mostrar los distintos mensajes , lo hago asi por una cuestion de prolijidad
}
else { // si tiene el nombre pero la pw es incorrecta, le damos otro valor al output
iOutput = 1
}
}
}
switch(iOutput){ //creamos un switch del ooutput
//si el output es 1..
case 1:{
server_cmd("kick #%d ^"** Tu nick esta registrado para otra persona o tenes mal la pw^"", get_user_userid(id))
}
//si el output es 2
case 2:{
client_cmd(id,"echo ** Tu Nick & Password han sido autorizados! (Name: %s | Pw: %s)", szName,szTemp)
}
//por defecto
default: client_cmd(id,"echo ** Tu Nick no esta registrado, Bienvenido al server!")
}
}
// esto es para bloquear el mensaje que dice por ejemplo Asd changed name to Asd2
// esto no lo hice yo sino que lo saque de otro lado
public MessageNameChange(msg_id, msg_dest, receiver)
{
new szInfo[64]
get_msg_arg_string(2, szInfo, 63)
if(!equali(szInfo, "#Cstrike_Name_Change")) return PLUGIN_CONTINUE
return PLUGIN_HANDLED
}