-
Contador contenido
357 -
Ingreso
-
Última visita
-
Días ganados
38
Mensajes publicados por caanmasu
-
-
hace 5 horas, ChuchoGamer dijo:
Buenas quiero pedirles se me pueden corregir esta quest ya que mata 5 mobs distintos y quiero que cuando mate 5 mobs distintos de una Recompensa
quest hola begin
state start begin
when 9010.chat."Mata xd" begin
say_title("Mata")
say("5 Perros")
say("5 de otra cosa")
say("5 de otra cosa")
say("5 de otra cosa")
say("5 de otra cosa")
pc.setqf("estadoms",1)
end
when 101. kill with pc.getqf("estadoms") == 1 begin
if pc.getqf("contador1") < 5 then
chat("Has matado a 5 perros")
else
pc.setqf("contador1",pc.getqf("contador1")+1)
end
end
when 102. kill with pc.getqf("estadoms") == 1 begin
if pc.getqf("contador2") < 5 then
chat("Has matado a 5 otro")
else
pc.setqf("contador2",pc.getqf("contador2")+1)
end
end
when 103. kill with pc.getqf("estadoms") == 1 begin
if pc.getqf("contador3") < 5 then
chat("Has matado a 5 otro")
else
pc.setqf("contador3",pc.getqf("contador3")+1)
end
end
when 104. kill with pc.getqf("estadoms") == 1 begin
if pc.getqf("contador4") < 5 then
chat("Has matado a 5 otro")
else
pc.setqf("contador4",pc.getqf("contador4")+1)
end
end
when 105. kill with pc.getqf("estadoms") == 1 begin
if pc.getqf("contador5") < 5 then
chat("Has matado a 5 otro")
else
pc.setqf("contador5",pc.getqf("contador5")+1)
end
end
end
endquest 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.
-
hace 17 horas, TheKing24 dijo:
tengo el dopador infinito recuerdas el item que tu lo arrastra al item para agregar o quitar o cambiar, no recuerdo como se llama el item pero bueno ese item mi server files lo tiene infinitos por defecto pero quiero quitarlo y no encuentro una solucion y decidi buscar una quest similar asi pero esta quest es mas para pvp que pvm ya quiero organizar algo pvm pero que la quest te pida cierto item por agregar bonus no se si me entiendes
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
-
-
Yo podría ser
Cuánto pagas?
-
Esta línea anda suelta o tiene su traducción abajo?
-
hace 22 horas, ALEXANDER2020 dijo:
Buenas alguno sabra que contexto contienen estos complementos.si alguien puede hacerme el favor. Para poder agregar al Locale_string
"% sÀÇ% sÀÌ% d %% Áõ ° ¡Çß½À´Ï´Ù!";
"ÀüÁ¦ ± ¹";
"Aida ³ª¿Ã μ · u · E®";"¾ÆÀÌÅÛÀÌ ³ª¿Ã È® · ü";
"아이템 이 나올 확률";"전제국";
"경험치 배율";"¾ÆA ÷ ° nôI'U.";
"말 을 탄 상태 에서 감정 표현 을 할 수 없습니다.";
"이미 탈것 을 이용중 입니다.";
"% s 블럭! (% d %%)";Veo bastante insistencia con el tema de las traducciones. Voy a hacer un programa que traduzca absolutamente todas las líneas
-
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
-
En 22/7/2021 a las 11:16, nilsonmax dijo:
buenas les quiero comentar que estoy conjuntamente con un grupo de personas que siguen mi blog y el grupo de metin2publico en un grupo de WhatsApp que creo
Debes iniciar sesión para ver el contenido del enlace en esta publicación.para modificar esta base y dejarla en español y otras modificaciones aun no hemos definido el limite hasta donde llegara el proyecto. yo me encargare de la parte de las quest y otras modificaciones con otras personas mas la base será publica, en ese grupo comunicarse con alexander que es el que creo el grupo de WhatsApp hay muchas personas que saben mucho de otros temas y estaremos dando cursos por discord que mas adelante los publicare en mi blog y muchos acá espero que aprovechen al maximo los conocimientos si un representante de metin2zone se quiere apuntar bienvenido sea.Y saludos a todos que tengan un excelente día.
Yo soy de Quest
Méteme a tu grupo bro
-
hace 43 minutos, ALEXANDER2020 dijo:
Camilo una pregunta si puedes por que no hacer otro programa asi al publico que se pueda usar como item_name o mod_name que busce el numero correspondiente y cambie traducción seria chévere realmente eso de manual ya cansa jeje xd hay le dejo la duda
Tal vez este post te ayude
-
-
hace 16 horas, ALEXANDER2020 dijo:
no se si el error es mio.
Debes iniciar sesión para ver el contenido del archivo adjunto en esta publicación.Debes tener Python 3 o superior descargado
-
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
-
En 11/6/2021 a las 18:04, TheKing24 dijo:
buen aporte la verdad, pero no tienes algo similar que te quite por ejemplo algún ítem y se aleatorio el bonus ya que mi agregador de bonus esta infinito y no se quitarlo y mi servidor será mas pvm que pvp entonces este quest solo sirve para mayor mente pvp si tienes una quest similar con las característica que digo me ayudaría mucho tu aporte y gracias!!!
Holaaa!
Explícame mejor tu idea, no te entendí muy bien
Ups, respondí un mes después
-
El mismo syserr te da la respuesta.
No existe el objeto 금전자파+0, +1, +2...
Usa un archivo que tenga los ítems en vnums mejor
-
- Este es un tema popular.
- Este es un tema popular.
borrar
- suning232, VladshipvenomskyYT, [D]ELARO ✓ y 21 mas reacciono a esto
- 19
- 3
- 2
-
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
-
Debes iniciar sesión para ver el contenido del enlace en esta publicación.te voy a explicar mejor
- colombia2020 reacciono a esto
- 1
-
- Este es un tema popular.
- Este es un tema popular.
borrar
- llollo300, ALEXANDER2020, wille damare y 23 mas reacciono a esto
- 20
- 3
- 2
- 1
-
hace 22 horas, .hack//ROOTS dijo:
Llama a mi discord tengo de todo lo mejor: xSachi#4832
Recomendado
-
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 = {}
-
Soy experto en quest, por si necesitas
-
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
-
Yo lo jugué, es muy bueno. Aunque es muy limitado, todavía le falta mucho.
-
Deja un vídeo o algo
¡Evento de pesca!
en Quest
Publicado
Update en el post original!