Mensajes: 1,072
Temas: 57
Registro en: Feb 2016
Reputación:
8
Hola, hice esto: Pero me gustaría saber si se podría hacer de otra manera. Lo que quiero es cambiar todo el sist. de Admins y hacer uno más diferente.
Pero no sé si así sería la mejor forma de hacerlo.
Código PHP: LoadAdmins(id) { new szFile[64]; copy(szFile, charsmax(szFile), DIR_ADMINS); if(!file_exists(szFile)) { write_file(szFile, "; ^"NOMBRE^" ^"CONTRASENIA^" ^"TIPO^"", -1); write_file(szFile, "; Rangos: - PREMIUM - STAFF - ADMIN - FUNDADOR", -1); write_file(szFile, "; Ejemplo:", -1); write_file(szFile, "; ^"heNK'^" ^"supermariobros^" ^"FUNDADOR^"", -1); } new file = fopen(szFile, "rt"); if(file) { new Nombre[32], Password[64], Tipo[20]; while(!feof(file)) { static szBuffer[256]; fgets(file, szBuffer, charsmax(szBuffer)); if(szBuffer[0] == ';' || (szBuffer[0] == '/' && szBuffer[1] == '/') || !szBuffer[0]) continue; Nombre[0] = Password[0] = Tipo[0] = EOS; parse(szBuffer, Nombre, charsmax(Nombre), Password, charsmax(Password), Tipo, charsmax(Tipo)); if(equal(Tipo, "FUNDADOR")) { g_AdminType[id][FUNDADOR] = true; admins_push(Nombre, Password, read_flags("abcdefghijklmnopqrstu"), read_flags("ab")); } else if(equal(Tipo, "ADMIN")) { g_AdminType[id][ADMIN] = true; admins_push(Nombre, Password, read_flags("abcdefghijkmnopqrstu"), read_flags("ab")); } else if(equal(Tipo, "PREMIUM")) { g_AdminType[id][PREMIUM] = true; admins_push(Nombre, Password, read_flags("bcdefghijkmnopqrstu"), read_flags("ab")); } else if(equal(Tipo, "STAFF")) { g_AdminType[id][STAFF] = true; admins_push(Nombre, Password, read_flags("abcdefghijkmnopqrstuv"), read_flags("ab")); } g_AdminCount++; } fclose(file); }else fclose(file); server_print("%s Se encontraron %d admin%s cargados", PREFIX_CONSOLE, g_AdminCount, g_AdminCount == 1 ? "" : "s"); }
Mensajes: 6,664
Temas: 81
Registro en: Jan 2014
Reputación:
68
07/07/2019, 12:59 PM
(Última modificación: 07/07/2019, 12:59 PM por kikizon2. Edited 1 time in total.)
puedes harcodear los tipos de admins y las flags, hacer un switch, meter un default, que lance logs de que algo esta mal escrito
Eso haria yo, ademas de simplificar la var admintypes
► NO DOY AYUDA VIA MENSAJE PRIVADO ◄
* Si requieres algún servicio de pago puedes contactarme vía MP o en mi facebook
Mensajes: 2,094
Temas: 59
Registro en: Feb 2015
Reputación:
15
07/07/2019, 01:19 PM
(Última modificación: 07/07/2019, 02:05 PM por OsweRRR. Edited 4 times in total.)
edit: no uses eso jajaja me volvi fue loco, supongo que cargas siempre en putinserver la lista
(18/11/2014, 05:47 PM)Neeeeeeeeeel.- escribió: Por qué necesitan una guía para todo? Meté mano y que salga lo que salga... es la mejor forma de aprender.
(16/05/2016, 11:08 PM)kikizon2 escribió: No cabe duda que tienen mierda en vez de cerebro, par de pendejos v:
Mensajes: 1,072
Temas: 57
Registro en: Feb 2016
Reputación:
8
07/07/2019, 01:42 PM
(Última modificación: 07/07/2019, 01:46 PM por Niper.-.. Edited 1 time in total.)
(07/07/2019, 12:59 PM)kikizon2 escribió: puedes harcodear los tipos de admins y las flags, hacer un switch, meter un default, que lance logs de que algo esta mal escrito
Eso haria yo, ademas de simplificar la var admintypes
Mi idea de g_AdminTypes es para luego hacer un hook say con ello.
Código PHP: public hook_say(id) { new say[192], Prefix[64]; read_args(say, charsmax(say)); remove_quotes(say); trim(say); replace_all(say, charsmax(say), "#", ""); replace_all(say, charsmax(say), "%", ""); new Nombre[32]; get_user_name(id, Nombre, charsmax(Nombre)); new alive[12]; if(is_user_alive(id)) alive = ""; else alive = "*MUERTO* "; if(strlen(say) > 0) { if(g_AdminType[id][FUNDADOR]) copy(Prefix, charsmax(Prefix), "*FUNDADOR*"); else if(g_AdminType[id][STAFF]) copy(Prefix, charsmax(Prefix), "*STAFF*"); else if(g_AdminType[id][ADMIN]) copy(Prefix, charsmax(Prefix), "*ADMIN*"); else if(g_AdminType[id][PREMIUM]) copy(Prefix, charsmax(Prefix), "*PREMIUM*"); else copy(Prefix, charsmax(Prefix), ""); if(is_user_admin(id)) format(say, charsmax(say), "^1%s^4%s ^3%s ^1: ^4%s", alive, Prefix, Nombre, say); else format(say, charsmax(say), "^1%s^3%s ^1: %s", alive, Nombre, say); for(new i = 1; i <= g_maxplayers; i++) { if(is_user_connected(i)) { if(is_user_alive(id) && is_user_alive(i) || !is_user_alive(id) || !is_user_alive(i)) ColorChat(0, GREEN, say); } } } return PLUGIN_HANDLED_MAIN }
Por eso, utilizo bool = true;
LoadAdmins(id); lo utilizo en client_putinserver. Una vez usado el LoadAdmins(id); hago el hook say donde chequeo su g_AdminType, y le agrego el prefijo. Entonces. Sí en una dirección ej: "admins.ini" tengo esto.
Cita:"heNK'" "password" "PREMIUM" Su g_AdminType se pone en TRUE y lo agrego al prefix.
"heNK'" "password" "STAFF" Su g_AdminType se pone en TRUE y lo agrego al prefix.
Quedaría "*STAFF*" "*PREMIUM*" etc.. Por eso utilizo g_AdminType[id][RANGO].
Mensajes: 2,094
Temas: 59
Registro en: Feb 2015
Reputación:
15
07/07/2019, 02:02 PM
(Última modificación: 07/07/2019, 11:13 PM por OsweRRR. Edited 7 times in total.)
Código PHP: #define MAX_ADMINS 10
enum _:ADMINS_CONSTS { CONSTS_ALIAS[30], CONSTS_ACCESS[20] }
public client_putinserver(id) { fw_LoadAdmins(id, "addons/amxmodx/configs/users.ini") }
enum _:ADMINS_ALIAS { ALIAS_FUNDADOR, ALIAS_ADMIN, ALIAS_STAFF, ALIAS_PREMIUM }
new const Struct_Admins[][ADMINS_CONSTS] = { { "FUNDADOR", "abcde" }, { "ADMIN", "abcdefghijkl" }, { "STAFF", "abcdef" }, { "PREMIUM", "a" } }
new bool:g_iAdminType[MAX_PLAYERS][ADMINS_ALIAS]
fw_LoadAdmins(id, dir_admins[64]) { remove_user_flags(id) arrayset(g_iAdminType[id], false, ADMINS_ALIAS) static sName_Db[MAX_ADMINS][33] static sPass_Db[MAX_ADMINS][25] static sAccs_Db[MAX_ADMINS][20] if(sName_Db[0][0]) { new sName[33]/*, sAuthid[35], sIp[20]*/, i, bool:bExist = false get_user_name(id, sName, charsmax(sName)) //get_user_ip(id, sIp, charsmax(sIp)) //get_user_authid(id, sAuthid, charsmax(sAuthid)) replace_string(sName, charsmax(sName), " ", " ", false) // 0xFF Sin testear. for(i = 0; i < MAX_ADMINS; i++) { if(strcmp(sName, sName_Db[i]) == 0/* || strcmp(sAuthid, sName_Db[i]) == 0 || strcmp(sIp, sName_Db[i]) == 0*/) { bExist = true if(sPass_Db[i][0] && !CheckPassword(id, sPass_Db[i])) { server_cmd("kick #%i ^"La clave de tu admin es incorrecta prro :v^"", get_user_userid(id)) server_exec() break } switch(sAccs_Db[i][0]) { case 'F': g_iAdminType[id][ALIAS_FUNDADOR] = bool:(set_user_flags(id, read_flags(Struct_Admins[0][CONSTS_ACCESS]))) case 'A': g_iAdminType[id][ALIAS_ADMIN] = bool:(set_user_flags(id, read_flags(Struct_Admins[1][CONSTS_ACCESS]))) case 'P': g_iAdminType[id][ALIAS_PREMIUM] = bool:(set_user_flags(id, read_flags(Struct_Admins[3][CONSTS_ACCESS]))) case 'S': g_iAdminType[id][ALIAS_STAFF] = bool:(set_user_flags(id, read_flags(Struct_Admins[2][CONSTS_ACCESS]))) } //log_amx("<%s><%s><%s> Se ha conectado.", sName, sAuthid, sIp) break } } if(!bExist) { set_user_flags(id, read_flags("z")) } } else { new iFile = fopen(dir_admins, "r"), sLines[90], i if(iFile) { while(!feof(iFile)) { fgets(iFile, sLines, charsmax(sLines)) if(sLines[0] == ';' || (sLines[0] == '/' && sLines[1] == '/') || !sLines[0]) { continue } if(i > MAX_ADMINS) { log_error(AMX_ERR_STACKERR, "Sobrepasaste los limites aumenta MAX_ADMINS.") break } parse(sLines, sName_Db[i], charsmax(sName_Db[]), sPass_Db[i], charsmax(sPass_Db[]), sAccs_Db[i], charsmax(sAccs_Db[])) replace_string(sName_Db[i], charsmax(sName_Db[]), " ", " ", false) // 0xFF Sin testear. i++ } fclose(iFile) log_amx("Se consigui%s %d administrador%s.", i > 1 ? "eron" : "o", i, i > 1 ? "es" : "") } else { fclose(iFile) } if(i == 0) { set_user_flags(id, read_flags("z")) return } fw_LoadAdmins(id, "addons/amxmodx/configs/users.ini") } }
bool:CheckPassword(id, sPass_Db[]) { new sPass[25] get_user_info(id, "_pw", sPass, charsmax(sPass)) return bool:(strcmp(sPass, sPass_Db) == 0) }
Edit: 7:59 PM, le hice un par de cambios..
La clave si realmente hay una simplemente hará los chequeos previos.
Dale buen uso hombre
(18/11/2014, 05:47 PM)Neeeeeeeeeel.- escribió: Por qué necesitan una guía para todo? Meté mano y que salga lo que salga... es la mejor forma de aprender.
(16/05/2016, 11:08 PM)kikizon2 escribió: No cabe duda que tienen mierda en vez de cerebro, par de pendejos v:
Mensajes: 1,072
Temas: 57
Registro en: Feb 2016
Reputación:
8
07/07/2019, 02:34 PM
(Última modificación: 07/07/2019, 02:40 PM por Niper.-.. Edited 1 time in total.)
En vez de set_user_flags, sería admins_push, no? Ya que, si bien, le otorgas los flags. Falta el Nombre & la Password que eso se ve después con admins_lookup. Que eso sería el chequeo de la clave, nombre y accesos.
Yo lo deje así el LoadAdmins.
Código PHP: enum { FUNDADOR, STAFF, ADMIN, PREMIUM }; new g_AdminType[33][4];
LoadAdmins(id) { new szFile[64]; copy(szFile, charsmax(szFile), DIR_ADMINS); if(!file_exists(szFile)) { write_file(szFile, "; ^"NOMBRE^" ^"CONTRASENIA^" ^"TIPO^"", -1); write_file(szFile, "; Rangos: - PREMIUM - STAFF - ADMIN - FUNDADOR", -1); write_file(szFile, "; Ejemplo:", -1); write_file(szFile, "; ^"heNK'^" ^"supermariobros^" ^"FUNDADOR^"", -1); } new file = fopen(szFile, "rt"); if(file) { new Nombre[32], Password[64], Tipo[20]; while(!feof(file)) { static szBuffer[256]; fgets(file, szBuffer, charsmax(szBuffer)); trim(szBuffer); if(szBuffer[0] == ';' || (szBuffer[0] == '/' && szBuffer[1] == '/') || !szBuffer[0]) continue; Nombre[0] = Password[0] = Tipo[0] = EOS; parse(szBuffer, Nombre, charsmax(Nombre), Password, charsmax(Password), Tipo, charsmax(Tipo)); switch(Tipo[0]) { case 'F': { g_AdminType[id][FUNDADOR] = true; admins_push(Nombre, Password, read_flags("abcdefghijklmnopqrstu"), read_flags("ab")); } case 'A': { g_AdminType[id][ADMIN] = true; admins_push(Nombre, Password, read_flags("abcdefghijkmnopqrstu"), read_flags("ab")); } case 'P': { g_AdminType[id][PREMIUM] = true; admins_push(Nombre, Password, read_flags("bcdefghijkmnopqrstu"), read_flags("ab")); } case 'S': { g_AdminType[id][STAFF] = true; admins_push(Nombre, Password, read_flags("abcdefghijkmnopqrstuv"), read_flags("ab")); } } g_AdminCount++; } fclose(file); }else fclose(file); server_print("%s Se encontraron %d admin%s cargados", PREFIX_CONSOLE, g_AdminCount, g_AdminCount == 1 ? "" : "s"); }
Mensajes: 2,094
Temas: 59
Registro en: Feb 2015
Reputación:
15
07/07/2019, 02:49 PM
(Última modificación: 07/07/2019, 02:51 PM por OsweRRR. Edited 2 times in total.)
De hecho te lo hice de esa forma por que pensé que no usarías mas admin.amxx, además de la forma en tu la tienes, Estás cargando una y otra ves la lista cada ves que un player ingresa al servidor si no me equivoco lo llamas en putinserver. Creo que al usar el código que te pase ya estaría sin uso las natives: admins_push@lookup y todas las que se asocien, excepto get_user_flags(). YYY aclaro que sólo funciona con nombres y no con steamids, pero se puede sólo tendrías que hacer otro chequeo más.
edit: lo acabo de editar.
(18/11/2014, 05:47 PM)Neeeeeeeeeel.- escribió: Por qué necesitan una guía para todo? Meté mano y que salga lo que salga... es la mejor forma de aprender.
(16/05/2016, 11:08 PM)kikizon2 escribió: No cabe duda que tienen mierda en vez de cerebro, par de pendejos v:
Mensajes: 1,072
Temas: 57
Registro en: Feb 2016
Reputación:
8
(07/07/2019, 02:49 PM)OsweRRR escribió: De hecho te lo hice de esa forma por que pensé que no usarías mas admin.amxx, además de la forma en tu la tienes, Estás cargando una y otra ves la lista cada ves que un player ingresa al servidor si no me equivoco lo llamas en putinserver. Creo que al usar el código que te pase ya estaría sin uso las natives: admins_push@lookup y todas las que se asocien, excepto get_user_flags(). YYY aclaro que sólo funciona con nombres y no con steamids, pero se puede sólo tendrías que hacer otro chequeo más.
edit: lo acabo de editar.
Es cambiar el sistema, por ende, admin.amxx no tendría que existir..
Volviendo al tema. fw_LoadAdmins lo estas ejecutando 2 veces. Por qué haces eso? No estarías básicamente repitiendolo constantemente el fw_LoadAdmins?
PD: Entonces set_user_flags por admins_push sería?
Código PHP: if(i == 0) { set_user_flags(id, read_flags("z")) return } fw_LoadAdmins(id, "addons/amxmodx/configs/users.ini")
Mensajes: 2,094
Temas: 59
Registro en: Feb 2015
Reputación:
15
Nop, velo bien, si sName_Db no tiene nada, va y carga los admins y luego devuelvo en esa linea la fw, y el caso i == 0 si no cargó ningún admin simplemente le da la flag z al player y retorno para que no se cree un bucle y pin pun pan crash server. YYY si puedes hacer eso, set_user_flags en ves de admins_push, échale un ojo a admin.amxx.
(18/11/2014, 05:47 PM)Neeeeeeeeeel.- escribió: Por qué necesitan una guía para todo? Meté mano y que salga lo que salga... es la mejor forma de aprender.
(16/05/2016, 11:08 PM)kikizon2 escribió: No cabe duda que tienen mierda en vez de cerebro, par de pendejos v:
Mensajes: 2,094
Temas: 59
Registro en: Feb 2015
Reputación:
15
Avísame si te pudo funcionar, actualice el código
(18/11/2014, 05:47 PM)Neeeeeeeeeel.- escribió: Por qué necesitan una guía para todo? Meté mano y que salga lo que salga... es la mejor forma de aprender.
(16/05/2016, 11:08 PM)kikizon2 escribió: No cabe duda que tienen mierda en vez de cerebro, par de pendejos v:
Mensajes: 1,072
Temas: 57
Registro en: Feb 2016
Reputación:
8
08/07/2019, 09:03 AM
(Última modificación: 08/07/2019, 10:41 AM por Niper.-.. Edited 7 times in total.)
No probe tu código, pero guiandome de él hice esto. Aclaro que no sé si esta bien, porque no tengo para testear :c.
Lo que hice, es mediante equal y get_user_name chequear si en el archivo es el mismo nombre del conectado. Debido a que LoadAdmins se llama en client_putinserver.
Luego, si es el correcto, chequeo si su password es también correcta. Sí no lo es, lo kickeo.
Luego, chequeo su rango (accesos) y le otorgo los flags.
Y para terminar, chequeo de vencimiento.
PD: Oswer, g_AdminType[id][RANGO] = true, porque como dije, es para luego usarlo en hooksay.
Edit: Lo que ahora faltaría para no hacerla tan larga, es detectar el cambio de nombre, porque si lo detecto siempre que llamo LoadAdmins, sería horrible. Qué otra forma puede haber?
LoadAdmins(id);
Código PHP: LoadAdmins(id) { new szFile[64]; copy(szFile, charsmax(szFile), DIR_ADMINS); new file = fopen(szFile, "r"); new linea, bool:bExists; new szPass[32]; get_user_info(id, PASSWORD, szPass, charsmax(szPass)); new szName[32]; get_user_name(id, szName, charsmax(szName)); remove_user_flags(id); if(file) { new Nombre[32], Password[64], Tipo[20], Vencimiento[64]; while(!feof(file)) { static szBuffer[256]; fgets(file, szBuffer, charsmax(szBuffer)); trim(szBuffer); linea++; if(szBuffer[0] == ';' || (szBuffer[0] == '/' && szBuffer[1] == '/') || !szBuffer[0]) continue; Nombre[0] = Password[0] = Tipo[0] = EOS; parse(szBuffer, Nombre, charsmax(Nombre), Password, charsmax(Password), Tipo, charsmax(Tipo), Vencimiento, charsmax(Vencimiento)); if(equal(szName, Nombre)) { bExists = true; if(equal(szPass, Password)) { log_amx("Se conecto el admin %s", szName); }else{ server_cmd("kick #%d ^"Ingrese la contrasenia de tu ADMIN/PREMIUM^"", get_user_userid(id)); break; } switch(Tipo[0]) { case 'F': { g_AdminType[id][FUNDADOR] = true; set_user_flags(id, read_flags("abcdefghijklmnopqrstu")); } case 'A': { g_AdminType[id][ADMIN] = true; set_user_flags(id, read_flags("abcdefghijkmnopqrstu")); } case 'P': { g_AdminType[id][PREMIUM] = true; set_user_flags(id, read_flags("bcdefghijkmnopqrstu")); } case 'S': { g_AdminType[id][STAFF] = true; set_user_flags(id, read_flags("abcdefghijkmnopqrstuv")); } } if(!Vencimiento[0]) continue; replace_all(Vencimiento, charsmax(Vencimiento), "/", " "); new dia[3], mes[3], anio[5]; parse(Vencimiento, dia, charsmax(dia), mes, charsmax(mes), anio, charsmax(anio)); if(get_systime() >= TimeToUnix(str_to_num(anio), str_to_num(mes), str_to_num(dia), 0, 0, 0, UT_TIMEZONE_SERVER)) { format(szBuffer, charsmax(szBuffer), "; ADMIN %s(%s) vencio en la fecha %s/%s/%s", Nombre, Tipo, dia, mes, anio); write_file(DIR_ADMINS, szBuffer, linea - 1); }else { replace_all(Vencimiento, charsmax(Vencimiento), " ", "/"); TrieSetString(g_tVencimiento, Nombre, Vencimiento); } g_AdminCount++; } } if(!bExists) set_user_flags(id, read_flags("z")); fclose(file); }else fclose(file); server_print("%s Se encontraron %d admin%s cargados", PREFIX_CONSOLE, g_AdminCount, g_AdminCount == 1 ? "" : "s"); }
HookSay(id);
Código PHP: public hook_say(id) { new say[192], Prefix[64]; read_args(say, charsmax(say)); remove_quotes(say); trim(say); replace_all(say, charsmax(say), "#", ""); replace_all(say, charsmax(say), "%", ""); new Nombre[32]; get_user_name(id, Nombre, charsmax(Nombre)); new alive[12]; if(is_user_alive(id)) alive = ""; else alive = "*MUERTO* "; if(strlen(say) > 0 || strlen(say) < 192) { if(g_AdminType[id][FUNDADOR]) copy(Prefix, charsmax(Prefix), "*FUNDADOR*"); else if(g_AdminType[id][STAFF]) copy(Prefix, charsmax(Prefix), "*STAFF*"); else if(g_AdminType[id][ADMIN]) copy(Prefix, charsmax(Prefix), "*ADMIN*"); else if(g_AdminType[id][PREMIUM]) copy(Prefix, charsmax(Prefix), "*PREMIUM*"); else copy(Prefix, charsmax(Prefix), ""); if(is_user_admin(id)) format(say, charsmax(say), "^1%s^4%s ^3%s ^1: ^4%s", alive, Prefix, Nombre, say); else format(say, charsmax(say), "^1%s^3%s ^1: %s", alive, Nombre, say); for(new i = 1; i <= g_maxplayers; i++) { if(is_user_connected(i)) { if(g_AdminType[id][FUNDADOR] || g_AdminType[id][STAFF] || is_user_alive(id) && is_user_alive(i) || !is_user_alive(id) || !is_user_alive(i)) { message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"),_,i) write_byte(id) write_string(say) message_end() } } } } return PLUGIN_HANDLED_MAIN }
Mensajes: 2,094
Temas: 59
Registro en: Feb 2015
Reputación:
15
Lo mejor en ese caso, cargar tu lista de admins en el inicio del mapa y almacenarlas en alguna variable, luego hacer los respectivos chequeos en infochanged y putinserver.
(18/11/2014, 05:47 PM)Neeeeeeeeeel.- escribió: Por qué necesitan una guía para todo? Meté mano y que salga lo que salga... es la mejor forma de aprender.
(16/05/2016, 11:08 PM)kikizon2 escribió: No cabe duda que tienen mierda en vez de cerebro, par de pendejos v:
|