KeKo Posted July 28, 2012 Report Share Posted July 28, 2012 Buenas zone! De nuevo tras otro emocionante capítulo del curso brindado por el gran raul es mi turno de seguir con el curso. El capítulo de hoy tratará sobre las condiciones en las quests, lo que popularmente conoceis todos como usar if en una quest. Esta vez también nos vamos a centrar en el cuerpo de una quest, y como mi colega raul empezare con la estructura básica de un if. Recordad esto primero: Llamaremos [X] a una variable que nos sirva para todos los casos. Pero como la variable [X] que nos hemos inventado no existe, tendremos que poner algo en su lugar, ¿no? Podemos poner muchas acciones que puede realizar el usuario (pc) dentro del servidor. De nuevo la idea es la misma que con los whens: Por lo tanto la estructura es asi: if [X] then accion end Como veis cada if le corresponde un end y para que nos os de error al cargar tiene que ir un then al final del if, si no os saltara este error: La sintaxis es incorrecta: el servidor espera encontrar un "then" después de la condición, pero no lo encuentra. Bien si ya tenemos claro la estructura vamos a profundizar un poco en el uso de las condiciones. Lo primero de todo me gustaría hacer una pequeña distinción entre varios tipos de condiciones: - Condiciones simples: Son aquellas que solo tienen un unico if (con sus posibles elseifs). - Condiciones compuestas: Son aquellas que se dan en las quests en las que si superamos la primera condicion se nos pone otra condición. Ojo! Son 2 condiciones diferentes, que llevan dos if y dos ends. - Condiciones opuestas: Que son las que usan habitualmente un else, o si no un return+end (ya os explicare como funcionan en el capi), y que son aquellas en las que ponemos una condicion y lo que pasara si se cumple lo contrario a esa condicion. Bueno vamos aver un pequeño ejemplo de una quest que usa una condicion: quest capicuatro begin state start begin when login with pc.get_map_index() == 41 begin if pc.get_empire() == 1 then say("No estas en el mapa de tu reino") end end end end Hasta aquí todo bien no? Como veis es una quest que se activa si te logeas en el mapa de city1 de jinno, pero te pone la condicion de que si eres del reino 1 (shinsoo) te aparece un mensaje diciendo que no estas en el mapa de tu reino. Respecto a los ends, como hay un if lleva un end y los otros tres son del when y de la apertura. Por lo tanto hagamos un resumen: cuando quieres poner una condicion en una quest primero pones el when [X] begin al que queremos ponerle la condicion, luego escribimos la condicion en si, la accion que se realiza una vez cumplida la condicion y el end. if [X] then accion end Ahora pongamos otro ejemplo con esta misma mision pero ya con algunos elseif: quest capicuatro begin state start begin when login with pc.get_map_index() == 41 begin if pc.get_empire() == 1 then say("No estas en el mapa de tu reino") elseif pc.get_empire() == 2 then say("No estas en el mapa de tu reino") elseif pc.get_empire() == 3 then say("Estas en el mapa de tu reino!") end end end end Ahora ya tenemos 3 condiciones, pero como os fijais solo 1 lleva if, ya que son continuacion de la primera y por lo tanto solo llevan un end por las tres. Y también otro ejemplo del uso de un elseif, con un local select que es cuando mas vais a ver un elseif: quest capicuatro begin state start begin when 70042.use begin say_title("Tienda portatil") say("Con este objeto podras comprar") say("Potas donde quiera que estes.") say_reward("Quieres algunas?") local tienda = select ("Potas rojas" , "Potas azules" , "Superpotas" , "Cerrar") if tienda == 1 then say("Toma 200 potas rojas") pc.give_item2("27003", 200) pc.change_money(-30000) elseif tienda == 2 then say("Toma 200 potas azules") pc.give_item2("27006", 200) pc.change_money(-45000) elseif tienda == 3 then say(" Usted ha sido trolleado") say("no hay superpotas") elseif tienda == 4 then return end end end end A estas alturas ya os habreis dado cuenta de como funciona el uso de un elseif: if [X] then accion elseif [X] then accion elseif [X] then accion end Al igual que cuando usabamos un solo if, ponemos el when [X] begin, luego la condicion if [X] then y esta vez las otras posibilidades que queremos que haya unidas al primer if [X] then (podemos poner las que queramos) con la estructura elseif [X] then. Por último cerramos el if con un end. Vayamos ahora a un caso de condicion compuesta, por ejemplo un teletransportador para un mapa: quest capicuatro begin state start begin when 20095.chat."Teleporter" begin if pc.get_level() < 50 then say("Lo siento eres muy bajo") say("vuelve cuando seas mas lvl") return end if pc.count_item("50084") == 0 then say("Valla, no tienes sello") say("Asi que no puedes entrar") return end if pc.get_map_index() == 190 then say("No puedes ir al mapa nuevo") say("Si ya estas en el") return end say("Pues lo siento ahora no quiero") say(" llevarte al mapa nuevo.") end end end Ahora en vez de usar condiciones unidas a la primera (el if [X] then) ponemos diferentes condiciones, cada una de estilo if [X] then y con su respectivo end. Usando las condiciones compuestas conseguimos que para llegar a la accion propia del when [X] begin haya que ir cumpliendo cada una de las condiciones. Es decir, si cumplimos la primera condicion el juego mirará aver si cumplimos la segunda. Si no cumplimos la segunda no se ejecutará, y si la cumplimos mirará aver si cumplimos la tercera. Si cumplimos todas las condiciones, la accion principal se ejecutará. Otra cosa a tener en cuenta es que podemos meter condiciones dentro de otras condiciones, y para eso os pondré un ejemplo en el que mezclaré condiciones simples con condiciones opuestas (hare mas compleja la quest de antes de las potas): quest capicuatro begin state start begin when 70042.use begin say_title("Tienda portatil") say("Con este objeto podras comprar") say("Potas donde quiera que estes.") say_reward("Quieres algunas?") local tienda = select ("Potas rojas" , "Potas azules" , "Superpotas" , "Cerrar") if tienda == 1 then if pc.gold < 30000 then say("Vaya no tienes suficiente dinero") return end say("Toma 200 potas rojas") pc.give_item2("27003", 200) pc.change_money(-30000) elseif tienda == 2 then if pc.gold < 45000 then say("Vaya no tienes suficiente dinero") return end say("Toma 200 potas azules") pc.give_item2("27006", 200) pc.change_money(-45000) elseif tienda == 3 then say(" Usted ha sido trolleado") say("no hay superpotas") elseif tienda == 4 then return end end end end end Ahora hemos metido una condición dentro de otra: primero metemos la condicion de elegir la opcion 1 (la de potas rojas) y luego dentro de esa hacemos que el juego mire si tenemos 30k para comprar las potas. Os habreis fijado que ahi usamos una condición opuesta: if pc.gold < 45000 then say("Vaya no tienes suficiente dinero") return end say("Toma 200 potas azules") pc.give_item2("27006", 200) pc.change_money(-45000) Ponemos la condicion: if pc.gold < 45000 then Luego lo que pasa si la cumplimos: say("Vaya no tienes suficiente dinero") Y para cerrar la condicion ponemos: return end De esta manera, lo siguiente que pongamos se cumplirá EN CUALQUIER CASO EN EL QUE NO CUMPLAMOS LA CONDICION ANTERIOR. Y como veis si tenemos mas de 45k de yang (es decir, no cumplimos la condicion) pues nos da las potas: say("Toma 200 potas azules") pc.give_item2("27006", 200) pc.change_money(-45000) Para acabar me gustaría hablarlos de la palabra else. Esta palabra se utiliza para hacer una condicion opuesta, ya que implica que si la cumplimos estará pasando cualquier cosa contraria a la de la condicion anterior. Veamos un ejemplillo, y os recalco que UN ELSE NO TIENE QUE LLEVAR SU CORRESPONDIENTE END. quest capicuatro begin state start begin when 70044.use begin if pc.count_item("70042") == 0 then pc.give_item2("70024", 1) chat("Toma un 5o bonus") pc.remove_item("70024" , 1) else say("Lo siento pero ya tienes") say("el 5o bonus") end end end end En este caso la condicion primera es que no tengamos ningun 5o bonus en el inventario, y si no la cumplimos (es decir, si que tenemos 5o bonus) pues nos dice que ya lo tenemos. Como usamos un else no especificamos una cantidad de bonus que tenemos que tener, si no que en cualquier caso contrario a que no tengamos ninguno nos dirá que sí lo tenemos. Y bueno eso es todo en el capítulo de hoy, espero que lo hayais disfrutado y que os ayude a la hora de hacer nuevas quests . Santy!., fuuton97, izaviona and 8 others 11 Link to comment Share on other sites More sharing options...
Santy!. Posted July 28, 2012 Report Share Posted July 28, 2012 wow lo tengo que leer de vuelta me embrollo la cabeza muy bueno! Link to comment Share on other sites More sharing options...
ElRaulxX Posted July 28, 2012 Report Share Posted July 28, 2012 Aún no han acabado de leerse mi capÃtulo y les pones el tuyo xD ¡Les estallará la cabeza de tanta información! El próximo me toca a mÃ, a ver que tal se os dan los states :fuckyeah: Link to comment Share on other sites More sharing options...
KeKo Posted July 28, 2012 Author Report Share Posted July 28, 2012 Aún no han acabado de leerse mi capÃtulo y les pones el tuyo xD ¡Les estallará la cabeza de tanta información! El próximo me toca a mÃ, a ver que tal se os dan los states :fuckyeah: sip este lo hice ants de lo normal porque mañana no estare en todo el dia Link to comment Share on other sites More sharing options...
fuuton97 Posted July 29, 2012 Report Share Posted July 29, 2012 Excelente keko, aún asà necesitarÃa todas las funciones de las quest y que hacen, solo tengo como 150 o 200 variables de la misma questlib.lua xD, serÃa genial que pusieras que hace cada una en especÃfica. Saludos. Link to comment Share on other sites More sharing options...
Dialfoar Posted August 17, 2012 Report Share Posted August 17, 2012 Ayer haciendo una quest y ya casi terminada, le quise agregar mas items que hace mi quest son muchos if con elseif que me comparan si el pj tiene cierta cantidad de x item en cada elseif le hago la comparacion pero en el ultimo elseif le pongo que sea todo => a la cantidad de items que pido anteriormente, y todo lo uno con and pero cuando hago unir dos items con 1 and funciona y al poner 3 o 4 and ya no corre bien la quest me Yo creo que no se puede mas de 1 and por linea de if , estoy en lo correcto ? tengo esa duda dejo una parte de lo que hablo if pc.count(item1) <=1 say:("te hace falta este item") elseif pc.count(item2) <=2 say:("te hace falta este item2") if pc.count(item3) <=9 say:("te hace falta este item") elseif pc.count(item1) => 2 and pc.count(item1) =>3 and pc.count(item) => 10 then say:("recibes estos items:") end Y excelentes aportes los que llevan en esta Web cada dia se esta mejorando mas la web Los Felicito Link to comment Share on other sites More sharing options...
KeKo Posted August 17, 2012 Author Report Share Posted August 17, 2012 Ayer haciendo una quest y ya casi terminada, le quise agregar mas items que hace mi quest son muchos if con elseif que me comparan si el pj tiene cierta cantidad de x item en cada elseif le hago la comparacion pero en el ultimo elseif le pongo que sea todo => a la cantidad de items que pido anteriormente, y todo lo uno con and pero cuando hago unir dos items con 1 and funciona y al poner 3 o 4 and ya no corre bien la quest me Yo creo que no se puede mas de 1 and por linea de if , estoy en lo correcto ? tengo esa duda dejo una parte de lo que hablo if pc.count(item1) <=1 say:("te hace falta este item") elseif pc.count(item2) <=2 say:("te hace falta este item2") if pc.count(item3) <=9 say:("te hace falta este item") elseif pc.count(item1) => 2 and pc.count(item1) =>3 and pc.count(item) => 10 then say:("recibes estos items:") end Pues sÃ, por desgracia no se pueden encadenar ifs con ands o ors (lo que es una pena la verdad) asà que en tu caso yo probaria asi: if pc.count(item1) <=1 say:("te hace falta este item") elseif pc.count(item2) <=2 say:("te hace falta este item2") if pc.count(item3) <=9 say:("te hace falta este item") elseif pc.count(item1) => 2 then if pc.count(item1) =>3 then if pc.count(item) => 10 then say:("recibes estos items:") return end end end say("Lo siento no tienes los items") end No estoi seguro de que funcione que no tengo tiempo ahora para probarla y recuerda que el comando para ver si tienes un item es pc.count_item("item", cantidad) o si estas haciendo comparaciones pc.count_item("iditem") == cantidad. Link to comment Share on other sites More sharing options...
Dialfoar Posted August 17, 2012 Report Share Posted August 17, 2012 Sip lo hize parecido pero despues me puse a mirar y dije eso son rebundancias.... por que compruebo que tenga <=9 por logica el pj tiene 10 o mas entonces ya no nesecito comprobar en el resto del codigo, y al final haciendolo a mi manera no podre dar la advertencia del ultimo item, pero como ya se que ese item no esta lo hago con un else..... Gracias = tu forma tambien funciona pero creo que asi como digo haorramos codigo y como no salimos de la ventana, no veo provabilidades de que la bugueen if pc.count(item1) <=1 then say:("te hace falta este item") elseif pc.count(item2) <=2 then say:("te hace falta este item2") elseif pc.count(item3) =>9 then say:("Recibes estos iems") else say:("the hace falta este item3") end Asi la termine dejando y corre muy bien, Gracias nuevamente por aportar, e igualmente por dar tu opinion sirve mucho para mirar los diferentes conociemientos y aprender mas Link to comment Share on other sites More sharing options...
KeKo Posted August 17, 2012 Author Report Share Posted August 17, 2012 Sip lo hize parecido pero despues me puse a mirar y dije eso son rebundancias.... por que compruebo que tenga <=9 por logica el pj tiene 10 o mas entonces ya no nesecito comprobar en el resto del codigo, y al final haciendolo a mi manera no podre dar la advertencia del ultimo item, pero como ya se que ese item no esta lo hago con un else..... Gracias = tu forma tambien funciona pero creo que asi como digo haorramos codigo y como no salimos de la ventana, no veo provabilidades de que la bugueen Asi la termine dejando y corre muy bien, Gracias nuevamente por aportar, e igualmente por dar tu opinion sirve mucho para mirar los diferentes conociemientos y aprender mas Pues la verdad ni mire como tenias la parte anterior a la del problema asi que simplemente intente hacer lo que comentaras xd, pero si asi te iba mejor pos listo Me alegra ver comentarios como el tuyo es un placer compartir conocimiento y entre todos ir haciendo la comunidad cada vez mejor Link to comment Share on other sites More sharing options...
Hawk Server's Posted May 22, 2013 Report Share Posted May 22, 2013 Amigo tengo una duda para hacer que un pj baje o suba su lv que pc......... tengo que poner yo antes de leer esto sabia muy poco de quest y ps recien termino este capitulo e intente hacer una aun no la pruebo pero si puedes decirme si tengo algo mal quest Reset1 begin state start begin when itemvalue.use begin say_title("by Ares") say("Pergamino reset 1") say ("con este pergamino podras") say ("ser lvl 1 de nuevo pero obtendras") say ("una poderosa armadura") say_reward ("SELECCIONA TU RAZA") local tienda = select ("Guerrero" , "Ninja" , "Sura" , "Chaman" , "Cerrar") if tienda == 1 then if pc.get.level() <250 say ("Que intentas? Tienes que ser lv250 para hacer Reset") return end say ("Aqui tienes tu armadura de Guerrero") pc.give_item2 ("Value armadura", 1) pc.set_level (1) elseif tienda == 2 then if pc.get.level() <250 say ("Que intentas? Tienes que ser lv250 para hacer Reset") return end say ("Aqui tienes tu armadura de Ninja") pc.give_item2 ("Value armadura", 1) pc.set_level (1) elseif tienda == 3 then if pc.get.level() <250 say ("Que intentas? Tienes que ser lv250 para hacer Reset") return end say ("Aqui tienes tu armadura de Sura") pc.give_item2 ("Value armadura", 1) pc.set_level (1) elseif tienda == 4 then if pc.get.level() <250 say ("Que intentas? Tienes que ser lv250 para hacer Reset") return end say ("Aqui tienes tu armadura de Chaman") pc.give_item2 ("Value armadura", 1) pc.set_level (1) elseif tienda == 5 then say ("Esta bien si no quieres es tu problema") say ("no sabes de lo que te pierdes jajaja") return end end end Link to comment Share on other sites More sharing options...
Yori Posted May 22, 2013 Report Share Posted May 22, 2013 no existe la funcion pc.set_level() tendrias que crearla usando mysql, pero para que fuese viable el jugador tendria que estar un tiempo off, como cuando se desbuguea un pj desde la web, que si se conecta rapido no se desbuguea. tambien tienes un un par de errores, te falto un end al final y pc.get.level() tienes que poner asi pc.get_level(). a simple vista no veo mas fallos Saludos, Yori Hawk Server's 1 Link to comment Share on other sites More sharing options...
Hawk Server's Posted May 22, 2013 Report Share Posted May 22, 2013 pero como hago para bajar al pj a lv 1? Link to comment Share on other sites More sharing options...
Yori Posted May 22, 2013 Report Share Posted May 22, 2013 si tienes el Debes iniciar sesión para ver el contenido del enlace en esta publicación. implementado en tu server, con esta funcion cambias el level, pero ya te digo que si el pj no esta off y pasa un tiempo hasta que se vuelva a conectar no creo que sirva. pero siempre puedes intentarlo. mysql_query("Update player.player set level = 1 where name = '"..pc.get_name().."';") Saludos, Yori Suerte Link to comment Share on other sites More sharing options...
Hawk Server's Posted May 22, 2013 Report Share Posted May 22, 2013 no pues entonces no me sirve xq los user's son muy atorrantes y eso generaria problemas a cada momento con los user's hice la quest para nada LOL de igual manera gracias =) Link to comment Share on other sites More sharing options...
Recommended Posts