Jump to content

caanmasu

Miembro
  • Contador contenido

    359
  • Ingreso

  • Última visita

  • Días ganados

    39

Mensajes publicados por caanmasu

  1. hace 20 minutos, kco 1 dijo:

    quest mapa_vip begin
        state start begin
            when 71174.use begin
                say_title(item_name(item.vnum))
                say()
                say("Deseja se teleportar para o mapa VIP?")
                if select("Sim", "Não") == 1 then
                    pc.warp(coord_global_x*1016, coord_global_y*99)
                end
            end
        end
    end

    
    no teletransportándome, ¿hice algo mal?

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

    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..";")

     

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

     

     

     

     

     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
    es el pto amo

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

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

     

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

  7. hace 19 horas, TheZurka dijo:

    Estaría bien aprender la sintaxis de los arrays, todavía voy a lo simple xD

    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

    image.png

    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!

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

     

  9. hace 1 hora, NazoX dijo:

    editarle todo el item_proto.txt equilibrando las armas, en plan, ni que una haga 1 de daño ni una haga 700 , que todas esten balanceadas xD, vamos que quiere que hagamos el trabajo sucio por vete a saber que recompensa :v

    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

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

     

×
×
  • Crear nuevo...