Jump to content

caanmasu

Miembro
  • Contador contenido

    357
  • Ingreso

  • Última visita

  • Días ganados

    38

Mensajes publicados por caanmasu

  1. 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
    end

    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.

  2. 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 

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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 🙂

  9. 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

     

  10. 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 = {}

     

×
×
  • Crear nuevo...