Jump to content

yagokurt

Miembro
  • Contador contenido

    16
  • Ingreso

  • Última visita

Actividad de reputación

  1. Me Gusta
    yagokurt reacted to EzekielitohMercury in Python Script loader v0.1   
    Nose si esta posteado pero se los dejo
     


     
    Creditos
    Pasha37
     
    DESCARGA

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
  2. Me Gusta
    yagokurt reacted to Shogun in [COSTUMES]Carnaval   
    Evento de Carnaval Metin2 Brasil, a ver si dais un poco de información que alguien se ha tomado su trabajo para hacerlo.
  3. Me Gusta
    yagokurt reacted to Shang in Nuevos trajes listos para la instalación   
    Son del essential.
  4. Me Gusta
    yagokurt reacted to PACI in [Guia] Crear diffs   
    Hola.
    Como sabéis, ahora que el source es publico, ya nadie, o casi nadie, hará, ni posteará, más diffs para editar vuestros cores.
    Este es uno de los motivos por los cuales hago escribo esta guia, el otro es para dar a la comunidad hispana un poco más de conocimiento, aunque no sea mucho.
     
    Que se necesita para hacer diffs?
    Hay quién diga que necesitas saber ASM (assembly), C, y esas cosas. Aunque, yo no sé ninguno de los 2, y creaba diffs.
    Lo que más necesitamos es un brain.exe, como se suele decir, paciencia, y el
    Debes iniciar sesión para ver el contenido del enlace en esta publicación. y un Debes iniciar sesión para ver el contenido del enlace en esta publicación..  
    Antes de ponernos a toquetear en el IDA, debemos, antes de nada, saber una cosa.
     
    Qué es un diff?
    Un diff (difference file) es un archivo que contiene, de una manera simplificada, una (o varias) linea(s) que altera(n) un (o más) bytes de un archivo.
    La sintaxis es: offset: byte antiguo byte nuevo.
    La creación de un diff no es propriamente un problema, ya que el IDA, dependiendo de lo que hayamos modificado, lo crea solo.
    Y a través de un diff no puedes saber lo que cambia.
     
    Después de saber que és un diff, y para que sirve, tenemos que saber qué es lo que queremos cambiar, y donde se localiza, yo, para eso, usaba el Pseudocode de un game core o db core para buscar lo que queria cambiar, obviamente para esto necesitamos el brain.exe, porque tenemos que entender la sintaxis del codigo que hay por ahí. Os dejaré en adjuntos, todos los pseudocodes de todos los game core y db core que tengo
     
    Vale, ahora qué hago?
    Yo, para empezar, cogeré el pseudocode del game r40250 y cambiaré... por ejemplo, el nível de diferencia que se necesita para invitar a alguién en un grupo.
     
    Como empezamos?
    Hay que saber un poquito de inglés, porque las variables no están escritas en español. Lo que sabemos es que grupo se puede decir party en inglés. Una vez sepamos eso, empezaremos buscando party en nuestro editor de texto (yo uso Notepad++ para esto, vosotros podéis usar algun otro), lo segundo es saber, cuando sucede la acción, o sea, cuando sale el mensajito ese en el chat diciendo que la diferencia de nível es X. Sabemos también que eso pasa cuando invitamos a alguién, invitar en inglés es invite. Entonces ya sabemos que tenemos que buscar algo como PartyInvite.
     
    Cuando encontremos algo de este tipo:
    extern char CHARACTER__PartyInvite_CHARACTER______FUNCTION__[12]; // weak Entonces lo que hacemos es buscar esa función. Ojo, apenas buscamos por CHARACTER__PartyInvite.
     
    Y por fin, encontraremos la función CHARACTER__PartyInvite:
    int __fastcall CHARACTER__PartyInvite(int a1, int a2, int a3, int a4){  int v4; // eax@4  int v5; // edx@4  int v6; // ecx@4  int v7; // ebx@6  int v8; // eax@6  int v9; // eax@7  int result; // eax@8  int v11; // eax@10  int v12; // eax@15  int v13; // eax@22  int v14; // eax@23  int v15; // edx@23  int v16; // ecx@23  int v17; // edi@23  int v18; // eax@23  int v19; // edx@25  int v20; // ecx@25  int v21; // [sp+0h] [bp-48h]@3  int v22; // [sp+0h] [bp-48h]@6  int v23; // [sp+20h] [bp-28h]@23  int v24; // [sp+24h] [bp-24h]@23  _BYTE v25[5]; // [sp+2Bh] [bp-1Dh]@29  int v26; // [sp+30h] [bp-18h]@23  int v27; // [sp+34h] [bp-14h]@22  int v28; // [sp+38h] [bp-10h]@1  v28 = *(_DWORD *)_stack_chk_guard__FBSD_1_0;  if ( *(_DWORD *)(a3 + 9328) && CParty__GetLeaderPID(a1, a2, *(_DWORD *)(a3 + 9328)) != *(_DWORD *)(a3 + 256) )  {   v21 = (int)&unk_848D8B8;LABEL_4:   v4 = locale_find(v21);   CHARACTER__ChatPacket(a3, 1, (const char *)v4);  }  else  {   if ( *(_BYTE *)(a4 + 9104) & 2 )   {   v8 = CHARACTER__GetName(a4);   v22 = (int)&unk_848D8E8;   v7 = v8;LABEL_7:   v9 = locale_find(v22);   CHARACTER__ChatPacket(a3, 1, (const char *)v9, v7);   }   else   {   v11 = CHARACTER__IsPartyJoinableCondition(a3, a4);   if ( (unsigned int)v11 <= 0xA )   {   switch ( v11 )   {   default:   goto LABEL_11;   case 10:   v21 = (int)&unk_848D868;   goto LABEL_4;   case 8:   v21 = (int)&unk_848D4C0;   goto LABEL_4;   case 7:   v12 = CHARACTER__GetName(a4);   v22 = (int)"<ÆÄƼ> ÀÌ¹Ì %s´ÔÀº ÆÄƼ¿¡ ¼ÓÇØ ÀÖ½À´Ï´Ù.";   v7 = v12;   goto LABEL_7;   case 6:   v21 = (int)&unk_848D480;   goto LABEL_4;   case 5:   v21 = (int)&unk_848D440;   goto LABEL_4;   case 4:   v21 = (int)&unk_848D404;   goto LABEL_4;   case 3:   v21 = (int)&unk_848D3D0;   goto LABEL_4;   case 2:   v21 = (int)&unk_848D39C;   goto LABEL_4;   case 1:   v21 = (int)&unk_848D368;   goto LABEL_4;   case 0:   v27 = *(_DWORD *)(a4 + 256);   v13 = std___Rb_tree_unsigned_int_std__pair_unsigned_int__const_boost__intrusive_ptr_event___std___Select1st_std__pair_unsigned_int__const_boost__intrusive_ptr_event____std__less_unsigned_int__std__allocator_std__pair_unsigned_int__const_boost__intrusive_ptr_event______find(   a3 + 9340,   (int)&v27);   v5 = a3 + 9344;   if ( a3 + 9344 == v13 )   {   v14 = AllocEventInfo_TPartyJoinEventInfo_();   *(_DWORD *)(v14 + 4) = *(_DWORD *)(a4 + 256);   *(_DWORD *)(v14 + 8) = *(_DWORD *)(a3 + 256);   event_create_ex(&v26, (int)party_invite_event, v14, 10 * passes_per_sec);   v17 = v26;   v18 = *(_DWORD *)(a4 + 256);   v24 = v26;   v23 = v18;   if ( v26 )   intrusive_ptr_add_ref(v16, v15, v26);   std___Rb_tree_unsigned_int_std__pair_unsigned_int__const_boost__intrusive_ptr_event___std___Select1st_std__pair_unsigned_int__const_boost__intrusive_ptr_event____std__less_unsigned_int__std__allocator_std__pair_unsigned_int__const_boost__intrusive_ptr_event_______M_insert_unique(   a3 + 9340,   (int)&v23);   if ( v24 )   intrusive_ptr_release(v20, v19, v24);   if ( v17 )   intrusive_ptr_release(v20, v19, v17);   v25[0] = 77;   *(_DWORD *)&v25[1] = *(_DWORD *)(a3 + 260);   DESC__Packet(*(_DWORD *)(a4 + 44), (int)v25, 5);   }   break;   }   }   else   {LABEL_11:   sys_err((int)"PartyInvite", 4558, "Do not process party join error(%d)", v11);   }   }  }  result = *(_DWORD *)_stack_chk_guard__FBSD_1_0 ^ v28;  if ( *(_DWORD *)_stack_chk_guard__FBSD_1_0 != v28 )   __stack_chk_fail(v6, v5);  return result;} Ahora a partir de aquí, hay que saber leer. Vayamos por partes:
    LABEL_4:   v4 = locale_find(v21);   CHARACTER__ChatPacket(a3, 1, (const char *)v4); LABEL_7:   v9 = locale_find(v22);   CHARACTER__ChatPacket(a3, 1, (const char *)v9, v7); LABEL_4 y LABEL_7 tienen un locale_find y un ChatPacket, lo que significa que buscará en el locale_string.txt un texto que estará dentro del locale_find y luego lo mostrará en el Chat.
     
    Pasemos directamente al switch:
      v11 = CHARACTER__IsPartyJoinableCondition(a3, a4);   if ( (unsigned int)v11 <= 0xA )   {   switch ( v11 )   {   default:   goto LABEL_11;   case 10:   v21 = (int)&unk_848D868;   goto LABEL_4;   case 8:   v21 = (int)&unk_848D4C0;   goto LABEL_4;   case 7:   v12 = CHARACTER__GetName(a4);   v22 = (int)"<ÆÄƼ> ÀÌ¹Ì %s´ÔÀº ÆÄƼ¿¡ ¼ÓÇØ ÀÖ½À´Ï´Ù.";   v7 = v12;   goto LABEL_7;   case 6:   v21 = (int)&unk_848D480;   goto LABEL_4;   case 5:   v21 = (int)&unk_848D440;   goto LABEL_4;   case 4:   v21 = (int)&unk_848D404;   goto LABEL_4;   case 3:   v21 = (int)&unk_848D3D0;   goto LABEL_4;   case 2:   v21 = (int)&unk_848D39C;   goto LABEL_4;   case 1:   v21 = (int)&unk_848D368;   goto LABEL_4;   case 0:   v27 = *(_DWORD *)(a4 + 256);   v13 = std___Rb_tree_unsigned_int_std__pair_unsigned_int__const_boost__intrusive_ptr_event___std___Select1st_std__pair_unsigned_int__const_boost__intrusive_ptr_event____std__less_unsigned_int__std__allocator_std__pair_unsigned_int__const_boost__intrusive_ptr_event______find(   a3 + 9340,   (int)&v27);   v5 = a3 + 9344;   if ( a3 + 9344 == v13 )   {   v14 = AllocEventInfo_TPartyJoinEventInfo_();   *(_DWORD *)(v14 + 4) = *(_DWORD *)(a4 + 256);   *(_DWORD *)(v14 + 8) = *(_DWORD *)(a3 + 256);   event_create_ex(&v26, (int)party_invite_event, v14, 10 * passes_per_sec);   v17 = v26;   v18 = *(_DWORD *)(a4 + 256);   v24 = v26;   v23 = v18;   if ( v26 )   intrusive_ptr_add_ref(v16, v15, v26);   std___Rb_tree_unsigned_int_std__pair_unsigned_int__const_boost__intrusive_ptr_event___std___Select1st_std__pair_unsigned_int__const_boost__intrusive_ptr_event____std__less_unsigned_int__std__allocator_std__pair_unsigned_int__const_boost__intrusive_ptr_event_______M_insert_unique(   a3 + 9340,   (int)&v23);   if ( v24 )   intrusive_ptr_release(v20, v19, v24);   if ( v17 )   intrusive_ptr_release(v20, v19, v17);   v25[0] = 77;   *(_DWORD *)&v25[1] = *(_DWORD *)(a3 + 260);   DESC__Packet(*(_DWORD *)(a4 + 44), (int)v25, 5);   }   break;   }   }   else   {LABEL_11:   sys_err((int)"PartyInvite", 4558, "Do not process party join error(%d)", v11);   } Como veremos, la variable v11 está obteniendo el valor de una otra función, llamada CHARACTER__IsPartyJoinableCondition.
    Entonces, lo que el servidor hará es testear ese valor desde la función switch.
      switch ( v11 )   {   default:   goto LABEL_11; Si esa variable es false dependiendo de los valores encontrados en los case, entonces irá hasta el LABEL_11, que es un error en syserr:
    LABEL_11:   sys_err((int)"PartyInvite", 4558, "Do not process party join error(%d)", v11); Si esa condición es verdadera, hará una serie de cosas.
     
    Entonces ya sabemos que, lo que sale en el chat dependerá:
    - Del valor de la variable v11, o sea, el valor que la función CHARACTER__IsPartyJoinableCondition obtiene. Ahora que sabemos esto, vayamos directos a esa función.
    int __cdecl CHARACTER__IsPartyJoinableCondition(int a1, int a2){  int v2; // edx@1  int result; // eax@2  v2 = a2;  if ( *(_BYTE *)(a1 + 9797) == *(_BYTE *)(a2 + 9797) )  {   if ( *(_DWORD *)_stack_chk_guard__FBSD_1_0 == *(_DWORD *)_stack_chk_guard__FBSD_1_0 )   return CHARACTER__IsPartyJoinableMutableCondition(a1, a2, a1, a2);LABEL_6:   __stack_chk_fail(a1, v2);  }  v2 = *(_DWORD *)_stack_chk_guard__FBSD_1_0 ^ *(_DWORD *)_stack_chk_guard__FBSD_1_0;  result = 10;  if ( *(_DWORD *)_stack_chk_guard__FBSD_1_0 != *(_DWORD *)_stack_chk_guard__FBSD_1_0 )   goto LABEL_6;  return result;} De aqui no podemos sacar grandes conclusiones, pero, sabemos una cosa:
      if ( *(_DWORD *)_stack_chk_guard__FBSD_1_0 == *(_DWORD *)_stack_chk_guard__FBSD_1_0 )   return CHARACTER__IsPartyJoinableMutableCondition(a1, a2, a1, a2); Esta funcion hará return al valor de una otra función. Debemos entonces, movermos hasta esa función, CHARACTER__IsPartyJoinableMutableCondition.
    int __fastcall CHARACTER__IsPartyJoinableMutableCondition(int a1, int a2, int a3, int a4){  int v4; // edx@1  char v5; // al@4  __int64 v6; // qax@5  int result; // eax@7  int v8; // eax@10  int v9; // [sp+1Ch] [bp-Ch]@1  v4 = 1;  v9 = *(_DWORD *)_stack_chk_guard__FBSD_1_0;  if ( *(_BYTE *)(singleton_CPartyManager___ms_singleton + 76) )  {   LOBYTE(v4) = 2;   if ( !*(_DWORD *)(a3 + 9364) )   {   LOBYTE(v4) = 3;   if ( !*(_BYTE *)(a4 + 4) )   {   v5 = LC_IsCanada(a1);   a1 = 15;   if ( !v5 )   a1 = (unsigned __int8)LC_IsBrazil(15) < 1u ? 30 : 10;   v6 = *(_BYTE *)(a3 + 1298) - *(_BYTE *)(a4 + 1298);   LODWORD(v6) = (HIDWORD(v6) ^ v6) - HIDWORD(v6);   v4 = 4;   if ( a1 >= (_DWORD)v6 )   {   LOBYTE(v4) = 7;   if ( !*(_DWORD *)(a4 + 9328) )   {   if ( !*(_DWORD *)(a3 + 9328)   || (v8 = CParty__GetMemberCount(a1, v4, *(_DWORD *)(a3 + 9328)), v4 = 8, v8 != 8) )   v4 = 0;   }   }   }   }  }  result = v4;  if ( *(_DWORD *)_stack_chk_guard__FBSD_1_0 != v9 )   __stack_chk_fail(a1, *(_DWORD *)_stack_chk_guard__FBSD_1_0 ^ v9);  return result;} La primera cosa en lo que nos fijaremos es en esto:
      v5 = LC_IsCanada(a1);   a1 = 15;   if ( !v5 )   a1 = (unsigned __int8)LC_IsBrazil(15) < 1u ? 30 : 10; La variable v5 será igual a un boolean (true o false), a1 es un integer (un valor entre 0 a 2 millones). Lo que la función hace, es verificar si la variable v5 es false, si así es, el valor de la variable a1 cambia, dependiendo del locale, ya que si este es un locale/brazil el a1 será 10.
    a1 = (unsigned __int8)LC_IsBrazil(15) < 1u ? 30 : 10; Esto es lo que se llama, un short if-statement:
    a1 = boolean ? valor si es true : valor si es false;
     
    Como el nivel de diferencia en los servidores de europa es 15, podemos concluir que la variable a1 define el nivel de diferencia y es el valor que queremos cambiar.
     
     
    Toqueteando en el IDA
     
    Después de saber que valor tenemos que cambiar, y donde está, abrimos el IDA:

     
    Y le damos al primer botón (New - Disassemble a new file), seleccionamos nuestro archivo, en mi caso el game r40250, y nos aparecerá algo de este tipo:

     
    Nosotros, sin tocar en nada, le damos al OK. Y esperamos hasta que cargue las funciones.
     
    Cuando nos salga algo así:

     
    Significa que las funciones ya están cargadas.
    Ahora le hacemos click en la ventana Function name y escribimos: CHARACTER::IsPartyJoinableMutableCondition y le damos un doble click.
     

     
     
    Nosotros simplemente bajamos hasta aqui:

     
    Si le damos al botón de tabulación, nos llevará al pseudocode de esa función y, además, nos dejará en la localización actual, por ejemplo:
    call   _Z11LC_IsCanadav ; LC_IsCanada(void)mov ecx, 0Fhtest   al, aljz   short loc_806E8B0 Si hacemos click en el mov y hacemos un jump to pseudocode nos llevará hasta:
    a1 = 15; Yo, como no sé cambiar los valores de los short if-statements, haré NOP (No Operation, que simplemente hace que en esa parte no haga nada).
     
    Entonces, nos moveremos al Hex View y podremos ver que la parte que está seleccionada, es la parte que hemos seleccionado en el IDA View.
    Nos vamos a la ventana donde está el LC_IsCanada:
    .text:0806E83A jnz short loc_806E878.text:0806E83C call   _Z11LC_IsCanadav ; LC_IsCanada(void).text:0806E841 mov ecx, 0Fh.text:0806E846 test   al, al.text:0806E848 jz   short loc_806E8B0 El short jump if not zero (jnz) si le damos click y vamos al pseudo, veremos que está demasiado arriba del if-statement.
    El call al LC sabemos que es una variable
    El mov es la variable que queremos cambiar.
    El test es el if-statement.
    El jump if zero (jz) basicamente es lo que va después de la condición.
     
    Entonces lo que tenemos que hacer, es NOP al jz y al test.
     
    Como?
    Facil, seleccionamos lo que queremos cambiar:

     
    Nos vamos al Hex View le damos al F2, y cambiamos los 2 valores que salen seleccionados por 90. Ya que el No Operation (NOP) equivale a 90. Volvemos a darle al F2 para guardar los cambios.
    Y luego, hacemos lo mismo con el jz.
     
    Que hemos echo entonces?
    Basicamente, lo que hicimos hasta ahora, es dejar el nivel de diferencia entre jugadores para que se inviten sea de 15, ya que el if define todo lo demás, dependiendo del locale.
    Si queremos cambiar el 15 por otro, facil. Vamos hasta:
    mov ecx, 0Fh
     
    Luego al Hex View, entonces abrimos el
    Debes iniciar sesión para ver el contenido del enlace en esta publicación., ponemos 15 donde el 1, y le damos click a to hexadecimal, que nos saldra un f, o sea 15 en hexadecimal equivale a 0F. Buscaremos eso en el Hex View, le damos al F2. Volvemos al conversor, y convertimos el valor que queremos poner a cambio de 15. Yo por ejemplo, pondré 5 que es 05. Le daré al F2 otra vez para guardar los cambios.
     
    Entonces si vuelvo al pseudo me saldrá:
      v5 = LC_IsCanada(a1, v4);   a1 = 5; En vez de:
      v5 = LC_IsCanada(a1, v4);   a1 = 15; Eso es porque hemos cambiado el 15 por 5 en el Hex View.
     
     
    Por fin, como creamos la diff después de cambiar lo que queramos?

     
     
    Y mi diff me saldrá así:
    This difference file has been created by IDA Progame_r4025000026842: 0F 05 // Esto es el cambio de la variable a1, de 15 a 5// Estos NOP es de la condición que hemos "eliminado"00026846: 84 9000026847: C0 9000026848: 74 9000026849: 66 90 Y por último os dejo aqui los pseudocode que tengo:
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
  5. Me Gusta
    yagokurt got a reaction from CristianoRonaldo7 in [RELEASE] Atuendo de Guerreiro Conejo Fixed   
    Buenas, encontre un pequeno bug en el traje de conejo de guerrero y entonces mi companera decidiu rehacer el modelo. Dejare la descarga del modelo ya arreglado. Solo necesita poner en el epk "metin2_patch_easter1" y en la carpeta de guerrero "ymir workpcwarrior" y esto es todo.
     

     
    VT: 
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    Download: 
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.!d2GGY_mvQA3y-gOftFfbuTBip42mv_Hhccbp5pW_pXM
  6. Me Gusta
    yagokurt got a reaction from Shogun in [RELEASE] Atuendo de Guerreiro Conejo Fixed   
    Buenas, encontre un pequeno bug en el traje de conejo de guerrero y entonces mi companera decidiu rehacer el modelo. Dejare la descarga del modelo ya arreglado. Solo necesita poner en el epk "metin2_patch_easter1" y en la carpeta de guerrero "ymir workpcwarrior" y esto es todo.
     

     
    VT: 
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    Download: 
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.!d2GGY_mvQA3y-gOftFfbuTBip42mv_Hhccbp5pW_pXM
  7. Me Gusta
    yagokurt reacted to PACI in Nueva Funcion: write_or_read   
    Hola.
    Bueno, ultimamente anduve trabajando mucho con la edición de archivos por quest, y decidi hacer una función que vamos, me reduce muchísimo el trabajo.
     
    La función es: write_or_read(path, file, act, text, line)
     
    Que sirve para escribir, reescribir y leer un archivo, o leer una línea especifica de un archivo.
     
    Notas:
    Ruta del archivo;
    Nombre del archivo;
    Acción;
    Texto;
    Línea.
     
    Las acciónes:
    Como os dije, esta función puede leer o escribir en un archivo, para eso en act se pone lo que se quiere que haga:
     
    - Para leer se puede usar:
    leer, read, l (L minusculo) u r.
     
    La Acción que queréis tomar hace influenciar a lo que tengáis que poner en text, si queréis leer el contenido de un archivo, obviamente no vais a colocar ahí ningun texto.
    Así que, la función de leer se divide en otras 3 funciones:
     
    -> Leer la primera línea; (line, linea, o l)
    -> Leer el archivo entero; (all, todo, o entero)
    -> Leer una línea específica*. (sline, lineas, o ls) -> sline = specific line; lineas = linea especifica.
     
    *Para leer una línea específica hay que colocar, como último argumento de la función el número de la línea que hay que leer.
     
    - Para escribir se puede usar 2 tipos:
    1. sobreescribir, rewrite, s u re.
    2. escribir, write, e, a+
     
    Lo que hace cada uno es muy simple, el 1. hace que borre el contenido del archivo y escriba de nuevo el texto que habéis puesto. El 2. apenas lo adiciona.
     
    Nota: No se necesita el último argumento, line, para escribir.
     
    Otros:
    Para tener menos trabajo aún, hice que, si el directório o el archivo seleccionados no existan, se creen solos.
    Las tabulaciones en el texto se hacen donde siempre, en el botóncito que está encima del caps lock. Pero para hacer un cambio de línea, hay que escribir __enter__.
     
    Ejemplos:
     
    --> Escribiendo:
     
     
     
    --> Leyendo:
     
     
     
    Y por fin, la función, que hay que colocarla en el questlib.lua:

    function write_or_read(path, file, act, text, line) local type_ if os.execute('cd '..path) ~= 0 then os.execute('mkdir '..path) elseif os.execute('[ -f '..path..'/'..file..' ] && echo "s" || echo "n"') == 'n' then os.execute('cd '..path..' && touch '..file) end if act == 'leer' or act == 'read' or act == 'l' or act == 'r' then type_ = 'r' elseif act == 'sobreescribir' or act == 'rewrite' or act == 's' or act == 're' then type_ = 'w' elseif act == 'escribir' or act == 'write' or act == 'e' or act == 'a+' then type_ = 'a+' end local f = io.open(path..'/'..file, type_) if type_ == 'r' then if text == 'all' or text == 'todo' or text == 'entero' then return f:read('*all') elseif text == 'line' or text == 'linea' or text == 'l' then return f:read('*l') elseif text == 'sline' or text == 'lineas' or text == 'ls' then local ltable = {} for i in f:lines() do table.insert(ltable, i) end f:close() return ltable[line] end elseif type_ == 'a+' or type_ == 'w' then if string.find(text, '__enter__') ~= 0 then f:write(string.gsub(text, '__enter__', 'n', string.find(text,'__enter__'))..'n') else f:write(text..'n') end f:close() endendSaludos
  8. Me Gusta
    yagokurt reacted to PACI in [Encriptacion]Esconder ficheros en el launcher!   
    La razon de porque yo no lo publiqué es porque el molebox no vale la pena xd.
  9. Me Gusta
    yagokurt reacted to Serex in Bloquear paises en FreeBSD   
    Hola chicos aquís os dejo una interesante guía para bloquear países en FreeBSD.
     
    Debeis tener instalando el PF.
    Y en nuestro pf.conf ponemos:
    ext_if="em0"table <cn-block> persist file "/etc/paises.txt"block in log quick on $ext_if from <cn-block> to anyblock out log quick on $ext_if from any to <cn-block> En /etc creamos una tabla con las ips del pais/paises que quieres bloquear. Las ips las obtenemos de esta lista:

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
  10. Me Gusta
    yagokurt reacted to Kratosxx in Coleta ninja   
    Un peinado de ninja femenino
     

    Descarga:  Debes iniciar sesión para ver el contenido del enlace en esta publicación.
  11. Me Gusta
    yagokurt reacted to Serex in Zrun Mapa + Quest + Regen + Objetos   
    Hola chicos, el otro día me pase bastante tiempo buscando la antigua dungeon Zrun. La encontre y os la quiero compartir por si alguno de vosotros tambien la buscaba.
     
    La descarga incluye el mapa, los regens para la quest y la quest. (Esta en alemán) No tuve tiempo a traducirla aún.
     
    Aqui os dejo un par de imagenes para que veais como es:
     
     
     

     
    Descarga: 
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
  12. Me Gusta
    yagokurt reacted to stein20 in Fixx 3e2df400 mismatch 0xaf != 0x0 header 254   
    Hola a todos aca les dejo la solucion para este error comun en casi todos los serve files
     
    SYSERR: Jan 8 14:07:42 :: Process: SEQUENCE 3e2df400 mismatch 0xaf != 0x0 header 254
    SYSERR: Jan 8 14:07:42 :: Process: SEQUENCE_LOG [uNKNOWN]-------------
     
     
    bueno ahora lo se hace lo siguiente:
     
    Abren el navicat luego entran a log
    seleccionan la tabla command_log. das clic derecho desing table
     
    hay te saldra una ventana y buscas las funciones que viene varchar
     
    que son : username y command
     
    buscas la columna length y aumentas el valor a 50 quedando algo asi
     
     
    username varchar 50 0
    command varchar 50 0
     
    luego dan a save reboot o /reload p en el juego y listo solucionado ese error en el sysserr
     
    suerte y muchas gracias por los agradecimientos e.e¡
  13. Me Gusta
    yagokurt reacted to Kratosxx in Dos peinados para metin2   
    Ola gente hoy os traigo un peinado q sirve para las cuatro razas masculinas xD se trata del peinado de rock lee de naruto.
     

     
     
    La descarga: 
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
     
    Otros peinados q posteare proximamente.
     
    Orochimaru. Debes iniciar sesión para ver el contenido del enlace en esta publicación.
    Kabuto. Debes iniciar sesión para ver el contenido del enlace en esta publicación.
    Tobi con mascara blanca. Debes iniciar sesión para ver el contenido del enlace en esta publicación.
    Zabuza. Debes iniciar sesión para ver el contenido del enlace en esta publicación.
    Peinado Cresta V2.  Debes iniciar sesión para ver el contenido del enlace en esta publicación.
    Peinado Itachi V2. Debes iniciar sesión para ver el contenido del enlace en esta publicación.
    Peinado kisame + Arma. Debes iniciar sesión para ver el contenido del enlace en esta publicación.
     
    Peinado Choper de One Pice 
     

     
    Descarga: 
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
     
    Si hay algún Problema agregarme a mi skype Kratosxx 
    Bye =)
  14. Me Gusta
    yagokurt reacted to Serex in Metin2 Map Pointer   
    Bueno chicos viendo que este programa se perdió y lo tenia olvidado e el pc, decidí resubirlo ya que es bastante útil.
    Sirve para poblar mapas su uso es bastante sencillo, solo teneis que abrir la carpeta del mapa descompilado con el programa y empezar a poblar.
     

     
    Descargas:
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
  15. Me Gusta
    yagokurt reacted to KeKo in [Guia Definitiva] Implementar Armaduras   
    Buenas zoneros y zoneras sé que esto es mucho textos para algunos pero si teneis dudas implementando armors os recomiendo que hagais un esfuerzo y la leais entera, y si copias esta guia a otros foros por favor respetad los créditos.
     
    Después de un tiempo el foro off se me ocurrio hacer una guía útil como regalo de perdón por el tiempo que estuvo el foro indispuesto y como sé que mucha gente tiene problemas a la hora de implementar armaduras y las guías actuales no explican todo lo relativo a la implementacion de armaduras en un único post pues me voi a poner a explicaros como implementar armaduras sin morir en el intento:
     
    1 - Antes de nada: Qué es una armadura de metin2?
     
    Creo que la respuesta es muy obvia: una armadura es eso que se pone por encima del cuerpo el pj. Hasta aquí bien, pero a lo que me refiero es a que archivos forman una armadura?
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    A la hora de implementar un armor nos vamos a encontrar con dos tipos de archivos:
     
    1.1 - Los archivos gr2:
     
    Un modelo de una armadura será siempre un archivo gr2, que es el que contiene la armadura en sí
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    1.2 - Las texturas:
     
    Cada armadura tiene su propia textura, que es el archivo que permite que veamos los colores de la armadura tal y como tienen que ser. Las texturas que se utilizan en los clientes de metin2 suelen ser de estos tres formatos: .jpg .tga o .dds
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
     
    2 - Vale, ya sé que archivos necesito. Qué hago con ellos?
     
    Las armaduras se implementan por defecto en la ruta d:/ymir work/pc, que corresponde en el cliente al pc.eix y pc.epk, si son de:
     
    + Guerrero hombre
    + Sura hombre
    + Ninja mujer
    + Chamán mujer
     
    Las armaduras se implementan por defecto en la ruta d:/ymir work/pc2, que corresponde en el cliente al pc.eix y pc.epk, si son de:
     
    + Guerrera mujer
    + Sura mujer
    + Ninja hombre
    + Chamán hombre
     
    Segun la raza hay cuatro carpetas estandar:
     
    + Warrior - guerrero
    + Assasssin - ninja
    + Sura - sura
    + Shaman - chamán
     
    Por lo tanto deberemos meter nuestro modelo gr2 en la carpeta pc/pc - warrior/sura/assasin/shaman dependiendo de la raza y el sexo para el que sea.
     
    Sin embargo, las texturas de las armors que implementamos pueden no ir en la misma ruta que el modelo en sí. Para ello debemos abrir el gr2 con el granny model viewer
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    Una vez hecho pincharemos donde pone texture inspection y ahi nos fijaremos en la ruta que pone donde dice texture:
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    En esta imagen que os acabo de poner, al ser un armor de guerrero masculino la textura va en la carpeta d:/ymir work/pc/warrior.
     
    Sin embargo, esa ruta no es siempre la misma, ya que la gente a veces pone otras rutas:
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    Como veis la ruta está cambiada Pero no os preocupeis esto tiene muy fácil solucion, debemos crear en la carpeta de nuestro descompilador una carpeta con ese nombre del siguiente modo:
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    Una vez hecha metemos dentro la textura del armor problematica quedando la ruta en nuestro ordena de este modo:
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
     
     
     
    Y cuando hagais el xml del armor tendreis que poner esa ruta:
     

    <File archivedPath="d:/ymir work/textures/minoarmorset/nombretextu.dds" type="0"><![CDATA[nombreepk_descompilado\ymir work\textures\minoarmorset\nombretextu.dds]]></File> Haciendo xmls:
     
    Doi por sentado en esta guía que ya sabeis hacer los xmls para un armor:
     

    <File archivedPath="d:/ymir work/pc/warrior/warrior_4-1.gr2" type="0"><![CDATA[PC_descompilado\ymir work\pc\warrior\warrior_4-1.gr2]]></File> Pero, si no sabeis, un xml se compone de dos partes:
     

    File archivedPath="d:/ymir work/pc/warrior/warrior_4-1.gr2" Esta es la ruta en la que el juego meterá el modelo o la textura (o cualquier otro archivo) que estemos implementando. Si ahi pone d:/ymir work/pc/warrior esa será la ruta a la que vaya el archivo llamado warrior_4-1.gr2.
     

    [CDATA[PC_descompilado\ymir work\pc\warrior\warrior_4-1.gr2]] Esta segunda parte contiene la ruta en nuestro ordenador en la que se encuentra el modelo. Lo más habitual es que la pongamos de estas maneras, dependiendo de la raza y sexo del armor:
     

    nombreepk_descompilado\ymir work\pc nombreepk_descompilado\ymir work\pc2 nombreepk_descompilado\ymir work\pc\warrior nombreepk_descompilado\ymir work\pc2\warrior Sin embargo, tanto la primera parte como la segunda pueden editarse:
     

    File archivedPath="d:/ymir work/item/kekomola/armorkeko.gr2
    [CDATA[Desktop\guia_armors\armorkeko.gr2 Como veis, la ruta en la que yo quiero meter el armor puede no ser pc o pc2 (algunas armors van en otras) y no tengo xq tener el archivo dentro de la carpeta del descompilador en una carpeta con el nombre ymir work y luego otra con el nombre pc y tal.
     
    Sin embargo, os recomiendo que lo hagais de esta manera, pa evitaros lios de: Dónde estaba el armor?
     

    [CDATA[PC_descompilado\ymir work\pc\warrior\warrior_4-1.gr2]] Y además si usais una ruta que no sea ymir work/pc o pc2 como en este caso:
     

    File archivedPath="d:/ymir work/item/kekomola/armorkeko.gr2 Luego tendreis que añadir la linea de abajo en el msm del armor, aunque eso lo explicare cuando lleguemos a los msms:
     

    SpecialPath Una vez hayais metido vuestros modelos y texturas en sus rutas correspondientes y hayas compilado los epks necesarios podemos pasar al siguiente paso:
     
    3 - La gente habla mucho de los ms... um... msalgo.... como eran?
     
    Bueno, una vez tenemos nuestra armor ya implementada llega la hora de hacerle su msm correspondiente, así que descompilemos el root.epk y busquemos estos archivos:
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    Hay dos para cada raza, diferenciando aquellos que llevan:
     

    _m.msm -- Para hombre _w.msm -- Para mujer Bien, como sabeis hay un armor para cada raza y sexo así que tendremos que hacerle un msm para cada uno. Para ellos abrimos cada uno de los msms y buscamos esto:
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    Y ahi ponemos un número alto, como 99 o más, que será el máximo de armaduras que vamos poder meter en este msm.
     
    Una vez hecho vamos a añadir nuestra armor al msm, para ello vamos hasta el final del archivo y miramos que numero tiene el ultimo armor antes de que ponga:
     

    Group AttachingData Al lado de:
     

    Group ShapeData
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    Para añadir nuestra nueva armor podemos copiar una ya anterior, como por ejemplo:
     

    Group ShapeData33 { SpecialPath "d:/ymir Work/pc/warrior/" ShapeIndex 42 Model "warriorm1002.gr2" } Y como os dije antes que miraramos el número que tenia en el ShapeData, a nuestra nueva armor le pondremos un número mas alto que ese y que no se repita a lo largo del msm:
     

    Group ShapeData34 { SpecialPath "d:/ymir Work/pc/warrior/" ShapeIndex 42 Model "warriorm1002.gr2" } Así por ejemplo serviria
     
    Una vez ya tenemos nuestras lineas, con el shapedata cambiado vamos a editarlas de la siguiente manera:
     

    Group ShapeData34 { SpecialPath "d:/ymir Work/pc/warrior/" -- esto solo se pone si la ruta no es esa, asi que podeis quitarlo si quereis ShapeIndex 43 Model "armorkeko.gr2" } Bien, vayamos paso a paso:
     

    ShapeIndex 43 *El ShapeIndex es el tan famoso numero que siempre da tantos problemas implementando armors. Pues bien, lo que hay que poner es un número que sea menor que el número que os he dicho antes que pongais:
     
    Y que no se puede repetir en ningun ShapeIndex que haya en el msm. La funcion de este numerito es enlazar el msm con el item_proto del cliente, de modo que el cliente sepa que armor estás metiendo.
     
    Y como se relacionan os estareis preguntando? Pues el numero que habeis puesto en el ShapeIndex será el que pondreis en el item_proto del cliente donde dice valu3 = numero.
     
    *Model, aqui tendreis que poner el nombre del gr2 de la armadura (con el .gr2 incluido).
     
    Y en estos momentos algun espabilado se estará preguntando: vaya pero yo suelo ver msm que tenen algo que pone SourceSkin y TargetSkin
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    Bien, esa es buen ejemplo para explicaros: como explique mas arriba en esta guia cada armor tiene sus texturas, que vemos dentro del modelo y esas son las que usara el juego si simplemente ponemos el msm asi:
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    Sin embargo, hay muchísimos casos de armaduras a las que queremos ponerles texturas que no son las que vemos en el gr2, si no que son texturas modificadas como en el caso de las negras o empes de colores. En esos casos tenemos a nuestra disposicion estos dos elementos:
     
    * El SourceSkin siempre es la textura original del armor, es decir la que vemos en el gr2.
    * El TargetSkin siempre es la textura modificada, la que añadimos nosotros en vez de la que usaria el armor si solo leyera el gr2.
     
    Por lo tanto si tengo mi textura negra_verde.dds y quiero que las negras usen esa textura, tendre que buscar el msm de las negras:
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    Y deberemos añadirle el Source y Target, para ello miraremos cual es la textura de las negras (warrior_4-1.dds) y se la pondremos en el SourceSkin y luego la nuestra en el TargetSkin.
     
    Por supuesto deberemos cambiar el shapeindex porque ahora es un armor nueva, pero dejaremos el mismo model porque solo hemos cambiado la textura:
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    Y claro, este proceso lo repetimos con los 8 msms, por cada raza y sexo. Una vez hecho ya podemos hacerle el item_proto del cliente a nuestra armor.
     
    4 - Buf, ya hice los msm, queda mucho?
     
    4.1: Item_proto del cliente
     
    Tranquilos que ya casi se acaba. Como os he comentado antes hablando del shapeindex:
     
    Por lo tanto, si nuestra armor NO tiene item_proto del cliente NO se verá así que vamos a ver donde ponemos el shapeindex:
     

    <Item vnum="11690" name="È渶°©+0" gb2312name="Arm. Placas Mágica +0" type="2" subtype="0" weight="0" size="2" antiflag="44" flag="1" wearflag="1" immuneflag="0" gold="120000" buy_price="120000" limittype0="1" limitvalue0="66" limittype1="0" limitvalue1="0" applytype0="8" applyvalue0="4294967281" applytype1="37" applyvalue1="2" applytype2="0" applyvalue2="0" value0="0" value1="90" value2="0" value3="12" value4="0" value5="0" socket0="0" socket1="0" socket2="0" socket3="0" socket4="0" socket5="0" refine_vnum="11691" refine_set="181" magic_pct="15" specular="0" socket_pct="3" /> <Item vnum="11691" name="È渶°©+1" gb2312name="Arm. Placas Mágica +1" type="2" subtype="0" weight="0" size="2" antiflag="44" flag="1" wearflag="1" immuneflag="0" gold="120000" buy_price="130000" limittype0="1" limitvalue0="66" limittype1="0" limitvalue1="0" applytype0="8" applyvalue0="4294967282" applytype1="37" applyvalue1="3" applytype2="0" applyvalue2="0" value0="0" value1="90" value2="0" value3="12" value4="0" value5="3" socket0="0" socket1="0" socket2="0" socket3="0" socket4="0" socket5="0" refine_vnum="11692" refine_set="182" magic_pct="15" specular="0" socket_pct="3" /> <Item vnum="11692" name="È渶°©+2" gb2312name="Arm. Placas Mágica +2" type="2" subtype="0" weight="0" size="2" antiflag="44" flag="1" wearflag="1" immuneflag="0" gold="120000" buy_price="145000" limittype0="1" limitvalue0="66" limittype1="0" limitvalue1="0" applytype0="8" applyvalue0="4294967283" applytype1="37" applyvalue1="4" applytype2="0" applyvalue2="0" value0="0" value1="90" value2="0" value3="12" value4="0" value5="6" socket0="0" socket1="0" socket2="0" socket3="0" socket4="0" socket5="0" refine_vnum="11693" refine_set="183" magic_pct="15" specular="0" socket_pct="3" /> <Item vnum="11693" name="È渶°©+3" gb2312name="Arm. Placas Mágica +3" type="2" subtype="0" weight="0" size="2" antiflag="44" flag="1" wearflag="1" immuneflag="0" gold="120000" buy_price="165000" limittype0="1" limitvalue0="67" limittype1="0" limitvalue1="0" applytype0="8" applyvalue0="4294967284" applytype1="37" applyvalue1="5" applytype2="0" applyvalue2="0" value0="0" value1="90" value2="0" value3="12" value4="0" value5="9" socket0="0" socket1="0" socket2="0" socket3="0" socket4="0" socket5="0" refine_vnum="11694" refine_set="184" magic_pct="15" specular="0" socket_pct="3" /> <Item vnum="11694" name="È渶°©+4" gb2312name="Arm. Placas Mágica +4" type="2" subtype="0" weight="0" size="2" antiflag="300" flag="1" wearflag="1" immuneflag="0" gold="120000" buy_price="190000" limittype0="1" limitvalue0="67" limittype1="0" limitvalue1="0" applytype0="8" applyvalue0="4294967285" applytype1="37" applyvalue1="6" applytype2="0" applyvalue2="0" value0="0" value1="90" value2="0" value3="12" value4="0" value5="12" socket0="0" socket1="0" socket2="0" socket3="0" socket4="0" socket5="0" refine_vnum="11695" refine_set="185" magic_pct="15" specular="30" socket_pct="3" /> <Item vnum="11695" name="È渶°©+5" gb2312name="Arm. Placas Mágica +5" type="2" subtype="0" weight="0" size="2" antiflag="300" flag="1" wearflag="1" immuneflag="0" gold="120000" buy_price="220000" limittype0="1" limitvalue0="68" limittype1="0" limitvalue1="0" applytype0="8" applyvalue0="4294967286" applytype1="37" applyvalue1="7" applytype2="0" applyvalue2="0" value0="0" value1="90" value2="0" value3="12" value4="0" value5="15" socket0="0" socket1="0" socket2="0" socket3="0" socket4="0" socket5="0" refine_vnum="11696" refine_set="186" magic_pct="15" specular="40" socket_pct="3" /> <Item vnum="11696" name="È渶°©+6" gb2312name="Arm. Placas Mágica +6" type="2" subtype="0" weight="0" size="2" antiflag="300" flag="1" wearflag="1" immuneflag="0" gold="120000" buy_price="265000" limittype0="1" limitvalue0="68" limittype1="0" limitvalue1="0" applytype0="8" applyvalue0="4294967287" applytype1="37" applyvalue1="9" applytype2="0" applyvalue2="0" value0="0" value1="90" value2="0" value3="12" value4="0" value5="18" socket0="0" socket1="0" socket2="0" socket3="0" socket4="0" socket5="0" refine_vnum="11697" refine_set="187" magic_pct="15" specular="50" socket_pct="3" /> <Item vnum="11697" name="È渶°©+7" gb2312name="Arm. Placas Mágica +7" type="2" subtype="0" weight="0" size="2" antiflag="300" flag="1" wearflag="1" immuneflag="0" gold="120000" buy_price="325000" limittype0="1" limitvalue0="69" limittype1="0" limitvalue1="0" applytype0="8" applyvalue0="4294967288" applytype1="37" applyvalue1="12" applytype2="0" applyvalue2="0" value0="0" value1="90" value2="0" value3="12" value4="0" value5="21" socket0="0" socket1="0" socket2="0" socket3="0" socket4="0" socket5="0" refine_vnum="11698" refine_set="188" magic_pct="15" specular="65" socket_pct="3" /> <Item vnum="11698" name="È渶°©+8" gb2312name="Arm. Placas Mágica +8" type="2" subtype="0" weight="0" size="2" antiflag="300" flag="1" wearflag="1" immuneflag="0" gold="120000" buy_price="405000" limittype0="1" limitvalue0="69" limittype1="0" limitvalue1="0" applytype0="8" applyvalue0="4294967289" applytype1="37" applyvalue1="15" applytype2="0" applyvalue2="0" value0="0" value1="90" value2="0" value3="12" value4="0" value5="24" socket0="0" socket1="0" socket2="0" socket3="0" socket4="0" socket5="0" refine_vnum="11699" refine_set="189" magic_pct="15" specular="80" socket_pct="3" /> <Item vnum="11699" name="È渶°©+9" gb2312name="Arm. Placas Mágica +9" type="2" subtype="0" weight="0" size="2" antiflag="300" flag="1" wearflag="1" immuneflag="0" gold="120000" buy_price="515000" limittype0="1" limitvalue0="70" limittype1="0" limitvalue1="0" applytype0="8" applyvalue0="4294967290" applytype1="37" applyvalue1="20" applytype2="0" applyvalue2="0" value0="0" value1="90" value2="0" value3="12" value4="0" value5="27" socket0="0" socket1="0" socket2="0" socket3="0" socket4="0" socket5="0" refine_vnum="12030" refine_set="530" magic_pct="15" specular="100" socket_pct="3" /> El item_proto de nuestra armor suele tener de +0 a +9 (aunque no tiene por que ser así), y en el queria remarcar los siguientes datos:
     

    Item vnum="11690" Ahi pondremos la id que vamos a ponerle al item.
     

    gb2312name="Arm. Placas Mágica +0" Ahi se pone el nombre que el armor tendrá en el juego.
     

    value3="12" Y ahi esta el famoso value3!! Le pondremos en cada una de las ids del armor (es decir de +0 a +9) el numero que pusimos en el shapeindex.
     
    Y ya estaría esta parte, por supuesto cada uno deberá hacer el item_proto con los valores que veas convenientes, para eso hay bastantes herramientas como creadores de querys e item_proto que os ayudaran a hacerlo.
     
    4.2: Icono del armor:
     
    Como a la gente le suele gustar que las armors tenga su iconito os diré como meterlo (partiendo de que ya teneis uno hecho, hay guias para hacerlos si no lo teneis):
     
    4.2.1: El icono:
     
    Descompilamos nuestro icon.epk, metemos el icono en icon/item y luego lo añadimos al xml y compilamos. Por supuesto para los que haceis esto en epks aparte recordad que la linea del xml debe llevar icon/item/idicono.tga en la primera parte del xml (lo que explique antes)
     
    4.2.2: Item_list:
     
    Descompilamos nuestro locale y vamos al archivo item_list. De ahi cojemos las lineas de +0 a +9 de otra armor cualquier y las editamos de la siguiente manera:
     

    idarmor ARMOR icon/item/idicono.tga Ojo! Las separaciones entre el texto deben ser con la tecla de tabulador (esa que esta encima del bloq mayusculas xd)
     
    4.3: La query del armor
     
    Una vez hecho todo esto, simplemente nos quedará hacer una query para nuestra armor con la misma id que le pusimos en el item_proto del cliente, para ello teneis muchos programas que os ayudarán a hacerla con los valores que prefirais
     
    Recordad que en la query el value3 da igual, por si alguno lo duda xd
     
    Y bueno, eso es todo por hoy espero que os sea útil esta guía
  16. Me Gusta
    yagokurt reacted to PACI in [Quest] Item para habs a P   
    Omg... Tens que abrir o bloco de notas, colocar isso lá;Em when 30100.use begin, onde está 30100 metes o id do item. Vais ao navicat>player procuras o id do item que escolheste e metes type 18, depois, o texto que colocaste no bloco de notas, guardas com um nome qualquer, mas tem que acabar em .quest, depois vais até ao teu servidor pelo filezilla, vais à pasta quest, e moves para lá o ficheiro. De seguida, procuras por um ficheiro com o nome: locale_list ou quest_list, e metes Ver/editar, e no fim disso, na ultima linha metes o nome da quest acabado em .quest e clicas em ENTER, depois fechas e guardas, vais à máquina, fazes cd /.../quest, as reticências é o diretório antes da pasta quest, carregas enter, e depois fazes ./qc nomedaquest.quest, o nomedaquest é o nome que deste à quest, carregas enter, vais ao jogo, fazes /reload q, depois esperas até que no chat, apareça "reloading quest", depois invocas o item e testas...
×
×
  • Crear nuevo...