Jump to content

jaBote

Community Contributors
  • Content Count

    2037
  • Joined

  • Last visited

  • Days Won

    43

Everything posted by jaBote

  1. Depende de lo que creas. Como comenté antes, utilizan la infraestructura de fRO (el RO europeo/francés), aunque fRO está un poco lejos de lo que yo consideraría estable...
  2. jaBote

    Reset NPC

    That's how permanent char variables are supposed to behave . Thanks for testing!
  3. Nope, it happens with current npc/guild/agit_main.txt file: // Respawn the Emperium, and display new owners. sleep 500; // Slow down script execution slightly. if( agitcheck() ) donpcevent "Agit#"+strnpcinfo(2)+"::OnStartArena"; sleep 7000; announce "The [" + getcastlename(strnpcinfo(2)) + "] castle has been conquered by the [" + getguildname(.@GID) + "] guild.",bc_all|bc_woe; end; The sleep script command detaches RID from script, so it won't be able to get any user name with strcharinfo() and push an empty string. Either get the char name before the sleep commands and save to a temporary variable, or change all sleep to sleep2, which will retain attached RID to the script.
  4. Vaya, pues al final te referías a lo que pensaba yo que no buscabas. Aunque precisamente es eso, el client hash check un mecanismo para evitar modificaciones de cliente en el servidor. Si se activa (client_hash_check: on), puedes especificar un hash para cliente según el group_id de cada usuario (recuerda que se creaban en conf/groups.conf y se asignan en el campo `group_id` de la tabla `login` en la base de datos). Nunca he usado esa característica, pero el login server puede obtener el hash MD5 del cliente y eso es lo que utiliza para hacer esa comprobación. Lo que tienes que hacer para configurarlo es crear tu programa cliente (el .exe que diffeas, no ningún patcher ni nada) como gustes, obtener el hash del mismo y usarlo. Los que aparecen ahí son hashes de ejemplo que deberías cambiar por los tuyos. ¿Y cómo obtener el hash MD5 de un cliente? Pues en el pequeño manual que hay en la documentación (en inglés) sugieren los siguientes programas según el sistema operativo: El comando de consola md5sum para Linux; El comando de consola md5 para Mac OS; El programa WinMD5 para Windows (no, en Windows no hay utilidad del sistema para eso...); Mirar el hash MD5 en el archivo client_filename.exe.secure.txt si se ha diffeado el cliente con NEMO (que no sabría decírtelo porque no lo he usado nunca); O bien (este lo sugiero yo si estás en Windows, no tienes NEMO y no quieres descargar nada) sube el archivo a alguna web como por ejemplo http://onlinemd5.com/ y te dirá el valor del hash MD5 del cliente. Por último, cada entrada de client_hash es válida para el group_id de ese número o cualquier otro superior: por ejemplo si tienes un client_hash para group_id 0, otro para group_id 40 y otro para group_id 99, cualquier usuario que tenga un group_id de 99 podrá conectar al servidor con cualquiera de los 3 clientes designados. Y ya está, creo que no me he dejado nada importante. ¡Un saludo!
  5. It seems you haven't properly indicated your emulator the correct path to the slot machine script file.
  6. @Zirius: I haven't seen any sign of attachrid being disabled on source by default, by any means. Nice script! I'd like to ask you to please modernize the set syntax of the script if possible, since the method you use is now deprecated. // Old, deprecated syntax:set <variable>, <value>;// New syntax:<variable> = <value>; Thanks!
  7. I guess it's easy to fix the script errors by yourself, since server already gives you an answer: [Error]: script_add_str: detected possible use of wrong case in a script. Found 'sc_berserk', probably meant to be 'SC_BERSERK' (in '/tmp/checkerEYCUXL'). I changed it to what the server says and it can, at least, parse without errors.
  8. I think it's official and last notice I knew about it is it was on the works from one of the devs.
  9. jaBote

    Reset NPC

    Maybe this untested NPC edit could help you do that? I took a different approach than Happy's because I think it's a bit cleaner this way: //===== Hercules Script ======================================//= Reset NPC//===== By: ==================================================//= Hercules Dev Team//===== Current Version: =====================================//= 1.3//===== Description: =========================================//= Resets skills, stats, or both.//===== Additional Comments: =================================//= 1.0 First Version//= 1.1 Optimized for the greater good. [Kisuka]//= 1.2 Cleaning [Euphy]//= 1.3 All statuses removed upon skill reset. [Euphy]//===== Custom Additions: ====================================//= 1.3a Custom reset limits. Modernized syntax [jaBote]//============================================================prontera,150,193,4 script Reset Girl 4_F_TELEPORTER,{ .@ResetStat = 5000; // Zeny for stat reset .@ResetSkill = 5000; // Zeny for skill reset .@ResetBoth = 9000; // Zeny for resetting both together .@MaxReset = 3; // Max amount of resets. Must be positive. mes "[Reset Girl]"; mes "I am the Reset Girl."; if (.@MaxReset) { mes "You can reset your character up to " + .@MaxReset + " times."; if (ResetCount >= .@MaxReset) { mes "Sorry, you've already used all of your available resets."; close; } mes "You've already used this service for " + ResetCount + " time(s)."; } mes "Reset Stats: "+ .@ResetStat +"z"; mes "Reset Skills: "+ .@ResetSkill +"z"; mes "Reset Both: "+ .@ResetBoth +"z"; mes "Please select the service you want:"; next; switch(select("^FF3355Reset Skills:Reset Stats:Reset Both^000000:Cancel")) { case 1: mes "[Reset Girl]"; if (Zeny < .@ResetSkill) { mes "Sorry, you don't have enough Zeny."; close; } if (.@MaxReset) ResetCount++; Zeny -= .@ResetSkill; sc_end SC_ALL; resetskill; mes "There you go!"; close; case 2: mes "[Reset Girl]"; if (Zeny < .@ResetStat) { mes "Sorry, you don't have enough Zeny."; close; } if (.@MaxReset) ResetCount++; Zeny -= .@ResetStat; resetstatus; mes "There you go!"; close; case 3: mes "[Reset Girl]"; if (Zeny < .@ResetBoth) { mes "Sorry, you don't have enough Zeny."; close; } if (.@MaxReset) ResetCount++; Zeny -= .@ResetBoth; sc_end SC_ALL; resetskill; resetstatus; mes "There you go!"; close; case 4: close; }}
  10. Hola, buenas. Creo que tienes un pequeño lío: Según comentas, lo que quieres es encriptar las contraseñas del servidor con MD5, opción que está disponible por defecto en el emulador. Puedes hacerlo de forma sencilla en conf/login-server.conf, cambiando el siguiente parámetro a yes. // Store passwords as MD5 hashes instead of plaintext ?// NOTE: Will not work with clients that use <passwordencrypt>use_MD5_passwords: no Y, en caso de tener un servidor ya en uso, ejecutar una única vez la siguiente consulta SQL en la base de datos principal del servidor (el archivo sql-files/tools/convert_passwords.sql): -- Convert passwords to MD5 HashUPDATE `login` SET `user_pass`=MD5(`user_pass`); El motivo de usar la consulta una única vez es porque el algoritmo MD5 no es reversible (o sea, que no hay vuelta atrás si decides no utilizarlo). Siendo honestos (y contra toda buena práctica) no se usa casi nunca en ningún servidor en línea por muchos motivos, haciendo que cualquier administrador malintencionado pueda tener acceso sencillo a las contraseñas y sus respectivas cuentas (o incluso cuentas en otros servicios en caso de usuarios confiados) ya que se guardan tal cual en la base de datos (campo `user_pass` de la tabla `login` como puede verse arriba, pero aunque estén encriptadas cualquier persona con luces puede aún así sumplantar tu identidad). Hay gente que no lo activa por mera comodidad aunque no miraría tus contraseñas, y aún así la seguridad del algoritmo MD5 está muy discutida desde hace años en caso de ataque a tu base de datos. Por tanto, desconozco cómo de bueno sería usarlo y yo personalmente no la usaría debido a que aporta una seguridad prácticamente nula aunque usarlo fuese una buena práctica. Preferiría ir del lado honesto y simplemente pedir a los usuarios en el formulario de registro que utilicen una contraseña distinta de la que tengan para cualquier otro servicio. Si buscas algo más seguro y tienes algo de conocimientos y tiempo, intentaría implementar otros algoritmos criptográficos como más seguros y pediría que se utilicen en este software. Por desgracia, ni eAthena ni rAthena ni Hercules tienen un modo seguro para almacenar contraseñas de los usuarios aún. Por otro lado, en el tema que has señalado, de lo que se habla es de un método para evitar modificaciones del cliente, cuyo funcionamiento viene más o menos explicado en el archivo aunque no me importaría comentarlo si necesitas un poco más de información.
  11. I have no test environment handy, but I remember monsters such as Pinguiculas and dryads can inflict that state via their Stop ability.
  12. Are you sure you need it using getinventorylist? You can use countitem2 to quickly make the check: // Checking just the case of no cards compounded // countitem2(<item id>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>) // delitem2 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account ID>}; if ( countitem2(Muffler_,1,10,0,0,0,0,0) && countitem2(Manteau_,1,10,0,0,0,0,0) ) { delitem2(Muffler_,1,1,10,0,0,0,0,0); delitem2(Manteau_,1,1,10,0,0,0,0,0); getitem Apple,1; } else { dispbottom "NOPE!"; } In case it's strictly necessary to use getinventorylist, then it's a bit less simple: /* getinventorylist returns: @inventorylist_id[] - array of item ids. @inventorylist_amount[] - their corresponding item amounts. @inventorylist_equip[] - will return the slot the item is equipped on, if at all. @inventorylist_refine[] - for how much it is refined. @inventorylist_identify[] - whether it is identified. @inventorylist_attribute[] - whether it is broken. @inventorylist_card1[] - These four arrays contain card data for the @inventorylist_card2[] items. These data slots are also used to store @inventorylist_card3[] names inscribed on the items, so you can @inventorylist_card4[] explicitly check if the character owns an item made by a specific craftsman. @inventorylist_expire[] - expire time (Unix time stamp). 0 means never expires. @inventorylist_bound - whether it is an account bounded item or not. @inventorylist_count - the number of items in these lists delitem2 <item id>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>{,<account ID>}; */ setarray .@requitems[1], Muffler_, Manteau_; //Muffler_ and Manteau_ (both slotted) getinventorylist; // Looping for each item for ( .@cur_item = 1; .@cur_item <= getarraysize(.@requitems); .@cur_item++ ) { // Looping the whole inventory till we find the required item for ( .@j = 0; .@j < @inventorylist_count; .@j++) { // Is this OUR desired item? if (@inventorylist_id[.@j] == .@requitems[cur_item] && @inventorylist_refine == 10) { // Fill up some arrays with all the info to use with delitem in case we have all required items .@item_identify[.@cur_item] = @inventorylist_identify[.@cur_item]; .@item_refine[.@cur_item] = @inventorylist_refine[.@cur_item]; // Could be directly 10, but making a general case .@item_attribute[.@cur_item] = @inventorylist_attribute[.@cur_item]; .@item_card1[.@cur_item] = @inventorylist_card1[.@cur_item]; .@item_card2[.@cur_item] = @inventorylist_card2[.@cur_item]; .@item_card3[.@cur_item] = @inventorylist_card3[.@cur_item]; .@item_card4[.@cur_item] = @inventorylist_card4[.@cur_item]; // And no need to continue doing this loop break; } // Can we confirm it is impossible to have this current items? if (.@j == @inventorylist_count -1) { .@deny = 1; dispbottom "You're missing at least a ^0000FF" + getitemname(.@requitems[cur_item]) + "^000000."; end; // No need to run the script anymore } } sleep 1; // The processor could be needed for something more important than this } // OK, we should have the items ready at this point, so loop to remove them for ( .@cur_item = 1; .@cur_item <= getarraysize(.@requitems); .@cur_item++ ) { delitem2 .@requitems[.@cur_item],1,.@item_identify[.@cur_item],.@item_refine[.@cur_item],.@item_attribute[.@cur_item],.@item_card1[.@cur_item],.@item_card2[.@cur_item],.@item_card3[.@cur_item],.@item_card4[.@cur_item]; } // And you've got your gift now! getitem Apple, 1; end; NOTE: Untested but checked. Should work unless I typo'd somewhere, in that case please tell me. P.S.: Yep, I usually copy over the documentation so no need to change tabs or windows while programming
  13. Hello. Please use English as the main language on all the international forums since this is specified on the forum rules: If you can't use English, please use an automatic translation such as Google Translator, at least.
  14. Esos dos comandos de scripting (tengo serias reservas para llamarlos funciones, aunque realmente lo sean en el código fuente dentro de src/map/script.c) sirven para el tratamiento de parámetros que se pasan a través de los otros script commands callsub y callfunc, que podríamos decir para simplificar que son una llamada a una SUBrutina (que se ejecuta dentro del mismo NPC a través de una etiqueta) o una FUNCión (que se ejecuta en un NPC aparte que es solo esa misma función) . Aunque no sea estrictamente cierto, viene bien creerse que todos los argumentos (o parámetros) que se pasan a través de los comandos anteriores se empaquetan en una especie de vector o array unidimensional, a cuyos valores solo se puede acceder usando getarg. Entonces getarg es el "vector" que contiene, ordenados, los valores de los parámetros que se han pasado, cuyo primer índice es el 0. Entonces, sabiendo el número de argumentos que se han enviado, es posible acceder a la información guardada en tal vector. getarg (GET ARGument) funciona de la siguiente forma: getarg(<index>[, <default value>]); Siendo el índice (index) la posición (el argumento) que quieres recuperar y el default value un valor opcional para dar al mismo, en caso de que haya un error al obtenerlo (porque el programador no lo haya pasado de forma intencional o accidental, o haya habido cualquier otro problema). Si no se especifica este último valor, en caso de error al obtener el argumento especificado, la ejecución del script terminaría y en la consola aparecería un mensaje de error. Por otro lado, getargcount (GET ARGument COUNT) simplemente cuenta el número de argumentos que se ha pasado a la subrutina o función. Este comando es solo útil cuando no sabes bien cuántos argumentos se han enviado (o tu script se comporta de forma distinta según el número de argumentos enviados). Es con esta función con la que se consigue determinar de forma rápida y fiable el número de argumentos recibidos. Ahora mismo no dispongo de mucho más tiempo para hacer ejemplos, aunque intenta leer de nuevo la documentación y a ver si así los comprendes; si no trataré de aclararlo un poco más cuando pueda. ¡Un saludo!
  15. No soy para nada bueno en apartados de cliente, aunque te falta algo de información en el mensaje: ¿qué errores te salen al diffear? ¿Estás seguro de que NEMO soporta ese cliente en concreto?
  16. Sí, es posible. Simplemente añade el item que permite hacer esto (Halter Lead) desde Renewal a Pre-renewal, o crea tú uno mismo que tenga el mismo script (efecto). El item Halter Lead, sacado desde el item DB renewal es el siguiente: { Id: 12622 AegisName: "Boarding_Halter" Name: "Halter Lead" Type: 11 Buy: 20 Upper: 63 Delay: 3000 Script: <" setcashmount(); ">}, Puedes añadirlo en la item DB oficial o el archivo que se tiene para contemplar los custom, da igual si renewal o pre-renewal, que está en db/item-db2.conf, y ya debería estar todo hecho.
  17. Server side configurations and scripts don't depend on whatever you do with your clients. Most errors you'll have is in case you don't have the sprites on your client...
  18. Sí, en mi anterior respuesta ya corroboraba el trabajo chapucero que han hecho en IDC-games. Supongo que el contrato que habrán hecho con Gravity Europe SAS será del estilo que ellos cobrarán parte de los ingresos que generen las cuentas con prefijo idc- o simplemente un porcentaje del total de beneficios, que no es para nada despreciable. Como contraprestación, IDC-games se hubiera comprometido a hacer la traducción del servidor y el cliente al español (aún en progreso) y poco más, porque en caso de tener que pagar ya lo habría hecho o recibiría la diferencia neta de ingresos cada mes, proveniente de Gravity Europe SAS. El problema aquí viene a que, estando el servidor oficial europeo en (desde mi honesta opinión, incompleta y en un burdo español), ya Gravity Europe SAS podría sentirse más "autorizada" a perseguir servicios hispanos (incluye latinoamérica previo "chivatazo" a la filial americana o brasileña, o simplemente la matriz). Un saludo.
  19. jaBote

    Algumas dúvidas

    Traduzir com GTranslate ou outros é garantia de uma tradução horrível. Pode ser funcional, mas não terá utilidade práctica.
  20. I can't test but I think I already gave you an answer: src/map/npc.c /*========================================== * Set or disable mapflag on map * eg : bat_c01<TAB>mapflag<TAB>battleground<TAB>2 * also chking if mapflag conflict with another *------------------------------------------*/const char* npc_parse_mapflag(char* w1, char* w2, char* w3, char* w4, const char* start, const char* buffer, const char* filepath, int *retval) { int16 m; char mapname[32]; int state = 1; // w1=<mapname> if( sscanf(w1, "%31[^,]", mapname) != 1 ) { ShowError("npc_parse_mapflag: Invalid mapflag definition in file '%s', line '%d'.n * w1=%sn * w2=%sn * w3=%sn * w4=%sn", filepath, strline(buffer,start-buffer), w1, w2, w3, w4); if (retval) *retval = EXIT_FAILURE; return strchr(start,'n');// skip and continue } m = map->mapname2mapid(mapname); if (m < 0) { ShowWarning("npc_parse_mapflag: Unknown map in file '%s', line '%d': %sn * w1=%sn * w2=%sn * w3=%sn * w4=%sn", filepath, strline(buffer,start-buffer), mapname, w1, w2, w3, w4); if (retval) *retval = EXIT_FAILURE; return strchr(start,'n');// skip and continue } if (w4 && !strcmpi(w4, "off")) state = 0; //Disable mapflag rather than enable it. [Skotlex] Just set the noazoth mapflag to off on the other zone that overwrites the first one.
  21. Pues os doy mis impresiones tras mis primeras pruebas: Utilizan la infraestructura de fRO, por lo que está igual que antes, y de hecho me conecté desde una cuenta que tenía de hace un tiempo. Aunque la comunidad española del servidor fuera inaugurada hace poco, el instalador instala un servidor actualizado hasta junio. Una vez se actualiza, la interfaz está traducida a medias y tiene serias deficiencias en la traducción de momento. Muchas cosas no se encuentran traducidas aún. Adjunto un par de imágenes: La interfaz completamente traducida. Y lo que está traducido, además bien . Dos veces el español, por si no nos hemos enterado bien . Y no he hecho fotos a algunas erratas en los NPCs que me parecen graves, aunque ya sabéis el palo del que se ha jugado en la traducción. Que oye, no está mal para ser un comienzo, pero algunos esperábamos algo más serio, una traducción en un estado algo más avanzado que esto.
  22. Have you tried to remove the town mapflag on the other zone? mapname mapflag town off
  23. You could create a new zone inheriting characteristics of another zone, but enabling or disabling other characteristics. Give it a try!
  24. La verdad, a mí no me importaría que cerrasen un par de servidores hispanos de esos de los que son bien conocidos, solo por asustar. Acabo de descargar el instalador y el GRF. Ni rastro de español en ninguno de ellos. A ver si alguien puede entrar en el juego y certificar que al final de español ese servidor solo tiene la web. Ya podrían habérselo currado, que no era tan difícil .
  25. Al fin llega un servidor oficial en español, con doce años de retraso. Aún no he podido probarlo por falta de tiempo, aunque tiene pinta de que utilizan la infraestructura y ofrecen los mismos contenidos que el servidor que está ahora mismo instalado en Europa, fRO, por lo que parece que todo hablará en español (NPCs, objetos, etcétera) menos el resto de usuarios. Parece que tenemos lag asegurado como todos los servidores oficiales pero al fin disponemos de una interfaz en español que poder usar. No obstante, esto puede resultar un peligro para el panorama de los servidores privados de Ragnarök por motivos obvios. No lo digo por la competencia sino porque puede que los busquen para cerrarlos. Os dejo link a la noticia: http://www.vidaextra.com/rpg/ragnarok-online-llega-a-espana-12-anos-despues-gracias-a-idc-games Y a un vídeo que no tiene desperdicio porque está equivocado en casi todo, a mí me resultó graciosísimo: Gracias a IDC Games por ofrecernos un servidor oficial en español, ahora esperemos que hagan las cosas bien hechas. Creo que algunos podréis al fin rapiñar cosas del cliente para tenerlo en español como los oficiales. Un saludo.
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.