Jump to content

caanmasu

Members
  • Content Count

    220
  • Joined

  • Last visited

  • Days Won

    11

caanmasu last won the day on June 23 2020

caanmasu had the most liked content!

About caanmasu

  • Rank
    Aficionado

Recent Profile Visitors

1,422 profile views
  1. El mismo syserr te da la respuesta. No existe el objeto 금전자파+0, +1, +2... Usa un archivo que tenga los ítems en vnums mejor
  2. Hola! Voy a regalar un programa que mejora la edición de mob_drop_item.txt. Si se dan cuenta, cuando quieren modificar este archivo, no se acuerdan los ids de los ítems y a veces tampoco el id del monstruo. El programa consiste en añadir comentarios en las líneas donde hay vnums ya sea de mobs o de ítems. Ejemplo: Así ya es muy fácil editar este archivo. Vamos al tutorial (el adjunto está al final) Cuando descomprimas el rar vas a encontrar la carpeta por dentro así: Tienes que tener Python 3+ instalado en tu pc Debes poner tu mob_drop_item.txt, tu item_names.txt, tu mob_names.txt y reemplazar por los que están ahí. Ahora corre el programa haciendo doble clic en start.bat. Se demora unos segundos y se generará el archivo new_mob_drop_item.txt. Revisa que se genere el archivo y que todo esté correcto. Para desarrolladores, dejo el código en Python que hice: def getArrayFile(path): content = [] with open(path, errors="ignore") as f: line = f.readline() content.append(line) while line: line = f.readline() content.append(line) f.close() return content def makeFileFromContent(content): open("new_mob_drop_item.txt", 'w') with open("new_mob_drop_item.txt", 'a') as f: for i in content: f.write(i) f.close() def isInteger(text): try: int(text) result = True except: result = False return result class NamesMobDropItem: mob_drop_item_content = getArrayFile("mob_drop_item.txt") mob_names_content = getArrayFile("mob_names.txt") item_names_content = getArrayFile("item_names.txt") def getNewNamesLine(line, content): for i in content: if len(i.split("\t")) >= 2: if i.split("\t")[0] == line.split()[1]: line = line.rstrip("\n") line = line+"\t-- "+i.split("\t")[1] break return line def setComments(self): for c, i in enumerate(self.mob_drop_item_content): if len(i.split()) == 2 or len(i.split()) == 3: if i.split()[0].lower() == "mob": i = NamesMobDropItem.getNewNamesLine(i, self.mob_names_content) self.mob_drop_item_content[c] = i elif len(i.split()) >= 4: if isInteger(i.split()[1]) and isInteger(i.split()[2]): i = NamesMobDropItem.getNewNamesLine(i, self.item_names_content) self.mob_drop_item_content[c] = i mob_drop_item_file = NamesMobDropItem() mob_drop_item_file.setComments() makeFileFromContent(mob_drop_item_file.mob_drop_item_content) Éxitos a todos! name_mob_drop_item.rar
  3. 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
  4. @colombia2020 te voy a explicar mejor
  5. Holaaaaaaaaaaaaaa Vengo a compartir un programa que hice en Python sencillo, que consiste en "traducir" el locale_string.txt. Contexto: cuando descargas una base turca, por ejemplo, viene el locale_string.txt en turco, y no puedes pasar tu locale_string.txt traducido porque resulta que la base turca tiene algunas líneas diferentes que dependen de sistemas, y si pones tu locale_string.txt traducido, te va a dar error. Lo mostraré mejor: Este es el locale_string.txt turco. " %s 군주 후보에서 삭제하였습니다"; "%s Savas arasindan ?kartildi "; " %s 군주로 입명 했습니다."; "%s ?parator aday?olarak g?terildi. "; " %s 군주르 제거 하였습니다.."; "%s ?paratorluk g?evini b?akt? "; "´?¸? °?·ˇAß(?˘°i,±ł??,≫oAˇ)?ˇ´A °ł?I≫oAˇ?≫ ≫c?eC? ?o ??˝?´?´?."; "Bir market a汚k iken baka bir market a?mazs?."; " %s 군주를 제거 할수 없습니다."; "%s ?paratoru g?evi b?akamaz. "; "Kendi marketinizden herhangi bir ey sat? alamazs??."; "Kendi marketinizden herhangi bir ey sat? alamazs??."; "20?? łE?≫ ??°uC??ⓒ ≫oAˇ?≫ ?­?o°ˇ ??˝?´?´?"; "Envanterinizdeki Yang maksimum seviyeye ulam詰. L?fen envanterdeki Yang'lar?k??lere d?淆t?? tekrar deneyiniz."; Este es el locale_string.txt tuyo, el traducido: " %s 군주 후보에서 삭제하였습니다"; "%s is deleted as Emperor Candidate."; " %s 군주로 입명 했습니다."; "%s nominated as Emperor."; " %s 군주르 제거 하였습니다.."; "The %s Emperor gets driven out."; " %s 군주를 제거 할수 없습니다."; "The %s Emperor cannot be driven out."; " %s 는 군주 후보가 아닙니다."; "%s is no Candidate to become Emperor."; " %s 는 군주로 입명할수 없습니다 ."; "%s cannot be nominated as Emperor."; " (만료일 : %d년 %d월 %d일)"; "(Procedure: %d y- %d m - %d d)"; Si te das cuenta, el 4° texto del locale_string.txt turco no existe en el locale_string.txt traducido. ¿Qué hubiese pasado si lo reemplazas en el servidor? probablemente te da error o se pierde ese texto para el sistema que pertenece ese locale. Aquí te lo explico mejor. Turco vs Inglés Por eso he creado un programa en Python que compara las líneas de tu locale_string.txt con las del locale_string.txt del otro servidor y reemplaza el texto. Dejo el código de Python aquí para las personas dev: (más abajo dejo el programa completo) compare_locale_string.py import array def getArrayFile(path): content = [] with open(path) as f: line = f.readline() content.append(line) while line: line = f.readline() content.append(line) f.close() return content print("You should have your locale_string within this directory") print("Type name file translated locale_string.txt (ex. locale_string_en.txt)") other_file = input() locale_string_content = getArrayFile("locale_string.txt") other_file_content = getArrayFile(other_file) count_1 = 1 for i in other_file_content: if '"' in i: count_2 = 1 for j in locale_string_content: if i == j: locale_string_content[count_2] = other_file_content[count_1] break count_2 = count_2 + 1 count_1 = count_1 + 1 with open('new_locale_string.txt', 'w') as f: for i in locale_string_content: f.write(i) print("New file: new_locale_string.txt") Requisitos: debes tener instalado Python versión 3+ Programa completo: archivo adjunto al final ¿Cómo se usa? Luego de tener Python 3+ instalado, vas a hacer esto: 1. Descomprime el rar y pon la carpeta en un lugar donde la identifiques 2. Abrir cmd.exe y poner cd ruta/de/la/carpeta/compare_locale_string 3. Pon py compare_locale_string.py 4. La consola te pedirá el nombre del archivo tuyo. Yo dejé un locale_string_en.txt ahí. 5. Abrir el archivo generado new_locale_string.txt y verificar que todo esté bien. El resultado de las primeras líneas de mi archivo new_locale_string.txt: Saludos amigos! compare_locale_string.rar
  6. caanmasu

    RETO quest #1

    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 = {}
  7. Soy experto en quest, por si necesitas
  8. Una vez dentro de la carpeta quest debes poner: ./qc ruta/de/tu/quest En tus files las quest están en la carpeta source. Digamos si tu quest se llama bienvenida.quest entonces debes poner: ./qc source/bienvenida.quest Si tu quest está en source/nuevas/evento.quest, entonces pones: ./qc source/nuevas/evento.quest
  9. Yo lo jugué, es muy bueno. Aunque es muy limitado, todavía le falta mucho.
  10. 1. Es "send_letter" 2. Puedes usar los caracteres especiales siempre y cuando no estén al inicio o al final de la línea 3. Esto se te va a bugear porque tienes un [ al inicio de la línea
  11. Hello amigo No te cae el objeto porque tienes que tener al menos uno en el inventario, así está en tu evento. if pc.count_item(50011) >= 0 then local porc = math.random(1,16) if porc <= 2 then game.drop_item_with_ownership("50011", 1) syschat("Você Dropou o Bau Arca de Luar, Pegue seu Premio!") end end Fíjate que está diciendo que si el personaje ya tiene el objeto, que le dropee. Pero si no tiene el objeto nunca le va a caer. Yo quitaría esa condición
  12. Hola mis cracks! Soy yo de nuevo, Camilo! Yo sé, no he llegado aún pero me faltan 3 puntos para llegar a los 400 3 reacciones a este mensaje y llegamos GOGOGO 400 ayudas, experiencias, formas de compartir he vivido en este foro de no solo hispanos sino también latinos e incluso una que otra persona de otro idioma/país. Fue en este foro donde aprendí lo básico, y bueno, hace años atrás había otro foro que ahora no existe. 400 veces me agradecieron por ayudarles 400 veces valoraron mi voluntario trabajo 400 veces dijeron que tenía que seguir No me estoy despidiendo, no me malinterpreten xD Estaré tiempo por fuera, así que no podré ayudarles por el momento pero cuando vuelva ¡habrá sorpresas! Últimas cosas que hice en Metin2: - Un programa que asigna la experiencia oficial de cada monstruo y personalizada con un multiplicador. Tanto para MySQL como para txt. - Las misiones del oficial hasta el nivel 90. Tanto las principales como las "new quests" como las secundarias. - Un programa que reemplaza líneas en otro idioma (turco, por ejemplo) por líneas en español en el cliente. Es decir, es un traductor. E incluso si no tienes las líneas traducidas, hay una forma de traducirlas con el Traductor de Google y con un solo clic se ajustan al archivo listo para meter al cliente. Hice otras cosas pero ahora no me acuerdo. Bien, cracks; no etiqueto a nadie porque si me falta alguien me linchan xD Éxitos para todos! No estaré activo en el foro por un tiempo. Con los 400 puntos vamos por juegos de azar y... lo que diga tu imaginación!
×
×
  • Create New...