Jump to content

borrar


caanmasu

Mensajes recomendados

¡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

Enlace para comentar
Compartir en otros sitios

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!

Enlace para comentar
Compartir en otros sitios

hace 1 hora, Zauron dijo:

Recien me ando interesando de a poco en como funcionan las quest, , para darle el premio a todos seria algho asi creo


pc.give_item2([local vnum = math.ceil(tonumber(input())] with pc.get_map_index() == pc.is_gm() then

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? 😮

Enlace para comentar
Compartir en otros sitios

¿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!

Enlace para comentar
Compartir en otros sitios

  • 6 months later...

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

 

Enlace para comentar
Compartir en otros sitios

  • caanmasu cambió el título a borrar

Unirse a la conversación

Puedes publicar ahora y registrarte más tarde. Si tienes una cuenta, regístrate para publicar con su cuenta.

Guest
Responder a este tema...

×   Has pegado contenido con formato .   Eliminar formato

  Only 75 emoji are allowed.

×   Tu enlace se ha incorporado automáticamente.   Mostrar un enlace en su lugar

×   Se ha restaurado el contenido anterior. .   Borrar editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recientemente navegando por este tema   0 miembros

    • No hay usuarios registrados visitando esta página.
×
×
  • Crear nuevo...