Jump to content

caanmasu

Members
  • Content Count

    196
  • Joined

  • Last visited

  • Days Won

    11

caanmasu last won the day on June 23

caanmasu had the most liked content!

5 Followers

About caanmasu

  • Rank
    Forero

Recent Profile Visitors

1,122 profile views
  1. quest drop_piedras_4 begin state start begin function esMetin() return { [8001] = 0, --este estructura la puse así para que cada vez que mate no tenga que hacer un ciclo [8002] = 0 } end when kill with drop_piedras_4.esMetin()[npc.get_race()] != nil begin --en la tabla que puse arriba asigné números 0 (o podía poner cualquier cosa que no sea nil) para que logre detectar el vnum. Ya que toda tabla tiene sus index por defecto en nil. Al irme directamente a la posición con npc.get_race() no tendría que recorrer la tabla. if prob(0.75) then --acá está mi función "prob", esto significa 0.75% local rango_piedras = {28430, 28443} local piedra_azar = number(0, rango_piedras[2] - rango_piedras[1])+rango_piedras[1] --acá elijo un número al azar entre 0 y la diferencia en el rango, o sea, 13. Luego le sumo el vnum base y ya obtengo la piedra. game.drop_item_with_ownership(piedra_azar) end end end end --Mi función del questlib.lua function prob(probabilidad) -- formato de probabilidad: 100, 80, 55, 32.5, 1, 0.3, 0.07 local base = 1 if probabilidad >= 1 then return math.random(1, base*100) <= probabilidad else for i = 1, string.len(probabilidad)-1 do base = base*10 end return math.random(1, base) <= probabilidad*(base/10) end end Lo hice de esta manera, comentado obviamente para transmitir el conocimiento. Ojo, no la probé xD Vamos crackkksss! Esta función será útil algún día xD
  2. caanmasu

    RETO quest #1

    ¿Qué pasó amigos? bueno, aquí va una pista: para poder dar los objetos a todos los pjs del mapa primero hay que tener "guardados los pjs" en una tabla ya que de alguna parte los tengo que sacar xD Y por mi parte no usaré db para esto. Así que aquí les va el VID. El VID (Virtual ID) es "identificador virtual". Todo "character" (entiéndase como personaje, NPC, mob) tiene un VID mientras esté "activo" o "online". Todo NPC o mob tiene un VID, y si no hay, entonces es 0. Todo personaje tiene un VID, y si está desconectado pues es 0. La función que retornan los VID son npc.get_vid() o find_pc_by_num(String nombre). Esa fue una gran pista, así que si alguien se anima a seguir pues adelanteee!
  3. Hola Yo quizá te puedo ayudar, sé algo de quest Si quieres escríbeme a mi Discord Camilo#0869
  4. caanmasu

    RETO quest #1

    ufff pues bueno, muchas cosas pc.give_item2() es una función. Esta función da los ítems, efectivamente pero recibe como parámetros el ítem y la cantidad. pc.give_item2(item_vnum, item_count) Al ser "pc" significa "personal character" o sea, tú mismo, tu pj. O sea que si yo pongo pc.give_item2(27001, 10) le estaré dando al propio pj 10 potas rojas pequeñas. Por lo tanto, sí sería pc.give_item2(vnum, count) pero solo lo darías a tu propio pj. El "with" que pusiste solo se admite en los bloques "when". El "with" se usa para separar los disparadores de las condiciones. Es decir, si yo pongo when login or levelup or kill with pc.get_map_index() == 21 and pc.is_gm() begin Lo que va antes del with son los disparadores, que son "eventos" que se activan cuando suceda algo, por eso se llama "when" (cuando tal cosa suceda). El "with" equivale a un "and" pero le cambiaron el significado para poder identificar los disparadores de las condiciones que le siguen. Disparadores: login, levelup, kill......... cuando el pj se loguee, cuando suba de lvl o cuando mate algo Condiciones: pc.get_map_index() == 21, pc.is_gm()........ si el pj está en el mapa de index 21, si el pj es GM. Ahora sí continuando con el código, sería pc.give_item2(vnum, count) Ahora cómo hacemos para darle a todos los pjs del mapa los ítems?
  5. caanmasu

    RETO quest #1

    quest regalar_items begin state start begin when 20095.chat."GM: Regalar ítems" with pc.is_gm() begin say_title(mob_name(npc.get_race())) say() say("¿Quieres regalar ítems a todos los") say("personajes que se encuentren en") say("tu mapa?") say("Digita el vnum") local vnum = math.ceil(tonumber(input())) if vnum == 0 or vnum == nil then return end say_title(mob_name(npc.get_race())) say() say("Digita la cantidad") local count = math.ceil(tonumber(input())) if count == 0 or count == nil then return end -- ya tenemos el ítem y la cantidad, ahora a darles a todos los pjs del mapa este objeto... end end end Este es el "esqueleto" La parte de local vnum = math.ceil(tonumber(input())) es una validación, o sea, evitar que metan ciertos datos que no son, como los decimales. El math.ceil() convierte el número en entero. Ahora para darle los ítems a todos los personajes? ese es el reto, let's go!
  6. ¡Hola a todos! He sacado de mi baúl de quests un evento de pesca El evento consiste en pescar objetos que el GM agregue a la lista de peces. Saludos a mi amigo @Anthony's que aparece en el vídeo. Vídeo: Instrucciones: El GM activa el evento y asigna la duración. Hay un menú donde aparecen todos los objetos posibles para pescar, y al seleccionar alguno, se puede elegir como modelo para agregar el objeto que se quiera. Una vez agregado, queda en la lista de Objetos especiales que se puede ver en el Pescador y en el NPC donde se activa el evento. Los objetos agregados se pueden eliminar desde la lista de Objetos especiales. Se puede terminar el evento forzadamente. FAQ: ¿Si agrego un objeto, se pueden seguir pescando los peces normales? Sí ¿Qué sucede cuando agrego un pez? ¿en dónde queda? Queda arriba del pez modelo, o sea, del pez elegido. Si elegiste Pez pequeño como modelo, en el fishing.txt va a quedar tu nuevo objeto arriba de esa línea. ¿Si se termina el evento, no saldrán los objetos especiales? Por supuesto que no. Y tampoco se eliminarán los objetos especiales sino que seguirán guardados en la lista. ¿Por qué al pescar objetos con socket aparece una rozadura en un socket? Es un bug despreciable. Solo es poner un limpia piedras y ya. ¿Si elimino un pez de los normales, lo puedo volver a agregar después? No. Hay que hacer una copia de fishing.txt ¿Por qué vi un tiempo de 30 segundos cuando se iba a activar el evento? Porque era para hacer pruebas, eso ya no estará. ¿Por qué hay que tomar como modelo otro objeto? Porque los parámetros de los peces son muy complejos, y para más facilidad solo se copia y se pega la línea. ¿Cuánto cuesta? Tan solo 25 usd o escríbeme para hacer un trato. El servicio cuenta desde la instalación hasta las actualizaciones que haga del evento. Esto fue todo amigos Discord: Camilo#0869
  7. caanmasu

    RETO quest #1

    ¡UP! ¿Alguien? ¿Quién dijo yo? ¿Quieren que la resuelva y explique todo todo o quieren participar aportar? Elijan, de las dos maneras se aprende muy bien ¿Para qué podría servir esta quest? Es muy similar a la del evento OX de dar un ítem de bienvenida, solo que esa función va por src. Acabo de dar una pista. Muy bien, esto puede servir para eso, dar un objeto por participación en un evento, por ejemplo un evento de jefes. Un GM pone que les de perlas rojas por decir, a todos los jugadores que estén participando. Esto lo hago sin pedir nada a cambio, aprovechen puesss! Fuegoooooooo! jejeje
  8. caanmasu

    RETO quest #1

    ¡Bienvenidos nuevamente, cracks! Espero que se encuentren muy bien porque voy a lanzar un reto. Antes de eso, voy a presentarme de nuevo: soy Camilo Martínez, y conozco Metin2 como desde 2009. Nunca fui bueno, así que me dio la curiosidad de saber cómo se montaba ese juego localmente para acabar el juego y de paso volverme GM. Luego de aprender lo básico de los servidores, me especialicé en quest/lua. Entre esos años han pasado muchas cosas y ahora no puedo dar detalles. Mi experiencia con las quest: llevo 3 años programando quests. He visto todos los posts de quest de este foro y he resuelto todas las quest (para mí mismo) que han pedido. También he analizado y creado quests muy grandes turcas e incluso he aprendido de trabajos muy bien elaborados. Empecé con un say("Hola mundo") y ahora puedo crear mundos con este lenguaje. He aportado quests en este foro que han llegado a tener buena fama, e incluso las he visto en servidores. En total diría que he analizado más de 1000 quests con sus correcciones. Mi valor agregado con las quest aparte de crear cosas exclusivas es personalizarlas, es decir, que solo cambiando números como "nivel_mision = 50" puedas cambiarla según tus necesidades sin tener que modificar código abajo. También me enfoqué en crearlas de manera profesional, y hasta acá llega mi avance. Mi objetivo del reto es obviamente compartir conocimiento para usar este exquisito programa creado por todos para sus servidores o lo que quieran si así lo desean. Les estaré ayudando, dando pistas y trucos, corrigiendo errores. Yo no daré la solución sino ustedes. No hay fecha de caducidad porque esto va a ser para ustedes, y quizá pueda haber premios luego... Este post puede quedar muerto, no pasa nada. La intención es lo importante. Lo que deben hacer es comentar haciendo preguntas, poniendo código en lua, pidiendo pistas, etc. Así es como veo la participación. Reto #1 Elaborar una quest donde: - Un GM desde un NPC pueda dar un objeto X y una cantidad Y a todos los personajes que se encuentren en el mapa donde estás. ¡Let's gooo!
  9. when 101.kill with pc.get_level() >= 140 and pc.get_level()< 170 begin
  10. Hola Qué error te sale?
  11. ¡Hola a todos de nuevo! Este será un tutorial sobre los timers en una dung. Ojo, solo en las dungs. Tutorial nivel intermedio Existen dos tipos de timers: Timers globales: Estos timers son a nivel de la dung. Tenemos: server_timer() server_loop_timer() Timers personales: Estos timers son a nivel de personaje. Tenemos: timer() loop_timer() server_timer() server_timer() es generalmente utilizado para tiempos globales en las dungs. Un tiempo global quiero decir, por ejemplo, cuando entras a la dung y te dice: "Te quedan 45 minutos para matar al jefe". Y es fácil de identificarlo porque ese tiempo es el mismo para todos. server_timer() es una función y también es un disparador (when) que se activa cuando pasa el tiempo determinado. Pero no siempre se usa para poner un anuncio de tiempo, sino que hay muchas funciones que se pueden usar. Y ojo a lo siguiente que es donde más se cometen errores: Al ser una función global, no puedes poner funciones personales Funciones que NO puedes poner en un server_timer(): - say(), chat(), syschat(), notice() o derivadas. - pc.mount(), y cualquiera que tenga pc... ya que "pc" es "personal character", no es global - game.drop_item() porque el objeto cae bajo el pj Funciones que puedes usar dentro de un server_timer(): - d.notice(), notice_all(), notice_multiline(), - clear_server_timer() - game.set_event_flag(), game.get_event_flag() - server_loop_timer() - Todas las que sean de dung, o sea, las que empiecen por d., ejemplo d.count_monster() - Todas las que no tengan que ver con afectar a algún carácter, ejemplo tonumber(), table.getn(), string.len(), etc. Estructura de un server_timer() Para crearlo: En el nombre, es el mismo nombre que le vas a poner al when. En tiempo, procura ponerlo en esta estructura, 60*60*2 (2 horas), por ejemplo. Si el server_timer no está dentro de otro, se pone en el 3° parámetro el index del mapa. Yo pongo d.get_map_index() pero es igual que con pc.get_map_index(). Esto mismo se aplica para la función clear_server_timer(). server_timer("nombre", tiempo, d.get_map_index()) Si el server_timer está dentro de otro, se pone get_server_timer_arg(), así: server_timer("nombre", tiempo, get_server_timer_arg()) Cuerpo de un server_timer(): when nombre.server_timer begin if d.select(get_server_timer_arg()) then -- aquí pones tu contenido con las funciones válidas end end En nombre, puse el mismo de cuando lo creé. Luego, en vez de poner use, chat, y esas cosas, puse server_timer. Sí o sí para dungs hay que poner ese bloque if así tal cual está. Esto es para identificar la dung. Pongo los dos casos a continuación: when login begin server_timer("nombre", 60, d.get_map_index()) --cuando pongo un server_timer() en un when normal end when nombre.server_timer begin if d.select(get_server_timer_arg()) then server_timer("nombre2", 30, get_server_timer_arg()) --cuando pongo un server_timer() en un when server_timer end end Parar un server_timer: En el caso de que esté en un when distinto a un server_timer: clear_server_timer("nombre", d.get_map_index()) En el caso de que esté dentro de un when server_timer: clear_server_timer("nombre", get_server_timer_arg()) Cuándo se detiene un server_timer? - Cuando necesitas parar un server_loop_timer - Cuando necesites detenerlo y crear otro con diferente tiempo. Como en el caso de Catacumbas cuando destruyes a Caronte, te crea un nuevo tiempo para matar a Azrael. - Cuando terminas la dung y antes de transportar a todos, limpias todos los server_timer. Cómo crear un server_timer imitando un ciclo: when login begin server_timer("nombre", 60, d.get_map_index()) end when nombre.server_timer begin if d.select(get_server_timer_arg()) then server_timer("nombre2", 30, get_server_timer_arg()) end end when nombre2.server_timer begin if d.select(get_server_timer_arg()) then server_timer("nombre", 1, get_server_timer_arg()) --llamo al server_timer anterior en 30 seg, y éste llamará de nuevo al server_timer y así... end end Esta estructura sirve como ciclo, en este caso para que cada 30 segundos haga algo. La siguiente estructura es para anunciar los tiempos de duración de la dung: when login begin server_timer("nombre", 10, d.get_map_index()) --en 10 segundos empezará a avisar que faltan 60 min end when nombre.server_timer begin if d.select(get_server_timer_arg()) then d.notice("Quedan 60 minutos") server_timer("nombre2", 60*30, get_server_timer_arg()) --en 30 min avisará que quedan 30 min end end when nombre2.server_timer begin if d.select(get_server_timer_arg()) then d.notice("Quedan 30 minutos") server_timer("nombre3", 60*20, get_server_timer_arg()) --en 20 min avisará que quedan 10 min end end when nombre3.server_timer begin if d.select(get_server_timer_arg()) then d.notice("Quedan 10 minutos") server_timer("nombre4", 60*5, get_server_timer_arg()) --en 5 min avisará que quedan 5 min end end when nombre4.server_timer begin if d.select(get_server_timer_arg()) then d.notice("Quedan 5 minutos") server_timer("nombre5", 60*5, get_server_timer_arg()) --en 5 min transportará a todos end end when nombre5.server_timer begin if d.select(get_server_timer_arg()) then d.exit_all() end end server_loop_timer() server_loop_timer() es igual al server_timer() pero cíclico. Loop significa ciclo, repeticiones cada cierto tiempo. Mientras que server_timer() hace algo una vez en x tiempo, server_loop_timer() hace algo cada x tiempo (en segundos) hasta que lo detengas forzosamente. Las funciones que se utilizan son las mismas que en el server_timer(). Estructura de un server_loop_timer() Para crearlo: Se crea exactamente igual que el server_timer(), solo cambia el tiempo. Si pones 5, cada 5 segundos hará lo que pongas dentro del when. Cuerpo de un server_loop_timer(): La única diferencia es que el when es el mismo. Veamos: when login begin server_loop_timer("nombre", 5, d.get_map_index()) end when nombre.server_timer begin --aquí se pone server_timer if d.select(get_server_timer_arg()) then -- aquí pones lo que va a hacer cada 5 seg end end Los server_loop_timer se detienen igual que un server_timer. Combinar server_loop_timer con server_timer: El tiempo de un server_loop_timer debe ser mayor al de un server_timer anidado. Anidado significa que está dentro, o sea, el server_timer dentro del server_loop_timer. Veamos qué sucede si NO cumplo con esta regla: when login begin server_loop_timer("nombre", 5, d.get_map_index()) end when nombre.server_timer begin if d.select(get_server_timer_arg()) then server_timer("nombre2", 10, get_server_timer_arg()) end end El ciclo cada 5 segundos va a ejecutar un ciclo de 10 segundos. Entra al ciclo, ejecuta el server_timer(), y en el segundo 5 vuelve a entrar al ciclo, impidiéndole cumplir sus 10 segundos para entrar al server_timer. Así que la regla es no poner un server_timer() con un tiempo mayor al del server_loop_timer(). Pero toda regla tiene sus excepciones, así que vamos con esta: Si el ciclo tiene una condición que permite que el server_timer() cumpla con su tiempo, entonces sí es válido. Como en el siguiente ejemplo: when login begin server_loop_timer("nombre", 5, d.get_map_index()) end when nombre.server_timer begin if d.select(get_server_timer_arg()) then if d.getf("bloqueo") == 0 then server_timer("nombre2", 10, get_server_timer_arg()) d.setf("bloqueo", 1) end end end Puse un d.getf() que cuando entra y ejecuta el server_timer(), solo lo hace una vez porque le cambié el valor al d.getf() al final. Es claro que el código así como lo tenemos no va a funcionar, tendríamos que hacer que el personaje logre cambiar de nuevo el valor del d.getf("bloqueo") a 0 para que se ejecute de nuevo el ciclo (si es lo que buscamos). Digamos que, cuando mate al jefe, ponga d.setf("bloqueo", 0) y se ejecutará de nuevo el ciclo. timer() Los timer() se usan cuando necesitas ejecutar funciones a nivel de personaje. La ventaja es que son más sencillas de usar, incluso puedes usar cualquier función, hasta las globales. Crear un timer: timer("nombre", tiempo) Cuerpo de un timer: when login begin timer("nombre", 10) end when nombre.timer begin -- end En el when solo pones nombre.timer Ya no hay que poner el if Detener un timer: cleartimer("nombre") Prácticamente no se usa en las dungs porque generalmente cualquier acción en las dungs afectan a todos los personajes que están ahí. Por lo tanto, si usas un timer() en una dung, y el personaje se desconecta antes de pase el tiempo, no se ejecutará el when timer. El timer() se muere cuando lo detengas o cuando el personaje se desconecta. A diferencia del server_timer o server_loop_timer que se sigue ejecutando sin importar si los personajes se desconectaron. Un ejemplo crítico para esto, es que mates un jefe y te ponga un timer() donde los lleve a todos a una sala, pues si el pj se desconecta antes de que ocurra el timer, nadie se transportará a la sala. Los timer() se pueden anidar en los server_timer() y server_loop_timer(). Así que la regla es, si las funciones son a nivel personaje debes usar timer(), si son a nivel global (a nivel dung, de hecho) se usan los server_timer() y server_loop_timer(). Un posible uso es que cuando mates a un jefe, en un determinado tiempo te de algo (a ti solo) pero no le veo mucho sentido. loop_timer() Llegamos al nivel más complejo del tutorial. Un loop_timer() es como un server_loop_timer() pero a nivel personaje. Crear un loop_timer: loop_timer("nombre", tiempo) Cuerpo de un loop_timer: when login begin loop_timer("nombre", 5) end when nombre.timer begin -- end Detener un loop_timer: Se detiene igual que un timer. Un loop_timer famoso es el de cuando el personaje se muere y haga algo when login begin loop_timer("muerto", 5) end when muerto.timer begin if pc.get_hp() <= 0 then chat("Se murióooo (8)") end end El tiempo del loop_timer() debe ser menor al tiempo en que hace respawn el pj o sino no aparece cuando le de al botón de respawn cuando ya pueda aparecer. Cuando el pj muere, en pocos segundos aparecerá en el chat ese mensaje, y si sigue muerto, cada 5 segundos seguirá apareciendo. Pero bueno, en una dung no le veo mucho sentido usar un loop_timer() independiente porque vuelvo y repito, las funciones de las dung afectan a todos los personajes salvo la creatividad que quieras darle que necesite de algo más exclusivo... Combinar loop_timer() con server_timer() y server_loop_timer(): El objetivo es usar funciones personales con funciones globales, así hacemos más diversa la dung. El problema está en que es no es tan sencillo combinarlas y menos cuando vamos a meter un loop_timer(), así que vamos a ver lo que yo llamo semáforos, que básicamente es usar los d.getf() y d.setf() como banderas. Vamos a hacer que el personaje cuando muera (loop_timer() porque la muerte es personal y además debe evaluar cada ciertos segundos porque no es when) lo lleve a city: when login begin loop_timer("muerto", 3) end when muerto.timer begin if pc.get_hp() <= 0 then timer("enviar_a_city", 1) end end when enviar_a_city.timer begin warp_to_village() end Puse un timer de 1 segundo para que al morir no transporte de una vez (se ve horrible). Ahora haré que cuando no hayan monstruos, invoque otros monstruos más después de 60 segundos: when login begin d.spawn_mob(blablabla) --aquí invoco los primeros mobs loop_timer("muerto", 3) server_loop_timer("timer_inv", 3, d.get_map_index()) --ciclo cada 3 segundos para evaluar si hay monstruos end when muerto.timer begin if pc.get_hp() <= 0 then timer("enviar_a_city", 1) end end when enviar_a_city.timer begin warp_to_village() end when timer_inv.server_timer begin if d.select(get_server_timer_arg()) then if d.count_monster() <= 0 and d.getf("bloqueo") == 0 then --si no hay monstruos, entonces... y de una vez pongo mi bloqueo que expliqué antes server_timer("invocar", 60, get_server_timer_arg()) --en 60 seg invocará de nuevo d.setf("bloqueo", 1) --fin bloqueo end end end when invocar.server_timer begin d.spawn_mob(blablabla) --aquí invoca de nuevo d.setf("bloqueo", 0) --pongo bloqueo en 0 para que pueda volver a invocar por el server_loop_timer end Ahora buscaré la manera de hacer que en cada oleada se monten automáticamente los personajes en alguna montura. Aquí aplicaré una función personal (pc.mount()) pero a todos. when login begin d.spawn_mob(blablabla) loop_timer("muerto", 3) server_loop_timer("timer_inv", 3, d.get_map_index()) end when muerto.timer begin if d.getf("montar_todos") == 1 then --esta es la bandera que les decía d.setf("montar_todos", 0) --toca bloquearla para que no se repita de nuevo hasta que se lance de nuevo la oleada quest.montarTodos() --aquí va a la function... end if pc.get_hp() <= 0 then timer("enviar_a_city", 1) end end when enviar_a_city.timer begin warp_to_village() end when timer_inv.server_timer begin if d.select(get_server_timer_arg()) then if d.count_monster() <= 0 and d.getf("bloqueo") == 0 then server_timer("invocar", 60, get_server_timer_arg()) d.setf("bloqueo", 1) end end end when invocar.server_timer begin d.spawn_mob(blablabla) o d.setf("bloqueo", 0) d.setf("montar_todos", 1) --pongo en 1 esta bandera para que arriba en el loop_timer entre a la condición que hace que todos monten end function montarTodos() -- aquí se usa el partyMembers y todo eso de las dungs... pc.mount() --lo que quiero que entiendan acá es que ese pc.mount() se aplicará en todos los pjs con q.begin_other_pc_block() y q.end_other_pc_block() end El resumen de esta parte es que utilicé los d.setf y d.getf para poder activar y desactivar las entradas a ciertas condiciones de los server_timer o server_loop_timer. Así que si necesitas usar una función personal en un server_loop_timer debes activar una bandera, en el loop_timer poner la condición, desactivar la bandera y luego hacer las funciones. Notas: - Se puede usar funciones dungeon (las que empiezan por d.) dentro de cualquier when (timers globales, personales, use, chat, todo eso) - Las líneas de código se ejecutan inmediatamente. No hay que esperar x tiempo del timer para que se ejecute las siguientes líneas. - El /rel q, mata todos los timers del mapa. Así que al testear debes cambiar de pj. Y bueno, esto solo se entiende practicando xD Si no entendiste ni madres, estás bien. Probablemente en dos semanas no entenderé lo que puse acá Esto lo apliqué en mi quest de "Arena Mob" que es una mazmorra infinita. Y al agregarle complejidad a la mazmo, había funciones que sí o sí debía poner en el server_loop_timer algunas funciones que eran personales, como pc.give_item2(), pues al pasar de cada ciertas oleadas tenía que dar unos premios y no podía usar pc.give_item2() en el server_loop_timer, así que me tocó en el loop_timer. Tampoco quería que reclamaran los premios dándole clic al NPC, yo quería que se dieran automáticamente y ahí está la complejidad. Arena Mob Consiste en una mazmorra de gremio donde se entra en grupo (la idea es que vayan los 8 mejores del gremio) y deben vencer las oleadas de monstruos que aparecen. Una vez dentro del mapa, aparecerá en anuncio que el gremio x se está enfrentando a la Arena Mob. Personaje que muere, será transportado a la ciudad y aparecerá un anuncio diciendo que x persona del gremio y murió en la oleada z. En cada oleada los monstruos se vuelven más fuertes y más resistentes. Cada ciertas oleadas todos los personajes que sigan vivos en la dung van a recibir un premio. En cada ciertas oleadas aparecerá un jefe un poco más fuerte. Cuando destruyan la oleada, pueden hacer aparecer otra inmediatamente, pero si no lo hacen, en 60 segundos aparecerá. Cuando muera el último personaje, aparecerá en anuncio que el gremio x terminó la Arena Mob en la oleada y. Luego, hay un ranking donde aparecerá la lista de gremios que llegaron a la oleada más alta. Precio de la quest: 15 usd Discord: Camilo#0869 Un gusto ayudarlos, ¡saludos amigos!
  12. Revisa la función ResetPoint() en tu source Ve a char.cpp y busca esto: if(iLv <= 499) PointChange(POINT_STAT, ((MINMAX(1, iLv, 499) - 1) * 3) + GetPoint(POINT_LEVEL_STEP) - GetPoint(POINT_STAT)); else PointChange(POINT_STAT, 270 - GetPoint(POINT_STAT)); Esta es la parte de la asignación de los puntos de estado al reiniciarlos. Es la misma función que usa el pergamino de reset_status de las quest. Si el pj es menor al lvl 500 entonces: + 3 puntos por cada nivel sin incluir el nivel 1 + puntos de estado recibidos por cada 25% del nivel actual - puntos de estado que no se han utilizado En otro caso: 270 - puntos de estado que no se han utilizado (no tengo idea por qué :v) Quizá tengas mal ese "limit level", yo en ese src que encontré, está el 499, de pronto tú lo tienes en 105.
×
×
  • Create New...