Jump to content

Tabla del Honor

Contenido popular

Showing content with the highest reputation on 16/08/21 in Mensajes

  1. Contenido del MultiHack: Level Bot Buscador de Metines Auto Ataque Hack de Damage Teleport ¡Muchas otras cosas! Vídeo de Muestra: LINKS DE DESCARGA: CLICK AQUÍ
    3 puntos
  2. [D]ELARO ✓

    SF MartySama 4.9.89 r88

    Estos files ya estaban en el foro pero esta caído el link así mismo como en el foro turco, los files son de Legendy con base MartySama en su versión 4.9.89 r88 # # # # # # # # # # # # # # # # # # # # # # # # # CONTENIDO: Solo traduje a español en cliente y servidor item_proto, mob_proto, locale_game y locale_interface. Falta traducir quest, locale_string y algunas cosas mas en locale_interface que son "sistemas" añadidos, pero eso ya será cosa de ustedes. Si hay bugs y sus fixes podrían añadirlo en comentarios y yo podría añadirlo despues al post. # # # # # # # # # # # # # # # # # # # # # # # # # VDI: se recomienda asignar al vdi mínimo 4gb de ram, no probé con menor cantidad. Mysql 5.6 GCC6 Visual Studio 2019 VDI: Usuario: root Contraseña: delaro Mysql: Usuario: root Contraseña: 12345 Esta montado directamente en un VDI funcionando sin ningún problema y ya listo para compilar source game. Una vez hayan configurado su ip con el comando bsdconfig, para iniciar pueden hacerlo como yo normalmente lo hago, cd /admin ENTER sh admin.sh ENTER y tendrán el menú a la vista, ya solo seria escribir 1 ENTER e iniciaran los 2 channels sin ningún tipo de complicaciones. # # # # # # # # # # # # # # # # # # # # # # # # # CUENTA GM: Usuario: marty Contraseña: 1 IMAGENES DENTRO DEL JUEGO: LINK DE DESCARGA: Google Drive
    2 puntos
  3. Algunas imagenes de las estolas DESCARGA: [CLIC EN "ME GUSTA" PARA VER EL ENLACE]
    2 puntos
  4. Ya que la otra vez se filtro sin querer el link,pues le dije Rauser para postearlo. Creditos: Al feo de Rauser switchbot - Version 1.4 Sin Packet.zip switchbot - Version 1.4 Con Patcke.zip
    2 puntos
  5. Archivos de 104-105 Vs Cientos de diferentes opciones de vestuario esperándote Un barco de encantamiento de nueva generación sin complicaciones, sin retrasos y sin saltos Arena de gremios sin complicaciones, sin complicaciones y sin retrasos Jugador máximo sin complicaciones: sistema de puntuación máxima Sistema de agentes del gremio Daño de personajes sin complicaciones Lycan, Belt, Alquimia, ¡NINGUNO! Sistema de biólogo de un clic Prevención de trampas al 100% Sistema de efectos Sistema de títulos Corrección de errores de agilidad Un barco de encantamiento de nueva generación sin complicaciones, sin retrasos y sin saltos Arena de gremios sin complicaciones, sin complicaciones y sin retrasos ¡Ollas de objetos de encantamiento vs ilimitadas! Chamán curativo pasivo Nemere de una sola capa Rosador de una capa Cuna Devil de una capa. Araña baronesa de una sola capa Sto de una sola capa. Baronesa Objetos de encantamiento de habilidad promedio +200 Disfraces ¡+50 armas animadas avanzadas! ¡Encantamiento antiguo impecable! GM ID: itja pass: 12345 MYSQL ID: root pass: uqurbey FREEBSD 11.3 GCC49 MYSQL 5.5 Client:Visual Studio 2013 https://www.dosyayukle.club/32Ox/ https://www.dosyaupload.com/cw28 https://www.dosyaupload.com/p6pj/ITJA_TANITIM.zip https://www.dosyaupload.com/cw2b/ Servidores que habre ahora el 20 de agosto http://www.rebel2vslik.com/ https://www.arin2.com/ VIRTUALBOX https://www.dosyaupload.com/82bh ID: root PW: turkmmo Nota: no hay Errores pero quién sabe Son archivos de pago gratis al público. Son super estables y facil de usar
    2 puntos
  6. Yori

    [QUEST]Control para GMs

    wenas a todos!! He estado haciendo una quest para los que les da pereza andar con comandos de mutear y esas cosas, tambien puse todos lo que se me ocurrieron, si se me paso alguno, decirlo y lo añado. Para poder usar la parte de banear gente, hace falta tener lo del mysql para quest, podeis encontrarlo aqui , no se si funcionara la quest sin eso... Click aqui para descargar la quest Descripcion de opciones: Halloween: Lo que hace es invocar unos npcs para halloween, deben ser configurados en la quest. Como usar el comando "/m" Dia/noche: creo que no hace falta explicacion xD Rates: para poner cualquier rate para reinos o por separado. Pronto rates para gremios xD Bloquear chat: como su nombre dice, es para silenciar el chat, para quitar el silencio o ver la lista de silenciados. Navidad: Para activar/desactivar cualquier evento de navidad, como la nieva, el arbol de navidad, los villancicos, Santa Claus, venta de fuegos artificiales, etc Banear: Banea/Desbanear la cuenta de la persona que quieras, pero necesitas implementar mysql para quest, aqui el post. Teleport: Para que te teletrasportes hacia una persona, o para traerlo hacia ti. Recordad: No os olvideis de poner vuestros datos y esas cosas en las funciones de mysql_query() al final de la quest hay 4 funciones parecidas a la siguiente, en "root" es el usuario del navicat(suele ser root), en PassNavicat, pos eso, la pass xD, en account no tocarle, y en ipNavicat, es la ip del server, los datos esos, van entre comillas como estan puestos ahy, si las quitais os dara error. mysql_query("Update account.account set account.status = 'OK' WHERE account.id ="..id.account_id[1].."" ,"root","PassNavicat", "account", "IPNavicat") Si teneis alguna duda, preguntaros, y recordad que nunca esta de mas dar las gracias xD Saludos!!
    1 punto
  7. ◄ ServerFiles ► Premiumlike ◄ ServerFiles ► Kuratox3 ◄ ServerFiles ► Battle2 ◄ ServerFiles ► BestProduction 1.8 ◄ ServerFiles ► Melosia2 ◄ ServerFiles ► Rubinum2 ◄ ServerFiles ► Taviona2 ◄ ServerFiles ► Maro2 / Oldline / Nalunia ◄ ServerFiles ► Mukari2 - Multilenguaje ◄ ServerFiles ► Drakonia2 ◄ ServerFiles ► Elitarius2 ◄ ServerFiles ► DINOS ◄ ServerFiles ► 40K pagas - Gratis ◄ ServerFiles ► con WON listas para montar ◄ ServerFiles ► Rivality2 ◄ ServerFiles ► con 6ta Raza ◄ ServerFiles ► Oficial TR by Frozen ◄ ServerFiles ► Abizu2 ◄ ServerFiles ► Sanii V1.2 [REUPLOAD] ◄ ServerFiles ► Nirvana V2 ◄ ServerFiles ► Athraworld ◄ ServerFiles ► Play PVP Farm ◄ ServerFiles ► Metin2Family ◄ ServerFiles ► Terios.pl ◄ ServerFiles ► Metin2Gravity ◄ ServerFiles ► Titania2 ◄ ServerFiles ► Limpios by Undyne ◄ ServerFiles ► Heroes última versión ◄ ServerFiles ► Avalter.pl ◄ ServerFiles ► Lucian (ingles) ◄ ServerFiles ► Ocelot2606
    1 punto
  8. Yori

    Letras de metin2

    Wenas a todos! Les traigo un .psd con los efectos de las letras de metin, para que todo el mundo pueda darle ese efecto a lo que quiera xD. Pongo tmb un imagen explicando como guardar el estilo para que no sepan hacerlo. Adjunto el psd y la letra de metin2 para los que no la tengan. Saludos!! Tipografia Metin2 by Yori.rar
    1 punto
  9. DESCARGA: https://mega.nz/#!3RIE2YIL!0KgIZmztnH7ILc2ydkXde8MiqoSoakXhUmTPCFbn3Fk
    1 punto
  10. ACTUALIZADO 04/2021 PARTE 1 Explicación por mi Créditos a: Nilsonmax Programas Juegos MAX y BESTPRODUCTION Para Los nuevos.. es como montar un Windows en VirtualBox, solo que no hay pasos de instalación (es mas rápido si es que descargan uno ya hecho) de ahí es solo configurar 2 programas y abrir el cliente, editando un pequeño texto en Pack Semi Español, nivel max 120 versión 40k,32 bits (la que les enseñare), funciona 12/2020 probado por mi En la misma pagina pueden encontrar el VDI 64 bits y el cliente full español, pero es solo una versión de test antigua no actual DESCARGA 1- Cliente Bestprodution 40k y VDI freebsd 9.2 32 bits + file (que es el aqui enseño es la pagina de Nilsonmax) 2- Makepack si o si necesario y Phyton 2.4 y root corregido Click Aqui para después utilizar 3- Virtualbox (Freeware buscar de la pagina oficial) 4- Hamachi (Opcional, multijugador a distancia, buscar de la pagina oficial) 5- WinSCP (Freeware solo necesario en la Parte 2, para edición) 6- Notepad++/Bloc de notas (para editar los textos y archivos .py) 7- Navicat MySQL 5.5 o otro superior premium de preferencia (de youtube mediafire :v) 8- PortMap (Freeware para abrir puertos 80 y 3306) 9- EterNexus File Archiver(esto es para extraer y editar archivos, no es necesario en esta parte solo en la Parte 2, lo encontraran en el Makepack o pueden descargarlo en otro post) DATOS DE ACCESO: (Aclarar que utilice el BESTPRO 40k) ESPA VDI freebsd 12.1=>usuario: root clave: 0424nilmary ESPA Navicat freebsd 12.1=>usuario: remoto clave: R1.mo_To BESTPRO 40k VDI freebsd 9.2=>usuario: root clave: dev BESTPRO 40k Navicat freebsd 9.2=>usuario: root clave: /*bestproduction*/ clientes en ambos: usuario: nilsonmax clave:12345678 Video para entender de Brayan y NietzSche(El Cliente .es antiguo): Pueden ignorar gran parte del video de Nietzsche. solo ver el virtual box como monta el vdi que ip se pone navicat y como cambia el root, solo eso, ya si quieren hacerlo desde 0 configurando su BSD etc pueden verlo completo ** Otra opción *Cliente Español+Multi15+instalacion(Click)* Editar nombres de NPC, descripciones de los objetos, traducir armas, cambiar nombres de items, editar valor de ataque de las armas defensa de armadura (MySQL y Item proto) abajo Como modificar.txt TXT item mob.rar ANEXO *Index Armas, Objetos, Items*Click Otros files/en español y 40k una alternativa al español de arriba Server File Delaro (ESPAÑOL) Mas info en el post bien explicado y detallado, y en el esta el post original de Arribal2 Bestproduction v4 Final (dice ser la versión final) Pagina Oficial Para Profundizar mas y si quieren comprar su producción y la versión final (https://programas-juegos-max.blogspot.com) CREACION PARTE 2 MODIFIACION GUIA *Click COMO SER GM (Esta pagina también tiene muchísimos tutoriales) Crear Implementar Armaduras (KeKo) Editar bonos, brillo, valor de ataque, valor defensa en Navicat Tomen nota de estos programas(estan al inicio del post) y entren en CREACION PARTE 2 MODIFICACION Si quieren editar quest (para cambiar algunas cosas como lo que da el baúl de aprendizaje, misiones, bienvenidas) (WinSCP usr /home/game/share/locale/germany/quest) , drop de yang(MySQL), porcentaje y que objetos dropean mobs y metines (WinSCP), introducir nuevas armaduras escudos(cliente root, MySQL y WinSCP) ACLARACIONES Según describió puedes descargar otro cliente y igual seria compatible excepto por algunos que necesitas cambiar la MySQL ver pagina 4 de: Montaje MySQL Nilsonmax Esto ha sido solo lo básico, hay clientes mas avanzados con mas equipos y implementaciones Ahora ya depende de ustedes quizá mas adelante les muestre otras cosas, nos vemos
    1 punto
  11. ¡Hola a todos! Hoy les traigo un sencillo bot para comprar y abrir almejas. http://gyazo.com/fa909e262a99d63297d9ff2196143a2a.png Para usar el bot primero deben abrir la tienda que contiene la almeja. Luego, el bot les pedirá una posición, esta posición es el lugar en donde se encuentra la almeja en la tienda. Todos los objetos de la tienda son respresentadas por un numero. Se empieza contando desde 0 y desde arriba a la izquierda. En este caso : http://gyazo.com/8339c4a83d41b30ddd75c93e57cb8303.png La almeja se ubica en el lugar numero 6. Bueno, una vez colocada la posición, tendremos que poner el tiempo. El tiempo es la velocidad con la que el bot comprará y abrirá las almejas. Recomiendo dejarlo en 1.0, no es necesario poner numeros con comas, pueden poner directamente 1, pero si quieren puede poner numeros decimales, es decir, 0.9, o 0.8, etc. Espero que hayan entendido. Descarga: http://www.mediafire.com/download/522w2cdrwxxn7ng/Compra+y+abre+almejas+-+By+Francoiz%282%29.rar
    1 punto
  12. Que hay Zone? Espero todos estén bien, he decidido liberal algunos de mis trabajos de diseños, algunos ya los he publicado pero sin archivos PSDs, espero lo valoren y les gusten. Todos los diseños que publicare solo contienen codificación en HTML+CSS+JS, y sus respectivos PSDs Aquella persona que quiera la codificación PHP agregueme a Skype y llegamos a un acuerdo. Skype: Weredcase Discord: Wered#8875 Webdesign Series Gods of Games One. (HTML+CSS+PSD) Credits: *Dkarts *Saomt2 Team *Wered Descarga: https://mega.nz/#!xYdWnBqZ!dw8o8Ms9wZt6Woym_09ndpkT9ag6FBG7MeKpC2bJFHU Webdesign Series Gods of Games Two. (HTML+CSS+JS+PSD) Descarga: https://mega.nz/#!dR1WTZDS!WMhnIVOelX5RS3r9qc5FPANWevlVpi_Eu7fdnqAgHD4 Webdesign Series Gods of Games Tree. (HTML+CSS+JS+PSD) Descarga: https://mega.nz/#!4MlHmRRC!rL-2y1y9WCW2igvoN7nZp4EovinY5I4yZlC0l8MJmkA Estos diseños ya los comparti antes pero dejo la descarga nueva con su respectivo PSD. Forest2 Webdesign. (HTML+CSS+PSD) Descarga: https://mega.nz/#!JB8ilbDC!B5mRiOPdEQ4VTEdMeN21Qv4-8Uc9LN1H7jiLYvF1mYk Story of Metin2. (HTML+CSS+PSD) Descarga: https://mega.nz/#!sU0iwBQA!Lr5NlZARuRYDfA6fdxU3zHVrDK08LGQV_fIHEzpPbBc Saludos Wered.-
    1 punto
  13. https://drive.google.com/file/d/1aWkhzzn8F_Cl-h1VI5GEiOGbt2ZOUrS0/view Segunda opción de link https://drive.google.com/folderview?id=1AzSHEQRHMnVjNWVlFN0HPIwA3e6rlDFB Freebsd https://www.dosyaupload.com/82bh ID:root PW:turkmmo
    1 punto
  14. Sí, muy tonta la pregunta, pero no pasa nada, imagino que eres nuevo. Depende, si utilizas la versión con "Packets" tienes que modificar el source de tu servidor, sin los "packets" creo recordar ,que solo tienes que modificar los archivos que indica la descarga, la parte de python, descompilando los archivos de la carpeta locale.
    1 punto
  15. podrias probar con algo mas sencillo anda a la ruta del /server/ y haslo todo junto con un gmake all
    1 punto
  16. NazoX

    Error al compilar la base de datos

    Te está diciendo que es incompatible con esas libs y el clang no funciona, necesitas otro freebsd más actualizado con sus libs correspondiente, tienes q saber si compila con 64 o 32, en freebsd 11 o superior, que esté listo para usar clang o gcc, etc. Aunque si te compila el game, es raro.
    1 punto
  17. buenas comunidad e visto que la mayoria cuando inicia en este mundo del metin2 se les dificulta preparar freesbsd o hacer copias de vuestros files esta guia es bastante facil y entendible solo espero su agradecimiento ya que esta guia es mas facil como las que estan posteadas aqui que no entienden. suerte chicos como preparar freesbsd abren putty y ejecutan los siguientes comandos: en el paso 5 pueden modificar 11.4-RELEASE por la version de su freesbsd que tiene ejemplo si es version 12.2 solo es colocar 12.2-REALEASE Y LISTO Y ASI SUCESIVAMENTE DEPENDE EL FREESBSD QUE TENGAIS como instarl archivos .tgz o .gz en vps o freesbsd Abren putty y escriben estos comando si desean instalar sus files en el vps o maquina virtual : ahora damos permiso a la maquina despues de aver instalado los archivoz .tgz o .gz en nuestro vps escribimos estos comandos:
    1 punto
  18. https://www.mediafire.com/file/q6nbjv0qbzjoawl/libcryptopp.soFreeBSD11.2_32_bit.tar.gz/file Prueba con esa lib...
    1 punto
  19. Me los vendio el Server Zoira2 el dueño Voy a publicar los files por si la gente le interesa bajarlos y arreglarlos tiene muchos errores :V yo le resolvi la mayoria de errores menos el ox evento no da premio de entrada y no descalifica y en el source tiene un error que no sale los item de bonus de agregar item y cambiar https://www.facebook.com/Zoira2MMORPG
    1 punto
  20. Presentación de los ServerFiles en el siquiente enlace de abajo. CLIC AQUI PARA VER LA PRESENTACIÓN Recomendaciones: FreeBSD 11.3 MariaDB 10.3 GCC8 Descargas: ARCHIVOS DEL SERVERFILES LIBRERIAS QUE VAN EN EL CLIENTE Créditos: Luigina
    1 punto
  21. Sirven para todos los Reinos Jinno,Shinsso,Chunjo Link de Fotos de las City https://imgur.com/a/hrcj8Sz ---- map1 https://imgur.com/a/79ilTNy------ map2 Link de Descarga https://mega.nz/#!ZRoTGQRT!ydCjDJlpz4G66gsQvsjwwvWF3r6H89imYuqvCGTLMps
    1 punto
  22. TTV_RANDARON

    [SERVERFILES] Osmanli2

    python para compilar el cliente?
    1 punto
  23. Hola foreros y foreras hoy les traigo algo que a simple vista me impacto y a la vez gusto mucho,desde elitepvpers les traigo este login para sus clientes que lo disfruten. ANTES QUE NADA HACER COPIA DE SEGURIDAD DE LOS ARCHIVOS QUE VIENEN EN EL COMPRIMIDO: Bien aqui os dejo un video y una imagen: Video: http://www.youtube.com/watch?v=IyT6XiVCe6M Imagen: http://i.epvpimg.com/L3cab.jpg Instalacion: primero de nada debemos decompilar el locale.epk locale.eix,seguidamente irnos a la carpeta ui (dentro del locale decompilado) y sustituir los archivos por los que vienen en el archivo comprimido.(/locale/ui) Decompilamos el root.epk y root.eix,sustituimos o copiamos el/los archivos "intrologin.py","serverinfo.py","intrologin.txt" y "ui.txt" Compilamos el locale y el root y añadimos al cliente. P.D: Acuerdate en el archivo serverinfo.py de poner la ip y puertos que uses para tu servidor. Descarga: http://www.mediafire.com/?gaabqqhmnzcspws Creditos: AG.Simpsey Fuente: Elitepvpers
    1 punto
  24. Hello today i'll present a new interface for you screens : the package also contains (choose / create character , choose empire) download - (Python script + PSD - 89.39MB) : http://depositfiles.com/files/w323220uc Virustotal : credits : mpcforum
    1 punto
  25. angeluchiha18

    [ARMOR]Angel's!.

    Acá tienen estas armaduras, están solo para Hombres! Link: https://mega.nz/#!O9hizKDY!XNoVdzJARCiY9Src6RZ9x3D1_ZwsIBD7NugaB_jsyuE Imagen : https://prnt.sc/i449c5 Creditos: FreakG. Pd:No se si estarán posteadas pero weno :'v.
    1 punto
  26. Hola muy buenas Tardes Aqui les Comparto esta Interfaz de cliente de login y select y Crear pj Espero que les Gustes no Se olviden Dar las Gracias y el que no Quiera bajarlo pues no lo baje no insulten :V Aqui les dejo unas fotos en estos links https://ibb.co/Gn2fvz8 https://ibb.co/thJJkWD https://ibb.co/hdXrnc9 Link mega https://mega.nz/file/MEwxxKgY#oCjUDMhJxhXir8dwXgxHcOcfa3ggFcBkEBsYys7PqHQ
    1 punto
  27. ########################################################################################################## Hola buenas tardes , Hoy dia 21/08/2018 a las 15:55 ########################################################################################################## vengo a compartir una aplicación que crear lineas automáticamente para la implementacion de Items en metin2 , el programa esta creado para facilitar las creaciones de lineas para implementar algo en tu servidor. Lenguaje de programación: Java Compatible con game : 40K Idioma : Ingles versión del programa : 1.1 Autor : DarkBozZ Suscripción : No olvides dar "Me Gusta" al post y comentar que tal te ha parecido el programa Descargas : http://www.mediafire.com/file/9oibb8e4ya9v2bl/Item_Creator40k_V.1.1.zip/file ##########################################################################################################
    1 punto
  28. Buenas como muchos sabréis hay un post de esta intro login: Ami me gusto y decidí usarla para mi Versión2 de mi servidor. Así que la traduje 100% al Español y como a muchos le gustaron y pocos saben hacerla funcionar o traducir. #A lo de traducir me refiero que en el post Original hubo mucha polémica de como se traducía o montaba la intro login. "Eso paso en Alemania." Bueno yo os daré los archivos necesarios y también un mini tuto de como hacerla funcionar. Bien lo primero que haremos será lo siguiente: Descompilar root y ir al archivo: "intrologin". Y lo remplazaremos por lo siguiente: import dbgimport appimport netimport uiimport imeimport sndimport wndMgrimport musicInfoimport serverInfoimport systemSettingimport ServerStateCheckerimport localeimport constInfoimport uiCommonimport timeimport ServerCommandParserimport imeimport uiScriptLocaleimport chatimport sysimport md5import backgroundimport osimport stringimport constinfoimport linecache########Config########DEINEIP = ""CH1PORT = CH2PORT = CH3PORT = CH4PORT = AUTHPORT = SERVERNAME = "Aeternum2"LOGINDATENSPEICHERN = 0 #0 = aus / 1 = anFORUMLINK = ""YOUTUBELINK = ""FACEBOOKLINK = ""#########################Ab hier nichts mehr ändern!######RUNUP_MATRIX_AUTH = FALSENEWCIBN_PASSPOD_AUTH = FALSELOGIN_DELAY_SEC = 0.0SKIP_LOGIN_PHASE = FALSESKIP_LOGIN_PHASE_SUPPORT_CHANNEL = FALSEFULL_BACK_IMAGE = TRUEPASSPOD_MSG_DICT = {}VIRTUAL_KEYBOARD_NUM_KEYS = 46VIRTUAL_KEYBOARD_RAND_KEY = FALSECH1STATE = 0CH2STATE = 0CH3STATE = 0CH4STATE = 0def Suffle(src): if VIRTUAL_KEYBOARD_RAND_KEY: items = [item for item in src] itemCount = len(items) for oldPos in xrange(itemCount): newPos = app.GetRandom(0, itemCount-1) items[newPos], items[oldPos] = items[oldPos], items[newPos] return "".join(items) else: return srcif locale.IsNEWCIBN() or locale.IsCIBN10(): LOGIN_DELAY_SEC = 20.0 FULL_BACK_IMAGE = TRUE NEWCIBN_PASSPOD_AUTH = TRUE PASSPOD_MSG_DICT = { "PASERR1" : locale.LOGIN_FAILURE_PASERR1, "PASERR2" : locale.LOGIN_FAILURE_PASERR2, "PASERR3" : locale.LOGIN_FAILURE_PASERR3, "PASERR4" : locale.LOGIN_FAILURE_PASERR4, "PASERR5" : locale.LOGIN_FAILURE_PASERR5, }elif locale.IsYMIR() or locale.IsCHEONMA(): FULL_BACK_IMAGE = TRUEelif locale.IsHONGKONG(): FULL_BACK_IMAGE = TRUE RUNUP_MATRIX_AUTH = TRUE PASSPOD_MSG_DICT = { "NOTELE" : locale.LOGIN_FAILURE_NOTELEBLOCK, }elif locale.IsJAPAN(): FULL_BACK_IMAGE = TRUEdef IsFullBackImage(): global FULL_BACK_IMAGE return FULL_BACK_IMAGEdef IsLoginDelay(): global LOGIN_DELAY_SEC if LOGIN_DELAY_SEC > 0.0: return TRUE else: return FALSEdef IsRunupMatrixAuth(): global RUNUP_MATRIX_AUTH return RUNUP_MATRIX_AUTH def IsNEWCIBNPassPodAuth(): global NEWCIBN_PASSPOD_AUTH return NEWCIBN_PASSPOD_AUTHdef GetLoginDelay(): global LOGIN_DELAY_SEC return LOGIN_DELAY_SEC app.SetGuildMarkPath("test")class ConnectingDialog(ui.ScriptWindow): def __init__(self): ui.ScriptWindow.__init__(self) self.__LoadDialog() self.eventTimeOver = lambda *arg: None self.eventExit = lambda *arg: None def __del__(self): ui.ScriptWindow.__del__(self) def __LoadDialog(self): try: PythonScriptLoader = ui.PythonScriptLoader() PythonScriptLoader.LoadScriptFile(self, "UIScript/ConnectingDialog.py") self.board = self.GetChild("board") self.message = self.GetChild("message") self.countdownMessage = self.GetChild("countdown_message") except: import exception exception.Abort("ConnectingDialog.LoadDialog.BindObject") def Open(self, waitTime): curTime = time.clock() self.endTime = curTime + waitTime self.Lock() self.SetCenterPosition() self.SetTop() self.Show() def Close(self): self.Unlock() self.Hide() def Destroy(self): self.Hide() self.ClearDictionary() def SetText(self, text): self.message.SetText(text) def SetCountDownMessage(self, waitTime): self.countdownMessage.SetText("%.0f%s" % (waitTime, locale.SECOND)) def SAFE_SetTimeOverEvent(self, event): self.eventTimeOver = ui.__mem_func__(event) def SAFE_SetExitEvent(self, event): self.eventExit = ui.__mem_func__(event) def OnUpdate(self, state): lastTime = max(0, self.endTime - time.clock()) if 0 == lastTime: self.Close() self.eventTimeOver() else: self.SetCountDownMessage(self.endTime - time.clock()) def OnPressExitKey(self): #self.eventExit() return TRUEclass LoginWindow(ui.ScriptWindow): IS_TEST = net.IsTest() def __init__(self, stream): print "NEW LOGIN WINDOW ----------------------------------------------------------------------------" ui.ScriptWindow.__init__(self) net.SetPhaseWindow(net.PHASE_WINDOW_LOGIN, self) net.SetAccountConnectorHandler(self) self.matrixInputChanceCount = 0 self.lastLoginTime = 0 self.inputDialog = None self.connectingDialog = None self.stream=stream self.isNowCountDown=FALSE self.isStartError=FALSE self.xServerBoard = 0 self.yServerBoard = 0 self.loadingImage = None self.virtualKeyboard = None self.virtualKeyboardMode = "ALPHABET" self.virtualKeyboardIsUpper = FALSE def __del__(self): net.ClearPhaseWindow(net.PHASE_WINDOW_LOGIN, self) net.SetAccountConnectorHandler(0) ui.ScriptWindow.__del__(self) print "---------------------------------------------------------------------------- DELETE LOGIN WINDOW" def Open(self): ServerStateChecker.Create(self) print "LOGIN WINDOW OPEN ----------------------------------------------------------------------------" self.loginFailureMsgDict={ #"DEFAULT" : locale.LOGIN_FAILURE_UNKNOWN, "ALREADY" : locale.LOGIN_FAILURE_ALREAY, "NOID" : locale.LOGIN_FAILURE_NOT_EXIST_ID, "WRONGPWD" : locale.LOGIN_FAILURE_WRONG_PASSWORD, "FULL" : locale.LOGIN_FAILURE_TOO_MANY_USER, "SHUTDOWN" : locale.LOGIN_FAILURE_SHUTDOWN, "REPAIR" : locale.LOGIN_FAILURE_REPAIR_ID, "BLOCK" : locale.LOGIN_FAILURE_BLOCK_ID, "WRONGMAT" : locale.LOGIN_FAILURE_WRONG_MATRIX_CARD_NUMBER, "QUIT" : locale.LOGIN_FAILURE_WRONG_MATRIX_CARD_NUMBER_TRIPLE, "BESAMEKEY" : locale.LOGIN_FAILURE_BE_SAME_KEY, "NOTAVAIL" : locale.LOGIN_FAILURE_NOT_AVAIL, "NOBILL" : locale.LOGIN_FAILURE_NOBILL, "BLKLOGIN" : locale.LOGIN_FAILURE_BLOCK_LOGIN, "WEBBLK" : locale.LOGIN_FAILURE_WEB_BLOCK, "HACK" : "Du wurdest wegen hacken gesperrt.", "BOT" : "Du wurdest wegen benutzung von Bots gesperrt.", "SCAM" : "Du wurdest wegen Betrug gesperrt.", "INSULT" : "Du wurdest wegen Beleidigung gesperrt.", "FAKE" : "Du wurdest aufgrund deiner Namensgebung gesperrt.", "NAME" : "Du wurdest aufgrund deiner Namensgebung gesperrt.", "BUG" : "Du wurdest wegen Bugusing gesperrt.", "DK" : "Du wurdest wegen Dauerkill gesperrt.", "OTHER" : "Du wurdest von der Serverleitung gesperrt.", } self.loginFailureFuncDict = { "WRONGPWD" : self.__DisconnectAndInputPassword, "WRONGMAT" : self.__DisconnectAndInputMatrix, "QUIT" : app.Exit, } self.SetSize(wndMgr.GetScreenWidth(), wndMgr.GetScreenHeight()) self.SetWindowName("LoginWindow") if not self.__LoadScript(uiScriptLocale.LOCALE_UISCRIPT_PATH + "LoginWindow.py"): dbg.TraceError("LoginWindow.Open - __LoadScript Error") return self.__LoadLoginInfo("loginInfo.py") if app.loggined: self.loginFailureFuncDict = { "WRONGPWD" : app.Exit, "WRONGMAT" : app.Exit, "QUIT" : app.Exit, } if musicInfo.loginMusic != "": snd.SetMusicVolume(systemSetting.GetMusicVolume()) snd.FadeInMusic("BGM/"+musicInfo.loginMusic) snd.SetSoundVolume(systemSetting.GetSoundVolume()) # pevent key "[" "]" ime.AddExceptKey(91) ime.AddExceptKey(93) self.Show() global SKIP_LOGIN_PHASE if SKIP_LOGIN_PHASE: if self.isStartError: self.connectBoard.Hide() self.loginBoard.Hide() self.serverBoard.Hide() self.PopupNotifyMessage(locale.LOGIN_CONNECT_FAILURE, self.__ExitGame) return if self.loginInfo: self.serverBoard.Hide() else: self.__RefreshServerList() self.__OpenServerBoard() else: connectingIP = self.stream.GetConnectAddr() if connectingIP: self.__OpenLoginBoard() if IsFullBackImage(): self.GetChild("demonking").Show() else: self.__RefreshServerList() self.__OpenServerBoard() app.ShowCursor() def Close(self): if self.connectingDialog: self.connectingDialog.Close() self.connectingDialog = None ServerStateChecker.Destroy(self) print "---------------------------------------------------------------------------- CLOSE LOGIN WINDOW " # # selectMusicÀÌ ¾øÀ¸¸é BGMÀÌ ²÷±â¹Ç·Î µÎ°³ ´Ù üũÇÑ´Ù. # if musicInfo.loginMusic != "" and musicInfo.selectMusic != "": snd.FadeOutMusic("BGM/"+musicInfo.loginMusic) ## NOTE : idEditLine¿Í pwdEditLineÀº À̺¥Æ®°¡ ¼­·Î ¿¬°á µÇ¾îÀ־ ## Event¸¦ °­Á¦·Î ÃʱâÈ­ ÇØÁÖ¾î¾ß¸¸ ÇÕ´Ï´Ù - [levites] self.idEditLine.SetTabEvent(0) self.idEditLine.SetReturnEvent(0) self.pwdEditLine.SetReturnEvent(0) self.pwdEditLine.SetTabEvent(0) self.connectBoard = None self.loginBoard = None self.idEditLine = None self.pwdEditLine = None self.inputDialog = None self.connectingDialog = None self.loadingImage = None self.serverBoard = None self.serverList = None self.channelList = None # RUNUP_MATRIX_AUTH self.matrixQuizBoard = None self.matrixAnswerInput = None self.matrixAnswerOK = None self.matrixAnswerCancel = None # RUNUP_MATRIX_AUTH_END # NEWCIBN_PASSPOD_AUTH self.passpodBoard = None self.passpodAnswerInput = None self.passpodAnswerOK = None self.passpodAnswerCancel = None # NEWCIBN_PASSPOD_AUTH_END self.VIRTUAL_KEY_ALPHABET_LOWERS = None self.VIRTUAL_KEY_ALPHABET_UPPERS = None self.VIRTUAL_KEY_SYMBOLS = None self.VIRTUAL_KEY_NUMBERS = None # VIRTUAL_KEYBOARD_BUG_FIX if self.virtualKeyboard: for keyIndex in xrange(0, VIRTUAL_KEYBOARD_NUM_KEYS+1): key = self.GetChild2("key_%d" % keyIndex) if key: key.SetEvent(None) self.virtualKeyboard = None self.KillFocus() self.Hide() self.stream.popupWindow.Close() self.loginFailureFuncDict=None ime.ClearExceptKey() app.HideCursor() def __SaveChannelInfo(self): try: file=open("channel.inf", "w") file.write("%d %d %d" % (self.__GetServerID(), self.__GetChannelID(), self.__GetRegionID())) except: print "LoginWindow.__SaveChannelInfo - SaveError" def __LoadChannelInfo(self): try: file=open("channel.inf") lines=file.readlines() if len(lines)>0: tokens=lines[0].split() selServerID=int(tokens[0]) selChannelID=int(tokens[1]) if len(tokens) == 3: regionID = int(tokens[2]) return regionID, selServerID, selChannelID except: print "LoginWindow.__LoadChannelInfo - OpenError" return -1, -1, -1 def __ExitGame(self): app.Exit() def SetIDEditLineFocus(self): if self.idEditLine != None: self.idEditLine.SetFocus() def SetPasswordEditLineFocus(self): if locale.IsEUROPE(): if self.idEditLine != None: #0000862: [M2EU] ·Î±×ÀÎâ Æ˾÷ ¿¡·¯: Á¾·á½Ã ¸ÕÀú None ¼³Á¤µÊ self.idEditLine.SetText("") self.idEditLine.SetFocus() #0000685: [M2EU] ¾ÆÀ̵ð/ºñ¹Ð¹øÈ£ À¯Ãß °¡´É ¹ö±× ¼öÁ¤: ¹«Á¶°Ç ¾ÆÀ̵ð·Î Æ÷Ä¿½º°¡ °¡°Ô ¸¸µç´Ù if self.pwdEditLine != None: #0000862: [M2EU] ·Î±×ÀÎâ Æ˾÷ ¿¡·¯: Á¾·á½Ã ¸ÕÀú None ¼³Á¤µÊ self.pwdEditLine.SetText("") else: if self.pwdEditLine != None: self.pwdEditLine.SetFocus() def OnEndCountDown(self): self.isNowCountDown = FALSE self.OnConnectFailure() def OnConnectFailure(self): if self.isNowCountDown: return snd.PlaySound("sound/ui/loginfail.wav") if self.connectingDialog: self.connectingDialog.Close() self.connectingDialog = None if app.loggined: self.PopupNotifyMessage(locale.LOGIN_CONNECT_FAILURE, self.__ExitGame) else: self.PopupNotifyMessage(locale.LOGIN_CONNECT_FAILURE, self.SetPasswordEditLineFocus) def OnHandShake(self): if not IsLoginDelay(): snd.PlaySound("sound/ui/loginok.wav") self.PopupDisplayMessage(locale.LOGIN_CONNECT_SUCCESS) def OnLoginStart(self): if not IsLoginDelay(): self.PopupDisplayMessage(locale.LOGIN_PROCESSING) def OnLoginFailure(self, error): if self.connectingDialog: self.connectingDialog.Close() self.connectingDialog = None try: loginFailureMsg = self.loginFailureMsgDict[error] except KeyError: if PASSPOD_MSG_DICT: try: loginFailureMsg = PASSPOD_MSG_DICT[error] except KeyError: loginFailureMsg = locale.LOGIN_FAILURE_UNKNOWN + error else: loginFailureMsg = locale.LOGIN_FAILURE_UNKNOWN + error #0000685: [M2EU] ¾ÆÀ̵ð/ºñ¹Ð¹øÈ£ À¯Ãß °¡´É ¹ö±× ¼öÁ¤: ¹«Á¶°Ç Æнº¿öµå·Î Æ÷Ä¿½º°¡ °¡°Ô ¸¸µç´Ù loginFailureFunc=self.loginFailureFuncDict.get(error, self.SetPasswordEditLineFocus) if app.loggined: self.PopupNotifyMessage(loginFailureMsg, self.__ExitGame) else: self.PopupNotifyMessage(loginFailureMsg, loginFailureFunc) snd.PlaySound("sound/ui/loginfail.wav") def __DisconnectAndInputID(self): if self.connectingDialog: self.connectingDialog.Close() self.connectingDialog = None self.SetIDEditLineFocus() net.Disconnect() def __DisconnectAndInputPassword(self): if self.connectingDialog: self.connectingDialog.Close() self.connectingDialog = None self.SetPasswordEditLineFocus() net.Disconnect() def __DisconnectAndInputMatrix(self): if self.connectingDialog: self.connectingDialog.Close() self.connectingDialog = None self.stream.popupWindow.Close() self.matrixInputChanceCount -= 1 if self.matrixInputChanceCount <= 0: self.__OnCloseInputDialog() elif self.inputDialog: self.inputDialog.Show() def __LoadScript(self, fileName): try: pyScrLoader = ui.PythonScriptLoader() pyScrLoader.LoadScriptFile(self, fileName) except: import exception exception.Abort("LoginWindow.__LoadScript.LoadObject") try: GetObject=self.GetChild self.serverBoard = GetObject("ServerBoard") self.serverList = GetObject("ServerList") self.channelList = GetObject("ChannelList") self.connectBoard = GetObject("ConnectBoard") self.loginBoard = GetObject("LoginBoard") self.idEditLine = GetObject("ID_EditLine") self.pwdEditLine = GetObject("Password_EditLine") self.ch1_offline_demon = GetObject("Channel1_offline_demon") self.ch2_offline_demon = GetObject("Channel2_offline_demon") self.ch3_offline_demon = GetObject("Channel3_offline_demon") self.ch4_offline_demon = GetObject("Channel4_offline_demon") self.ch1_online_demon = GetObject("Channel1_online_demon") self.ch2_online_demon = GetObject("Channel2_online_demon") self.ch3_online_demon = GetObject("Channel3_online_demon") self.ch4_online_demon = GetObject("Channel4_online_demon") self.ch1_online_markiert_demon = GetObject("Channel1_online_markiert_demon") self.ch2_online_markiert_demon = GetObject("Channel2_online_markiert_demon") self.ch3_online_markiert_demon = GetObject("Channel3_online_markiert_demon") self.ch4_online_markiert_demon = GetObject("Channel4_online_markiert_demon") self.ch1_offline_markiert_demon = GetObject("Channel1_offline_markiert_demon") self.ch2_offline_markiert_demon = GetObject("Channel2_offline_markiert_demon") self.ch3_offline_markiert_demon = GetObject("Channel3_offline_markiert_demon") self.ch4_offline_markiert_demon = GetObject("Channel4_offline_markiert_demon") self.loginButton = GetObject("LoginButton") self.forum = GetObject("forum") self.youtube = GetObject("youtube") self.facebook = GetObject("facebook") self.oben_links = GetObject("oben_links") self.idEditLine.SetFontColor(71, 96, 144) self.pwdEditLine.SetFontColor(71, 96, 144) ## ACCMANAGER self.endles = GetObject("endles") # RUNUP_MATRIX_AUTH if IsRunupMatrixAuth(): self.matrixQuizBoard = GetObject("RunupMatrixQuizBoard") self.matrixAnswerInput = GetObject("RunupMatrixAnswerInput") self.matrixAnswerOK = GetObject("RunupMatrixAnswerOK") self.matrixAnswerCancel = GetObject("RunupMatrixAnswerCancel") # RUNUP_MATRIX_AUTH_END # NEWCIBN_PASSPOD_AUTH if IsNEWCIBNPassPodAuth(): self.passpodBoard = GetObject("NEWCIBN_PASSPOD_BOARD") self.passpodAnswerInput = GetObject("NEWCIBN_PASSPOD_INPUT") self.passpodAnswerOK = GetObject("NEWCIBN_PASSPOD_OK") self.passpodAnswerCancel= GetObject("NEWCIBN_PASSPOD_CANCEL") # NEWCIBN_PASSPOD_AUTH_END self.virtualKeyboard = self.GetChild2("VirtualKeyboard") if self.virtualKeyboard: self.VIRTUAL_KEY_ALPHABET_UPPERS = Suffle(locale.VIRTUAL_KEY_ALPHABET_UPPERS) self.VIRTUAL_KEY_ALPHABET_LOWERS = "".join([locale.VIRTUAL_KEY_ALPHABET_LOWERS[locale.VIRTUAL_KEY_ALPHABET_UPPERS.index(e)] for e in self.VIRTUAL_KEY_ALPHABET_UPPERS]) self.VIRTUAL_KEY_SYMBOLS = Suffle(locale.VIRTUAL_KEY_SYMBOLS) self.VIRTUAL_KEY_NUMBERS = Suffle(locale.VIRTUAL_KEY_NUMBERS) self.__VirtualKeyboard_SetAlphabetMode() except: import exception exception.Abort("LoginWindow.__LoadScript.BindObject") self.serverBoard.OnKeyUp = ui.__mem_func__(self.__ServerBoard_OnKeyUp) self.xServerBoard, self.yServerBoard = self.serverBoard.GetLocalPosition() self.loginButton.SetEvent(ui.__mem_func__(self.__OnClickLoginButton)) self.forum.SetEvent(ui.__mem_func__(self.__forum)) self.youtube.SetEvent(ui.__mem_func__(self.__youtube)) self.facebook.SetEvent(ui.__mem_func__(self.__facebook)) ## ACCMANAGER self.endles.SetEvent(self.__OnClickExitButton) ## END ACCMANAGER self.serverList.SetEvent(ui.__mem_func__(self.__OnSelectServer)) self.idEditLine.SetReturnEvent(ui.__mem_func__(self.pwdEditLine.SetFocus)) self.idEditLine.SetTabEvent(ui.__mem_func__(self.pwdEditLine.SetFocus)) self.pwdEditLine.SetReturnEvent(ui.__mem_func__(self.__OnClickLoginButton)) self.pwdEditLine.SetTabEvent(ui.__mem_func__(self.idEditLine.SetFocus)) # RUNUP_MATRIX_AUTH if IsRunupMatrixAuth(): self.matrixAnswerOK.SAFE_SetEvent(self.__OnClickMatrixAnswerOK) self.matrixAnswerCancel.SAFE_SetEvent(self.__OnClickMatrixAnswerCancel) self.matrixAnswerInput.SAFE_SetReturnEvent(self.__OnClickMatrixAnswerOK) # RUNUP_MATRIX_AUTH_END # NEWCIBN_PASSPOD_AUTH if IsNEWCIBNPassPodAuth(): self.passpodAnswerOK.SAFE_SetEvent(self.__OnClickNEWCIBNPasspodAnswerOK) self.passpodAnswerCancel.SAFE_SetEvent(self.__OnClickNEWCIBNPasspodAnswerCancel) self.passpodAnswerInput.SAFE_SetReturnEvent(self.__OnClickNEWCIBNPasspodAnswerOK) # NEWCIBN_PASSPOD_AUTH_END if IsFullBackImage(): self.GetChild("demonking").Show() return 1 def __VirtualKeyboard_SetKeys(self, keyCodes): uiDefFontBackup = locale.UI_DEF_FONT locale.UI_DEF_FONT = locale.UI_DEF_FONT_LARGE keyIndex = 1 for keyCode in keyCodes: key = self.GetChild2("key_%d" % keyIndex) if key: key.SetEvent(lambda x=keyCode: self.__VirtualKeyboard_PressKey(x)) key.SetText(keyCode) key.ButtonText.SetFontColor(1, 1, 1) keyIndex += 1 for keyIndex in xrange(keyIndex, VIRTUAL_KEYBOARD_NUM_KEYS+1): key = self.GetChild2("key_%d" % keyIndex) if key: key.SetEvent(lambda x=' ': self.__VirtualKeyboard_PressKey(x)) key.SetText(' ') locale.UI_DEF_FONT = uiDefFontBackup def __VirtualKeyboard_PressKey(self, code): ime.PasteString(code) #if self.virtualKeyboardMode == "ALPHABET" and self.virtualKeyboardIsUpper: # self.__VirtualKeyboard_SetLowerMode() def __VirtualKeyboard_PressBackspace(self): ime.PasteBackspace() def __VirtualKeyboard_PressReturn(self): ime.PasteReturn() def __VirtualKeyboard_SetUpperMode(self): self.virtualKeyboardIsUpper = TRUE if self.virtualKeyboardMode == "ALPHABET": self.__VirtualKeyboard_SetKeys(self.VIRTUAL_KEY_ALPHABET_UPPERS) elif self.virtualKeyboardMode == "NUMBER": self.__VirtualKeyboard_SetKeys(self.VIRTUAL_KEY_SYMBOLS) else: self.__VirtualKeyboard_SetKeys(self.VIRTUAL_KEY_NUMBERS) def __VirtualKeyboard_SetLowerMode(self): self.virtualKeyboardIsUpper = FALSE if self.virtualKeyboardMode == "ALPHABET": self.__VirtualKeyboard_SetKeys(self.VIRTUAL_KEY_ALPHABET_LOWERS) elif self.virtualKeyboardMode == "NUMBER": self.__VirtualKeyboard_SetKeys(self.VIRTUAL_KEY_NUMBERS) else: self.__VirtualKeyboard_SetKeys(self.VIRTUAL_KEY_SYMBOLS) def __VirtualKeyboard_SetAlphabetMode(self): self.virtualKeyboardIsUpper = FALSE self.virtualKeyboardMode = "ALPHABET" self.__VirtualKeyboard_SetKeys(self.VIRTUAL_KEY_ALPHABET_LOWERS) def __VirtualKeyboard_SetNumberMode(self): self.virtualKeyboardIsUpper = FALSE self.virtualKeyboardMode = "NUMBER" self.__VirtualKeyboard_SetKeys(self.VIRTUAL_KEY_NUMBERS) def __VirtualKeyboard_SetSymbolMode(self): self.virtualKeyboardIsUpper = FALSE self.virtualKeyboardMode = "SYMBOL" self.__VirtualKeyboard_SetKeys(self.VIRTUAL_KEY_SYMBOLS) def Connect(self, id, pwd): if constInfo.SEQUENCE_PACKET_ENABLE: net.SetPacketSequenceMode() if IsLoginDelay(): loginDelay = GetLoginDelay() self.connectingDialog = ConnectingDialog() self.connectingDialog.Open(loginDelay) self.connectingDialog.SAFE_SetTimeOverEvent(self.OnEndCountDown) self.connectingDialog.SAFE_SetExitEvent(self.OnPressExitKey) self.isNowCountDown = TRUE else: self.stream.popupWindow.Close() self.stream.popupWindow.Open(locale.LOGIN_CONNETING, self.SetPasswordEditLineFocus, locale.UI_CANCEL) self.stream.SetLoginInfo(id, pwd) self.stream.Connect() def __OnClickExitButton(self): self.stream.SetPhaseWindow(0) def __SetServerInfo(self, name): net.SetServerInfo(name.strip()) self.serverInfo.SetText(name) def __LoadLoginInfo(self, loginInfoFileName): try: loginInfo={} execfile(loginInfoFileName, loginInfo) except IOError: print( "ÀÚµ¿ ·Î±×ÀÎÀ» ÇϽ÷Á¸é" + loginInfoFileName + "ÆÄÀÏÀ» ÀÛ¼ºÇØÁÖ¼¼¿än" "n" "³»¿ë:n" "================================================================n" "addr=ÁÖ¼Òn" "port=Æ÷Æ®n" "id=¾ÆÀ̵ðn" "pwd=ºñ¹Ð¹øÈ£n" "slot=ij¸¯ÅÍ ¼±Åà À妽º (¾ø°Å³ª -1À̸é ÀÚµ¿ ¼±Åà ¾ÈÇÔ)n" "autoLogin=ÀÚµ¿ Á¢¼Ó ¿©ºÎn" "autoSelect=ÀÚµ¿ Á¢¼Ó ¿©ºÎn" "locale=(ymir) LC_Ymir ÀÏ°æ¿ì ymir·Î ÀÛµ¿. ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é korea·Î ÀÛµ¿n" ); id=loginInfo.get("id", "") pwd=loginInfo.get("pwd", "") if self.IS_TEST: try: addr=loginInfo["addr"] port=loginInfo["port"] account_addr=addr account_port=port net.SetMarkServer(addr, port) self.__SetServerInfo(locale.CHANNEL_TEST_SERVER_ADDR % (addr, port)) except: try: addr=serverInfo.TESTADDR["ip"] port=serverInfo.TESTADDR["tcp_port"] net.SetMarkServer(addr, port) self.__SetServerInfo(locale.CHANNEL_TEST_SERVER) except: import exception exception.Abort("LoginWindow.__LoadLoginInfo - Å×½ºÆ®¼­¹ö ÁÖ¼Ò°¡ ¾ø½À´Ï´Ù") else: addr=loginInfo.get("addr", "") port=loginInfo.get("port", 0) account_addr=loginInfo.get("account_addr", addr) account_port=loginInfo.get("account_port", port) locale = loginInfo.get("locale", "") if addr and port: net.SetMarkServer(addr, port) if locale == "ymir" : net.SetServerInfo("õ¸¶ ¼­¹ö") self.serverInfo.SetText("Y:"+addr+":"+str(port)) else: net.SetServerInfo(addr+":"+str(port)) self.serverInfo.SetText("K:"+addr+":"+str(port)) slot=loginInfo.get("slot", 0) isAutoLogin=loginInfo.get("auto", 0) isAutoLogin=loginInfo.get("autoLogin", 0) isAutoSelect=loginInfo.get("autoSelect", 0) self.stream.SetCharacterSlot(slot) self.stream.SetConnectInfo(addr, port, account_addr, account_port) self.stream.isAutoLogin=isAutoLogin self.stream.isAutoSelect=isAutoSelect self.id = None self.pwd = None self.loginnedServer = None self.loginnedChannel = None app.loggined = FALSE self.loginInfo = loginInfo if self.id and self.pwd: app.loggined = TRUE if isAutoLogin: self.Connect(id, pwd) print "==================================================================================" print "ÀÚµ¿ ·Î±×ÀÎ: %s - %s:%d %s" % (loginInfoFileName, addr, port, id) print "==================================================================================" def PopupDisplayMessage(self, msg): self.stream.popupWindow.Close() self.stream.popupWindow.Open(msg) def PopupNotifyMessage(self, msg, func=0): if not func: func=self.EmptyFunc self.stream.popupWindow.Close() self.stream.popupWindow.Open(msg, func, locale.UI_OK) # RUNUP_MATRIX_AUTH def BINARY_OnRunupMatrixQuiz(self, quiz): if not IsRunupMatrixAuth(): return id = self.GetChild("RunupMatrixID") id.SetText(self.idEditLine.GetText()) code = self.GetChild("RunupMatrixCode") code.SetText("".join(["[%c,%c]" % (quiz[i], quiz[i+1]) for i in xrange(0, len(quiz), 2)])) self.stream.popupWindow.Close() self.serverBoard.Hide() self.connectBoard.Hide() self.loginBoard.Hide() self.matrixQuizBoard.Show() self.matrixAnswerInput.SetFocus() def __OnClickMatrixAnswerOK(self): answer = self.matrixAnswerInput.GetText() print "matrix_quiz.ok" net.SendRunupMatrixCardPacket(answer) self.matrixQuizBoard.Hide() self.stream.popupWindow.Close() self.stream.popupWindow.Open("WAITING FOR MATRIX AUTHENTICATION", self.__OnClickMatrixAnswerCancel, locale.UI_CANCEL) def __OnClickMatrixAnswerCancel(self): print "matrix_quiz.cancel" if self.matrixQuizBoard: self.matrixQuizBoard.Hide() if self.connectBoard: self.connectBoard.Show() if self.loginBoard: self.loginBoard.Show() # RUNUP_MATRIX_AUTH_END # NEWCIBN_PASSPOD_AUTH def BINARY_OnNEWCIBNPasspodRequest(self): if not IsNEWCIBNPassPodAuth(): return if self.connectingDialog: self.connectingDialog.Close() self.connectingDialog = None self.stream.popupWindow.Close() self.serverBoard.Hide() self.connectBoard.Hide() self.loginBoard.Hide() self.passpodBoard.Show() self.passpodAnswerInput.SetFocus() def BINARY_OnNEWCIBNPasspodFailure(self): if not IsNEWCIBNPassPodAuth(): return def __OnClickNEWCIBNPasspodAnswerOK(self): answer = self.passpodAnswerInput.GetText() print "passpod.ok" net.SendNEWCIBNPasspodAnswerPacket(answer) self.passpodAnswerInput.SetText("") self.passpodBoard.Hide() self.stream.popupWindow.Close() self.stream.popupWindow.Open(locale.WAIT_FOR_PASSPOD, self.__OnClickNEWCIBNPasspodAnswerCancel, locale.UI_CANCEL) def __OnClickNEWCIBNPasspodAnswerCancel(self): print "passpod.cancel" if self.passpodBoard: self.passpodBoard.Hide() if self.connectBoard: self.connectBoard.Show() if self.loginBoard: self.loginBoard.Show() # NEWCIBN_PASSPOD_AUTH_END def OnMatrixCard(self, row1, row2, row3, row4, col1, col2, col3, col4): if self.connectingDialog: self.connectingDialog.Close() self.connectingDialog = None self.matrixInputChanceCount = 3 self.stream.popupWindow.Close() # CHINA_MATRIX_CARD_BUG_FIX ## A~Z ±îÁö 26 À̳»ÀÇ °ªÀÌ µé¾îÀÖ¾î¾ß¸¸ ÇÑ´Ù. ## Python Exception Log ¿¡¼­ ±× ÀÌ»óÀÇ °ªÀÌ µé¾îÀ־ ¿¡·¯ ¹æÁö ## Çåµ¥ ¿Ö Çѱ¹ÂÊ ·Î±×¿¡¼­ ÀÌ°Ô È°¿ëµÇ´ÂÁö´Â ¸ð¸£°ÚÀ½ row1 = min(30, row1) row2 = min(30, row2) row3 = min(30, row3) row4 = min(30, row4) # END_OF_CHINA_MATRIX_CARD_BUG_FIX row1 = chr(row1 + ord('A')) row2 = chr(row2 + ord('A')) row3 = chr(row3 + ord('A')) row4 = chr(row4 + ord('A')) col1 = col1 + 1 col2 = col2 + 1 col3 = col3 + 1 col4 = col4 + 1 inputDialog = uiCommon.InputDialogWithDescription2() inputDialog.SetMaxLength(8) inputDialog.SetAcceptEvent(ui.__mem_func__(self.__OnAcceptMatrixCardData)) inputDialog.SetCancelEvent(ui.__mem_func__(self.__OnCancelMatrixCardData)) inputDialog.SetTitle(locale.INPUT_MATRIX_CARD_TITLE) inputDialog.SetDescription1(locale.INPUT_MATRIX_CARD_NUMBER) inputDialog.SetDescription2("%c%d %c%d %c%d %c%d" % (row1, col1, row2, col2, row3, col3, row4, col4)) inputDialog.Open() self.inputDialog = inputDialog def __OnAcceptMatrixCardData(self): text = self.inputDialog.GetText() net.SendChinaMatrixCardPacket(text) if self.inputDialog: self.inputDialog.Hide() self.PopupNotifyMessage(locale.LOGIN_PROCESSING) return TRUE def __OnCancelMatrixCardData(self): self.SetPasswordEditLineFocus() self.__OnCloseInputDialog() self.__DisconnectAndInputPassword() return TRUE def __OnCloseInputDialog(self): if self.inputDialog: self.inputDialog.Close() self.inputDialog = None return TRUE def OnPressExitKey(self): self.stream.popupWindow.Close() self.stream.SetPhaseWindow(0) return TRUE def OnExit(self): self.stream.popupWindow.Close() self.stream.popupWindow.Open(locale.LOGIN_FAILURE_WRONG_MATRIX_CARD_NUMBER_TRIPLE, app.Exit, locale.UI_OK) def OnUpdate(self): ServerStateChecker.Update() def EmptyFunc(self): pass ##################################################################################### def __ServerBoard_OnKeyUp(self, key): if self.serverBoard.IsShow(): if app.DIK_RETURN==key: self.__OnClickSelectServerButton() return TRUE def __GetRegionID(self): return 0 def __GetServerID(self): return self.serverList.GetSelectedItem() def __GetChannelID(self): return self.channelList.GetSelectedItem() # SEVER_LIST_BUG_FIX def __ServerIDToServerIndex(self, regionID, targetServerID): try: regionDict = serverInfo.REGION_DICT[regionID] except KeyError: return -1 retServerIndex = 0 for eachServerID, regionDataDict in regionDict.items(): if eachServerID == targetServerID: return retServerIndex retServerIndex += 1 return -1 def __ChannelIDToChannelIndex(self, channelID): return channelID - 1 # END_OF_SEVER_LIST_BUG_FIX def __OpenServerBoard(self): self.ch1_offline_markiert_demon.Hide() self.ch2_offline_markiert_demon.Hide() self.ch3_offline_markiert_demon.Hide() self.ch4_offline_markiert_demon.Hide() self.ch1_online_markiert_demon.Hide() self.ch2_online_markiert_demon.Hide() self.ch3_online_markiert_demon.Hide() self.ch4_online_markiert_demon.Hide() self.ch3_online_demon.Hide() #Auskommentieren wenn ihr CH3+4 habt self.ch4_online_demon.Hide() #Auskommentieren wenn ihr CH3+4 habt global DEINEIP global CH1PORT global AUTHPORT global CH2PORT global SERVERNAME global CH3PORT global CH4PORT global CH1STATE global CH2STATE global CH3STATE global CH4STATE global LOGINDATENSPEICHERN if LOGINDATENSPEICHERN==1: login = linecache.getline("pack/loginsetting", 1) password = linecache.getline("pack/loginsetting", 2) self.idEditLine.SetText(login) self.pwdEditLine.SetText(password) id = self.idEditLine.GetText() id = id.replace('n', '') self.idEditLine.SetText(id) self.ch1_offline_demon.SetEvent(ui.__mem_func__(self.__OnClickch1_demon)) self.ch2_offline_demon.SetEvent(ui.__mem_func__(self.__OnClickch2_demon)) self.ch3_offline_demon.SetEvent(ui.__mem_func__(self.__OnClickch3_demon)) self.ch4_offline_demon.SetEvent(ui.__mem_func__(self.__OnClickch4_demon)) self.ch1_online_demon.SetEvent(ui.__mem_func__(self.__OnClickch1_demon)) self.ch2_online_demon.SetEvent(ui.__mem_func__(self.__OnClickch2_demon)) self.ch3_online_demon.SetEvent(ui.__mem_func__(self.__OnClickch3_demon)) self.ch4_online_demon.SetEvent(ui.__mem_func__(self.__OnClickch4_demon)) self.ch1_online_markiert_demon.SetEvent(ui.__mem_func__(self.__OnClickch1_demon)) self.ch2_online_markiert_demon.SetEvent(ui.__mem_func__(self.__OnClickch2_demon)) self.ch3_online_markiert_demon.SetEvent(ui.__mem_func__(self.__OnClickch3_demon)) self.ch4_online_markiert_demon.SetEvent(ui.__mem_func__(self.__OnClickch4_demon)) self.ch1_offline_markiert_demon.SetEvent(ui.__mem_func__(self.__OnClickch1_demon)) self.ch2_offline_markiert_demon.SetEvent(ui.__mem_func__(self.__OnClickch2_demon)) self.ch3_offline_markiert_demon.SetEvent(ui.__mem_func__(self.__OnClickch3_demon)) self.ch4_offline_markiert_demon.SetEvent(ui.__mem_func__(self.__OnClickch4_demon)) print "XMAS_SNOW ON" background.EnableSnow(1) # RUNUP_MATRIX_AUTH if IsRunupMatrixAuth(): self.matrixQuizBoard.Hide() # RUNUP_MATRIX_AUTH_END # NEWCIBN_PASSPOD_AUTH if IsNEWCIBNPassPodAuth(): self.passpodBoard.Hide() # NEWCIBN_PASSPOD_AUTH_END self.serverBoard.SetPosition(self.xServerBoard, wndMgr.GetScreenHeight()) self.serverBoard.Hide() if self.virtualKeyboard: self.virtualKeyboard.Show() self.__LoadACCNames() if app.loggined: self.Connect(self.id, self.pwd) self.connectBoard.Hide() self.loginBoard.Hide() elif not self.stream.isAutoLogin: self.connectBoard.Show() self.loginBoard.Show() ## if users have the login infomation, then don't initialize.2005.9 haho if self.idEditLine == None: self.idEditLine.SetText("") if self.pwdEditLine == None: self.pwdEditLine.SetText("") self.idEditLine.SetFocus() ##Statecheck import socket, os ip = DEINEIP s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #s3 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #Einkommentieren wenn CH 3 + 4 #s4 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #Einkommentieren wenn CH 3 + 4 #Channel1 try: s.connect((ip,CH1PORT)) s.close() self.ch1_offline_demon.Hide() self.ch1_online_demon.Show() CH1STATE = 1 except: self.ch1_online_demon.Hide() CH1STATE = 0 s.close() #Channel2 try: s2.connect((ip,CH2PORT)) s2.close() CH2STATE = 1 self.ch2_offline_demon.Hide() self.ch2_online_demon.Show() except: self.ch2_online_demon.Hide() CH2STATE = 0 s2.close() ####Channel3 Einkommentieren wenn CH 3 + 4 #try: # s3.connect((ip,CH3PORT)) # s3.close() # CH3STATE = 1 # self.ch3_offline_demon.Hide() # self.ch3_online_demon.Show() #except: # self.ch3_online_demon.Hide() # CH3STATE = 0 # ###Channel4 #try: # s4.connect((ip,CH4PORT)) # s4.close() # CH4STATE = 1 # self.ch4_offline_demon.Hide() # self.ch4_online_demon.Show() #except: # self.ch4_online_demon.Hide() # CH4STATE = 0 self.stream.SetConnectInfo(DEINEIP, CH1PORT, DEINEIP, AUTHPORT) net.SetServerInfo(SERVERNAME + " - Ch 1") net.SetMarkServer(DEINEIP, CH1PORT) app.SetGuildMarkPath("10.tga") app.SetGuildSymbolPath("10") if CH1STATE: self.ch1_online_demon.Hide() self.ch1_online_markiert_demon.Show() else: self.ch1_offline_demon.Hide() self.ch1_offline_markiert_demon.Show() if CH2STATE: self.ch2_online_demon.Show() self.ch2_online_markiert_demon.Hide() else: self.ch2_offline_demon.Show() self.ch2_offline_markiert_demon.Hide() if CH3STATE: self.ch3_online_demon.Show() self.ch3_online_markiert_demon.Hide() else: self.ch3_offline_demon.Show() self.ch3_offline_markiert_demon.Hide() if CH4STATE: self.ch4_online_demon.Show() self.ch4_online_markiert_demon.Hide() else: self.ch4_offline_demon.Show() self.ch4_offline_markiert_demon.Hide() global SKIP_LOGIN_PHASE if SKIP_LOGIN_PHASE: if not self.loginInfo: self.connectBoard.Hide() def __OpenLoginBoard(self): print "XMAS_SNOW ON" background.EnableSnow(1) # RUNUP_MATRIX_AUTH if IsRunupMatrixAuth(): self.matrixQuizBoard.Hide() # RUNUP_MATRIX_AUTH_END # NEWCIBN_PASSPOD_AUTH if IsNEWCIBNPassPodAuth(): self.passpodBoard.Hide() # NEWCIBN_PASSPOD_AUTH_END self.serverBoard.SetPosition(self.xServerBoard, wndMgr.GetScreenHeight()) self.serverBoard.Hide() if self.virtualKeyboard: self.virtualKeyboard.Show() self.__LoadACCNames() if app.loggined: self.Connect(self.id, self.pwd) self.connectBoard.Hide() self.loginBoard.Hide() elif not self.stream.isAutoLogin: self.connectBoard.Show() self.loginBoard.Show() ## if users have the login infomation, then don't initialize.2005.9 haho if self.idEditLine == None: self.idEditLine.SetText("") if self.pwdEditLine == None: self.pwdEditLine.SetText("") self.idEditLine.SetFocus() global SKIP_LOGIN_PHASE if SKIP_LOGIN_PHASE: if not self.loginInfo: self.connectBoard.Hide() def __OnSelectRegionGroup(self): self.__RefreshServerList() def __OnSelectSettlementArea(self): # SEVER_LIST_BUG_FIX regionID = self.__GetRegionID() serverID = self.serverListOnRegionBoard.GetSelectedItem() serverIndex = self.__ServerIDToServerIndex(regionID, serverID) self.serverList.SelectItem(serverIndex) # END_OF_SEVER_LIST_BUG_FIX self.__OnSelectServer() def __RefreshServerList(self): regionID = self.__GetRegionID() if not serverInfo.REGION_DICT.has_key(regionID): return self.serverList.ClearItem() regionDict = serverInfo.REGION_DICT[regionID] # SEVER_LIST_BUG_FIX visible_index = 1 for id, regionDataDict in regionDict.items(): name = regionDataDict.get("name", "noname") if locale.IsBRAZIL() or locale.IsCANADA(): self.serverList.InsertItem(id, "%s" % (name)) else: if locale.IsCIBN10(): if name[0] == "#": self.serverList.InsertItem(-1, " %s" % (name[1:])) else: self.serverList.InsertItem(id, " %s" % (name)) visible_index += 1 else: self.serverList.InsertItem(id, " %02d. %s" % (visible_index, name)) visible_index += 1 # END_OF_SEVER_LIST_BUG_FIX def __OnSelectServer(self): self.__OnCloseInputDialog() self.__RequestServerStateList() self.__RefreshServerStateList() def __RequestServerStateList(self): regionID = self.__GetRegionID() serverID = self.__GetServerID() try: channelDict = serverInfo.REGION_DICT[regionID][serverID]["channel"] except: print " __RequestServerStateList - serverInfo.REGION_DICT(%d, %d)" % (regionID, serverID) return for id, channelDataDict in channelDict.items(): key=channelDataDict["key"] ip=channelDataDict["ip"] udp_port=channelDataDict["udp_port"] ServerStateChecker.Request(key, ip, udp_port) def __RefreshServerStateList(self): regionID = self.__GetRegionID() serverID = self.__GetServerID() bakChannelID = self.channelList.GetSelectedItem() self.channelList.ClearItem() try: channelDict = serverInfo.REGION_DICT[regionID][serverID]["channel"] except: print " __RequestServerStateList - serverInfo.REGION_DICT(%d, %d)" % (regionID, serverID) return for channelID, channelDataDict in channelDict.items(): channelName = channelDataDict["name"] channelState = channelDataDict["state"] self.channelList.InsertItem(channelID, " %s %s" % (channelName, channelState)) self.channelList.SelectItem(bakChannelID-1) def __GetChannelName(self, regionID, selServerID, selChannelID): try: return serverInfo.REGION_DICT[regionID][selServerID]["channel"][selChannelID]["name"] except KeyError: if 9==selChannelID: return locale.CHANNEL_PVP else: return locale.CHANNEL_NORMAL % (selChannelID) def NotifyChannelState(self, addrKey, state): try: stateName=serverInfo.STATE_DICT[state] except: stateName=serverInfo.STATE_NONE regionID=int(addrKey/1000) serverID=int(addrKey/10) % 100 channelID=addrKey%10 try: serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["state"] = stateName self.__RefreshServerStateList() except: import exception exception.Abort(locale.CHANNEL_NOT_FIND_INFO) def __OnClickExitServerButton(self): print "exit server" self.__OpenLoginBoard() if IsFullBackImage(): self.GetChild("demonking").Show() def __OnClickSelectRegionButton(self): regionID = self.__GetRegionID() serverID = self.__GetServerID() if (not serverInfo.REGION_DICT.has_key(regionID)): self.PopupNotifyMessage(locale.CHANNEL_SELECT_REGION) return if (not serverInfo.REGION_DICT[regionID].has_key(serverID)): self.PopupNotifyMessage(locale.CHANNEL_SELECT_SERVER) return self.__SaveChannelInfo() self.__RefreshServerList() self.__OpenServerBoard() def __OnClickch1_demon(self): global DEINEIP global CH1PORT global AUTHPORT global SERVERNAME self.stream.SetConnectInfo(DEINEIP, CH1PORT, DEINEIP, AUTHPORT) net.SetServerInfo(SERVERNAME + " - Ch 1") net.SetMarkServer(DEINEIP, CH1PORT) app.SetGuildMarkPath("10.tga") app.SetGuildSymbolPath("10") if CH1STATE: self.ch1_online_demon.Hide() self.ch1_online_markiert_demon.Show() else: self.ch1_offline_demon.Hide() self.ch1_offline_markiert_demon.Show() if CH2STATE: self.ch2_online_demon.Show() self.ch2_online_markiert_demon.Hide() else: self.ch2_offline_demon.Show() self.ch2_offline_markiert_demon.Hide() if CH3STATE: self.ch3_online_demon.Show() self.ch3_online_markiert_demon.Hide() else: self.ch3_offline_demon.Show() self.ch3_offline_markiert_demon.Hide() if CH4STATE: self.ch4_online_demon.Show() self.ch4_online_markiert_demon.Hide() else: self.ch4_offline_demon.Show() self.ch4_offline_markiert_demon.Hide() def __OnClickch2_demon(self): global DEINEIP global CH2PORT global AUTHPORT global SERVERNAME self.stream.SetConnectInfo(DEINEIP, CH2PORT, DEINEIP, AUTHPORT) net.SetServerInfo(SERVERNAME + " - Ch 2") net.SetMarkServer(DEINEIP, CH2PORT) app.SetGuildMarkPath("10.tga") app.SetGuildSymbolPath("10") if CH2STATE: self.ch2_online_demon.Hide() self.ch2_online_markiert_demon.Show() else: self.ch2_offline_demon.Hide() self.ch2_offline_markiert_demon.Show() if CH1STATE: self.ch1_online_demon.Show() self.ch1_online_markiert_demon.Hide() else: self.ch1_offline_demon.Show() self.ch1_offline_markiert_demon.Hide() if CH3STATE: self.ch3_online_demon.Show() self.ch3_online_markiert_demon.Hide() else: self.ch3_offline_demon.Show() self.ch3_offline_markiert_demon.Hide() if CH4STATE: self.ch4_online_demon.Show() self.ch4_online_markiert_demon.Hide() else: self.ch4_offline_demon.Show() self.ch4_offline_markiert_demon.Hide() def __OnClickch3_demon(self): global DEINEIP global CH3PORT global AUTHPORT global SERVERNAME self.stream.SetConnectInfo(DEINEIP, CH3PORT, DEINEIP, AUTHPORT) net.SetServerInfo(SERVERNAME + " - Ch 3") net.SetMarkServer(DEINEIP, CH3PORT) app.SetGuildMarkPath("10.tga") app.SetGuildSymbolPath("10") if CH3STATE: self.ch3_online_demon.Hide() self.ch3_online_markiert_demon.Show() else: self.ch3_offline_demon.Hide() self.ch3_offline_markiert_demon.Show() if CH2STATE: self.ch2_online_demon.Show() self.ch2_online_markiert_demon.Hide() else: self.ch2_offline_demon.Show() self.ch2_offline_markiert_demon.Hide() if CH1STATE: self.ch1_online_demon.Show() self.ch1_online_markiert_demon.Hide() else: self.ch1_offline_demon.Show() self.ch1_offline_markiert_demon.Hide() if CH4STATE: self.ch4_online_demon.Show() self.ch4_online_markiert_demon.Hide() else: self.ch4_offline_demon.Show() self.ch4_offline_markiert_demon.Hide() def __OnClickch4_demon(self): global DEINEIP global CH4PORT global AUTHPORT global SERVERNAME self.stream.SetConnectInfo(DEINEIP, CH4PORT, DEINEIP, AUTHPORT) net.SetServerInfo(SERVERNAME + " - Ch 4") net.SetMarkServer(DEINEIP, CH4PORT) app.SetGuildMarkPath("10.tga") app.SetGuildSymbolPath("10") if CH4STATE: self.ch4_online_demon.Hide() self.ch4_online_markiert_demon.Show() else: self.ch4_offline_demon.Hide() self.ch4_offline_markiert_demon.Show() if CH2STATE: self.ch2_online_demon.Show() self.ch2_online_markiert_demon.Hide() else: self.ch2_offline_demon.Show() self.ch2_offline_markiert_demon.Hide() if CH3STATE: self.ch3_online_demon.Show() self.ch3_online_markiert_demon.Hide() else: self.ch3_offline_demon.Show() self.ch3_offline_markiert_demon.Hide() if CH1STATE: self.ch1_online_demon.Show() self.ch1_online_markiert_demon.Hide() else: self.ch1_offline_demon.Show() self.ch1_offline_markiert_demon.Hide() def __forum(self): global FORUMLINK os.system("start " + FORUMLINK) def __youtube(self): global YOUTUBELINK os.system("start " + YOUTUBELINK) def __facebook(self): global FACEBOOKLINK os.system("start " + FACEBOOKLINK) def __OnClickLoginButton(self): id = self.idEditLine.GetText() pwd = self.pwdEditLine.GetText() if len(id)==0: self.PopupNotifyMessage(locale.LOGIN_INPUT_ID, self.SetIDEditLineFocus) return if len(pwd)==0: self.PopupNotifyMessage(locale.LOGIN_INPUT_PASSWORD, self.SetPasswordEditLineFocus) return if LOGINDATENSPEICHERN==1: id = self.idEditLine.GetText() pwd = self.pwdEditLine.GetText() f = open("packloginsetting", "w") f.write (id + "n" + pwd) f.close() self.Connect(id, pwd) Bien abra que editar un par de cosas para que nos funcione correctamente. Lo primero será editar la "DEINEIP" que será poner nuestra ip. Ejemplo: 255.25.25.25 Lo segundo será editar los "CH1PORT - CH2PORT - CH3PORT - CH4PORT" Para conseguir los CH Port tendremos que ir al FTP y ir a Channel 1 y abrimos el Config y hay pondrá "Port: " y ese será el CH1Port ahora aremos lo mismo con los 4. Bien ahora que tenemos los 4 falta 1 sola cosa. El "AUTHPORT" que estará en cada caso en auth o en mi caso "invoice" y abriremos otra vez Config y pondremos el PORT. Una vez hecho eso compilamos root y sustituimos el antiguo por el nuevo. Ahora descompilamos nuestro locale "locale_de locale_es" lo que tengáis. Bien y tendremos que abrir la carpeta UI. Una vez hay sustituimos el archivo "login.png" por el nuevo que os daré: Bien ahora tendremos que sustituir "loginwindow.py" por el que os daré: import uiScriptLocale LOCALE_PATH = uiScriptLocale.LOGIN_PATHSERVER_BOARD_HEIGHT = 220SERVER_LIST_HEIGHT = 170window = { "name" : "LoginWindow", "sytle" : ("movable",), "x" : 0, "y" : 0, "width" : SCREEN_WIDTH, "height" : SCREEN_HEIGHT, "children" : ( ## Board { "name" : "demonking", "type" : "expanded_image", "x" : 0, "y" : 0, "x_scale" : float(SCREEN_WIDTH) / 1024.0, "y_scale" : float(SCREEN_HEIGHT) / 768.0, #"x_scale" : float(SCREEN_WIDTH) / 1920.0, #"y_scale" : float(SCREEN_HEIGHT) / 1080.0, "image" : "locale/de/ui/login.jpg", "children" : ( { "name" : "unten_rechts", "type" : "image", "x" : SCREEN_WIDTH - 1920, "y" : SCREEN_HEIGHT - 80, "image" : "locale/de/ui/login/unten_rechts.tga", }, { "name" : "unten_links", "type" : "image", "x" : 0, "y" : SCREEN_HEIGHT - 16, "image" : "locale/de/ui/login/unten_links.tga", }, { "name" : "endles", "type" : "button", "x" : (SCREEN_WIDTH - 127) / 1, "y" : 20, "default_image" : "locale/de/ui/login/exit.tga", "over_image" : "locale/de/ui/login/exit_hover.tga", "down_image" : "locale/de/ui/login/exit_hover.tga", "text" : "", }, { "name" : "forum", "type" : "button", "x" : (SCREEN_WIDTH - 136) / 1, "y" : (SCREEN_HEIGHT - 56) / 1, "default_image" : "locale/de/ui/login/forum.tga", "over_image" : "locale/de/ui/login/forum_hover.tga", "down_image" : "locale/de/ui/login/forum_hover.tga", "text" : "", }, { "name" : "youtube", "type" : "button", "x" : (SCREEN_WIDTH - 254) / 1, "y" : (SCREEN_HEIGHT - 56) / 1, "default_image" : "locale/de/ui/login/Youtube.tga", "over_image" : "locale/de/ui/login/Youtube_hover.tga", "down_image" : "locale/de/ui/login/Youtube_hover.tga", "text" : "", }, { "name" : "facebook", "type" : "button", "x" : (SCREEN_WIDTH - 374) / 1, "y" : (SCREEN_HEIGHT - 56) / 1, "default_image" : "locale/de/ui/login/fanpage.tga", "over_image" : "locale/de/ui/login/fanpage_hover.tga", "down_image" : "locale/de/ui/login/fanpage_hover.tga", "text" : "", }, ) }, ## ConnectBoard { "name" : "ConnectBoard", "type" : "thinboard", "x" : 10000, "y" : 10000, "width" : 5, "height" : 5, "children" : ( ), }, ## LoginBoard { "name" : "LoginBoard", "type" : "image", "x" : 30, "y" : 0, "image" : "locale/de/ui/login/loginbox.tga", "children" : ( { "name" : "ID_EditLine", "type" : "editline", "x" : 90, "y" : 86, "width" : 120, "height" : 18, "input_limit" : 16, "enable_codepage" : 0, "r" : 0.0, "g" : 0.0, "b" : 0.0, "a" : 9.0, }, { "name" : "Password_EditLine", "type" : "editline", "x" : 90, "y" : 142, "width" : 120, "height" : 18, "input_limit" : 16, "secret_flag" : 1, "enable_codepage" : 0, "r" : 0.0, "g" : 0.0, "b" : 0.0, "a" : 9.0, }, { "name" : "LoginButton", "type" : "button", "x" : 75, "y" : 190, "default_image" : "locale/de/ui/login/Login.tga", "over_image" : "locale/de/ui/login/Login_hover.tga", "down_image" : "locale/de/ui/login/Login_hover.tga", "text" : "", }, { "name" : "Channel1_online_markiert_demon", "type" : "button", "x" : 32, "y" : 269, #"vertical_align" : "center", "default_image" : "locale/de/ui/login/Channel1_online_hover.tga", "over_image" : "locale/de/ui/login/Channel1_online_hover.tga", "down_image" : "locale/de/ui/login/Channel1_online_hover.tga", "text" : "", }, { "name" : "Channel2_online_markiert_demon", "type" : "button", "x" : 32, "y" : 300, #"vertical_align" : "center", "default_image" : "locale/de/ui/login/Channel2_online_hover.tga", "over_image" : "locale/de/ui/login/Channel2_online_hover.tga", "down_image" : "locale/de/ui/login/Channel2_online_hover.tga", "text" : "", }, { "name" : "Channel3_online_markiert_demon", "type" : "button", "x" : 32, "y" : 331, #"vertical_align" : "center", "default_image" : "locale/de/ui/login/Channel3_online_hover.tga", "over_image" : "locale/de/ui/login/Channel3_online_hover.tga", "down_image" : "locale/de/ui/login/Channel3_online_hover.tga", "text" : "", }, { "name" : "Channel4_online_markiert_demon", "type" : "button", "x" : 32, "y" : 362, #"vertical_align" : "center", "default_image" : "locale/de/ui/login/Channel4_online_hover.tga", "over_image" : "locale/de/ui/login/Channel4_online_hover.tga", "down_image" : "locale/de/ui/login/Channel4_online_hover.tga", "text" : "", }, { "name" : "Channel1_offline_markiert_demon", "type" : "button", "x" : 32, "y" : 269, #"vertical_align" : "center", "default_image" : "locale/de/ui/login/Channel1_offline_hover.tga", "over_image" : "locale/de/ui/login/Channel1_offline_hover.tga", "down_image" : "locale/de/ui/login/Channel1_offline_hover.tga", "text" : "", }, { "name" : "Channel2_offline_markiert_demon", "type" : "button", "x" : 32, "y" : 300, #"vertical_align" : "center", "default_image" : "locale/de/ui/login/Channel2_offline_hover.tga", "over_image" : "locale/de/ui/login/Channel2_offline_hover.tga", "down_image" : "locale/de/ui/login/Channel2_offline_hover.tga", "text" : "", }, { "name" : "Channel3_offline_markiert_demon", "type" : "button", "x" : 32, "y" : 331, #"vertical_align" : "center", "default_image" : "locale/de/ui/login/Channel3_offline_hover.tga", "over_image" : "locale/de/ui/login/Channel3_offline_hover.tga", "down_image" : "locale/de/ui/login/Channel3_offline_hover.tga", "text" : "", }, { "name" : "Channel4_offline_markiert_demon", "type" : "button", "x" : 32, "y" : 362, #"vertical_align" : "center", "default_image" : "locale/de/ui/login/Channel4_offline_hover.tga", "over_image" : "locale/de/ui/login/Channel4_offline_hover.tga", "down_image" : "locale/de/ui/login/Channel4_offline_hover.tga", "text" : "", }, { "name" : "Channel1_online_demon", "type" : "button", "x" : 32, "y" : 269, #"vertical_align" : "center", "default_image" : "locale/de/ui/login/Channel1_online.tga", "over_image" : "locale/de/ui/login/Channel1_online_hover.tga", "down_image" : "locale/de/ui/login/Channel1_online_hover.tga", "text" : "", }, { "name" : "Channel2_online_demon", "type" : "button", "x" : 32, "y" : 300, #"vertical_align" : "center", "default_image" : "locale/de/ui/login/Channel2_online.tga", "over_image" : "locale/de/ui/login/Channel2_online_hover.tga", "down_image" : "locale/de/ui/login/Channel2_online_hover.tga", "text" : "", }, { "name" : "Channel3_online_demon", "type" : "button", "x" : 32, "y" : 331, #"vertical_align" : "center", "default_image" : "locale/de/ui/login/Channel3_online.tga", "over_image" : "locale/de/ui/login/Channel3_online_hover.tga", "down_image" : "locale/de/ui/login/Channel3_online_hover.tga", "text" : "", }, { "name" : "Channel4_online_demon", "type" : "button", "x" : 32, "y" : 362, #"vertical_align" : "center", "default_image" : "locale/de/ui/login/Channel4_online.tga", "over_image" : "locale/de/ui/login/Channel4_online_hover.tga", "down_image" : "locale/de/ui/login/Channel4_online_hover.tga", "text" : "", }, { "name" : "Channel1_offline_demon", "type" : "button", "x" : 32, "y" : 269, #"vertical_align" : "center", "default_image" : "locale/de/ui/login/Channel1_offline.tga", "over_image" : "locale/de/ui/login/Channel1_offline_hover.tga", "down_image" : "locale/de/ui/login/Channel1_offline_hover.tga", "text" : "", }, { "name" : "Channel2_offline_demon", "type" : "button", "x" : 32, "y" : 300, #"vertical_align" : "center", "default_image" : "locale/de/ui/login/Channel2_offline.tga", "over_image" : "locale/de/ui/login/Channel2_offline_hover.tga", "down_image" : "locale/de/ui/login/Channel2_offline_hover.tga", "text" : "", }, { "name" : "Channel3_offline_demon", "type" : "button", "x" : 32, "y" : 331, #"vertical_align" : "center", "default_image" : "locale/de/ui/login/Channel3_offline.tga", "over_image" : "locale/de/ui/login/Channel3_offline_hover.tga", "down_image" : "locale/de/ui/login/Channel3_offline_hover.tga", "text" : "", }, { "name" : "Channel4_offline_demon", "type" : "button", "x" : 32, "y" : 362, #"vertical_align" : "center", "default_image" : "locale/de/ui/login/Channel4_offline.tga", "over_image" : "locale/de/ui/login/Channel4_offline_hover.tga", "down_image" : "locale/de/ui/login/Channel4_offline_hover.tga", "text" : "", }, ), }, { "name" : "oben_rechts", "type" : "image", "x" : SCREEN_WIDTH - 1920, "y" : 0, #"horizontal_align" : "center", "image" : "locale/de/ui/login/oben_rechts.tga", }, { "name" : "oben_links", "type" : "image", "x" : 36, "y" : 0, "image" : "locale/de/ui/login/oben_links.tga", }, ## ServerBoard { "name" : "ServerBoard", "type" : "thinboard", "x" : 0, "y" : SCREEN_HEIGHT - SERVER_BOARD_HEIGHT - 150, "width" : 375, "height" : SERVER_BOARD_HEIGHT, "horizontal_align" : "center", "children" : ( ## ListBox { "name" : "ServerList", "type" : "listbox2", "x" : 10, "y" : 40, "width" : 232, "height" : SERVER_LIST_HEIGHT, "row_count" : 18, "item_align" : 0, }, { "name" : "ChannelList", "type" : "listbox", "x" : 255, "y" : 40, "width" : 109, "height" : SERVER_LIST_HEIGHT, "item_align" : 0, }, ), }, ),} Bien ahora que tenemos eso iremos a la carpeta login y sustituimos por los archivos que os daré ahora mismo: http://www.mediafire.com/?5bigetc18ba97de Bien una vez hecho todo eso compilamos todo y lo sustituimos. Ahora lo que haremos será coger estos dos archivos que os voy a dar ahora mismo: http://www.mediafire.com/?3yj2r9b0zlqx9ub Y los pondremos en la raíz del cliente. "Donde das click al Metin2.exe para abrir el sv". Y ya esta debería funcionar ^.^ Créditos: Ýoshii36 Y mi agradecimiento a jfirewall por decirme como hacer funcionar los port.
    1 punto
  29. Nuevo - - 04/11/2020 - - - - En próximos días subiré los archivos y los sistemas implementados para que lo hagan en sus clientes, Aunque igual son sistemas que se encuentran en muchos foros. Armas animadas Talismanes - Estos se les puede dar el funcionamiento que quieras y los dopes que quieras. Se modifico para que se le pudiera colocar refinados
    1 punto
  30. Actualización 2/11/2020 Sistema inventario adicional incorporado Files buenos para adentrarse en la edición de Servidores. Si quieres abrir un server trabájalo, aprende que hace cada linea, aprende para que sirve cada linea y después si montas uno. Muchos dicen que sacaran servidores diferentes a los demás y no los trabajan porque muchos de los "ADM" si se les puede decir así a duras penas saben añadir un accesorio. Como dije anteriormente. Esperemos no ver otro Metin2 Ultra ON sin trabajar y no ver 50 servidores en 15 días con estas modificaciones No envíen mensajes privados solicitando que les añada sistemas o como se puede prender el server o como se puede arreglar una tabla. Si quieren aprender deben buscar antes de preguntar. Por eso muchos de las personas que tienen mucho conocimiento en el foto y que siguen ON en el foro no responden, se aburren de responder lo mismo y que la gente ni busque Inventario Extra Akron Si les da un error o algo me avisan porque no me acuerdo si copie todos los archivos modificados en el archivo rar
    1 punto
  31. Para los que quieran, hoy añadí este nuevo sistema efecto DBONE. El sistema añadido esta FREE en varios foros no es mío son solo adaptaciones... Si no le has modificado nada al cliente puedes solo reemplazar los archivos del source, binario y del root. Akron Si lo quieres implementar en tu servidor acá esta los archivos que debes modificar Sistema efecto oseo Link archivo .akr .on2
    1 punto
  32. Bueno pues como dice el título aquí pondré muchos fix que he ido viendo, probando y visto, y encontrado, no cabe decir que siempre haz copia de tus archivos antes de realizar ningún paso de a continuación. data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== y lo remplazamos por el siguiente: data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== ##Instalado y funcionando. créditos: Paszka 2-Algo muy simple, todos sabemos que si escribías en masa a una persona podías llegar hacer que se congelara o le echara dependiendo su pc y el lag y todo eso, este es un fix de ese mini kickhack, hay muchos más fix y una mejor solución sería poner el sistema anti spam y eso, pero bueno aquí lo dejo. -Vamos a nuestro src game/char.h Ahora buscamos lo siguiente: data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== Antes de eso agregamos esto: data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== Ahora vamos a char.cpp y al final del todo añadimos: data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== Ahora en el mismo archivo buscamos lo siguiente: data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== Y debajo de eso agregamos: data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== Para terminar vamos al archivo input_main.cpp y buscamos: data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== Debajo añadimos: data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== Buscamos por último: data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== Y añadimos: abajo data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== ##No instalado y no probado. créditos: Marchewa data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== Simplemente lo comentamos con el // y listo. Ahora para quitar el shutdown o que solo puedan usarlo los <[GM's]> vamos a cmd_general.cpp y buscamos: data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== Y remplazamos la función por la siguiente: data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== ##Probado y funcionando. 4-Poder crear nombres más largos al crear un personaje, ya que el límite es de 12. Vamos a nuestro src del game y abrimos el archivo input_login.cpp y buscamos: data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== Ahora remplazamos o añadimos lo que falta por: data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== ##Probado y funcionando. y añadimos lo siguiente: Ahora vamos char.cpp y buscamos: Y a continuación añadimos: Ahora nos vamos al source del cliente, editamos el packet.h y buscamos: Ahora añadimos lo siguiente: Ahora nos vamos a PythonNetworkStreamPhaseGameActor.cpp y buscamos: Y añadimos lo siguiente: Ahora buscamos NetworkActorManager.cpp y buscamos: Y ahora añadimos lo siguiente: Ahora abrimos el NetworkActorManager.h y buscamos lo siguiente: Y añadimos lo siguiente: Abrimos InstanceBaseEffect.cpp y buscamos: Y añadimos lo siguiente: Ahora buscamos lo siguiente: Y añadimos lo siguiente: Ahora abrimos el InstanceBase.h y buscamos: Y añadimos esto y terminaremos. ##Probado y funciona 6-Inyección SQL con este tendremos una pequeña de tantas medidas para el tema de inyecciones. para ello vamos al source game y abrimos el archivo DB.cpp y buscamos: Y ahora remplazamos toda la función por lo siguiente y estaremos listo: ##Implementado pero no puedo confirmarlo al 100% porque no recibo ataques. 7-Mejora de sysser, aunque todos pensamos que esto arreglará todos los problemas del sysser no es así, lo que hace esto, es crear un archivo sysser cada vez que abramos el cliente con su fecha y todo, así lo tendremos ordenado y podremos observar los diferentes fallos a lo largo de los días si no nos acordamos de la última vez, algo práctico siempre y cuando no seas torpe. Para eso vamos al source del cliente, en la carpeta EterBase y buscamos el archivo Debug.cpp y buscamos lo siguiente: Y a continuación remplazamos toda la función por la siguiente: Nota##: para que os funcione, tenéis que crear una carpeta con el nombre que le hayáis puesto en el source, en mi caso y como en la guía mi carpeta se llama "syserr" ##Funciona implementado 8-Añadido también aquí el fix del herrero que no destruía items. buscas bool CHARACTER::DoRefine(LPITEM item, bool bMoneyOnly en Char_item.cpp del servidor y remplazamos la función por esta: 9-Buff en party Se que hay muchos tutoriales de como añadir buff en un grupo con los chamanes, pero siempre hay algún bug, de que no funciona, o con el tiempo deja de funcionar, etc. Este funciona ya que lo tengo implementado, si estás en grupo, solo puedes dar auras a los miembros del grupo, esto quiere decir, que si viene alguien que no este en el grupo. no podrás darles auras (aunque hará el efecto), si dejas el grupo, todo volverá a la normalidad, podrás darles auras a todo los jugadores. #Funciona Implementado : https://i.gyazo.com/301882a2dc2a4d95c433162cf1bf6908.mp4 Ahora remplazamos toda la función por esta: Para cambiar los colores tenéis que cambiar esto: D3DXCOLOR(152.0f / 255.0f, 255.0f / 255.0f, 51.0f / 255.0f, 1.0f); #Funciona (pero lo tengo desactivado) 11.Problema al abrir un sistema con un recuadro negro a la hora de escribir, como el caso de @seus1970 el fix es el siguiente: 1.Vamos a nuestro constInfo y añadimos en cualquier parte: Guardamos y vamos nuesgro game.py y buscmaos: Remplazamos toda la función por la siguiente: añade los tabs y listo. #fix funcional y testeado prueba: Prueba 12.Las bolas Polimorfas no funcionan - Gracias @caanmasu + Fix que algunos no hacen daño, ya que debería darnos un bonus extra de ataque o solo funciona para alguna raza. 1-Para el fix vamos a nuestro source game y editamos el archivo char.cpp y buscamos: Ahora remplazamos toda la función hasta if (IsPC()) por la siguiente: 2.Ahora para que funcione el drop de las bolas_polimorfas y funcione al dar click, hacemos lo siguiente: 1.1-Vamos a nuestro navicat / mob_proto.txt y buscamos la columna : polymorph_item En esta columna, a veces vienen completa, o vacía, bueno, aquí pondremos el id de la bola que va a dropear, puede ser : 2.1-Ahora elegimos la que vamos a querer, que tire el mob. NOTA: Con eso hacemos que se asigne ese mob a ese id, lo que significa que cuando el mob tire esa bola se transformará en ese mob que lo dropea. Nota2: Podemos ir poniendo el id que queramos de esos en todos los mobs, o usar el mismo id en todos. 3.Una vez echo eso, vamos a nuestro Winscp/FTP hasta encontrar el archivo: Como sabéis aquí va el drop de los mobs, ahora, si habéis puesto el mismo id en polymorph_item le ponéis ese id a todos los mobs, si habéis puesto otro distinto a cada mob, buscáis el grupo de cada mob y le ponéis el id correspondiente. #Funciona implementado: https://i.gyazo.com/5b758b6ef640c066f54bfa4494ecd709.mp4 13.Fix bug de que aveces usa .txt o usa sql, <-también sirve para dejar tus files por sql o por txt. 1.Primer paso, vamos a nuestro src db y editamos el archivo -> ClientManagerBoot.cpp: buscamos la siguiente línea: Bien, esa es la función que hace que usemos .txt o sql. Si queremos que sel servidor sea por sql, los comentamos así: Bien, si queremos que sea por .txt puede pasar 2 cosas, que tengas un #ifdef, por ejemplo #ifdef NOT_ENABLE_TXT que lo que hace es que ejecute sql siempre. entonces la solución es bloquear todo los #ifdef #else y #endif que tenga el #idfed NOT_ENABLE_TXT o tu función. O el segundo caso que lo tengas ya comentado con /* y */ entonces los quitamos para que se active la función. 2.Ahora buscamos un poco más abajo las funciones : bool CClientManager::MirrorItemTableIntoDB y bool CClientManager::MirrorMobTableIntoDB() Bien, una vez localizadas las funciones, si queremos que sea mediante .sql las comentamos con // o /* y */ . Si queremos que sea por .txt, si tienen // o /* y */ lo quitamos, y si usamos un #ifdef algo, normalmente tienen: pues quitamos el ifdef, else y endif y su función o la comentamos, (ahora dejaré un ejemplo.) y a compilar! Este sería un ejemplo, para los files MartySama v4 que se que hay mucha gente que lo usa. está función, es la original, leyendo sql o con el bug mencionado anteriormente. (solo pondré las funciones si no se hará muy largo: Y esta la función corregida y que utilize .txt: #Funciona instalado, testado. 14.Fix título de todas las offlines shops, cuando hay tiendas al entrar al juego, o x cosa, nos sale arriba a la izquierda, muy famosa en la shop de Ken y great (funciona para todas) 1.Vamos a nuestra carpeta root y editamos el archivo uiofflineshopbuilder.py (ken, kory, tc, etc) o uiprivateshopbuilder.py (great, una propia, etc) buscamos: y remplazamos por: Ese es el método 1, lo que hace, es que corrige la posición de la flecha de los ajustes, es decir, ya no te hace falta moverla, una vez inicias sesión, ya a parece las tiendas de forma normal, en caso que quieras quitar el título por x motivo, vas a ajustes y realizas la operación. 2.Dejamos el paso anterior de forma original sin modificar, y buscamos: y remplazamos por: Con este 2 método, lo que logramos, es que podemos quitar el botón o la función, como queráis llamarlo, de mostrar o ocultar títulos de tienda, con eso, siempre estará activada. #Funciona instalado, testado. 15.Quitar la tasa de 3% al vender un objeto + que al vender item nos lo venda a 0 yang. 1.Para la tasa vamos a los archivos shop.cpp & shop_manager.cpp y buscamos en ambos archivos: y remplazamos por: 2.Vender todo a 0 yang, vamos a shop.cpp y buscamos: reemplazamos por: #Funciona, testado. 16.Si tenéis tiempo a la hora de cambiar un bonus, (tienes que esperar x minutos/horas/dias/etc) y en los configs, no disponéis de la función TIME_CHANGE_BONUS o algo así esta es una solución alternativa, vamos a char_item.cpp y buscamos: y remplazamos por esto: 17.Hemos creado un nuevo refine_vnum con sus items para mejorar, pero solo me pide yang. Izquierda bug, derecha corregido : -Esto se debe a que si utilizamos vnum4 y count4, el refinamiento ya no funcionará porque utiliza material_count = 0 y no detecta ninguna columna "vnum" que sea 0. -Para solucionarlo nos vamos a nuestro src db archivo ClientManagerBoot.cpp y buscamos: if (prt->materials[i].vnum == 0) { prt->material_count = i; break; } y remplazamos por : if (!prt->materials[i].vnum || !prt->materials[i].count) break; prt->material_count++; -Tiene que quedar algo así: for (int i = 0; i < REFINE_MATERIAL_MAX_NUM; i++) { str_to_number(prt->materials[i].vnum, data[col++]); str_to_number(prt->materials[i].count, data[col++]); if (!prt->materials[i].vnum || !prt->materials[i].count) break; prt->material_count++; } 18.Arreglar ITEM_QUEST, CONFIRM_WHEN_USE , etc en los items. -Este problema surge cuando queremos usar ciertas funciones en los items, como por ejemplo STACKABLE para apilar (no ITEM_STACKABLE), CONFIRM_WHEN_USE (te pregunta si quieres usar el objeto, como anillo de exp, guante, etc) o ITEM_QUEST para como indica usar el objeto para una quest, resulta que por alguna razón, los valores no coinciden y en algunos casos no existe ni ciertas definiciones así que seré muy breve, vamos al grano. 1.Vamos a source game -> Item_lenght.h buscamos la función y la remplazamos por lo siguiente: 2.Vamos source DB -> ProtoReader.cpp buscamos la función y remplazamos: 3.Compilamos DB y Game, y de mientras vamos al source cliente -> GameLib -> itemData.h buscamos la función y remplazamos: 3.1.Ahora vamos a UserInterface -> PythonItemModule.cpp y comentamos esta linea: 4.Para finalizar vamos a nuestro source de dum_proto ->ItemCSVReader.cpp y buscamos y remplazamos: Y listo, ya tendremos todo funcionando, ejemplo de lo que puedes hacer: Gracias a @caanmasu por orientarme para el fix https://i.gyazo.com/00ee5c60c4d493a058c9737f512198ec.mp4 Iré actualizando todos los días que me sea posible con nuevas cosas. Actualizado 31/03/2020 Actualizado 02/04/2020 Actualizado 03/04/2020 Actualizado 16/04/2020 Actualizado 26/04/2020 Actualizado 18/05/2020 Actualizado 21/05/2020 Actualizado 28/05/2020 Actualizado 05/ 06/2020 Actualizado 20/03/2021 Actualizado 16/09/2023
    1 punto
  33. Bueno con esta interface empeze, y pues dio polemica porque en ese tiempo yo no sabia modificar ni una huella y maso menos con esto aprendi haciendo eso en ese tiempo ni supe quitarle los creditos jajajajaaj ahora me la encontre por ay mirando cosas y muchas personas me piden que contraseña del .rar anterior que no la daba en el post pues lo rebsubo lo acabe de hacer de rapides modifique etc. lo hice porque estoy esperando al sema por un visaje y estaba aburrido y lo medio arregle ; diseño de : ryen pues no siendo mas felices fiestas navideñas y prospero año nuevo y ojala el otro año todos se vuelvan mas gay de lo que son esto fue lo primero que yo hice y eso que solo fue editar =P pd: si van a comentar wbonadas que no van con el post .l. chupemen el culo se ve corrida porque mi pc es mas viejo que el putas y no tiene graficos buenos pero en sus pcs se vera correctamente ademas fue de rapidez que la arregle un poquito y subi ;D Interface Ryen_jfirewall.rar
    1 punto
  34. https://mega.nz/#!0tM3HAiB!SXFIvympTsyo0ZSYDtFvMkVejnGg9g8gU1-6mQf1I04
    1 punto
  35. SzC

    [Aporte] New Items with Effect

    Descarga: https://mega.nz/#!NIZSVATD!LAvK9v93HlbvceK2HWXAapfl09LR9pldl5yFaL57GQY Creditos: board legend
    1 punto
  36. mira creo que es asi vas a account > account > click derecho > design table Imagen: https://ibb.co/JxMWz3T en caso de que no se vea la imagen que subi buscas los siguentes nombres: gold_expire, silver_expire, safebox_expire, autoloot_expire, fish_mind_expire, marriage_fast_expire, money_drop_rate_expire y en cada uno aparece default ahi pones una fecha por ejemplo '2020-09-09 12:40:00' espero que me log
    1 punto
  37. Dilong

    Interface [Solo etc]

    Link: https://mega.nz/#!t8QSVZ5a!Vm4PZ2K0YlyVv4OnVGM0aV5YTZD1aQ6YMXqNEK9qYR0 Foto:
    1 punto
  38. Veo que en este foro no hay ninguna guía de esto y las que he visto en demás sitios están bastante desorganizadas, pues aquí lo dejo. (No está completa, solo con los objetos básicos). 1- Vnum: Número del objeto, ejemplo: Espada +0 (Vnum: 10) +9 (Vnum: 19). 2 y 3 Me los salto porque ya sabemos lo que es. 4- Type: Esto determina que objeto que es: 1: Armas / Flechas. 2: Armadura / Equipamiento. 3: Pociones 5- SubType: Esto determina el tipo de objeto que es, ejemplo: Armas (Campana). Type 1 (Armas / Flechas)/ Subtype: 0 (Espada) 1 (Daga) 2 (Arco) 3 (Lanza) 4 (Campanas) 5 (Abanicos) 6 (Flechas) Type 2 (Armaduras / Equipamiento) / Subtype: 0 (Armaduras) 1 (Cascos) 2 (Escudos) 3 (Brazaletes) 4 (Zapatos) 5 (Collares) 6 (Pendientes). 6- Weight: Es el peso de un objeto (¿?) dejarlo en 0. 7- Size: Son las casillas que ocupa un objeto en tu inventario, si pones 1, pues una casilla. 8-Antiflag: Es para determinar para qué raza será el objeto. Os dejaré un programa de inforge para calcular esto: http://localhostr.co...in2AntiCalc.exe 9- Flag: Identificación del objeto. Valores: 0 (Equipamiento, brazaletes, collares, pendientes...) 1 (Armas y Armaduras) 20 (Pociones) 10- WearFlag: Esto determina el uso de un objeto. Si ponéis 0 no se podrá equipar, por ejemplo. Valores: 1 (Armaduras y Piedras para la armadura) 16 (Armas y Piedras para el arma) 2 (Cascos) 4 (Zapatos) 8 (Brazaletes) 32 (Collares) 256(Escudos) 512(Flechas) 11- InmuneFlag: En todo el item_proto no encontré un item con algún valor aquí. Se dejaría como está. 12- Gold: Esto determina el precio de un objeto a la hora de venderse. 13- Shop_buy_price: Esto determina cuando oro te dan al vender tú el objeto a la tienda. 14- Refined_vnum: Aquí va el objeto que subirá el item que modifiques. 15- Refine_set: Aquí va el id de la tabla refine_proto. (En esa tabla veremos que cada id indica diferentes objetos y costes para subirlo). 16- Refine_set2: Lo mismo que refine_set, pero apuntando a otra tabla. (Por si queréis que pida más objetos). 17- Magic_pct: Aquí irá uno de los siguientes valores: Valores:0 (Objetos de equipamiento que no se pueden equipar) 5 (Este numero se suele dar al equipamiento nuevo y al épico como Tritón)15 (Objetos de equipamiento que si se pueden equipar, el que más usaremos). 18- Limittype0: Esto es por si el objeto se podrá usar a un nivel determinado o no. 19- Limitvalue0: Si habéis puesto en limittype0 un cero, aquí también tendréis que poner 0. Si habéis puesto 1 pues aquí tendréis que poner el nivel que queramos que tenga el objeto. Por ejemplo: Limittype0 = 1 Limitvalue0 = 80 (Se podrá usar al 80) La columna Nº 20 y 21 el numero que se tendrá que poner siempre es 0. 22- Applytype0 / 1 / 2: Aquí irá la identificación de la opción que tendrá el objeto. Y aquí los valores http://metin2zone.ne...s-del-servidor/ 23- Applyvalue0 / 1 / 2: Aquí irá la cantidad del bonus que hayamos añadido en applytype*. 24- Value0 / 1 / 2 / 3 / 4 / 5: Aquí irá en el caso de armas; el mínimo y máximo de ataque físico y mágico del arma. Y en caso de armaduras; la defensa física y mágica de la armadura. Valores: Value0 = 0 (Se deja en cero, no se toca) Value1 = En caso de armas, el mínimo de ataque mágico. En caso de armaduras, la defensa física. Value2 = En caso de armas, el máximo de ataque mágico. En caso de armaduras, 0 (No se toca) Value3 = En caso de armas, el mínimo de ataque físico. En caso de armaduras, la defensa mágica. Value4 = En caso de armas, el máximo de ataque físico. En caso de armaduras, 0 (No se toca) Value5 = Aquí irá la cantidad de puntos que se le suman a un objeto (arma o armadura) a la hora de subirlo en el herrero. Por ejemplo: Si vamos al vnum de la espada del nivel 1 (10/19) veremos que de +0 a +9 en value5 tendrá 7, 14, 21... ¿Vemos que se le suman 7 puntos cada +1 de la espada? y el ataque de esta arma es 13-15, 20-22, 27-29... ¿Vemos que también sube 7 de ataque cada +1? 24- Socket0 / 1 / 2 / 3 / 4 / 5: Esto se deja siempre en -1. 25- Specular: Esto determina el brillo del objeto. De +4 a +9 ya empieza a tener valores. Valores: +4 = 30 +5 = 40 +6 = 50 +7 = 65 +8 = 80 +9 = 100 25- Socket_pct: Esto determina la cantidad de piedras que se le pueden añadir a un objeto, de 0 a 3 si no me equivoco. 26- Addon_type: Esto determina si el objeto llevará media y habilidad. Valores: 0 (No tiene media ni habilidad) -1 (Tiene media y habilidad) Me ha costado un poquito bastante, se agradecen las gracias
    1 punto
  39. Prueba esta aver. Si te funciona esta,
    1 punto
  40. Hola Metin2Zone, soy consciente de que hay muchas guías de cambiar contraseña de mysql. Pero como he visto en el chat de metin2zone, comentarios de que no le funcionan la guía o que no esta bien explicado. Lo que voy hacer es una guía definitiva, de recuperar contraseña o cambiar la contraseña de mysql fácilmente. Nos podemos encontrarnos en los siguientes casos: Caso 1: No se cual es la contraseña del Navicat (mysql) (Nota: En los comandos aparecerá "Break#" este es el hostname, de mi vps y en el directorio que me encuentro, no le hagáis mucho caso, solo tenéis que copiar lo que viene detrás) Break# /usr/local/etc/rc.d/mysql-server stop Pasaremos a parar lo primero de todo la mysql, para así poder editar la contraseña de los usuarios haciendo una entrada forzosa. Break# mysqld_safe --skip-grant-tables & Con este comando lo que hacemos es iniciar el servidor en modo seguro. Conocimiento sobre este comando que estamos haciendo: Break# mysql -u root Entramos a la mysql como usuario root mysql# use mysql; Nos movemos a la database mysql, que es la base de datos del sistema de mysql, donde se almacenan los usuarios que existen en la mysql entre otras cosas. Aquí podemos reemplazar la contraseña que tenia nuestro usuario root, la cual no conocemos, con el siguiente comando: mysql# update user set password=PASSWORD("TUPASSWORD") where user='root'; Ahora saldremos de la mysql: mysql# quit Por último quedaría ya solo arrancar la mysql: Break# /usr/local/etc/rc.d/mysql-server start Hasta aquí, seria el caso que desconozcamos la contraseña del usuario root, también serviría este caso para cambiar la contraseña del usuario root, pero lo veo mucho lío, esto ultimo se ve mucho mejor en el caso 2. Caso 1.1- "En caso de que no hubiésemos tenido éxito en realizar el apartado 1, dejo otras maneras de hacerlo" (AGRADECIMIENTOS A @Xhebas por compartir la idea). Para poder cambiar la clave puedes hacerlo desde la maquina o cambiarla desde el filezila o Winscp y aqui tendras dos opciones de cambiarla. La primera es descargar el rar y añadirlo en la carpeta /var/db/mysql darle permiso 777 a los 3 archivos y antes de hacer reboot cambiar en todos los config el usuario y contraseña PLAYER_SQL: localhost sebas Juan870614 player COMMON_SQL: localhost sebas Juan870614 common LOG_SQL: localhost sebas Juan870614 log Si tienes Notepad++ abres todos los config de todos los ch de la db y del auth y le cambias todos de una. Haces reboot y ya podras entrar a modificarlo ya como tu quieras. user_xhebas.rar Caso 1.2- "En caso de que no hubiésemos tenido éxito en realizar el apartado 1 y 1.1, dejo otras maneras de hacerlo que es muy parecida que el 1.1" Abrimos winscp o filezilla y nos vamos al siguiente directorio: /var/db/mysql/mysql user.rar Descomprimimos el .rar en nuestro pc y subimos los archivos que hay dentro a ese directorio, dirá que si queremos reemplazar, le decimos que si y le damos permisos 777 Por defecto los usuarios que existirán son: root@localhost root@% Ambos usuarios tienen la contraseña: metin2zone Ahora, nos vamos al config de alguno de nuestros channel PLAYER_SQL: localhost root passdelosfiles player Nos fijamos la palabra que tiene detras del usuario ''root'' y esa es la pass de los files. A partir de aquí en vez de cambiar los configs, podemos hacer el Caso 2, y cambiar la pass por la que hay en los configs, que es mucho más rapido, entrando al navicat con el usuario root y pass metin2zone He de recordar que usemos siempre el usuario de ''localhost'' para los files, ya que es más seguro. Caso 2: Conozco la contraseña de mi usuario de mysql pero no se como cambiarla. Este es el mas sencillo, abres el navicat y te logeas. Una vez logeado le damos a user: Y nos saldrán todos los usuarios que existen en nuestra mysql. Seleccionamos el usuario que queramos cambiar la contraseña, en este caso elegiré el usuario Break y le daré a ''Edit User" Ahora la nueva password, la pondremos en Password: y en Confirm Password: Una vez puesta le damos a Save y ya estaría cambiada. Hasta aquí seria el Caso 2. Espero que os haya resultado útil esta guía, me he intentado explicar lo mejor posible para que todo el mundo pueda utilizar la guía, sin tener mucho conocimiento de la materia. Si se os da más caso que tengáis problema con los usuarios de la mysql o algo, decirlo en los comentarios y agrego la solución a esos casos. Por lo pronto solo se me han ocurrido esos dos. ¡Un saludo y hasta la próxima chicos!
    1 punto
  41. Jaggerman

    Galería Jaggerman :v

    #up Nuevo fondo.
    1 punto
  42. Salvatory

    quest estolas

    gracias bro
    1 punto
  43. https://mega.nz/#!IcolgTiT!4m3lYf83bHBa0M0qdL-OAuZiGAq6BjUhxZ3uzFN85L4 toma hermano ahi las subi
    1 punto
  44. Miguelito

    Nuevo Npc Virana!

    Ola les traigo este npc que lo eh visto posteado en Epvp, espero les guste ... Descarga: http://www.elitepvpers.com/forum/attachments/metin2-pserver-guides-strategies/198336d1386419339-release-new-npc-virana-ratedr203_npc_virana.rar Pass: www.tgc-team.com Creditos: tgc.team Fuente:Epvp Saludos!
    1 punto
  45. Vlaad

    IDESIGN ¡Hacemos tu trabajo!

    ¡CLICK AQUÍ PARA IR A NUESTRO FACEBOOK! Bienvenidos a Image Design (IDesign), es un grupo de 2 personas que se ocupan del diseño gráfico. Hacemos todo tipo de cosas como por ejemplo: avatares, logos, biografías, banners, etc... Para hacernos un pedido lo único que tienes que hacer es escribirnos un mensaje en nuestra página de facebook ¡¡CLICK AQUÍ! detallando en la medida de lo posible lo que quieres. El pedido será atendido y acabado entre 24 y 48h dependiendo que no haya muchos pedidos. De momento son totalmente gratis pero habrá algunos diseños y cosas especiales que se cobrarán (no caro, está claro) Recuerda que si te hemos hecho un pedido y te ha gustado puedes dar a compartir y a me gusta como muestra de agradecimiento, ya que no te cobramos nada por hacerlo. Algunos trabajos para servidores de metin2 ya acabados, espero que os guste
    1 punto
  46. Jeo

    (Ayuda)Evoluciones

    http://www.youtube.com/watch?v=zooRdVm1z_4 1 video vale mas que mil palabras.
    1 punto
  47. Hola gente de metin2zone les traigo este npc espero les guste :3 Descarga: http://rapidgator.net/file/71297427/kowal_mark.rar.html Link 2 : http://www31.zippyshare.com/v/67070897/file.html Pd: Si ya esta Borren Virus Total: https://www.virustotal.com/file/982348cf5954cd4fe2b0d55264e77641ce921d6512b7c41818196c04a06544fe/analysis/1358345654/ Fuente: Foro Turco Creditos: mark13
    1 punto
  48. Pathits!

    Drop por quest.

    quest drop_quest begin state start begin when mob.kill or mob.kill or mob.kill begin local suerte = math.random(1,2) local drop = {90020,90021} if suerte == 1 then game.drop_item(drop[1], 1) elseif suerte == 2 then game.drop_item(drop[2],1) end end end end esta quest la realizo Keko a si que tienes que agradecerle a el si te sirvio, para añadir mas mob solo agrega " or mob.kil" --> mob el "code del tiene que ir hay" y para agregar item los pones acá local drop = {90020,90021, xxxx,xxx} y debes agregar esto cada vez que pongas un item en este caso si agregas uno mas seria 3 elseif suerte == 3 then game.drop_item(drop[3],1) así sucesivamente...
    1 punto
  49. Hola a todos, para los que querais meter nuevas quests en vuestros servidores, hoy os dejare esta guia de como hacerlo. *Si durante alguno de estos dos metodos os da un error de librerías, aquí os dejo las librerias para files de 32 bits, y para files de 64 bits. Link resubido de las de 32bits: http://www.4shared.c...as_32_bits.html Link resubido de las de 64 bits: http://www.4shared.c...as_64_bits.html *Lo siento no me fijé que no iban los links Hay 2 metodos: 1- Mediante el make.sh que viene por defecto en los files de metin2 y que para usarlo para cargar una nueva quest tendreis que hacer lo siguiente: - Encendeis vuestro servidor hasta despues de logearos. - Poneis el siguiente comando (o el mismo pero con la ruta en la que este la carpeta quest en vuestros files) cd /home/game/quest - Meteis vuestra nueva quest (por ejemplo logeo.quest) - Ahora abris el archivo locale_list , que puede tener un nombre diferente dependiendo de los files, pero sera algo acabado en (_list). - Al final del archivo, poneis el nombre de vuestra nueva quest, con el .quest incluido (logeo.quest por ejemplo), LE DAIS UN ENTER AL FINAL DEL ARCHIVO, guardais y cerrais. - Ahora solo teneis que volver al bsd, y poner: chmod 777 make.sh && sh make.sh - Una vez hecho eso ya estara cargada vuestra nueva quest. - Inconvenientes de este metodo: Cargais la lista entera de quests. *Si haceis esto con el servidor encendido, poned reload q con vuestro gm y ya estara funcionando la nueva quest. 2- Podéis hacer el método que a mi más me gusta, que es simplemente ir a la carpeta quest (cd /home/game/quest) y una vez allí poner el siguiente comando: ./qc nombredetuquest.quest Y una vez hecho eso ya os cargará la nueva quest. - Ventajas de este metodo: Solo recargas la quest que quieras y no todas como en el make.sh
    1 punto
Esta clasificación está establecida en Madrid/GMT+02:00
×
×
  • Crear nuevo...