Jump to content

caanmasu

Miembro
  • Contador contenido

    357
  • Ingreso

  • Última visita

  • Días ganados

    38

Todo lo publicado por caanmasu

  1. Hacerla no es tan difícil, el problema es que es muy fácil aprovecharse del farmeo de puntos. Van a crear muchos pjs y contratar personas solo para matarlos y así cumplir con la meta. Por eso esas misiones de matar personajes no las ponen Y si lo hacen, las ponen con muchas restricciones como IP, niveles altos, al matar el pj de nuevo solo cuenta punto si lo matas al otro día, etc.
  2. quest five_kills begin state start begin function info() return { [101] = 5, [102] = 5, [103] = 5, [104] = 5, [105] = 5 } end when 9010.chat."Mata xd" begin local s = five_kills.info() say_title(mob_name(npc.get_race())) say("Debes matar los monstruos que te indicaré ") say("cuando aceptes la misión") say_reward("Aceptar misión?") if select("Aceptar", "Cerrar") == 1 then for k, v in pairs(s) do pc.setqf(string.format("fk_%s", k), v) end set_state(state1) end end end state state1 begin when 9010.chat."Mata xd" begin local s = five_kills.info() say_title(mob_name(npc.get_race())) say("Todavía te quedan por matar:") for k, v in pairs(s) do say(string.format("%s %s", pc.getqf(string.format("fk_%s", k)), mob_name(k))) end end when kill begin if five_kills.info()[npc.get_race()] != nil then pc.setqf(string.format("fk_%s", npc.get_race()), pc.getqf(string.format("fk_%s", npc.get_race())-1)) if five_kills.allKillDone() then chat("Acabaste la misión con éxito") set_state(state2) end end end end function allKillDone() local s = five_kills.info() for k, v in pairs(s) do if pc.getqf(string.format("fk_%s", k)) > 0 then return false end end return true end function clearQuest() local s = five_kills.info() for k, v in pairs(s) do pc.delqf(string.format("fk_%s", k)) end end state state2 begin when 9010.chat."Mata xd" begin say_title(mob_name(npc.get_race())) say("Recompensas:") say_reward("Recibes bablabla") five_kills.clearQuest() set_state(__COMPLETE__) end end state __COMPLETE__ begin end end Esta la hice en un rato, no la testeé Fíjate que la quest es tipo misión, es más cómodo usar states. Si el pj está en un state, solo reconoce los when de ese mismo state. Así que no es necesario poner pc.getqf() de valor 1 o 0 para validar si el personaje tiene la misión activa, por ejemplo. De igual manera cuando se termina la misión se envía a un state vacío y listo. Al ser varios monstruos ya constituye una pequeña estructura de datos, a menos que uses programación estática. Sé que cada monstruo pide 5 de cantidad pero lo hice para que pudieras elegir cierta cada cantidad en cada uno. Utilizo la estructura como [clave] = valor, para que no tenga que recorrer la lista todas la veces sino que vaya directo a la posición que se pide. Esto mejora el rendimiento. Una vez aceptada la misión, se almacena un qf para cada monstruo donde el valor del qf es el número que hay que matar. Luego cada vez que mate uno, disminuye en 1 ese qf. Cada vez que hace un kill a un monstruo objetivo, verifica si todos los qf están en 0 para enviar al state de recompensas. En el state de recompensas limpio los qf para optimizar espacio en la db. Viste el for k, v in pairs(tabla) do ? eso es un ciclo que recorre las posiciones de la lista que no son nulas. Para la lista de five_kills.info(): La "k" es 101, 102, 103, 104, 105... La v es 5, 5, 5, 5, 5... Así se recorre un ciclo con [clave] = valor. El string.format es para que no hagas esto: say("Hola "..variable1.." blabla "..variable2.." asdasd "..variable3) sino que hagas esto say(string.format("Hola %s blabla %s asdasd %s", variable1, variable2, variable3)) Es mucho más fácil de ver y programar No creo que funcione la quest si la llegas a compilar y ya. Hay que testearla.
  3. caanmasu

    borrar

    Dices que al usar el Objeto Encantado no se elimina? bueno eso creo que ya por el src. Alguien habrá comentado la línea del remove. Busqué y no lo encontré xD
  4. Simplemente pon en una query UPDATE account.account SET password = password("tu_pass") WHERE login = "tu_user"; La función password() recibe como parámetro la contraseña en String y el retorno es la contraseña encriptada
  5. Esta línea anda suelta o tiene su traducción abajo?
  6. Veo bastante insistencia con el tema de las traducciones. Voy a hacer un programa que traduzca absolutamente todas las líneas
  7. DEFINE chest_1 1111 quest chest_race begin state start begin function info() return { [0] = { --guerrero (no más de 30 ítems por raza) --item_vnum, cantidad {27991, 20}, {19, 1} }, [1] = { --ninja {27992, 40}, {1009, 1} }, [2] = { --sura {27992, 40}, {19, 1} }, [3] = { --chamán {27992, 40}, {7009, 1} }, [4] = { --lícano {27992, 40}, {6009, 1} } } end when chest_1.use begin local s = chest_race.info() say_title(item_name(item.vnum)) local tabla_select = {} for i = 1, table.getn(s) do table.insert(tabla_select, item_name(s[pc.job][i][1])) end table.insert(tabla_select, gameforge.arena_manager._200_tableInsert) local sel = select_table(tabla_select) if sel == table.getn(sel) then return end pc.give_item2(s[pc.job][sel][1], s[pc.job][sel][2]) pc.remove_item(item.vnum) end end end Lo hice a la carrera, no sé si funcione ya que no lo puedo testear, ando en trabajos finales Si alguno puede corregirla estaría muy bien! Cualquier cosa me preguntan
  8. caanmasu

    borrar

    Tal vez este post te ayude
  9. Ese end lo debes borrar Revisa el punto 2 en la parte de los bloques
  10. caanmasu

    borrar

    Debes tener Python 3 o superior descargado
  11. Estuve revisando este caso con el autor La quest no existía en la carpeta original, solo en la compilada (object) Borré la carpeta object y luego compilé todas las quest En este punto esa give_basic_weapon ya no existe. Luego creamos un archivo con otro nombre, le pusimos un say para testear, y sucedió lo mismo... Lo único que se me ocurre ahora sería borrar de nuevo la carpeta object, compilar una quest cualquiera con say en un when login. Esto con el objetivo de averiguar si otras quest entran en conflicto Si sigue ocurriendo lo mismo ya es un bug desde otro lado
  12. caanmasu

    borrar

    Holaaa! Explícame mejor tu idea, no te entendí muy bien Ups, respondí un mes después
  13. El mismo syserr te da la respuesta. No existe el objeto 금전자파+0, +1, +2... Usa un archivo que tenga los ítems en vnums mejor
  14. caanmasu

    borrar

    Que se ejecute una sola vez en un pergamino? hmmm no le encuentro gracia porque esto es para una sola habilidad Pero bueno, así sería la quest: quest una_hab_p begin state start begin when login with pc.get_skill_group() != 0 begin setstate(state1) end end state state1 begin when login begin send_letter("Una sola hab P") end when button or info begin MAX_LVL_SKILL = 40 if pc.get_skill_group() != 0 then local skill_list = special.active_skill_list[pc.job+1][pc.get_skill_group()] local ret_vnum_list, ret_name_list = {}, {} table.foreach(skill_list, function(i, skill_vnum) local skill_level = pc.get_skill_level(skill_vnum) if skill_level < MAX_LVL_SKILL then table.insert(ret_vnum_list, skill_vnum) local name=locale.GM_SKILL_NAME_DICT[skill_vnum] if name == nil then name=skill_vnum end table.insert(ret_name_list, name) end end) if table.getn(ret_name_list) != 0 then table.insert(ret_name_list, "Cerrar") say_title("Subir habilidad a P") say("[ENTER]Desaparece tras su uso") local sel = select_table(ret_name_list) if sel != table.getn(ret_name_list) then pc.set_skill_level(ret_vnum_list[sel], MAX_LVL_SKILL) setstate(__COMPLETE__) end end end end end state __COMPLETE__ begin end end
  15. @colombia2020 te voy a explicar mejor
  16. caanmasu

    borrar

    Voy a revivir el RETO! Sé que dar un objeto es algo muy básico. El reto está en entregarlo a varias personas porque ese comando se limita al persona actual. Así que lo planeo de esta manera: 1. Crear una tabla donde almacene los VIDs de los personajes. En los comentarios de arriba explico qué significa esto. La tabla va a estar en questlib porque si lo pongo en la quest, va a inicializarse de nuevo y se perderán los datos. vidPc_map = {} Así la llamé. Ten en cuenta que un /rel q vuelve a cargar el questlib.lua. 2. Hacer que la tabla se vaya llenando. Cuando un personaje se conecte, agregar su vid y el mapa en donde está. when login with not pc.is_gm() begin local idx = pc.get_map_index() if type(vidPc_map[idx]) != "table" then vidPc_map[idx] = {} end table.insert(vidPc_map[idx], pc.get_vid()) end En la lista no habrá GMs porque ellos no recibirán regalos. Capturo el index del personaje. Luego pregunto si la tabla donde guardo los VIDs es una tabla, y en caso de que no, asignarle una vacía. Inserto en la tabla el VID. La estructura de mi tabla será así: vidPc_map = { [map_index] = {vid_pj...}, [map_index] = {vid_pj...} ... } Ejemplo: vidPc_map = { [1] = {43254, 43255, 43256}, --Shinsoo [41] = {52552, 52553, 52554, 5255} --Jinno } Así que viéndolo de esa forma, es fácil insertar un valor en la tabla. Se crea una tabla en la posición del index del mapa y todos los elementos que agregue son los VIDs. Y cómo saco el VID? con la función pc.get_vid(). Cuando un personaje se desconecte o cambie de personaje, buscar su vid y eliminarlo. when logout or disconnect with not pc.is_gm() begin local idx = pc.get_map_index() if type(vidPc_map[idx]) == "table" then for i = 1, table.getn(vidPc_map[idx]) do if vidPc_map[idx][i] == pc.get_vid() then table.remove(vidPc_map[idx], i) end end end end Es muy parecido al anterior. La diferencia es que al desconectar el pj vas a buscar su VID. Obviamente tiene VID porque estuvo conectado. Tu deber es buscar el VID en la tabla del mismo map index, esto se hace un ciclo comparando los VIDs. Cuando lo encuentre, luego le da a remover la posición en la que estaba ese VID. 3. Regalar los ítems tomando la tabla de los VIDs. local idx = pc.get_map_index() for i = 1, table.getn(vidPc_map[idx]) do pc.select(vidPc_map[idx][i]) pc.give_item2(in_vnum, in_count) end Recorro la tabla de los VIDs de mi mismo mapa. A su vez, selecciono cada personaje y ya, doy el objeto. Esto de seleccionar el personaje funciona así: Yo pongo pc.select(vid_del_otro_pj) y esto hace que cuando yo use funciones de quest, se hagan hacia ese personaje y no hacia mí. Por ejemplo, si lo tengo seleccionado y pongo chat("Hola, soy "..pc.get_name()), va a mostrar ese chat en el personaje seleccionado y con su propio nombre. Ya lo demás es poner que el NPC pida los datos y pues ya es más básico. Quest completa: quest premio_mapa begin state start begin when 20095.chat."Regalar objetos a todos" with pc.is_gm() begin say_npc() say() say("Elige el vnum") local in_vnum = math.ceil(tonumber(input())) say_npc() say() say("Cantidad") local in_count = math.ceil(tonumber(input())) if in_vnum == nil or in_count == nil then return end local idx = pc.get_map_index() if type(vidPc_map[idx]) != "table" then syschat("No hay personas en el mapa") return end local personas = 0 local mi_vid = pc.get_vid() for i = 1, table.getn(vidPc_map[idx]) do pc.select(vidPc_map[idx][i]) pc.give_item2(in_vnum, in_count) personas = personas + 1 end pc.select(mi_vid) syschat("Les has regalado las cosas a "..personas.." jugadores") end when login with not pc.is_gm() begin local idx = pc.get_map_index() if type(vidPc_map[idx]) != "table" then vidPc_map[idx] = {} end table.insert(vidPc_map[idx], pc.get_vid()) end when logout or disconnect with not pc.is_gm() begin local idx = pc.get_map_index() if type(vidPc_map[idx]) == "table" then for i = 1, table.getn(vidPc_map[idx]) do if vidPc_map[idx][i] == pc.get_vid() then table.remove(vidPc_map[idx], i) end end end end end end --questlib --vidPc_map = {}
  17. Soy experto en quest, por si necesitas
  18. Una vez dentro de la carpeta quest debes poner: ./qc ruta/de/tu/quest En tus files las quest están en la carpeta source. Digamos si tu quest se llama bienvenida.quest entonces debes poner: ./qc source/bienvenida.quest Si tu quest está en source/nuevas/evento.quest, entonces pones: ./qc source/nuevas/evento.quest
  19. Yo lo jugué, es muy bueno. Aunque es muy limitado, todavía le falta mucho.
×
×
  • Crear nuevo...