Jump to content

caanmasu

Miembro
  • Contador contenido

    357
  • Ingreso

  • Última visita

  • Días ganados

    38

Todo lo publicado por caanmasu

  1. En donde dice "coord_global_x" debes poner las coordenadas que aparecen en map/tu_mapa/Setting.txt Luego dentro del archivo busca en BasePosition, ahí están las coordenadas.
  2. quest mapa_vip begin state start begin when id_item.use begin say_title(item_name(item.vnum)) say() say("¿Quieres transportarte al mapa VIP?") if select("Sí ", "No") == 1 then pc.warp(coord_global_x*100, coord_global_y*100) end end end end
  3. Esto está muy raro, yo agregaría este when: when login with horse.get_level() < 30 then horse.set_level(30) end
  4. Hola Asegúrate de enviar los datos con el tipo de dato correcto. Estás sumando un número con un texto. 5+"10" -> el sistema no lo va a reconocer. En cambio 5+10 = 15 sí Lo mismo con el id de la cuenta, que es un número entero. Corrección: mysql_query("UPDATE account.account SET coins = coins+"..count.." WHERE id="..account..";")
  5. Hola Supongo que quieres aumentar el bonus de media y habilidad al cambiar los bonus Está en item_addon.cpp Si quieres cambiar los valores sin "meter la pata" en tu server, puedes probar mi simulador. @NazoXes el pto amo
  6. Para hacer que se maten entre los del mismo reino, en el when kill no pongas pc.get_empire() != npc.get_empire(). Todos tienen que ponerse en Libre. Debes garantizar que no pierdan puntos de ranking. En este caso no se puede evitar perderlos pero sí los puedes recuperar. Para lo de cada 5 muertes te voy a explicar el operador módulo: if math.mod(numero_de_kills, 5) == 0 then --Aquí pones lo del premio end El módulo es el residuo de la división. Si divides un número entre otro y da 0 el residuo es porque es divisible. O sea que el cociente es entero. Haré una pequeña tablita para mostrarte Número de kills División 1 5 = 1/5 = no es entero 2 5 = 2/5 = no es entero 3 5 = 3/5 = no es entero 4 5 = 4/5 = no es entero 5 5 = 5/5 = da 1, es entero el cociente, o sea que el residuo es 0. 7 5 = 7/5 = no es entero 10 5 = 10/5 = da 2, es entero el cociente, osea que el residuo es 0. y si te das cuenta cada vez que el número de kills es divisible entre 5, va a entrar a la condición.
  7. quest biolog_reset_time begin state start begin function info() local quest_names = { [1] = "collect_quest_lv30", [2] = "collect_quest_lv40", [3] = "collect_quest_lv50", [4] = "collect_quest_lv60", [5] = "collect_quest_lv70", [6] = "collect_quest_lv80", [7] = "collect_quest_lv85", [8] = "collect_quest_lv90", [9] = "collect_quest_lv92", [10] = "collect_quest_lv94" } for i = 1, table.getn(quest_names) do if get_time() < pc.getf(quest_names[i], "duration") then pc.setf(quest_names[i], "duration", 0) syschat("Reset time") item.remove() return end end end when 30132.use begin say_title(string.format("%s:[ENTER]", item_name(item.get_vnum()))) say("Você tem certeza?") say("Você só pode fazer isso uma vez.[ENTER]") if select("Sim", "Agora não") == 1 then biolog_reset_time.info(); end end end end (Esta es una quest que ya tenía guardada) for i = 1, table.getn(quest_names) do if get_time() < pc.getf(quest_names[i], "duration") then pc.setf(quest_names[i], "duration", 0) syschat("Reset time") item.remove() return end end Aquí lo que hace es revisar cada qf "duration" de cada quest. Si "duration" es tiempo futuro, entonces va a borrar el qf. ¿Por qué es "tiempo futuro"? Cuando entregas un objeto al biólogo, el qf guarda un nuevo valor que es el tiempo actual (el get_time()) + el tiempo de duración. Cada segundo que pasa, el get_time() aumenta en 1. O sea, si pones get_time()+30, estás poniendo un tiempo futuro de 30 segundos a partir de ahora. Y como era de esperarse, el "tiempo futuro" obviamente es mayor que el tiempo actual. La quest es un poco extensa porque validé. Es decir, me aseguré de cuál quest es la que tiene el "tiempo futuro". Más no borré todos los qf sin distinción. Esto es para que el jugador no consuma el ítem 30132 si ya puede entregar el objeto del biólogo. Edito: cuando se trata de los qf de la misma quest se usa pc.setqf(), pc.getqf(), pc.delqf() Cuando se trata de los qf de otra quest, se usa pc.setf(), pc.getf() (delf no existe) y en el primer parámetro va la el nombre de la quest, así: pc.setf("tu_quest", "tu_qf", tu_valor)
  8. ¡Hola! Usa pc.delqf(nombre_quests_biologos, "duration") "duration" almacena el tiempo.
  9. A ver, a ver, qué pasó aquí? xD Quest es el lenguaje más limitado en el server. Hay cosas que no puede hacer. 1. Sí es con quest 2. Sí es con quest 3. Esto de aparecer un pequeño ícono junto al nombre del personaje ya es Python (interfaz) 4. Esto es C++ 5. Sí es quest 6. Sí es quest Todo esto se puede hacer con quest, excepto los puntos 3 y 4.
  10. Jeje ok xD Estas son estructuras de datos. En el caso de los arrays son de dos dimensiones (una fila) y en el caso de matrices son de tres dimensiones (filas y columnas) array = {} Esto es un array vacío. array = {10} Esto es un array con un elemento. En Lua la posición de los arrays o matrices empiezan desde 1. Ese fue un número, pero podemos poner cualquier otro tipo de dato. Por ejemplo, pondré un array. array = {{10}} Esto de adentro es un array con un solo elemento. Se puede acceder al 10 así: array[1][1] ¿Por qué? míralo de esta forma array = { {10} } que es lo mismo. El primer elemento de array es {10} (pos 1), y la posición del 10 en ese arreglo es 1. Otro ejemplo: array = { {3, 4, 5}, {6, 7, 8} } Un array dentro de otro prácticamente es una matriz porque automáticamente estás creando columnas. Eso de arriba es lo mismo que poner: array = { {3, 4, 5}, {6, 7, 8} } Es un array con dos arrays adentro. Vamos a acceder al 4: array[1][2] Hay una forma de entenderlo mientras uno está aprendiendo y es suponer que array[fila][columna] (esto ya no es tan así cuando es más compleja la estructura) Entonces para acceder al 4, vas a la fila 1, columna 2 Ahora la forma genérica de la matriz quedaría: array = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} } Por qué no se le pone la coma al final? por esto: array = {1, 2, 3,} Sería un error de sintaxis. Por qué hay algunas estructuras que sí se puede poner la coma al final? Porque es una función que retorna, o sea: function info() return { {3, 4, 5}, {6, 7, 8}, } end Esto es válido porque si ponemos return { {3, 4, 5}, {6, 7, 8}, } (mira la coma después del 8 ) lo que se toma después de la coma será un "nil" o nulo, pero sí es válida la sintaxis. ¿Cómo acceso a varios elementos? Si queremos mostrar el 3, 4 y 5 hacemos esto: for i = 1, table.getn(array[1]) do chat(array[1][i]) end table.getn() es una función que te devuelve el tamaño del array. Y al poner array[1], ¿cuántos elementos tiene? pues los elementos que tiene el primer arreglo {3, 4, 5}, o sea, 3. No olvidar que hay que poner i = 1. Pongo array[1] porque en el ciclo la variable es la i, que aumenta de uno en uno en este caso. Entonces mostrará en el chat esto: 3 -- por el array[1][1] 4 -- por el array[1][2] 5 -- por el array[1][3] Ahora explicaré el código de la quest pos_raza = pc.job+1 En verdad la función es pc.get_job() pero en el questlib.lua se le asigna otra variable para abreviar pc.job = pc.get_job() Así que es lo mismo. Puse +1 porque pc.job retorna 0, 1, 2, 3 (guerrero, ninja, sura, chamán respectivamente) Los arreglos empiezan en 1, así que debo sumarle 1 para "cuadrar" mi arreglo. Luego queda guerrero 1, ninja 2, sura 3, chamán 4. Que son las posiciones respectivas de mi arreglo. Si no hago esto, simplemente no funcionará porque no existe la posición 0. Luego en la línea pc.give_item2(items[pos_raza][i][1], items[pos_raza][i][2]) Puse que items[pos_raza][i][1] accediera al array en la posición de su personaje, o sea, si es guerrero, entonces va a la primera fila. Luego se va recorrer cada mini arreglo. Como cada mini arreglo tiene dos elementos (item, cantidad), lo que me interesa en este caso es ítem, así que elijo la primera posición Y hago lo mismo con la cantidad. Solo le cambio la posición del mini arreglo a 2. Hay una forma para ponerle posiciones arbitrariamente a los arreglos, así: array = { [0] = {tu contenido}, [1] = {tu contenido}, [2] = {tu contenido}, [3] = {tu contenido} } De esta forma al pc.job no se le sumaría 1 porque establecí las nuevas posiciones. Si quieres poner que la posición sea un texto también se puede array = { ["un_texto"] = "hola", ["un_numero"] = 10 } Para acceder a "hola" solo pones array.un_texto y para acceder al 10 pones array.un_numero Un ejercicio en la vida real de mis quests :v quest_biolog = { ["prob_elixir"] = 30, [0] = { ["level_req"] = 30, ["item_req"] = { ["id"] = 30006, ["count"] = 10, ["time_delay"] = 0, --seconds ["success_prob"] = 60, ["monsters_drop"] = {631, 632, 633, 634}, ["prob_drop"] = 1 -- 1(%) to 500(%) }, ["soul_stone"] = { ["id"] = 30220, ["prob_drop"] = 1 -- 1(%) to 500(%) }, ["award"] = { ["box"] = 50109, ["bonus"] = { { ["id"] = 8, ["value"] = 10, ["apply"] = true -- true: apply, false: point } } } }, En la última línea, después de la coma va a el elemento [1] y así con todas las misiones del biólogo pero lo voy a hacer solo con el primero. Quiero poner el nivel que se requiere para que la misión aparezca, entonces voy al level_req = 30 así: quest_biolog[0].level_req Ahora quiero hacer que los mobs me dropeen el objeto (en este caso son dientes de orco), entonces debo ir a ver monsters_drop: for i = 1, table.getn(quest_biolog[0].item_req.monsters_drop) do quest_biolog[0].item_req.monsters_drop[i] end Necesito saber cuál es el objeto a entregar y cuántos: quest_biolog[0].item_req.id quest_biolog[0].item_req.count Ahora debo darle al pj los bonus permanentes: for i = 1, table.getn(quest_biolog[0].award.bonus) do quest_biolog[0].award.bonus[i].id quest_biolog[0].award.bonus[i].value end Hay una bandera que dice si el bonus es apply o no, eso es otro tema. Lo importante era saber cómo llegar a cada elemento. Ahora si queremos hacer esto con todas las misiones: for i = 1, table.getn(quest_biolog[0].award.bonus) do for j = 0, table.getn(quest_biolog) do quest_biolog[j].award.bonus[i].id quest_biolog[j].award.bonus[i].value end end que obviamente no va a suceder, solo era para el ejercicio. En mi quest de biólogo tengo esa parte así: local awards = quest_biolog[pc.getqf("biolog_quest")].award for i = 1, table.getn(awards.bonus) do local attr = awards.bonus[i].id local value = awards.bonus[i].value if awards.bonus[i].apply == true then affect.add_collect(attr, value, 60*60*24*365*60) else affect.add_collect_point(attr, value, 60*60*24*365*60) end end Bueno este fue más o menos el tutorial. La práctica hace al maestro. Éxitos!
  11. quest bonus_7 begin state start begin when id_npc.take begin -- cambia por el id de tu NPC if item.get_type() == 1 then item.set_attribute(6, type, value) end end end end
  12. quest itemxraza begin state start begin when id_item.use begin --cambia aquí el ítem items = { {{item1, cant1}, {item2, cant2}, {item3, cant3}}, --ítems guerrero. Solo sigue el patrón {{item1, cant1}, {item2, cant2}, {item3, cant3}}, --ítems ninja {{item1, cant1}, {item2, cant2}, {item3, cant3}}, --ítems sura {{item1, cant1}, {item2, cant2}, {item3, cant3}} --ítems chamán } pos_raza = pc.job+1 for i = 1, table.getn(items[pos_raza]) do pc.give_item2(items[pos_raza][i][1], items[pos_raza][i][2]) end end end end
  13. Sí se puede, con cmdchat, se envía el comando de la interfaz del dopador desde la quest hacia el cliente. No me pregunten cómo hacerlo porque no sé xD
  14. Te refieres a poner un botón en alguna parte y que al darle clic aparezca el dopador?
  15. Lo entenderás en una guerra de reinos xD
  16. Lo bueno de confundir a la gente es que no saben que están confundidas - El virus 2020 :v Ole no vaya a venir que tengo el coronavirus... en la nevera jajaja
  17. xD Me puse a ver cada nivel y daño de las armas para ver si tenían algún patrón y sí tienen pero también tienen muchas irregularidades, así que prácticamente cada arma hay que hacerla a mano
  18. Hola "Equilibre" el valor de las armas? no entiendo tu pregunta
  19. Para los ítems de mejora es 100% recomendable usar el mob_drop_item.txt, ya si no te funciona es otra cosa pero me parece raro que no funcione, algo estás haciendo mal xD Para usar la probabilidad debes tener en cuenta que if number(1, 10) == 1 then Esto significa que se toma un número (pseudoaleatoriamente) del 1 al 10 N = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} y si cae el 1, entonces entrará a la condición. Es decir que las probabilidades son 1/10 = 0,1 = 10%, de 10 perros que mates te dropeará 1 (puede que sí, puede que no). Si quieres personalizar la probabilidad de drop haz esto: Para poner 1% de drop: if number(1, 100) == 1 then 1/100 = 0,01 = 1% de probabilidades Para poner 0.1% de drop: if number(1, 1000) == 1 then 1/1000 = 0,001 = 0,1% de probabilidades Y así vas viendo el patrón. Nota: solo funciona este patrón con 1. Luego si quieres poner el 2% de drop: if number(1, 100) <= 2 then Dice que si el número cae entre 1 y 2 va a entrar a la condición, o sea que hay 2/100 = 1/50 = 0.02 = 2% de probabilidades Si quieres poner 20% de drop aplica el patrón del 1% así: if number(1, 10) <= 2 then Ya sabiendo esto, si quieres poner 3.5% de drop: if number(1, 1000) <= 35 then 0.25% de drop: if number(1, 10000) <= 25 then Nota: se puede comparar con cualquier conjunto de números ya que number() crea números al azar con distribución uniforme. Así que puedes poner == 1, == 100, == 40 o cualquier número que esté en el rango. Una forma de hacer esto más fácil es tomar de referencia el (1, 100) como el 1% y si quieres aumentar las probabilidades debes quitar ceros. En cambio si quieres disminuir las probabilidades debes aumentar los ceros. (1, 10) == 1 -> 10% (1, 100) == 1 -> 1% (1, 1000) == 1 -> 0.1% (1, 10000) == 1 -> 0.01% (1, 100000) == 1 -> 0.001% Después para variar los porcentajes simplemente comparas con <= poniendo el dígito. Ejemplo para el 25 (1, 100) <= 25 -> 25% (1, 1000) <= 25 -> 0.25% (1, 10000) <= 25 -> 0.025% Si quieres que el perro te bote algo con probabilidad de drop del 0,15% se hace así: quest drop begin state start begin when kill with not npc.is_pc() begin if number(1, 1000) <= 15 then -- 0.15% items={ {30093,1},{30094,1},{30095,1},{30096,1} } for i = 1, table.getn(items) do game.drop_item(items[1],items[2]) end end end end end
  20. La quest no tiene errores. Algo raro te está pasando chucho... Cuéntanos si ahora te funciona
×
×
  • Crear nuevo...