Tabla del Honor
Contenido popular
Showing content with the highest reputation on 16/08/21 in Mensajes
-
[APORTE] MultiHack + DMG | Servidores Privados
Leo TheDream and 2 otros reaccionó a Josevasqueez por un tema,
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 -
SF MartySama 4.9.89 r88
markyttt and uno mas reaccionó a [D]ELARO ✓ por un tema,
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 Drive2 puntos -
Algunas imagenes de las estolas DESCARGA: [CLIC EN "ME GUSTA" PARA VER EL ENLACE]2 puntos
-
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.zip2 puntos
-
Servi FILES 1-105
marysol bustamante trauco and uno mas reaccionó a ALEXANDER2020 por un tema,
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 usar2 puntos -
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
-
◄ 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 ► Ocelot26061 punto
-
Letras de metin2
JavierSirenz reaccionó a Yori por un tema,
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.rar1 punto -
[FULL SYSTEM]Estolas Cliente + Source
santos2002 reaccionó a EzekielitohMercury por un tema,
DESCARGA: https://mega.nz/#!3RIE2YIL!0KgIZmztnH7ILc2ydkXde8MiqoSoakXhUmTPCFbn3Fk1 punto -
Crear Server Metin2 + VDI 9.2 + Cliente Semi ES (TODO LO NECESARIO)
Camilo Almonacid A. reaccionó a Freddy Di Maria por un tema,
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 vemos1 punto -
¡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.rar1 punto
-
[FREE] Webdesigns (HTML+CSS+JS+PSD)
luis ricardo porres dias reaccionó a werednnbs por un tema,
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 -
Servi Files Turkmmo update v3
joaosergio pedro reaccionó a ALEXANDER2020 por un tema,
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:turkmmo1 punto -
Sistema switchbot con y sin packets
FaltaUnEdwiin reaccionó a NazoX por un tema,
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 -
podrias probar con algo mas sencillo anda a la ruta del /server/ y haslo todo junto con un gmake all1 punto
-
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
-
[GUIA]COMO PREPARAR FREESBSD EN DIFERENTES VERSIONES
poveda.caraquiz reaccionó a Kenshi Torres por un tema,
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 -
[SERVERFILES] 40k limpios fix + SRC & binario *15 idiomas*
santos2002 reaccionó a 【ℛ-𝓝】ℛ𝔂𝓼𝒆 por un tema,
https://www.mediafire.com/file/q6nbjv0qbzjoawl/libcryptopp.soFreeBSD11.2_32_bit.tar.gz/file Prueba con esa lib...1 punto -
[SERVERFILES] 40k limpios fix + SRC & binario *15 idiomas*
Marcos Pinheiro reaccionó a ChuchoGamer por un tema,
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/Zoira2MMORPG1 punto -
[SERVERFILES] Osmanli2
Metin2Regal reaccionó a 【ℛ-𝓝】ℛ𝔂𝓼𝒆 por un tema,
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: Luigina1 punto -
Mapas de City De todos los Reinos
Marcos Pinheiro reaccionó a ChuchoGamer por un tema,
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!ydCjDJlpz4G66gsQvsjwwvWF3r6H89imYuqvCGTLMps1 punto -
[SERVERFILES] Osmanli2
xcoskunx reaccionó a TTV_RANDARON por un tema,
python para compilar el cliente?1 punto -
Login estupendo para tu interfaz
GreposX reaccionó a themagicfreak por un tema,
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: Elitepvpers1 punto -
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 : mpcforum1 punto
-
[ARMOR]Angel's!.
MikeiXD reaccionó a angeluchiha18 por un tema,
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 -
New -Login/Select/Create - Lysium
Soo reaccionó a ChuchoGamer por un tema,
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#oCjUDMhJxhXir8dwXgxHcOcfa3ggFcBkEBsYys7PqHQ1 punto -
1 punto
-
Creador de Items para files 40k [Dowload]
santos2002 reaccionó a Randaron por un tema,
########################################################################################################## 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 -
[Intro Login] Traducida
[email protected] reaccionó a Anthony's por un tema,
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 -
Akron2 - Ultima actualización 01/12/2020
Marcos Pinheiro reaccionó a XhebasT1an por un tema,
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 refinados1 punto -
Akron2 - Ultima actualización 01/12/2020
Marcos Pinheiro reaccionó a XhebasT1an por un tema,
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 rar1 punto -
Akron2 - Ultima actualización 01/12/2020
Edwin Mejia reaccionó a XhebasT1an por un tema,
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 .on21 punto -
[C++/PY/SCRIPT/CLIENTE MUCHOS FIXS]
Anibal Estela Ramos reaccionó a NazoX por un tema,
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/20231 punto -
Interface Ryen [Diseño]
Night-legionm2.com reaccionó a Jfirewall por un tema,
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.rar1 punto -
https://mega.nz/#!0tM3HAiB!SXFIvympTsyo0ZSYDtFvMkVejnGg9g8gU1-6mQf1I041 punto
-
Descarga: https://mega.nz/#!NIZSVATD!LAvK9v93HlbvceK2HWXAapfl09LR9pldl5yFaL57GQY Creditos: board legend1 punto
-
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 log1 punto
-
Link: https://mega.nz/#!t8QSVZ5a!Vm4PZ2K0YlyVv4OnVGM0aV5YTZD1aQ6YMXqNEK9qYR0 Foto:1 punto
-
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 gracias1 punto
-
[AYUDA] QUEST - server_loop_timer
wille damare reaccionó a NazoX por un tema,
Prueba esta aver. Si te funciona esta,1 punto -
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
-
1 punto
-
1 punto
-
quest estolas
siguaschristofer2332 reaccionó a ♥ TesT ♥ por un tema,
https://mega.nz/#!IcolgTiT!4m3lYf83bHBa0M0qdL-OAuZiGAq6BjUhxZ3uzFN85L4 toma hermano ahi las subi1 punto -
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
-
¡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 guste1 punto
-
(Ayuda)Evoluciones
Teo García reaccionó a Jeo por un tema,
http://www.youtube.com/watch?v=zooRdVm1z_4 1 video vale mas que mil palabras.1 punto -
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: mark131 punto
-
Drop por quest.
wille damare reaccionó a Pathits! por un tema,
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 -
[TIP] Meter nuevas Quests.
Christofer Siguas reaccionó a KeKo por un tema,
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.sh1 punto