Jump to content

Nanashi

Members
  • Posts

    59
  • Joined

  • Last visited

  • Days Won

    5

Everything posted by Nanashi

  1. @Aaeria Thanks a lot and yes, it's fully coded and working fine, if you search on google the server name (in the pic logo), you can actually see it online.
  2. Hi again, today I would like to share with you guys the new website I've been working for the last months. The server is an ancient ep 7 server so I've tried to give it a classic style but with the new features and design trendings. Here is the result, hope you liked it
  3. Hi to everyone, i would like to show you the new project i'm working on right now. Hope you guys liked it . PD: It's not over, gess i'll upload the full content when it get finished.
  4. I highly recommend you to use SQL instead of txt, because those data are saved in variables and it's much more harder to track and debug the script than you can imagine . Here is an expample you can use for what you are looking for in SQL: STEP 1: LOAD THE TABLE IN YOUR SQL BEFORE USE THE SCRIPT Run this query on your sql database: SET FOREIGN_KEY_CHECKS=0; -- ------------------------------------ -- Table structure for `mvp_ranking` -- ------------------------------------ DROP TABLE IF EXISTS `mvp_ranking`; CREATE TABLE `mvp_ranking` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `char_id` int(11) unsigned NOT NULL DEFAULT '0', `mvp_count` smallint(6) unsigned NOT NULL DEFAULT '1', PRIMARY KEY `id` (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; -- ------------------------------------ -- End of table `mvp_ranking`. -- ------------------------------------ STEP 2: LOAD THE SCRIPT IN YOUR SERVER Create and load the next script: - script Rank MvP -1,{ OnInit: setarray .mobid[0],1511,1647,1785,1630,1399,1039,1874,2068,1272,1719,1046,1389,1112,1115,1957,1418,1871,1252,1768,1086,1688,1646,1373,1147,1059,1150,1956,2022,1087,1190,1038,1157,1159,1502,1623,1650,1583,1708,1312,1751,1685,1648,1917,1658; set .a, 1; // [ 1 - Enable global announcement on MvP kill ] [ 0 - Disable global announcement ] set $@top, 10; // Number of top rankings that will be shown. end; OnNPCKillEvent: if (getgmlevel() > 10) end; for (set .@c, 0; .@c < getarraysize(.mobid); set .@c, .@c + 1) { if (killedrid == .mobid[.@c]) set .@s, 1; } // Check MvP if (!.@s) end; if (.a) announce "The user [" +strcharinfo(0) +"] has killed [" +getmonsterinfo(killedrid,0) +"] in map [" +strcharinfo(3) +"]",bc_blue|bc_all; query_sql "SELECT char_id FROM mvp_ranking WHERE char_id = "+getcharid(0),@char_id; if (@char_id == getcharid(0)) { query_sql "SELECT mvp_count FROM mvp_ranking WHERE char_id = "+getcharid(0),@mvptotal; set @mvptotal, @mvptotal +1; query_sql "UPDATE mvp_ranking SET mvp_count = '"+@mvptotal+"' WHERE char_id = "+getcharid(0); } else { set @mvptotal, 1; query_sql "INSERT INTO mvp_ranking (id,char_id,mvp_count) VALUES ('','"+getcharid(0)+"','"+@mvptotal+"')"; } end; } prontera,150,150,3 script MvP Rank 411,{ set .@menu$, "- Check TOP 10 MVP ranking:- Check my stats"; if (getgmlevel() >= 80) { set .@menu$, .@menu$ + ":- ^FF0000Reset All Rankings^000000"; } mes "[Top " +$@top +" MvP Rank]"; mes "Please select an option."; next; switch(select(.@menu$)) { case 1: query_sql "SELECT mvp_count FROM mvp_ranking ORDER BY mvp_count ASC LIMIT "+$@top,@count[0]; query_sql "SELECT char_id FROM mvp_ranking ORDER BY mvp_count ASC LIMIT "+$@top,@char_id[0]; query_sql "SELECT `name` from `char` WHERE `char_id` = '"+@char_id[.@c]+"'",.@names$[0]; mes "[Top " +$@top +" MvP Rank]"; for (set .@c, 0; .@c < $@top; set .@c, .@c + 1){ mes ""; mes "Top ^FF0000" +(.@c + 1)+"^000000 ^0000FF"+.@names$[.@c]+"^000000 with ^FF0000"+@count[.@c]+"^000000 MVP killed."; } close; case 2: query_sql "SELECT `mvp_count` FROM `mvp_ranking` WHERE `char_id` = "+getcharid(0),@amount; if (@amount) { mes "[Top " +$@top +" MvP Rank]"; mes "You have killed ^FF0000"+@amount+"^000000 MVP"+( ( .@amount == 1)? "." : "s." ); } close; case 3: mes "[Top " +$@top +" MvP Rank]"; mes "This will delete all existing rankings."; mes "Do you want to proceed?"; next; if (select("No:Yes") == 1) end; query_sql "DELETE FROM `mvp_ranking`"; mes "[Top " +$@top +" MvP Rank]"; mes "All rankings have been reset."; close; } end; } Have tested it and works fine , if you find any error let me know. PD: If there is any spelling mistake I apologize, I don't speak English.
  5. No si esta es la sección correspondiente a tu problema .
  6. Hola @Jormundgander, para crear el script que pides (suponiendo que sepas hacer lo demás) solo necesitas almacenar los datos en una tabla sql. Ejemplo: Para que lo veas más claro supongamos que el script entrega un item X que almacenamos en @item$ y queremos que guarde el nombre del personaje al que se entregó dicho objeto, la id del objeto que se entregó, el job de ese personaje, su id de personaje, su nivel base/job y, por último, la hora a la que se entregó el objeto. Esta información la guardaremos en una tabla a la que llamaremos Reward_System. Para almacenar estos datos simplemente utilizaremos la siguiente query_sql en el script: query_sql "INSERT INTO `Reward_System` (`id`,`char_id`,`name`,`class`,`base_level`,`job_level`,`item_id`,`time`) VALUES ('','"+getcharid(0)+"','"+strcharinfo(0)+"','"+jobname(Class)+"','"+readparam(BaseLevel)+"','"+readparam(JobLevel)+"','"+@item$+"','"+ gettimestr("%Y-%m-%d %H:%M:%S",21) +"')"; Espero que te haya sido de ayuda para lo que pretendes hacer, si tienes alguna duda avísame, un saludo .
  7. Solucionado Se trataba de un error con el bonus IG_Potion (id 37) que estaba mal escrito: bAddItemHealRate en lugar de bAddItemGroupHealRate que es el correcto.
  8. HI! here is the release of this new design, which I want to share with this community, for a private Ragnarok Online server, hope you like it: (The text that appears in there are not the specifications of that server) Author of the Theme: BVERSION
  9. Hi everyone, first of all sry for my English (is not my native language). I would like to request if someone can show me the way to make the Monk/Champion combo skills act as passive skills. So when u attack a monster you have a chance to auto make the combo skills without the need of using the skills in order or even clicking the skill, because it is suppose to work as passive skills now. Is it possible? Hope you guys understand what I'm trying to explain. Thanks in advice Edit: To understand it better, I want to make the skills and Chain Combo and Combo Finish work as Triple Combo Attack. Edit 2: Resolved, can close this topic.
  10. Buena guía Celsius pero este tipo de cosas siempre es más recomendable hacerlo mediante scripts, así solucionas todos los errores o detalles que mencionaste que ocurren tras la modificación por src. Además puedes añadir efectos, sonidos y animaciones, crear una probabilidad de que la runa, gema, etc, se pueda romper o incluso hacer que se pueda tener más de una en un mismo slot y muchas más cosas q se te ocurran.
  11. Gracias @Ziu, se agradece .
  12. Comprueba en que el atributo <view> del objeto en el item_db.txt y en la carpeta luafiles514 sea 1051 y esté asignado al sprite LDTail. Si después de haberlo comprobado está todo correcto, deberías abrir el archivo LDTail.spr por si acaso a ver si realmente contiene el sprite correcto. Si el sprite era incorrecto te adjunto el verdadero: LDTail Sprite.zip
  13. Hola krias, disculpa que no haya podido responder antes. Es posible que el sistema que utiliza el autor del video sea mediante la modificación del src o mediante el uso de un script (concretamente una función llamada desde el objeto). En el caso de que quieras hacerlo por src no puedo ayudarte sin embargo, si decides hacerlo mediante un script deberás hacer lo siguiente: PASO 1. MODIFICAR EL TIPO DE OBJETO En tu emulador rAthena dirígete a "../db/import/item_db.txt" (en el caso de que uses este archivo para agregar los items custom, sino al archivo item_db.txt dónde tienes agregados los objetos que quieres insertar en el equipo). Ahora modifica el atributo <type> de los objetos que quieres agregar al equipo poniendo el número 11 (segúramente los debes tener con el número 6) y el atributo { < script> } dejandolo cómo { callfunc "F_enchant",<numero>; } . ¡ATENCIÓN! en la parte de <numero> de cada item tienes que poner numeros, comenzando desde 1 hasta el último item. Ejemplo: Imagina que estamos añadiendo 5 runas diferentes (cada una da stats diferentes), el itemdb debería quedar así: 29001,Runa_Roja,STR +10,11,0,,0,,,,,,,,,,,,,{ callfunc "F_enchant",1; },{},{} 29002,Runa_Amarilla,AGI +10,11,0,,0,,,,,,,,,,,,,{ callfunc "F_enchant",2; },{},{} 29003,Runa_Azul,INT +10,11,0,,0,,,,,,,,,,,,,{ callfunc "F_enchant",3; },{},{} 29004,Runa_Verde,VIT +10,11,0,,0,,,,,,,,,,,,,{ callfunc "F_enchant",4; },{},{} 29005,Runa_Negra,DEX +10,11,0,,0,,,,,,,,,,,,,{ callfunc "F_enchant",5; },{},{} ¿Para qué sirve este numero? Con este número identificaremos que objeto es el que está llamando la función desde el script. PASO 2. CREAR EL SCRIPT CORRESPONDIENTE Ahora te toca configurar la función en un script " function script F_enchant { } " ahí ya le puedes dar las condiciones que quieras al usar el objeto. Recuerda hacer que el script elimine el item al finalizar la acción que se ha usado para llamar la función, si no haces esto el objeto podrá usarse indefinidas veces. Consejo 1: para obtener el id del objeto que llama la función usa: if (getarg(0) == 1) @runeID = <ID de la runa correspondiente al número 1>; if (getarg(0) == 2) @runeID = <ID de la runa correspondiente al número 2>; if (getarg(0) == 3) @runeID = <ID de la runa correspondiente al número 3>; ... Consejo 2: recuerda agregar las siguientes seis condiciones obligatorias: Evitar que el usuario quite el equipo o la runa mientras se usa el script con " disable_items; " al inicio del script. Guardar la parte del equipo seleccionada (en la que insertaremos la runa) en una variable (ejemplo "@part"). Comprobar que el objeto seleccionado no tenga nada equipado en el 4º slot con " if (getequipcardid(@part,3) != 0) end; " Obtener todas las propiedades (cartas, si es refinable o no, su refine, etc...) antes de dar el nuevo objeto con la runa equipada. Guardar el id del equipo seleccionado con " set @itemid, getequipid(@part); ". Por último hacer que el script elimine la runa " delitem @runeID,1; " y nos de el objeto con la runa insertada usando: ESTRUCTURA: getitem2 <item_id>,<amount>,<identify>,<refine>,<atribute>,<card1>,<card2>,<card3>,<card4>{,<account ID>}; COMO DEBE QUEDAR: getitem2 @itemid,1,1,getequiprefinerycnt(@part),0,getequipcardid(@part,0),getequipcardid(@part,1),getequipcardid(@part,2),@runeID; Si tienes alguna duda o no has entendido algo pregúntame. Un saludo. EDIT: si prefieres hacerlo mediante src tal vez este topic te sea de ayuda: http://rathena.org/board/topic/95342-set-enchant-rune-cards-directly-into-4th-slot/
  14. ¿Podrías dar más detalles? Necesitamos la versión del cliente que utilizas, si tu cliente está configurado para leer el itemInfo.lua/itemInfo.lub o si está configurado para leer los idum2, el sprite o nombre del custom que intentas agregar o al menos señalarlo en la imagen que has subido, etc... Intenta siempre dar tantos detalles como puedas para obtener una mejor respuesta.
  15. Hi everyone, I would like to request a script command that works like addmonsterdrop but adding some extra item parameters like in getitem2. So that it would look like this: *addmonsterdrop2 <mob_id or name>,<item id>,<rate>,<amount>,<identify>,<refine>,<attribute>,<card1>,<card2>,<card3>,<card4>; Is it posible? Thanks in advance.
  16. Verás te explico, yo quiero que el objeto caiga del mob al matar dicho monstruo (algo así como el comando addmonsterdrop). Pero el problema de makeitem2 es determinar la ubicación del mob para que caiga de él y no del jugador. Y el problema que da addmonsterdrop es que no me permite configurar las cartas que lleva el objeto, su refine, si esta identificado o no, etc... Tal vez sea más fácil configurar el command script addmonsterdrop agregando las propiedades del getitem2, pero como no se mucho de programación C/C++ pues estoy bastante perdido con lo q tengo q editar .
  17. Hola a todos, me gustaría saber si es posible modificar el comando 'getitem2' para hacer que, en vez de enviar el objeto creado directamente al inventario, lo envíe al suelo como si se tratase de un drop item. Si es posible podríais echarme una mano o indicarme qué debo modificar (?), gracias de antemano. Edit: ya he encontrado el lugar donde modificar el script command getitem2 en .../src/map/script.c buscando BUILDIN_FUNC(getitem2) el problema es que no se que debo modificar para hacer que el objeto caiga al suelo (cerca del jugador) en lugar de ir directo al inventario. El código es el siguiente: /*========================================== * *------------------------------------------*/ BUILDIN_FUNC(getitem2) { int nameid,amount,get_count,i,flag = 0; int iden,ref,attr,c1,c2,c3,c4; char bound=0; struct item_data *item_data; struct item item_tmp; TBL_PC *sd; struct script_data *data; if( !strcmp(script_getfuncname(st),"getitembound2") ) { bound = script_getnum(st,11); if( bound < 1 || bound > 3) { //Not a correct bound type ShowError("script_getitembound2: Not a correct bound type! Type=%d\n",bound); return 1; } if( script_hasdata(st,12) ) sd=map_id2sd(script_getnum(st,12)); else sd=script_rid2sd(st); // Attached player } else if( script_hasdata(st,11) ) sd=map_id2sd(script_getnum(st,11)); // <Account ID> else sd=script_rid2sd(st); // Attached player if( sd == NULL ) // no target return 0; data=script_getdata(st,2); get_val(st,data); if( data_isstring(data) ) { const char *name=conv_str(st,data); struct item_data *item_data = itemdb_searchname(name); if( item_data ) nameid=item_data->nameid; else nameid=UNKNOWN_ITEM_ID; } else nameid=conv_num(st,data); amount=script_getnum(st,3); iden=script_getnum(st,4); ref=script_getnum(st,5); attr=script_getnum(st,6); c1=(short)script_getnum(st,7); c2=(short)script_getnum(st,8); c3=(short)script_getnum(st,9); c4=(short)script_getnum(st,10); if(nameid<0) { // Invalide nameid nameid = -nameid; flag = 1; } if(nameid > 0) { memset(&item_tmp,0,sizeof(item_tmp)); item_data=itemdb_exists(nameid); if (item_data == NULL) return -1; if(item_data->type==IT_WEAPON || item_data->type==IT_ARMOR || item_data->type==IT_SHADOWGEAR ) { if(ref > MAX_REFINE) ref = MAX_REFINE; } else if(item_data->type==IT_PETEGG) { iden = 1; ref = 0; } else { iden = 1; ref = attr = 0; } item_tmp.nameid=nameid; if(!flag) item_tmp.identify=iden; else if(item_data->type==IT_WEAPON || item_data->type==IT_ARMOR || item_data->type==IT_SHADOWGEAR ) item_tmp.identify=0; item_tmp.refine=ref; item_tmp.attribute=attr; item_tmp.card[0]=(short)c1; item_tmp.card[1]=(short)c2; item_tmp.card[2]=(short)c3; item_tmp.card[3]=(short)c4; item_tmp.bound=bound; //Check if it's stackable. if (!itemdb_isstackable(nameid)) get_count = 1; else get_count = amount; for (i = 0; i < amount; i += get_count) { // if not pet egg if (!pet_create_egg(sd, nameid)) { if ((flag = pc_additem(sd, &item_tmp, get_count, LOG_TYPE_SCRIPT))) { clif_additem(sd, 0, 0, flag); if( pc_candrop(sd,&item_tmp) ) map_addflooritem(&item_tmp,get_count,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); } } } } return SCRIPT_CMD_SUCCESS; }
  18. Corrígeme si me equivoco pero creo que lo que pretendes es crear una base de datos SQL que registre a los usuarios premium y el tiempo en el que expira sus cuentas, ¿verdad? Sí no es así, te estás complicando mucho la vida ya que siempre es mucho más fácil manejar ese tipo de sistemas desde las tablas SQL y scripts. Sí es el caso, te recomiendo crear una tabla SQL que registre el id de cuenta del usuario, la fecha en la que se ha producido la compra de la cuenta premium y, por último, la fecha en la que expirará dicha cuenta premium. Después es tan simple como crear un script que introduzca la información en la tabla mediante query_sql y que cuando la fecha en la que expira la cuenta supere o sea igual al tiempo actual del servidor se elimine de la tabla. A la vez que si detecta que la id del usuario se encuentra en la tabla SQL de los user premium te otorgue los beneficios por ser premium. Si no sabes como hacerlo o no has entendido lo q quería decir avísame por mensaje privado o a través de este topic explicando detalladamente en qué te puedo ayudar.
  19. Hola Zikoziz, estoy interesado en ayudaros con el proyecto en la parte de la Web. He trabajado ya en varios servidores y tengo 4 años de experiencia en el desarrollo de páginas web. Además puedo ayudaros con el resto de tareas que tengáis referentes al emulador o al cliente. No cobro por mi colaboración en los aspectos del servidor, sin embargo, si queréis una web con flux o cp integrado entonces habría q hablar de precios pero puedo hacer diseños muy bonitos y profesionales sin coste alguno. Tengo bastante tiempo libre actualmente, entre semana me encuentro online y los fin de semanas muy habitualmente. Tengo 20 años y mi experiencia en ragnarok comenzó a los 8 años. Si estáis interesados en contactar conmigo, mi correo electrónico se encuentra en mi perfil o si encontráis alguna dificultad siempre podéis contactar conmigo a través de mensajes privados del foro. Un saludo, espero su respuesta.
  20. Me alegra haber sido de ayuda, para próximas consultas te recomiendo q le eches un vistazo a la Wiki de rAthena.
  21. Hola negroronald, para hacer lo que pides tienes dos opciones, la opción menos recomendada (pero más rápida) y la opción más recomendada (pero más lenta), en este caso te enseñaré a hacerlo por el método rápido porque no dispongo de mucho tiempo . Opción Menos Recomendada \ Sustitución de un item existente Dirígete a .../rAthena/db/re/item_db.txt y busca la siguiente línea: 16448,Scorpio_Diadem_Box,Scorpio Diadem Box,18,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 5677,1; },{},{} Vamos a elegir este objeto para sustituirlo por el que queremos. Imaginemos que queremos que el objeto entregue 2x Red Potion (id 501) y 5x White Potion (id 504) entonces tienes que sustituir { getitem 5677,1; } por { getitem 501,2; getitem 504,5; } quedando así: 16448,Scorpio_Diadem_Box,Scorpio Diadem Box,18,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ getitem 501,2; getitem 504,5; },{},{} Eso por parte del emulador, ahora tocaría modificar la parte del cliente. Dirígete a la carpeta donde se encuentra el exe de tu server y luego a la carpeta System/itemInfo.lub y busca la siguiente línea: [16448] = { unidentifiedDisplayName = "Scorpio Diadem Box", unidentifiedResourceName = "번호상자01", unidentifiedDescriptionName = { "...", "^ffffff_^000000", "Weight :^777777 1^000000", }, identifiedDisplayName = "Scorpio Diadem Box", identifiedResourceName = "번호상자01", identifiedDescriptionName = { "A box that contains 1 Scorpio Celestial Diadem.", "Weight : ^7777771^000000", }, slotCount = 0, ClassNum = 0 }, Y sustituye los datos por el nombre e información que le quieres dar al objeto. Por ejemplo si lo quieres llamar "Paquete Sorpresa" y q la descripción sea algo así como "Caja misteriosa que contiene 2 pociones rojas y 5 pociones blancas." se quedaría del siguiente modo: [16448] = { unidentifiedDisplayName = "Paquete Misterioso", unidentifiedResourceName = "번호상자01", unidentifiedDescriptionName = { "...", "^ffffff_^000000", "Peso :^777777 1^000000", }, identifiedDisplayName = "Paquete Misterioso", identifiedResourceName = "번호상자01", identifiedDescriptionName = { "Caja misteriosa que contiene ^0088882 Pociones Rojas y 5 Pociones Blancas^000000.", "Peso : ^7777771^000000", }, slotCount = 0, ClassNum = 0 }, Si has modificado todo correctamente, inicia sesión en tu servidor y pon @item 16448 para recivir el objeto y ver que todo ha ido bien. Espero que te haya sido de ayuda y perdona que no me haya parado a explicar que es cada cosa pero tengo algo de prisa , si tienes cualquier duda avisa. PD: De ahora en adelante, este tipo de preguntas deberías postearlas en la sección correspondiente (Spanish Soporte o Sección de Scripts).
  22. Hi just wanted to know if there is anything we have to add to the item (Tiquet Exploration) to make it work fine with the script. Any function to call or something? Thanks in advance and great release, i love this warper .
  23. ACTUALIZACIÓN: Ya he hallado la forma de hacerlo por lo que considero solucionada mi duda, pueden cerrar el post o borrarlo. Hola chicos/as, necesito ayuda para elaborar un menu inteligente que muestre unas opciones dependiendo del numero de resultados posibles. Estoy elaborando un script llamado Party Board que vi en el servidor XatiyaRO. Ya he conseguido que el servidor almacene el registro de los detalles de la party registrada en el tablón (lugar al que va, nivel mínimo, cual es el objetivo, lugar de encuentro, etc) y ahora estoy con la parte en la que los usuarios buscan las party's registradas en ese tablón que es donde he encontrado dificultades. Al registrar una party en el tablón se asigna la variable ACTIVE en el campo STATUS mediante SQL y al pasar 20 minutos el campo STATUS cambia a INACTIVE. Bien, ahora que he explicado esto, lo que yo quiero hacer es que en el menú donde los usuarios buscan las party's registradas quiero que aparezcan exclusivamente las que tengan el atributo o variable ACTIVE en forma de menú; quedando algo así en el cliente al hablar con el npc: [Tablón de Party] Estos son los grupos registrados actualmente: Opciones del Menú: - Grupo 1 - Grupo 2 - Grupo 3 - Grupo 4 - etc (y que se añadan más si existen más grupos) Además me gustaría que ese mismo menú si detecta que no hay ninguna party con el atributo ACTIVE muestre el siguiente mensaje: "No se han encontrado grupos registrados actualmente.". ¿Es posible hacer un menú inteligente de ese tipo? Si es así, ¿podríais echarme una mano con el código o dejarme algún ejemplo? Gracias de antemano, espero ansioso vuestras respuestas .
  24. Hola Badariel, te voy a responder en orden a tus preguntas y con ejemplos para que lo veas un poco más claro. De todos modos, si después tienes alguna duda avisame. 1 - ¿Cómo logro hacer que un npc me mande hablar con otro es que quiero crear una quest pero necesito que hablen con distintos npc? Lo primero es dirigirnos al primer npc con el que debemos hablar y asegurarnos de que nos asigne la quest, ejemplo: - script Quest1 -1,{ set .@nombre$,"[ Quest NPC 1]"; if (Quest == 1) { mes .@nombre$; mes "¿Qué haces aún por aqui?"; next; mes .@nombre$; mes "Ve a buscar al Quest NPC 2."; close; } mes .@nombre$; mes "Hola "+strcharinfo(0)+","; mes "¿Quieres aceptar mi quest?"; if(select("Si:No")==2) { end; } else { mes .@nombre$; mes "De acuerdo, para continuar busca al Quest NPC 2."; close2; set Quest,1; end; } } Si te fijas, al final del script, cuando teminas de hablar con el NPC se asigna la variable "Quest" en 1 al user. Con esto identificamos si el usuario ha hablado ya con el a través del comando if (Quest == 1) {} a través de esos dos comandos vas comprobando si el usuario habla con todos los npc que debería hablar y haces que lleven un orden. Por ejemplo, para el siguiente NPC con el que debería hablar es Quest NPC 2 (no tiene porq llamarse así xD): - script Quest2 -1,{ set .@nombre$,"[ Quest NPC 2 ]"; if (Quest > 1) { mes .@nombre$; mes "Tu ya has terminado esta quest."; close; } if (Quest < 1) { mes .@nombre$; mes "Hola, ¿te has perdido?."; close; } if (Quest == 1) { mes .@nombre$; mes "Veo que ya has hablado con Quest NPC 1."; next; mes .@nombre$; mes "Doy por terminada la quest, aquí tienes tu recompensa."; close2; getitem 609,10; set Quest,2; close; } end; } Espero que con esos dos ejemplos bastante sencillos y simples te haya quedado claro el punto 1. Ahora vamos con el punto 2: 2 - ¿Cómo puedo lograr hacer que un npc al llegar al nivel 20 me hable sin importar el lugar donde este y me de algun mensaje? La forma más fácil de conseguir que al subir al nivel 20 un npc te hable, estés donde estés, es a través de la función OnNPCKillEvent, ya que lo más normal es que el usuario suba de nivel matando a un monstruo. Te pongo un ejemplo de lo que deberías poner: - script MensajeNv20 -1,{ OnNPCKillEvent: if (BaseLevel >= 20 && MNv20 != 1) { set .@nombre$,"- Información -"; mes .@nombre$; mes "Enhorabuena, has alcanzado el nivel 20."; close2; set MNv20,1; end; } else { end; } } Ahora vamos con el punto 3: 3 - ¿Cómo puedo lograr hacer que el script active algun comando como el de poder clonar algún personaje con el que esta hablando? Para que un script realice un comando de administrador se utiliza el siguiente comando NPC: atcommand "@comando <variable>" Ejemplo, imagina que queremos que el npc haga un clon malvado de la persona que le está hablando a dicho NPC: - script EvilCloneNPC -1,{ mes "[ Ejemplo ]"; mes "Hola, ¿quieres que haga un clon malvado de tí?"; next; if (select("Si:No") == 2) { end; } else { mes "[ Ejemplo ]"; mes "Muy bien, ahora mismo crearé a tu clon malvado."; close2; atcommand "@evilclone "+strcharinfo(0); end; } Espero que te haya servido de ayuda esta mini-guia, si tienes alguna duda preguntame. Un saludo.
  25. Sería mucho más sencillo crear un sistema de lenguaje con una serie de variables que se asignen según un comando (en el que decides cual es tu idioma o en que idioma prefieres que se muestren los npc). Una vez asignada esa variable, llamemos a esa variable "Lang", haces que los npc la identifiquen antes de hablarte y que te hable en ese idioma. Si no te ha quedado claro te pongo un ejemplo de un npc que actue según esa variable: prontera,150,150,4 script Ejemplo 120,{ set .@nombre$,"[^0065DF Ejemplo ^000000]"; if (Lang == 1) { mes .@nombre$; mes "Hola ^008888"+ strcharinfo(0) +"^000000,"; mes "como has configurado tu idioma por defecto como Español, a partir de ahora te hablaré en Español."; close; } if (Lang == 2) { mes .@nombre$; mes "Hi ^008888"+ strcharinfo(0)"^000000,"; mes "you have set English as your idiom, so from now i'll speak to you in English."; close; } mes .@nombre$; mes "Aún no has configurado tu idioma, utiliza @idioma para configurar el idioma del juego."; next; mes .@nombre$; mes "You have not set your idiom, please use @idioma to set the language of the game."; close; } Si necesitas ayuda en algo o no te ha quedado claro avísame. Espero haberte sido de ayuda .
×
×
  • Create New...