Jump to content

Search the Community

Showing results for tags 'profesional'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Metin2 Zone
    • Community
    • Presentations and farewells
  • Private Servers
    • Server Presentations
    • Project showcase
  • General
    • General Discussions
    • Partnerships and Cooperation
    • Services and trading
    • Helps and questions
    • Reviews and advice
    • Offtopic
  • Technical
    • Programming
    • Metin2 Server Modding
    • Web Development
    • Security
    • Operating Systems
    • Computing
  • Art
    • Design and graphic section
    • Gallery of images and videos
    • 3D Modelling
    • Mapping
  • Downloads
    • Client and Server files
    • 3D Models
    • Metin2 Images
    • Maps
    • Translation
  • Archive
    • Offline Servers
    • Temas Links Caidos

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Email


Sitio web


Jabber


Skype


Discord


Location


Intereses

Found 8 results

  1. Hola mi gente! Hoy les traigo una quest elaborada 100% por mí desde la concepción de la idea xD Dale Me encorazona Vídeo demostrativo: go_all_map from Camilo Martinez on Vimeo. Descripción en el archivo de la quest Dale Me encorazona si te gustó EDITADO: Y agreguen la quest, las funciones en el questlib y por último agregar las funciones xx_coords_town_folder_map y list_folder_maps en el quest_functions (Revisa si tu objeto es type 18) Quest go_all_map.quest --[[ QUEST METIN2 Quest creada por Camilo Martínez Es un anillo teleport donde se puede acceder a la totalidad de los mapas del juego. Especificaciones: 1. Al darle clic al objeto, aparecerán botones de nombres página #, donde cada página muestra 43 mapas y la última los restantes mapas. 2. Al seleccionar una de las páginas y luego uno de los mapas, transportará al personaje a ese mapa en las coordenadas centrales Notas: 1. Recomendable para solo uso GM, esto es administrativo. Pero igual pueden usarlo a su antojo, solo es una recomendación :) 2. La cantidad máxima de botones por defecto puse 44 porque se bugeaba a los 45+ 3. No olvidar cambiar el país (locale/xx) por el de tu servidor 4. Se enlistan todas las líneas del index de la carpeta map. No debe haber ninguna línea vacía en ese archivo. Se toma el index y el nombre del mapa (nombre de la carpeta) por aparte. Luego con el nombre del mapa se va a la ruta del mapa y en Town.txt tomará la primera coordenada. Posteriormente se hace un warp_local donde se le envía el id del mapa y las coordenadas del Town*100 5. Si los separadores son espacio y tabulador, se tomará sin problema los datos de los archivos. Si hay varios espacios simulando un tabulador, no se tomará en cuenta. Es decir: Si tienes en Town.txt las coordenadas 433 542, habrá un error porque tienes dos espacios. Lo correcto es que haya un solo espacio o un solo tabulador. 6. Si no te transporta es porque el mapa puede estar mal implementado 7. No olvides poner la parte del questlib.lua 8. Tampoco olvides poner las funciones en quest_functions xx_coords_town_folder_map list_folder_maps 7. Cualquier error reportar 8. Que lo disfruten :) y como siempre, mi Discord: Camilo#0869 --]] quest go_all_map begin state start begin function info() return{ ["max_button"] = 44, ["country"] = "hungary", } end when 40004.use with pc.is_gm() begin local s = go_all_map.info().max_button local t = go_all_map.info().country local nombres_mapas, index_mapas = list_folder_maps(t) local cant_pags = math.ceil(table.getn(nombres_mapas)/(s-1)) local tabla_madre, tabla_select = {}, {} local tabla_madre_index = {}, {} local aux = 1 for i=1, cant_pags do table.insert(tabla_madre, {}) table.insert(tabla_madre_index, {}) table.insert(tabla_select, "Página "..i) for j=1, s-1 do tabla_madre[i][j] = nombres_mapas[aux] tabla_madre_index[i][j] = index_mapas[aux] aux = aux + 1 end table.insert(tabla_madre[i], "Cerrar") end table.insert(tabla_select, "Cerrar") local sel1 = select_table(tabla_select) if sel1 != table.getn(tabla_select) then local sel = select_table(tabla_madre[sel1]) if sel != table.getn(tabla_madre[sel1]) then local x, y = xx_coords_town_folder_map(t, tabla_madre[sel1][sel]) pc.warp_local(tabla_madre_index[sel1][sel], x*100, y*100) end end end end end Parte del questlib.lua function xx_coords_town_folder_map(country, map) local det, tab, spc = io.open('locale/'..country..'/map/'..map..'/Town.txt'), ' ', ' ' local x, y = 0, 0 for line in det:lines() do if table.getn(split(line, tab)) == 2 then x = split(line, tab)[1] y = split(line, tab)[2] return x, y elseif table.getn(split(line, spc)) == 2 then x = split(line, spc)[1] y = split(line, spc)[2] return x, y else return "ERROR" end end end function list_folder_maps(country) local map, index = {}, {} local det, tab, spc = io.open('locale/'..country..'/map/index'), ' ', ' ' for line in det:lines() do if table.getn(split(line, spc)) == 1 then table.insert(map, split(line,tab)[2]) table.insert(index, split(line, tab)[1]) else table.insert(map, split(line,spc)[2]) table.insert(index, split(line, spc)[1]) end end return map, index end go_all_map.rar
  2. Hola a todos de nuevo Hoy les traigo una nueva quest creada por mí. Me gusta crear cosas nuevas, originales, y de gran calidad. Esta vez es una herramienta administrativa que será muy útil para los admins, GMs… Lean todo, incluso el encabezado de la quest, ahí están las especificaciones con sus vulnerabilidades. A mí me funciona, espero que también te funcione Vídio random: buscar_id_item.quest from Camilo Martinez on Vimeo. quest_functions get_items_without_plus_zero questlib.lua function get_items_without_plus_zero(items) for i = 1, table.getn(items) do if string.find(items[i], "+0") then local str = string.gsub(items[i], "+0", "") items[i] = str end end return items end buscar_id_item.quest --[[ QUEST Quest creada por Camilo Martínez Consiste en obtener el ID de un objeto a partir del nombre en una búsqueda. Especificaciones: 1. Solo a los GMs les aparecerá el botón "Buscar ID ítem" en las misiones. 2. Al darle clic al botón, aparecerá un cuadro con un input() donde se digitará una palabra para buscar el objeto. Luego aparecerá una lista de objetos y cuando selecciones uno, te mostrará en letras rojas el nombre y el id. 3. Si el objeto es +0, +1, +2... se mostrará el nombre solo y el id de ese objeto +0. Notas: 2. Al digitar la palabra, omite el nivel del ítem (+0, +1...) No sensible a las tildes ni mayúsculas/minúsculas, así que escribe con confianza :) 3. Hago una consulta en la base de datos de la tabla player.item_proto donde recojo los ítems que contengan la palabra y además no terminen en un número del 1 al 9. Tomo el número 0 al final para el conjunto de equipos (+0, +1, +2...) y así mostrar solo uno para mejorar la búsqueda y evitar muchas páginas. (Si tienes un objeto llamado por ejemplo Llave1 o Llave2 no aparecerá) 4. Restringido a 47 botones (8 botones por página y en la última página 7 botones). Más botones en la búsqueda bugea el pj. 6. Agregar la función: get_items_without_plus_zero En el questlib.lua y quest_functions 7. Reportar cualquier error Que aprovechen la quest :) Discord: Camilo#0869 --]] quest buscar_id_item begin state start begin when letter with pc.is_gm() begin send_letter("Buscar ID ítem") end when button or info begin say_title("Buscar ID ítem") say("[ENTER]Escribe una palabra que tenga el nombre") say("del ítem. No escribas +1, +2, +3...") local nombre_item = input() if nombre_item == "" then return end local items = mysql_query("SELECT vnum, locale_name FROM player.item_proto WHERE (UPPER(CONVERT(locale_name USING latin1)) LIKE '%"..nombre_item.."%' and locale_name NOT REGEXP '.*[1-9]+' );") local tam = table.getn(items) if tam == 0 then syschat("No hay coincidencias") end local items, id = items.locale_name, items.vnum items = get_items_without_plus_zero(items) table.insert(items, "Cerrar") if tam > 47 then syschat("Sé más específico con tu búsqueda") return end local sel = select_table(items) if sel != tam+1 then say_size(350, 250) say_title("Resultados:[ENTER][ENTER]") say_item_vnum(id[sel]) say_reward(items[sel]..": "..id[sel]) syschat(items[sel]..": "..id[sel]) end end end end buscar_id_item.rar
  3. EDITO: debido a que cada pirata almacenaba un event_flag en la tabla quest, he agregado el reiniciador que no solo vuelve 0 el reiniciador de pirata sino que borra el registro de cada pirata invocado... en otras palabras, si se invocaban 1000 piratas en un evento, se hacían 1000 event_flag; con el reiniciador se eliminan esos 1000 registros y así se limpia la db. Hola a todos! Hoy traigo otra quest, es un Evento Tanaka con la diferencia de que los GMs pueden ver los Tanakas en tiempo real en el mapa. Todos los GMs los pueden ver, no solo el GM que los invocó. Para más detalles leer el comentario del archivo de la quest. Si les gustó no olviden darle Like, piensen que están en Facebook :v (ba dum tss!) Un posible error que puede pasar es que cuando le den clic al pergamino no abra la misión. Yo cargo de nuevo todas las quest y hago reboot; luego sí compilo la actual. Cuando encuentre la razón de por qué no funciona el botón les cuento. No les quito más tiempo, link: [Hidden Content] Vidio random para todos: [Hidden Content] Quest Evento Tanakas Version 2 from Camilo Martinez on Vimeo. evento_tanakas_v2.quest --[[ QUEST Quest hecha por Camilo Martínez Consiste en el típico evento de Piratas Tanaka con la diferencia de que los GMs pueden ver la ubicación en el mapa grande de los piratas en tiempo real. Especificaciones: 1. Solo a los GMs les aparecerá un pergamino de misión. 2. Al darle clic, (estando en el mapa configurado en la quest) mencionará el nombre del monstruo a invocar y el rango mín-máx que se puede invocar. 3. Aparecerá un input() para digitar la cantidad de monstruos a invocar 4. Al invocarlos, aparecerá un anuncio a todos indicando el nombre del mob, cantidad de invocados y el mapa en donde te encuentras 5. Se asignarán targets o puntos en el mapa por cada pirata que invoques. 6. Se pueden invocar las oleadas que desees sin ningún problema 7. Al matar piratas botará una oreja con probabilidad modificable en la quest 8. Las orejas se cambiarán con el NPC 20095. FIX: reiniciar contador ya funciona Notas: 1. Todos los GMs pueden ver los monstruos en el mapa. Si no eres el GM que invocó, debes cambiar pj para verlos en el mapa. 2. Cada monstruo invocado se le asignará un vid (identificador) pero al morir, no se vuelve 0 el vid. Así que tuve que inventarme un reiniciador del contador de oleadas. El contador se reinicia en el NPC 20095 solo siendo GM. El contador es para mostrar a los GMs los puntos donde están los monstruos. Si los reinicias simplemente no se verán, así que recomendado que se reinicie cuando estés seguro de que no hayan piratas en el mapa. 3. El evento no tiene inicio y finalización, solo se invocan monstruos. 4. El reinicio consiste en dejar el contador de oleadas en 0 y borrar todas las tuplas en player.quest que contengan en el nombre la palabra "PIRATA". Cada mob invocado ocupa un registro en la base de datos, así que es una forma de limpiar la tabla. 5. Reportar cualquier error Que la disfruten! Discord: Camilo#0869 --]] quest evento_tanakas_v2 begin state start begin function info() return { ["index_mapa"] = 63, ["nombre_mapa"] = "Desierto", ["id_mob"] = 5004, ["drop_mob"] = 30202, ["prob_mob"] = 50, -- del 1% al 100% (entero) ["radio"] = 1000, ["max_invoc"] = 300, ["premios"] = { ["id"] = {10, 21, 32, 43, 54, 65, 76, 87, 98, 99}, ["cantidad"] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, ["precio"] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20} }, } end when letter with pc.is_gm() begin send_letter("GM: Evento Tanakas") for j = 1, game.get_event_flag("OleadaPirata") do for i = 1, evento_tanakas_v2.info().max_invoc do local vid = game.get_event_flag(j.."PIRATA"..i) target.vid(j.."PIRATA"..i, vid, mob_name(evento_tanakas_v2.info().id_mob)) end end end when button or info begin local s = evento_tanakas_v2.info() if pc.get_map_index() == s.index_mapa then say_title("Evento Tanakas") say("[ENTER]Hola "..pc.get_name()) say("[ENTER]Los "..mob_name(s.id_mob).." se invocarán en") say("el mapa actual.") say("[ENTER]Digita la cantidad a invocar (1-"..s.max_invoc..")") say("Deja vacío para cancelar") local cantidad = tonumber(input()) if cantidad == nil or cantidad == 0 or cantidad > s.max_invoc then return end game.set_event_flag("OleadaPirata", game.get_event_flag("OleadaPirata")+1) for i = 1, cantidad do local vid = mob.spawn(s.id_mob, pc.get_local_x(), pc.get_local_y(), s.radio, false, 1) target.vid(game.get_event_flag("OleadaPirata").."PIRATA"..i, vid, mob_name(s.id_mob)) game.set_event_flag(game.get_event_flag("OleadaPirata").."PIRATA"..i, vid) end notice_all("Se han invocado "..cantidad.." "..mob_name(s.id_mob).." en "..s.nombre_mapa..". ¡Saca sus orejas!") else syschat("Debes estar en el desierto para poder invocar") end end when kill with npc.get_race() == evento_tanakas_v2.info().id_mob begin if number(1, 100) <= evento_tanakas_v2.info().prob_mob then game.drop_item_with_ownership(evento_tanakas_v2.info().drop_mob, 1) end end when 20095.chat."Reiniciar contador Evento Tanakas" with pc.is_gm() begin say_title(mob_name(npc.get_race())) say("[ENTER]El servidor hace una cantidad de ciclos cuando") say("invoca los tanakas. Si la cantidad de ciclos es muy grande,") say("puede ralentizar el proceso.") say("Actualmente el contador está en "..game.get_event_flag("OleadaPirata")) say("Solo reinicialo cuando no haya ningún Tanaka por ahí ") say("[ENTER]Reiniciarlo ahora?") if select("Sí ", "No") == 1 then if select("Sí ", "No") == 1 then game.set_event_flag("OleadaPirata", 0) mysql_query("DELETE FROM player.quest WHERE szName like '%PIRATA%'") syschat("Reiniciado") end end end when 20095.chat."Cambiar orejas de Tanaka" begin -- Cambiar NPC si se necesita local s = evento_tanakas_v2.info() say_title("Cambiar orejas de Tanaka") local tabla_select = {} for i = 1, table.getn(s.premios.id) do tabla_select[i] = item_name(s.premios.id[i]).." x"..s.premios.cantidad[i].." - "..s.premios.precio[i] end table.insert(tabla_select, "Cerrar") local sel = select_table(tabla_select) if sel != table.getn(tabla_select) then if pc.count_item(s.drop_mob) >= s.premios.precio[sel] then pc.give_item2(s.premios.id[sel], s.premios.cantidad[sel]) pc.remove_item(s.drop_mob, s.premios.precio[sel]) else syschat("No tienes suficientes "..item_name(s.drop_mob)) end end end end end
  4. Hola amigos Esta quest consiste en que el líder del grupo al pulsar sobre un objeto (type 18) mostrará/ocultará la ubicación de los miembros del grupo (sin incluirlo a él) en el mapa. Parecido a cuando tenemos misión con un NPC y aparece una flecha arriba y también como una burbuja en el mapa. A medida que los miembros del grupo se mueven, también se moverá el "target", o sea, la "burbuja". Es decir, la ubicación es en tiempo real. No traigo vídeo porque no lo puedo testear en mi server pero sí funciona. Igualmente si no llegase a funcionar me lo escriben por acá. [Hidden Content] (Dejo código en post, código en web y archivo adjunto) --[[ QUEST Quest creada por Camilo Martínez Consiste en que el líder del grupo pueda ver la ubicación en tiempo real de los integrantes. Especificaciones: 1. El líder del grupo al darle click sobre el objeto, le aparecerá la ubicación de cada integrante en el mapa (en tiempo real) 2. Se notificará en el chat grupal cuando se active/desactive el rastreador 3. Cuando se le dé click de nuevo al objeto, se borrarán las ubicaciones. Notas: 1. Si un miembro no está en el mapa simplemente no se muestra su ubicación. 2. Al apuntar el cursor en cualquiera de los integrantes mostrados en el mapa, se verá su nombre. 3. Los targets se eliminan cuando se cierra la sesión 4. Basado en los targets de las misiones oficiales 5. Reportar cualquier error Y disfrutar de la quest! Discord: Camilo#0869 --]] quest ver_miembros begin state start begin function eliminar_targets() pc.setqf("block_target", 0) for i = 1, 8 do target.delete("__MEMBER"..i.."__") end end when 40001.use begin if party.is_leader() then if pc.getqf("block_target") == 0 then pc.setqf("block_target", 1) local pids = {party.get_member_pids()} local partyMembers = table.getn(pids) for i = 1, partyMembers do q.begin_other_pc_block(pids[i]) if pids[i] != pc.get_vid() then local name, pid = pc.get_name(), pids[i] end q.end_other_pc_block() target.vid("__MEMBER"..i.."__", pid, name) end party.chat("<Grupo> El líder está siguiendo las ubicaciones de los integrantes") else party.chat("<Grupo> El líder dejó de seguir las ubicaciones de los integrantes") ver_miembros.eliminar_targets() end else ver_miembros.eliminar_targets() syschat("No eres el líder de un grupo") end end when logout with pc.getqf("block_target") == 1 begin pc.setqf("block_target", 0) end end end ver_miembros.quest
  5. Hola a todos Traigo esta quest. Creada e ideada por mí, 100% original de Camilo. EDICIÓN URGENTE: añadí límite en los cambios/iteraciones. Eso depende del rendimiento de sus servidores. El personaje cuando tarda un minuto, estando en diálogo con un NPC haciendo un proceso, el servidor se cae. En la nueva edición, puse como máximo 2 millones; en mi server local se demora 6 segundos en llegar a los 2 millones. Pueden cambiar ese parámetro en la variable LIMITE. Descarga los archivos en el adjunto y mira todo de aquí para abajo. simulador.quest --[[ QUEST Quest creada por Camilo Martínez Esta quest fue creada con el fin de entretenimiento usando un simulador de media y habilidad. Especificaciones: 1. Dar clic al NPC indicado y abrirá una ventana con dos opciones: Sacar media y habilidad; Iteraciones infinitas 2. Al presionar sobre Iteraciones infinitas mostrará páginas de 10 filas donde se muestran números de media y habilidad aleatorios. Las páginas son infinitas en cuanto le presiones al botón "Siguiente". 3. Al presionar sobre Sacar media y habilidad, te pedirá la media deseada, la habilidad deseada y la cantidad de cambios (iteraciones) a usar. Si no quieres sacar habilidad, simplemente déjala en un número que sabes que no saldrá, como el 999. En iteraciones, elige un número muy grande. El resultado de esta operación es mostrar la cantidad de cambios utilizados para obtener la media o habilidad igual o mayor a las digitadas por ti. Notas: [ACADÉMICO] 1. La función para obtener estos valores está basada en la source del game en el archivo Item_addon.cpp 2. La media depende de la habilidad. Eso se puede ver en la función. La habilidad se saca de una distribución gaussiana (normal) con parámetros media (promedio) = 0 y desviación estándar = 5. Una vez obtenida la habilidad, se le suma 0.5 y si el valor obtenido es menor o igual a 20, sacará una función para la media. Si es mayor a 21, sacará otra función para sacar la media. 3. ¿Cómo obtener la función? ya que se trata de uso de números aleatorios para realizar simulaciones o eventos, la cosa cambia, hay que usar un método llamado Box-Muller. La función está en el questlib.lua y en simulador.py. La función number() o math.random() funcionan perfecto con el método ya que retornan variables aleatorias uniformes (todos los números caen con una probabilidad aproximadamente igual). 4. En C++ ya se encontraba la función gaussiana. En Python se encuenta como random.gauss() En Lua no se encontraba. Así que la tomé de Box-Muller. Al probar, me pareció que sacaba los valores muy cercanos a las de los otros dos lenguajes así que supongo que esta función simula muy bien. En ninguno de los tres lenguajes (aunque no se trata del lenguaje sino de la función), se logró obtener una media de 60. 5. La función de Box-Muller la encontré standard (media 0 y desviación estándar 1) así que tuve que averiguar una más genérica. Encontré una pero los resultados no me daban. La media no tenía problema porque sumaba con la función y la media es 0, así que daba igual. La desviación estándar estaba dentro de la raíz. Como no me daban bien los resultados (no pasaba de 40 de media(arma)), la elevé al cuadrado (quedó la desviación estándar afuera de la raíz) Los resultados cambiaron y se aproximaron bastante a mi simulación por Python. 6. La ventaja de usar el simulador es que puedes "usar" miles de Objeto Encantado en un segundo. Así que puedes poner libremente media de 50 y 1kk de cambios para probar. 7. Reportar cualquier error Que se entretengan :) Discord: Camilo#0869 --]] quest simulador begin state start begin function llenar_pagina() say_title("Habilidad Media") for j=1, 10 do local h, m = calcular_hab_med() say(h.." "..m) end end function sacar_bonus() LIMITE = 2000000 say("Ingresa la media que quieres sacar") local med = tonumber(input()) say("Ingresa la habilidad que quieres sacar") local hab = tonumber(input()) if med == nil or hab == nil then return end say("Ingresa la cantidad de cambios") say("(Máximo "..LIMITE..")") local iter = tonumber(input()) if iter == nill or iter > LIMITE then return end for i = 1, iter do local h, m = calcular_hab_med() if m >= med or h >= hab then say_title("Media y habilidad") say("[ENTER]Resultados: [ENTER]"..i.." cambios") say(m.." daño de media") say(h.." daño de habilidad") return end end syschat("No salió el bonus deseado") end when 20095.chat."Media y habilidad" begin local sel = select("Sacar media y habilidad", "Cambios infinitas", "Cerrar") if sel == 1 then simulador.sacar_bonus() elseif sel == 2 then simulador.llenar_pagina() while true do if select("Siguiente", "Cerrar") == 1 then simulador.llenar_pagina() else return end end end end end end questlib.lua function gaussian (mean, variance) return variance*math.sqrt(-2 * math.log(math.random())) * math.cos(2 * math.pi * math.random()) + mean end function calcular_hab_med() local g = gaussian(0, 5) local hab = math.floor(g) + 0.5 local med = 0 if math.abs(hab) <= 20 then med = -2*hab+math.abs(number(-8, 8) + number(-8, 8))+number(1, 4) else med = -2*hab+number(1, 5) end return math.floor(hab), math.floor(med) end Este código es para simular por Python3 por local o web. Deshabilita el print de adentro para que no aparezca en cada iteración la media y la habilidad. Este archivo no va en ninguna parte del juego, aclaro. #Simulador de media y habilidad. La probabilidad de sacar media y habilidad es la clásica del oficial import random import math def calcularmedia(num, intentos): for i in range(intentos): valor_bonus = 500 n1 = random.gauss(0, 5) iSkillBonus = int(n1) + float(0.5) iNormalHitBonus = 0 if math.fabs(iSkillBonus) <= 20: iNormalHitBonus = -2 * iSkillBonus + math.fabs(random.randint(-8, 8) + random.randint(-8, 8)) + random.randint(1, 4) else: iNormalHitBonus = -2 * iSkillBonus + random.randint(1, 5) hab = "Habilidad", int(iSkillBonus) med = "Media", int(iNormalHitBonus) print (med, hab) if iNormalHitBonus >= num: return (i+1), "cambios", med, hab, "Yang gastado", (i+1)*valor_bonus return "no dopó, Yang gastado: ", (i+1)*valor_bonus #En donde va el 50 es la media y el 1000000 es la cantidad de cambios a utilizar print (calcularmedia(30, 1000000)) Éxitos!
  6. Hola! He traído una nueva quest, creada por mí. Link: [Hidden Content] Toda la descripción está en el archivo. Adáptenla a sus servers EDIT: 1. He agregado la confirmación del personaje a transportar --[[ QUEST Quest creada por Camilo Martínez Consiste en que el líder del grupo transporta a un miembro hacia él. Al pulsar sobre el ítem (type 18) abrirá una ventana donde se visualizan los nombres de los integrantes del grupo y al seleccionar a uno, le llegará al integrante un cuadro donde tiene que confirmar la teletransportación. En caso de afirmativo, llegará a la posición del líder. Notas: 1. Solo aparecerán los miembros del grupo que estén en el mismo mapa que el líder 2. El tiempo de espera se puede modificar 3. Los botones del select se bugean con los corchetes del nombre del GM. Así que haz pruebas con un pj que no tenga esos caracteres. 4. El objeto cuando está en estado de confirmación se bloquea. Es decir, solo se puede hacer una invitación a la vez. 5. Solo files 40k+ 6. Reportar cualquier error Buena suerte :) Discord: Camilo#0869 --]] quest anillo_teleport_lider begin state start begin when 40003.use with party.is_leader() begin TIEMPO_ESPERA = 10 local pids = {party.get_member_pids()} local partyMembers = table.getn(pids) local lider = party.get_leader_pid() local members, members_pids = {}, {} local index_map = pc.get_map_index() for i = 1, partyMembers do q.begin_other_pc_block(pids[i]) if pids[i] != lider then if pc.get_map_index() == index_map then table.insert(members, pc.get_name()) table.insert(members_pids, pids[i]) end end q.end_other_pc_block() end table.insert(members, "Cerrar") local sel = select_table(members) if sel != table.getn(members) then setskin(NOWINDOW) syschat("Se le ha enviado una invitación a "..members[sel]) local res = confirm(members_pids[sel], pc.get_name().." quiere transportarte. ¿Aceptas?", TIEMPO_ESPERA) if res == CONFIRM_OK then local x = pc.get_local_x()*100 local y = pc.get_local_y()*100 local r = pc.select(members_pids[sel]) pc.warp_local(index_map, x, y) pc.select(r) elseif res == CONFIRM_TIMEOUT then syschat("Se acabó el tiempo de espera") else syschat(members[sel].." ha rechazado la invitación de transportación") end end end end end
  7. Hola a todos Hoy quise regalar una quest a todos. Consiste en transformarse por medio de pergamino de misión pero con una diferencia. ¿Qué hay que poner? pues... Variable de entradas: 1. ID del mob (vnum) que es las que tienen todas las quest de transformación ó 2. Nombre del mob Sí, el nombre. El nombre que digites, buscará los mobs que contengan la palabra que pusiste y aparecerá la lista. El que selecciones, en ese te transformarás. Algo así como un buscador de Google (bueno no tanto xD) No tengo pantallazos... Aquí tienes: [Hidden Content] EDITADO: 1. He quitado que solo saliera el botón en misión. Ahora aparece flotante en la parte izquierda. 2. He descubierto que el select_table() se bugea cuando hay más de 47 botones, así que reduje la cantidad. 3. Pero igualmente quité los "Cerrar" de cada página, menos en la última. 4. Fix bug portales Éxitos! --[[ QUEST Quest creada por Camilo Martínez Consiste en transformarse en un monstruo facilitando la búsqueda del mismo. Ya que los jugadores no deben conocer los id de lo monstruos, ahora tienen la posibilidad de buscar por vnum o por nombre. Especificaciones: 1. En las misiones aparecerá el botón "Transformarse" 2. Al darle clic al botón, aparecerá un cuadro con la duración de la transformación y 3 opciones: Buscar por id, por nombre y volver a la normalidad. 3. Cuando busques por nombre, aparecerán todos los monstruos que contengan la palabra que pusiste. 4. Te transformarás y podrás quitarte la transformación pulsando en la 3° opción del pergamino. 5. Saldrá en chat rojo el mob en el que te transformaste y el id. Notas: 1. Modificable la duración. 2. La búsqueda se realiza consultando en player.mob_proto y para mejorarla, omití los portales como resultados (type 3 y 9). 3. El pj se bugea si la tabla que se inserta en select_table supera el tamaño 47. Por eso puse la restricción de ser más específico con la búsqueda. 4. Hará un aviso cuando no se encuentra el monstruo. 5. Reportar cualquier error. Que la disfrutes :) Discord: Camilo#0869 --]] quest transformarse begin state start begin when letter begin send_letter("Transformarse") end when button or info begin DURACION = 60*5 say_title("Transformarse") say("[ENTER]La transformación dura "..DURACION.." segundos") say("[ENTER]Buscar mob por :") local sel = select("Vnum", "Nombre", "Volver a la normalidad", "Cerrar") if sel == 1 then say_title("Transformarse") say("Digita el ID del mob") local vnum = tonumber(input()) if vnum == "" then return end pc.polymorph(vnum, DURACION) chat("Te transformaste en un "..mob_name(mobs.vnum[sel]).." ("..mobs.vnum[sel]..")") elseif sel == 2 then say_title("Transformarse") say("[ENTER]Escribe una palabra que tenga el nombre") say("del mob") local nombre_mob = input() if nombre_mob == "" then return end local mobs = mysql_query("SELECT vnum, locale_name FROM player.mob_proto WHERE (UPPER(CONVERT(locale_name USING latin1)) like '%"..nombre_mob.."%' and type!=3 and type!=9 );") if table.getn(mobs) == 0 then syschat("No hay coincidencias") end local aux = 0 table.insert(mobs.locale_name, "Cerrar") if table.getn(mobs.locale_name) > 47 then syschat("Sé más específico con tu búsqueda") return end local sel = select_table(mobs.locale_name) pc.polymorph(mobs.vnum[sel], DURACION) chat("Te transformaste en un "..mob_name(mobs.vnum[sel]).." ("..mobs.vnum[sel]..")") elseif sel == 3 then pc.polymorph(0) end end end end
  8. Hola Este es mi primer regalo luego de aprender a hacer quest Por ahí vi que la pidieron pero fue hace mucho tiempo. Si no sirve para la 6° habilidad para guerreros y ninjas, deben agregar en su questlib.lua esto: Buscar la tabla special.active_skill_list y agregan la 6, 21, 36 y 51. Eso es todo, que lo disfruten --[[ QUEST Quest creada por Camilo, basada en la quest de las P Consiste en subir una sola habilidad a P. Al usar el anillo, aparecerá en una ventana las habilidades que no tengas en nivel 40 (P) y al seleccionar una de ellas, te la pondrá en lvl 40 (P) y el objeto se desaparecerá. Discord: Camilo #0869 --]] quest una_hab_p begin state start begin when 40004.use begin ITEM = 40004 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) pc.set_skill_level(ret_vnum_list[sel], MAX_LVL_SKILL) pc.remove_item(ITEM, 1) end end end end end
×
×
  • Create New...