Jump to content
Sign in to follow this  
caanmasu

[QUEST] Editor de ítems

Recommended Posts

Quest editor de ítems

 

Hola amigos. He realizado esta quest para ustedes.

Ver vídeo y leer descripción en la quest! Éxitos!

 

 

Pastebin:

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

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

 

quest_functions:

gaussian
calcular_hab_med
say_title_center
math.abs

 

dopador_camilo.quest

--[[
QUEST editora de ítems

Consiste en asignar bonificaciones a los ítems de manera arbitraria. Solo se permiten tipos y valores de bonificaciones permitidas por el curso legal del juego.
En otras palabras, los ítems solo pueden obtener valores que se consigan al cambiar los bonus con un Objeto Encantado.

Configuración:
1. NPC: buscar when 20354.take begin; y cambiar por el id de tu NPC.
2. INTENTOS = 5000000 -> esta constante determina la cantidad de iteraciones al cambiar la hab y media. Puede saturar tu server por 3 segundos si pones valores muy altos.

Requisitos para instalar:

Descargar la parte del questlib.lua

Agregar a quest_functions:
gaussian
calcular_hab_med
say_title_center
math.abs

Notas:
1. Al poner encima un ítem al NPC 20354 (Guardián de la Ciudad) se te abrirá una ventana donde te dará la opción de editar el ítem.
2. Ítems disponibles: armas, armaduras, brazaletes, zapatos, collar, casco, escudo y pendientes.
3. Tomado del 1° al 5° bonus. No importa si el objeto no tiene bonus, se agregarán automáticamente.
4. En caso del arma de media y habilidad, pedirá dos entradas, una donde pide media y la otra habilidad.
Si quieres solo media, pon la media a tu gusto y la habilidad en un número imposible (como el 111)
Si quieres solo habilidad, pon la habilidad a tu gusto y la media en un número imposible (como el 111)
Si quieres que salga 50 de media ó 25 de habilidad, lo que caiga primero, entonces pon 50 en media y 25 en habilidad.
Después de escoger la media y habilidad, te saldrá una página donde saldrán los bonus disponibles para ese objeto y los valores que pueden salir.
Aparecerán 3 páginas y así se completarán los 5 bonus.
5. Para objetos sin media y habilidad, pedirá escoger 5 bonus, en 5 páginas.
6. Si un objeto ya tiene un tipo de bonus, no puede volver a salir ese tipo de bonus.

¿Cómo funciona el programa?

Al poner el objeto en el NPC evalúa si el objeto es de media y habilidad. Entonces busca en la base de datos si tiene addon_type = -1 ó 0
En caso de tener media (addon_type = -1), se harán muchos "cambios" hasta conseguir que la habilidad o media que salieron, sean mayores o iguales a las que escogió el jugador.
Esos "cambios" son la simulación de media y habilidad, en donde realizo hasta 5 millones de iteraciones. La función de media y habilidad es la misma tomada de la oficial desde el source en el archivo ItemAddon.cpp
Para más detalles sobre la media y habilidad visitar: https://metin2zone.net/index.php?/topic/27849-quest-simulador-de-media-y-habilidad/
Si no sale la media o habilidad elegida, entonces dirá "No dopó. Inténtalo de nuevo"
En caso de que sí, entonces procede a dopar el resto así:
En la base de datos busca el tipo de objeto y averigua los bonus que están asociados. Esto hace que a un arma no aparezca inmune apagón, por ejemplo.
Luego busca los bonus que ya tiene inmersos en el ítem, tales como el HP que está en el brazalete de plata. Esos tipos de bonus los excluye.
Ya se tienen los tipos de bonus que pueden salir en el objeto. Ahora se traducen a lenguaje humano. Por ejemplo, en vez de poner "ATT_SPEED" pone "Velocidad de Ataque"
Ahora esos bonus en "lenguaje humano" saldrán en las opciones con un select_table(). Al seleccionar el tipo de bonus, aparecerá otra página donde se ven los valores. Esos valores pertenecen a los campos lv1, lv2, hasta lv5 de item_attr.
Para poder agregar los bonus al objeto, se toman las variables que eligió el jugador en cada select. Con item.set_value() asigno los bonus al ítem.
Esto se hace 3 o 4 veces dependiendo de la media y habilidad que haya salido. Y para objetos normales se realizan 5 veces.

Cualquier duda comentar debajo de la publicación o escribirme al Discord.

Discord: Camilo#0869

--]]



quest dopador_camilo begin
	state start begin

		function get_str_sub_type(t, st)
			local sub_tipos = {
				[1] = {"weapon", 1},
				[2] = {"body", 2, 0},
				[3] = {"wrist", 2, 3},
				[4] = {"foots", 2, 4},
				[5] = {"neck", 2, 5},
				[6] = {"head", 2, 1},
				[7] = {"shield", 2, 2},
				[8] = {"ear", 2, 6}
			}
			if t == 1 then
				return sub_tipos[1][1]
			end
			for i = 1, table.getn(sub_tipos) do
				if t == sub_tipos[i][2] and st == sub_tipos[i][3] then
					return sub_tipos[i][1]
				end
			end
		end
	
		function verificar(id)
			local apply_type = mysql_query("SELECT applytype0, applytype1, applytype2 FROM player.item_proto WHERE vnum = "..tonumber(id)..";")
			local types_prohibidos = {tonumber(apply_type.applytype0[1]), tonumber(apply_type.applytype1[1]), tonumber(apply_type.applytype2[1])}
			item.select(id)
			local item_type, item_sub_type = item.get_type(), item.get_sub_type()
			local bonus_type = mysql_query("SELECT apply, lv1, lv2, lv3, lv4, lv5 FROM player.item_attr WHERE "..dopador_camilo.get_str_sub_type(item_type, item_sub_type).." > 0;")
			local real_bonus_type, real_bonus_level = {}, {}
			for i = 1, table.getn(bonus_type.apply) do
				table.insert(real_bonus_level, {})
				for j = 1, table.getn(apply2) do										
					if bonus_type.apply[i] == apply2[j][1] and dopador_camilo.es_prohibido(dopador_camilo.get_vnum_applytype(bonus_type.apply[i]), types_prohibidos) != 1 then
						table.insert(real_bonus_type, apply2[j][1])
						for k = 1, 5 do
							table.insert(real_bonus_level[table.getn(real_bonus_type)], bonus_type[i][k+1])
						end
					end
				end
			end
			
			return real_bonus_type, real_bonus_level
		end

		function get_vnum_applytype(str)
			for i = 1, table.getn(apply2) do
				if apply2[i][1] == str then
					return apply2[i][2]
				end
			end
		end

		function get_str_applytype(name)
			for i = 1, table.getn(apply2) do
				if apply2[i][3] == name then
					return apply2[i][1]
				end
			end
		end

		function get_name_applytype(str)
			for i = 1, table.getn(apply2) do
				if apply2[i][1] == str then
					return apply2[i][3], apply2[i][4]
				end
			end
		end

		function es_prohibido(s, t)
			for i = 1, table.getn(t) do
				if s == t[i] then
					return 1
				end
			end
		end

		function dopar_media(id)
			INTENTOS = 5000000
			say_title_center("Dopador de Camilo[ENTER]")
			say_item_vnum(id)
			say("Ingresa la media que quieres sacar")
			local med = tonumber(input())
			if med == nil then return end
			say_title_center("Dopador de Camilo[ENTER]")
			say_item_vnum(id)
			say("Ingresa la habilidad que quieres sacar")
			local hab = tonumber(input())
			local cont = 0
			for i = 1, INTENTOS do
				local h, m = calcular_hab_med()
				if m >= med or h >= hab then
					if m == 0 then
						item.set_value(0, 71, h)
						dopador_camilo.dopar(id, 4)
					elseif h == 0 then
						item.set_value(0, 72, m)
						dopador_camilo.dopar(id, 4)
					else
						item.set_value(0, 72, m)
						item.set_value(1, 71, h)
						dopador_camilo.dopar(id, 3)
					end
					return  
				end
				cont = i
			end
			syschat("No dopó. Inténtalo de nuevo")
		end

		when 20354.take begin
			local r = mysql_query("SELECT addon_type FROM player.item_proto WHERE vnum = "..item.vnum..";")
			if r.addon_type[1] == "-1" or r.addon_type[1] == -1 then
				dopador_camilo.dopar_media(item.vnum)
			elseif item.get_type() == 1 or item.get_type() == 2 then
				dopador_camilo.dopar(item.vnum, 5)
			end
		end

		function dopar(id, cant_bonus)
			local type_bonus_temp, value_bonus_temp = dopador_camilo.verificar(id)

			local type_bonus, value_bonus = {}, {}
			local type_bonus_completo, value_bonus_completo = {}, {}

			for i = 1, table.getn(type_bonus_temp) do
				type_bonus_completo[i] = type_bonus_temp[i]
				type_bonus[i] = type_bonus_temp[i]
				value_bonus_completo[i] = {}
				value_bonus[i] = {}
				for j = 1, table.getn(value_bonus_temp[i]) do
					value_bonus[i][j] = value_bonus_temp[i][j]
					value_bonus_completo[i][j] = value_bonus_temp[i][j]
				end
			end		

			for i = 1, table.getn(type_bonus) do
				type_bonus[i] = dopador_camilo.get_name_applytype(type_bonus[i])
			end
			table.insert(type_bonus, "Cerrar")
			for i = 1, table.getn(value_bonus) do
				table.insert(value_bonus[i], "Volver")
			end
			local type_guardado, value_guardado = {}, {}

			for i = math.abs(6-cant_bonus), 5 do
				say_title("Elige el "..i.."° bonus")
				local sel_type = select_table(type_bonus)
				if sel_type != table.getn(type_bonus) then
					say_title("Elige el valor")
					local sel_value = select_table(value_bonus[sel_type])
					if sel_value != 6 then
						table.insert(type_guardado, dopador_camilo.get_vnum_applytype(dopador_camilo.get_str_applytype(type_bonus[sel_type])))
						table.insert(value_guardado, value_bonus[sel_type][sel_value])
						table.remove(type_bonus, sel_type)
						table.remove(value_bonus, sel_type)
					else
						i = i - 1
					end
				else
					return
				end
			end

			local cont = 0
			for i = math.abs(cant_bonus-5), 4 do
				item.set_value(i, type_guardado[cont+1], value_guardado[cont+1])
				cont = cont + 1
			end
			syschat("Hecho!")
		end
	end
end

 

questlib.lua

apply2 = {
	{"MAX_HP", 1, "Máx. HP", ""},
	{"MAX_SP", 2, "Máx. SP", ""},
	{"CON", 3, "VIT", ""},
	{"INT", 4, "INT", ""},
	{"STR", 5, "STR", ""},
	{"DEX", 6, "DEX", ""},
	{"ATT_SPEED", 7, "Velocidad de ataque", "%"},
	{"MOV_SPEED", 8, "Velocidad de movimiento", "%"},
	{"CAST_SPEED", 9, "Velocidad de hechizo", "%"},
	{"HP_REGEN", 10, "Regeneración de HP", "%"},
	{"SP_REGEN", 11, "Regeneración de SP", "%"},
	{"POISON_PCT", 12, "Probabilidad de envenenar", "%"},
	{"STUN_PCT", 13, "Probabilidad de apagón", "%"},
	{"SLOW_PCT", 14, "Probabilidad de retardar", "%"},
	{"CRITICAL_PCT", 15, "Probabilidad de golpes críticos", "%"},
	{"PENETRATE_PCT", 16, "Probabilidad de golpes de penetración", "%"},
	{"ATTBONUS_HUMAN", 17, "Fuerza contra humanos", "%"},
	{"ATTBONUS_ANIMAL", 18, "Fuerza contra animales", "%"},
	{"ATTBONUS_ORC", 19, "Fuerza contra orcos", "%"},
	{"ATTBONUS_MILGYO", 20, "Fuerza contra místicos", "%"},
	{"ATTBONUS_UNDEAD", 21, "Fuerza contra nomuertos", "%"},
	{"ATTBONUS_DEVIL", 22, "Fuerza contra demonios", "%"},
	{"STEAL_HP", 23, "Probabilidad de absorber HP", "%"},
	{"STEAL_SP", 24, "Probabilidad de absorber SP", "%"},
	{"MANA_BURN_PCT", 25, "Probabilidad de robar SP al enemigo", "%"},
	{"DAMAGE_SP_RECOVER", 26, "Probabilidad de recuperar SP al golpear", "%"},
	{"BLOCK", 27, "Probabilidad de bloquear ataques al cuerpo", "%"},
	{"DODGE", 28, "Probabilidad de evitar flechas", "%"},
	{"RESIST_SWORD", 29, "Defensa de espada", "%"},
	{"RESIST_TWOHAND", 30, "Defensa de dos manos", "%"},
	{"RESIST_DAGGER", 31, "Defensa de daga", "%"},
	{"RESIST_BELL", 32, "Defensa de campana", "%"},
	{"RESIST_FAN", 33, "Defensa  de fan", "%"},
	{"RESIST_BOW", 34, "Resistencia de flechas", "%"},
	{"RESIST_FIRE", 35, "Resistencia a fuego", "%"}, 
	{"RESIST_ELEC", 36, "Resistencia relámpago", "%"},
	{"RESIST_MAGIC", 37, "Defensa mágica", "%"},
	{"RESIST_WIND", 38, "Resistencia a viento", "%"},
	{"REFLECT_MELEE", 39, "Probabilidad de reflectar ataques al cuerpo", "%"},
	{"REFLECT_CURSE", 40, "Probabilidad de disipar", "%"},
	{"POISON_REDUCE", 41, "Resistencia al veneno", "%"},
	{"KILL_SP_RECOVER", 42, "Probabilidad de recuperar SP al matar", "%"},
	{"EXP_DOUBLE_BONUS", 43, "Probabilidad de doble bonus de EXP", "%"},
	{"GOLD_DOUBLE_BONUS", 44, "Probabilidad de doble caída de Yang", "%"},
	{"ITEM_DROP_BONUS", 45, "Probabilidad de doble caída de objetos", "%"},
	{"POTION_BONUS", 46, "Potion bonus", ""},
	{"KILL_HP_RECOVER", 47, "Probabilidad de recuperar HP al matar", "%"},
	{"IMMUNE_STUN", 48, "Defensa contra apagón", ""},
	{"IMMUNE_SLOW", 49, "Defensa contra retardo", ""},
	{"IMMUNE_FALL", 50, "Defensa contra caídas", ""},
	{"SKILL", 51, "Habilidad", ""},
	{"BOW_DISTANCE", 52, "Distancia de arco", ""},
	{"ATT_GRADE_BONUS", 53, "Ataque", ""},
	{"DEF_GRADE_BONUS", 54, "Defensa", ""},
	{"MAGIC_ATT_GRADE", 55, "Ataque mágico", ""},
	{"MAGIC_DEF_GRADE", 56, "Defensa mágica", ""},
	{"CURSE_PCT", 57, "Probabilidad de maldecir", "%"},
	{"MAX_STAMINA", 58, "Máx. Stamina", ""},
	{"ATTBONUS_WARRIOR", 59, "Fuerza contra guerreros", "%"},
	{"ATTBONUS_ASSASSIN", 60, "Fuerza contra ninjas", "%"},
	{"ATTBONUS_SURA", 61, "Fuerza contra suras", "%"},
	{"ATTBONUS_SHAMAN", 62, "Fuerza contra chamanes", "%"},
	{"ATTBONUS_MONSTER", 63, "Fuerza contra monstruo", "%"},
  	{"DAÑO_HABILIDAD", 71, "Daño de Habilidad", "%"},
	{"DAÑO_MEDIA", 72, "Daño de Media", "%"},

}

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

function say_title_center(msg,r,g,b)
	local _color
	if (r and g and b) == nil then
		_color = color256(255, 230, 186)
	else
		_color = color256(r, g, b)
	end
	raw_script(string.format("[TEXT_HORIZONTAL_ALIGN_CENTER]%s%s%s[/TEXT_HORIZONTAL_ALIGN_CENTER][ENTER]", _color, msg, color256(196, 196, 196)))
end

 

Anexo: probar media y habilidad

Dale a run

Y en la línea

print (calcularmedia(30, 1000000))

En donde está el 30 es la media y el 1kk son la cantidad de cambios. Cambia los valores y prueba 🙂

 

 

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

Share this post


Link to post
Share on other sites

buen aporte aunque a mi personalmente me gusta mas que se maten a dopar con el auto, lo veo muy facil asin solo es mi opinion ojo! el aporte esta weno

Share this post


Link to post
Share on other sites

Edité la publicación

Olvidé agregar 

	{"DAÑO_HABILIDAD", 71, "Daño de Habilidad", "%"},
	{"DAÑO_MEDIA", 72, "Daño de Media", "%"},

pero ya, ya está en Pastebin, code y adjuntos.

 

Si no saben cómo instalarlo o les causa error, escríbanme al Discord.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

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

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...