Jump to content

fuuton97

Miembro
  • Contador contenido

    177
  • Ingreso

  • Última visita

  • Días ganados

    10

Actividad de reputación

  1. Me Gusta
    fuuton97 reacted to Akroma in Sistemas de desencriptacion (IMPORTANTE)   
    Bueno, antes de ponerme a explicar nada pedir, que este tema lo pongan en IMPORTANTES, debido a que estara en continuos updates.

    Os preguntareis porque hago este post.

    La razon es la siguiente: Si quereis desencriptar algo, seguireis este post, i podreis abrir qualquier cliente del mercado, escepto los .eix .epk en 1 (o sea mi encriptacion) xd, yo ya estoy arto de desencriptar clientes, os enseñare todo lo que se y asi podreis abrir qualquier cosa del mercado.


    Pondre todos los metodos de desencriptacion k tengo desde descompilar types del .es, hasta desencriptar cadenas ocultas, descomprimir binarios, volcados de arxivos, quitar los "Access Denied", encontrar las cadenas en otras posiciones, y tipos de desencriptadores que se pueden usar.

    Los updates comenzaran el dia 14/6/13.

    Update 15/6/13:

    XTEAS, M2.EXE, Y COMO SUSTITUIRLAS.

    Bueno empezare por lo mas basico que es:

    m2.exe

    y xteas

    M2.EXE: Bueno como algunos sabreis es el descompilador estandard, de metin2 (creditos a Tim por el), hay varias versiones, yo os recomiendo para no saliros del guion usar el del masterpack(es antiguo pero os servira).

    Como modificarlo:

    Bueno la forma de modificar el m2.exe es la siguiente:

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

    hxd es un editor hexadecimal que nos permitira modificar las XTEAS, de un m2.exe y encontrar las verdaderas en un binario, aparte de mas cosas que se explicaran mas adelante.

    Modificacion de xteas en m2.exe:

    Las cadenas de nuestro m2.exe siempre son las estandar que son:

    xTea1=B99EB0026F69810563989B2879181A00
    xTea2=22B8B40464B26E1FAEEA1800A6F6FB1C

    con esas 2 cadenas podremos descompilar todo el cliente, esceptuando ITEM - MOB PROTO.

    Buscamos esas 2 cadenas hexadecimalmente y una vez encontradas sustituimos por las cadenas del cliente a desencriptar.

    Como encontrar xteas:

    Bueno para encontrar las xteas haremos lo siguiente:

    Descargar process explorer: Debes iniciar sesión para ver el contenido del enlace en esta publicación.


    Una vez tengamos el process explorer ejecutamos el cliente normal, y abrimos el process explorer.

    Suspendemos el proceso dandole click en Suspend, y entonces ejecutamos un Mini Dump.

    Una vez echo eso abrimos el mini dump con HXD, y buscamos la siguiente palabra: AVCeter

    entonces nos aparecera:


    a partir del .. son las cadenas del .bin

    Fin de la teoria de hoy, qualquier duda lo dejais aqui comentado ( se que esto no es lo que muchos esperabais pero quiero partir de 0)
      UPDATE 21/6/13
     
    Suspension de binarios con acceso denegado
     
    Bueno para esta tarea tenemos varias herramientas, que son las siguientes:
     
    1- Linux (comandos de consola, son infalibles)
     
    2- Services.msc(WINDOWS), con esto podremos detener los procesos del sistema.
     
    3- Desconectarnos de internet  (metodo poco ortodoxo pero funciona, debido a que hay servidores que el permiso denegado se debe a el funcionamiento del servidor.)
     
    4- AllyDBG: Este programa es un debugger/decrypter/descompilador de todo tipo de archivos, se usa para ver funciones del game, o modificar las funciones del binario, pero tambien se puede usar para dumpear archivos con acceso denegado  (creditos de esto a mr.lucifer, ya que no me acordaba de el programa).
     
    Con esas 4 formas, podreis suspender QUALQUIER BINARIO, es cuestion de probar qual os lo suspende.
     
    Dudas, etc comentarlas.
    Saludos
  2. Me Gusta
    fuuton97 got a reaction from Snontoums in [DUNGEON]Quest Icen Run By Fuuton97.   
    Hola, como saben hace tiempo había hecho una quest de tipo dungeo para el mapa Ice Run, había mostrado un vídeo por aquí mismo sobre la subida por mi quest en el mapa osea en Ice Run + dungeon, y hoy decidí darles este regalo por mi cumpleaños adelantado xD. (Es 9 de Junio)
     
    Ver Preview del vídeo:
     

     
    También estoy trabajando en la misma dungeon pero la defino así: Dungeon Ice Run Extended Edition, una edición más larga con implementación de 20 plantas en dungeon, llevando así varios mapas que ya no se llamaría ICE RUN en general, porque combino mapas de plantas para esa dungeon extendidad en edición, este proyecto de dungeon lo estoy haciendo para solo MZ. Aún no tengo fecha fija para terminarlo y testearla.
     
    Sin más acá les dejo la dungeon Ice Run:

    ---- Quest Dungeon By Fuuton97 ---- Copyrigth 2013 quest ice_run begin state start begin when 20095.chat."Map Ice Run" begin say_title("DESAFIO HELADO") say("Hola, estás hablando con el paso a") say("lo que se llama como el Mapa del Hielo.") say("Se dice que es un Desafio o Reto, todos") say("los que entren acá deberán destruir las") say("Bestias jamás nuncas vistas.") say("La recompensa será drop de item para") say("subir a las Armaduras épicas.") say_reward("Quieres Entrar?") local ice = select("Si" , "No") if ice == 1 then pc.warp(513100, 408900) end end ---NPC INICIO PLANTA--- when 20094.chat."Acceso a Map Ice Run" with pc.get_map_index() == 46 begin say("Comenzarán la MAZMORRA.") timer("ice_run_1", 4) chat("HAN COMENZADO EL DESAFIO DEL MAPA DEL HIELO!!!!") end ---ICE_RUN_1--- when ice_run_1.timer begin d.new_jump_all(46, 5131, 4089) d.setf("ice_run", 1) d.setf("mob_ice", 20) d.regen_file("data/dungeon/ice_run/ice_1.txt") d.notice("Destruye todos los mob de esta sala y avanzarán") end when 101.kill or 102.kill with pc.in_dungeon() and d.getf("ice_run") == 1 begin d.setf("mob_ice", d.getf("mob_ice")-1) if d.getf("mob_ice") == 0 then d.notice("Han acabo con todos los mob de esta sala, avanzarán") timer("ice_run_2", 2) end end ---ICE_RUN_2--- when ice_run_2.timer begin d.jump_all(5433, 4122) d.setf("ice_run", 2) d.regen_file("data/dungeon/ice_run/ice_2.txt") d.notice("Destruye la resalia del Metin2") d.spawn_mob(8001, 388, 123) end when 8001.kill with d.getf("ice_run") == 2 begin d.notice("Han destruido el Metin, avanzarán") timer("ice_run_3", 2) end ---ICE_RUN_3--- when ice_run_3.timer begin d.jump_all(5610, 4088) d.setf("ice_run", 3) d.setf("drop", 0) d.regen_file("data/dungeon/ice_run/ice_3.txt") d.notice("Acaben con las Bestias hasta encontrar la Llave") end when 104.kill or 105.kill or 106.kill with pc.in_dungeon() and d.getf("ice_run") == 3 begin d.setf("drop", d.getf("drop")+1) if d.getf("drop")== 10 then game.drop_item(40003, 1) d.setf("drop", 0) chat("Se te ha caído el pase.") end end when 40003.use begin chat("Será llevados a la 4ta planta") item.remove() timer("ice_run_4", 2) end ---ICE_RUN_4--- when ice_run_4.timer begin d.jump_all(5464, 4458) d.setf("ice_run", 4) d.setf("metines", 3) d.regen_file("data/dungeon/ice_run/ice_4.txt") d.notice("Están en la 4ta planta.") d.notice("Destruye los Metines y avanzarán.") d.spawn_mob(8025, 473, 439) d.spawn_mob(8025, 478, 441) d.spawn_mob(8025, 481, 444) end when 8025.kill with d.getf("ice_run") == 4 begin d.setf("metines", d.getf("metines") - 1) d.notice("Todavia te quedan "..d.getf("metines").." metines por destruir") if d.getf("metines") == 0 then d.notice("Han destruido los metines.") d.notice("Avanzarán, suerte viajeros.") timer("ice_run_5", 2) end end ---ICE_RUN_5--- when ice_run_5.timer begin d.jump_all(5661, 4196) d.setf("ice_run", 5) d.regen_file("data/dungeon/ice_run/ice_5.txt") d.notice("Mata al Guardían de esta 5ta planta.") d.spawn_mob(115, 697, 194) end when 115.kill with d.getf("ice_run") == 5 begin d.notice("Han matado al Guardían de esta 5ta planta") d.notice("Suerte viajeros, avanzarás") timer("ice_run_6", 2) end ---ICE_RUN_6--- when ice_run_6.timer begin d.jump_all(5221, 4448) d.setf("ice_run", 6) d.regen_file("data/dungeon/ice_run/ice_6.txt") d.notice("Mata al Gran Jefe de esta planta y terminarán en desafio") d.spawn_mob(1901, 154, 449) end when 1901.kill with d.getf("ice_run") == 6 begin game.drop_item(279, 1) game.drop_item(269, 1) game.drop_item(249, 1) d.notice("Han derrotado al Gran Jefe.") notice_all("El personaje ".. pc.get_name() .." ha Derrotado al Gran Jefe") d.kill_all() chat("Han completado el Desafio: Map Ice Run") chat("www.metin2skill.com By Fuuton97") chat("Tienen 20 segundos, luego serán Telestrasportado a su Ciudad.") timer("salida_ice_run", 20) end ---SALIDA_ICE_RUN--- when salida_ice_run.timer begin warp_to_village() end end end Pueden probar de una, tiene las coordenadas del mapa Ice Run, los regen´s pueden hacerlo ustedes, como ven está totalmente editable por ustedes, pueden editar los .kill de los mob, metins etc etc.
     
     
    Cualquier duda, no olviden en comentar.
  3. Me Gusta
    fuuton97 reacted to Shogun in Optimización del servidor MySQL   
    Buenas, hoy os traigo un script que facilita la tarea de detectar problemas y cuellos de botella en servidores MySQL, y en general, optimizar sus recursos y funcionamiento. Se trata de un script perl que se puede utilizar tanto bajo Linux como FreeBSD:
     
    FreeBSD
     

    cd /root fetch mysqltuner.pl chmod 755 mysqltuner.pl ./mysqltuner.pl Linux
     

    cd /root wget mysqltuner.pl chmod 755 mysqltuner.pl ./mysqltuner.pl A continuación nos mostrará una serie de estadísticas y recomendaciones sobre nuestro servidor tal que así:
     

     
    Es bastante sencillo de entender, pero si no tenemos conocimientos del tema lo mejor es seguir las recomendaciones del final, éstas se refieren a variables que se encuentran en my.cnf (fichero de configuración de mysql) éste fichero se puede encontrar en varios lugares según el sistema así que lo mejor será mirar primero en /etc/my.cnf (localización más común) y si no lo encontramos ahí, buscarlo tal que asi:
     

    locate my.cnf Y a continuación editamos el fichero con las recomendaciones que mencionamos arriba. Si la variable no está en my.cnf, simplemente la añadimos. Aquí un ejemplo del fichero my.cnf del WOM:
     

    [client] port = 3306 socket = /tmp/mysql.sock # Here follows entries for some specific programs # The MySQL server [mysqld] port = 3306 socket = /tmp/mysql.sock skip-external-locking key_buffer_size = 384M max_allowed_packet = 1M table_open_cache = 512 sort_buffer_size = 4M read_buffer_size = 2M read_rnd_buffer_size = 16M myisam_sort_buffer_size = 64M thread_cache_size = 8 query_cache_size = 32M # Try number of CPU's*2 for thread_concurrency thread_concurrency = 4 max_connections=250 # Don't listen on a TCP/IP port at all. This can be a security enhancement, # if all processes that need to connect to mysqld run on the same host. # All interaction with mysqld must be made via Unix sockets or named pipes. # Note that using this option without enabling named pipes on Windows # (via the "enable-named-pipe" option) will render mysqld useless! # #skip-networking # Replication Master Server (default) # binary logging is required for replication #log-bin=mysql-bin # required unique id between 1 and 2^32 - 1 # defaults to 1 if master-host is not set # but will not function as a master if omitted server-id = 1 # Replication Slave (comment out master section to use this) # # To configure this host as a replication slave, you can choose between # two methods : # # 1) Use the CHANGE MASTER TO command (fully described in our manual) - # the syntax is: # # CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>, # MASTER_USER=<user>, MASTER_PASSWORD=<password> ; # # where you replace <host>, <user>, <password> by quoted strings and # <port> by the master's port number (3306 by default). # # Example: # # CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306, # MASTER_USER='joe', MASTER_PASSWORD='secret'; # # OR # # 2) Set the variables below. However, in case you choose this method, then # start replication for the first time (even unsuccessfully, for example # if you mistyped the password in master-password and the slave fails to # connect), the slave will create a master.info file, and any later # change in this file to the variables' values below will be ignored and # overridden by the content of the master.info file, unless you shutdown # the slave server, delete master.info and restart the slaver server. # For that reason, you may want to leave the lines below untouched # (commented) and instead use CHANGE MASTER TO (see above) # # required unique id between 2 and 2^32 - 1 # (and different from the master) # defaults to 2 if master-host is set # but will not function as a slave if omitted #server-id = 2 # # The replication master for this slave - required #master-host = <hostname> # # The username the slave will use for authentication when connecting # to the master - required #master-user = <username> # # The password the slave will authenticate with when connecting to # the master - required #master-password = <password> # # The port the master is listening on. # optional - defaults to 3306 #master-port = <port> # # binary logging - not required for slaves, but recommended #log-bin=mysql-bin # # binary logging format - mixed recommended #binlog_format=mixed # Uncomment the following if you are using InnoDB tables #innodb_data_home_dir = /var/db/mysql #innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend #innodb_log_group_home_dir = /var/db/mysql # You can set .._buffer_pool_size up to 50 - 80 % # of RAM but beware of setting memory usage too high #innodb_buffer_pool_size = 384M #innodb_additional_mem_pool_size = 20M # Set .._log_file_size to 25 % of buffer pool size #innodb_log_file_size = 100M #innodb_log_buffer_size = 8M #innodb_flush_log_at_trx_commit = 1 #innodb_lock_wait_timeout = 50 [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash # Remove the next comment character if you are not familiar with SQL #safe-updates [myisamchk] key_buffer_size = 256M sort_buffer_size = 256M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout Como vimos arriba al ejectutar mysqltuner.pl bajo el epigrafe Variables nos recomienda subir sort_buffer_size por encima de 2M y read_rnd_buffer_size sobre 16M, así que esas son las variables que tendríais que editar, a continuación reiniciar el servidor mysql y dejarlo correr unos días antes de ejecutar de nuevo mysqltuner.pl, así hasta que no os de ningún "aviso" en rojo, lo cual significa que el servidor está optimizado al máximo, no así su uso de memoria como veremos ahora.
     
    Otra cosa que se puede hacer si tenemos algo de confianza es justo lo contrario, reducir valores excesivos. Un ejemplo de esto lo tenemos en la salida de mysqltuner.pl que nos dice lo siguiente:
     
    InnoDB Data Size / Buffer Pool 3.5 MB / 128 MB
     
    Es decir que tenemos reservados 128 MB para algo que solo ocupa 3. Buscamos el culpable en my.cnf
     

    #innodb_buffer_pool_size = 384M Está comentado por lo que toma el valor default de 128, lo dejaríamos por ejemplo así, dejando memoria libre para otras tareas:
     

    innodb_buffer_pool_size = 16M
  4. Me Gusta
    fuuton97 got a reaction from NataliMontoya in [QUEST]Item Aleatorio.   
    Hola, les vengo a traer esta quest mu útil para dar un item aleatorio, tiene 100 probabilidades, puedes aumentarlo con el math.random, das un item y te da otro, algo así como lo que tiene Guabina.
     

    quest fuutoncete begin state start begin when 20095.chat."Item Aleatorio" begin if pc.count_item(50027) < 1 then say("Lo siento te falta el item") else local futon = math.random(1, 100) if futon == 1 then pc.remove_item(50027, 1) pc.give_item2(71095, 1) elseif futon == 2 then pc.remove_item(50027, 1) pc.give_item2(27994, 1) elseif futon == 3 then pc.remove_item(50027, 1) pc.give_item2(22982, 1) elseif futon == 4 then pc.remove_item(50027, 1) pc.give_item2(27993, 1) elseif futon == 5 then pc.remove_item(50027, 1) pc.give_item2(27992, 1) elseif futon == 6 then pc.remove_item(50027, 1) pc.give_item2(22989, 1) elseif futon == 7 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 8 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 9 then pc.remove_item(50027, 1) pc.give_item2(22991, 1) elseif futon == 10 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 11 then pc.remove_item(50027, 1) pc.give_item2(22992, 1) elseif futon == 12 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 13 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 14 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 15 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 16 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 17 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 18 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 19 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 20 then pc.remove_item(50027, 1) pc.give_item2(51110, 1) elseif futon == 21 then pc.remove_item(50027, 1) pc.give_item2(51120, 1) elseif futon == 22 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 23 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 24 then pc.remove_item(51130, 1) pc.give_item2(72050, 1) elseif futon == 25 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 26 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 27 then pc.remove_item(50027, 1) pc.give_item2(51140, 1) elseif futon == 28 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 29 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 30 then pc.remove_item(50027, 1) pc.give_item2(11150, 1) elseif futon == 31 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 32 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 33 then pc.remove_item(50027, 1) pc.give_item2(22986, 1) elseif futon == 34 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 35 then pc.remove_item(50027, 1) pc.give_item2(22987, 1) elseif futon == 36 then pc.remove_item(50027, 1) pc.give_item2(22988, 1) elseif futon == 37 then pc.remove_item(50027, 1) pc.give_item2(22980, 1) elseif futon == 38 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 39 then pc.remove_item(50027, 1) pc.give_item2(22984, 1) elseif futon == 40 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 41 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 42 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 43 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 47 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 48 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 49 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 50 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 51 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 52 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 53 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 54 then pc.remove_item(50027, 1) pc.give_item2(22985, 1) elseif futon == 55 then pc.remove_item(50027, 1) pc.give_item2(29330, 1) elseif futon == 56 then pc.remove_item(50027, 1) pc.give_item2(29340, 1) elseif futon == 57 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 58 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 59 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 60 then pc.remove_item(50027, 1) pc.give_item2(29390, 1) elseif futon == 61 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 62 then pc.remove_item(50027, 1) pc.give_item2(29380, 1) elseif futon == 63 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 64 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 65 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 66 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 67 then pc.remove_item(50027, 1) pc.give_item2(29350, 1) elseif futon == 68 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 69 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 70 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 71 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 72 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 73 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 74 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 75 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 76 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 77 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 78 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 79 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 80 then pc.remove_item(50027, 1) pc.give_item2(30110, 1) elseif futon == 81 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 82 then pc.remove_item(50027, 1) pc.give_item2(30170, 1) elseif futon == 83 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 84 then pc.remove_item(50027, 1) pc.give_item2(30140, 1) elseif futon == 85 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 86 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 87 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 88 then pc.remove_item(50027, 1) pc.give_item2(30150, 1) elseif futon == 89 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 90 then pc.remove_item(50027, 1) pc.give_item2(30160, 1) elseif futon == 91 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 92 then pc.remove_item(50027, 1) pc.give_item2(30120, 1) elseif futon == 93 then pc.remove_item(50027, 1) pc.give_item2(11110, 1) elseif futon == 94 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 95 then pc.remove_item(50027, 1) pc.give_item2(11120, 1) elseif futon == 96 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 97 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 98 then pc.remove_item(50027, 1) pc.give_item2(11130, 1) elseif futon == 99 then pc.remove_item(50027, 1) pc.give_item2(72050, 1) elseif futon == 100 then pc.remove_item(50027, 1) pc.give_item2(11140, 1) end end end end end Saludos, espero que les guste.
  5. Me Gusta
    fuuton97 got a reaction from NataliMontoya in Protección - Pot Bomber   
    This difference file has been created by IDA Pro game 0004D0A4: 2C 05 0004D0A5: 01 00 Así se coloca, se parchea con un parchador xD, de tipo .exe
  6. Me Gusta
    fuuton97 reacted to Shogun in Protección básica de servidor FreeBSD   
    Hola a todos los usuarios de Metin2Zone, hoy quería compartir con vosotros la configuración que usamos en el servidor del World of Metin2. Esto os dará una protección básica contra los ataques más comunes.
     
    En primer lugar, debemos añadir estas líneas a /etc/sysctl.conf
     
     

    security.bsd.see_other_uids=0 net.inet.ip.random_id=1 net.inet.ip.redirect=0 net.inet.ip.sourceroute=0 net.inet.ip.accept_sourceroute=0 net.inet.icmp.maskrepl=0 net.inet.icmp.log_redirect=0 net.inet.icmp.drop_redirect=1 net.inet.tcp.drop_synfin=1 net.inet.tcp.icmp_may_rst=0 net.inet.udp.blackhole=1 net.inet.tcp.blackhole=2 Una vez hecho esto ejecutamos este comando para cargar la nueva configuración:
     

    service sysctl restart En segundo lugar tenemos el firewall PacketFiler (pf) que deberéis activar (no voy a explicar aquí como se hace, Google is your friend) y a continuación modificar /etc/pf.conf ;aquí os dejo la que usa el WOM.
     
     

    ext_if="em0" service_ports="{ 21, 1137 }" public_ports="{ 80, 443 }" game_ports="{ 11000, 13000, 13001, 13002, 13010, 13011, 13012, 13020, 13021, 13022, 13030, 13031, 13032, 13099 }" table <trusted_hosts> const {} table <abusive_hosts> persist # options set block-policy drop set loginterface $ext_if set skip on lo # Normalizes packets and masks the OS's shortcomings such as SYN/FIN packets # [scrub reassemble tcp](BID 10183) and sequence number approximation # bugs (BID 7487). scrub on $ext_if reassemble tcp no-df random-id # Filters antispoof quick for { lo0 $ext_if } block in pass out all keep state pass out on $ext_if all modulate state pass in quick from <trusted_hosts> block in quick from <abusive_hosts> ## allow ping in pass in inet proto icmp all icmp-type echoreq pass in on $ext_if proto tcp to any port $service_ports flags S/SA keep state (max-src-conn 30, max-src-conn-rate 10/5, overload <abusive_hosts> flush) pass in on $ext_if proto tcp to any port $public_ports flags S/SA keep state (max-src-conn 30, max-src-conn-rate 10/5, overload <abusive_hosts> flush) pass in on $ext_if proto {tcp,udp} to any port $game_ports flags S/SA keep state (max-src-conn 20, max-src-conn-rate 10/5, overload <abusive_hosts> flush) Debéis adaptar esta configuración a vuestro servidor claro está, en primer lugar modificando los game ports a los que utilicéis. En segundo lugar:
     
    table <trusted_hosts> const {}
     
    entre las llaves debéis poner las direcciones IP a las que se les da acceso libre sin pasar por el firewall, separadas por comas si son más de una. Es aconsejable poner aquí la IP de tu servidor web (si está en otro host) y la tuya propia (para evitar quedar bloqueados por error mientras probamos)
     
    En las tres últimas líneas configuramos los límites que vamos a permitir por dirección IP.
     
    max-src-conn 30, max-src-conn-rate 10/5, overload <abusive_hosts> flush
     
    Esto significa que permitimos hasta 30 conexiones por IP, a una velocidad máxima de 10 conexiones cada 5 segundos, y quien supere estos límites será puesto en la tabla abusive_hosts, es decir, baneado. Si quitamos esta última parte las conexiones que superen el límite se descartarán, pero no se baneará al infractor. En el tercer párrafo,correspondiente a los game ports, admitimos conexiones UDP, esto es necesario para la comprobación del cliente en la pantalla de login (CH1 NORM, etc.) Si bloqueásemos completamente UDP los canales saldrían siempre off (...)
     
    Para vaciar la tabla de bans en caso de que algún jugador o nosotros mismos haya sido baneado por error debemos usar el siguiente comando:
     

    pfctl -t abusive_hosts -T flush Espero que este post sirva de ayuda a alguien, un saludo.
  7. Me Gusta
    fuuton97 got a reaction from NataliMontoya in Ayuda Pliz!   
    socket_pc en la db buscas hay en el id de tu item y pones el número 3.
  8. Me Gusta
    fuuton97 got a reaction from Soren in Fix de Kickhack (dif)   
    Hola, como ven Serex acabo de postear un Hack, que es muy molesto, pero como saben siempre están los fix :$ , y como siempre son los alemanes XDDDDDDDDDDDDDDDD.
     
    Según leí y al no entender el idioma Alemán, y al traducirlo no tiene concordancia, por lo tanto no puedo decir bien que es, pero según el post dice que el dif tiene un efecto secundario sobre los mob's, hasta entiendo, porque al traducirlo en google no tiene concordancia alguna.
     
    2089:

    This difference file is created by The Interactive Disassembler game 000E637B: 31 90 000E637C: C9 90 000E6384: C7 90 000E6385: 45 90 000E6386: C4 90 000E6387: FF 90 000E6388: FF 90 000E6389: FF 90 000E638A: FF 90 000E638B: 39 90 000E638C: D0 90 000E638D: 0F 90 000E638E: 87 90 000E638F: EF 90 000E6390: 00 90 000E6391: 00 90 000E6392: 00 90 000E639B: 0F E9 000E639C: 88 E2 000E639D: 69 00 000E639E: 03 00 2019:

    This difference file is created by The Interactive Disassembler game 000E6434: C7 90 000E6435: 45 90 000E6436: C4 90 000E6437: FF 90 000E6438: FF 90 000E6439: FF 90 000E643A: FF 90 000E643B: 39 90 000E643C: D0 90 000E643D: 0F 90 000E643E: 87 90 000E643F: EF 90 000E6440: 00 90 000E6441: 00 90 000E6442: 00 90 000E644B: 0F E9 000E644C: 88 E2 000E644D: 69 00 000E644E: 03 00 1765:

    This difference file is created by The Interactive Disassembler game1765 000E3C84: C7 90 000E3C85: 45 90 000E3C86: C4 90 000E3C87: FF 90 000E3C88: FF 90 000E3C89: FF 90 000E3C8A: FF 90 000E3C8B: 39 90 000E3C8C: D0 90 000E3C8D: 0F 90 000E3C8E: 87 90 000E3C8F: EF 90 000E3C90: 00 90 000E3C91: 00 90 000E3C92: 00 90 000E3C9B: 0F E9 000E3C9C: 88 E2 000E3C9D: 69 00 000E3C9E: 03 00  
    Fuente: iMer de Epvp.
     
    Saludos.
  9. Me Gusta
    fuuton97 reacted to KeKo in [Sistema] Puntos Metin   
    Buenas zoneros y zoneras,
     
    Hace tiempo que no posteaba ninguna quest, asi que hoy me ha dado por haceros un "mini-sistema" para que lo podais meter en vuestro servidores si os gusta
     
    Lo he llamado sistema de "Puntos Metin" y como el nombre sugiere tiene que ver con los metines. Por cada metin que destruyas en el servidor obtendrás una determinada cantidad de un item que yo bautize como "Esfera Metin" pero que cada uno puede llamar como quiera (yo os dejo el tga del item por si lo quereis).
     
    Las esferas que te da cada metin son diferentes (configurables a voluntad) y ademas os he hecho un npc de canjes para que podais llevar vuestras esferas metin y canjearlas por los items que querais (vosotros configurais el npc) .
     
    Primero unas fotitos del proceso:
     
    1 - Petando un metin, te da esferas:
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    * Detalle: La quest reconoce automaticamente que metin destruyes y te da los puntos correspondientes a ese metin, mas abajo os enseñare a editar los puntos.
     
    2 - Esta es una esfera metin:
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    3 - Vamos al npc de los canjes:
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    4 - Elegimos el item a canjear:
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    5 - Si no tenemos las esferas suficientes saldra este mensaje, si las tenemos nos dara el item y nos quitara las esferas correspondientes (podeis poner el coste de cada item al lado del nombre en el local).
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    Y bueno ahora que os he explicado un poco como va, aqui os dejo la quest:
     
     
     
     
    (Aqui en pastebin para quien la prefiera tener con las tabs
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.)  
    Y bueno ahora os voi a enseñar como editarla:
     
    Paso 1 - Los metines:
     
    Para añadir nuevos metines ponemos su id en el array y vamos a configurarles el nombre y esferas que daran:
     

    local metin = { [8001] = {1,"Metin de Dolor"}, [8002] = {1,"Metin de Combate"}, [8003] = {2,"Metin de Batalla"}, [8004] = {2,"Metin de Avaricia"}, [8005] = {3,"Metin Negro"}, [8006] = {3,"Metin de Oscuridad"}, [8007] = {3,"Metin de Celos"}, [8008] = {4,"Metin de Alma"}, [8009] = {4,"Metin de Sombra"}, [8010] = {5,"Metin de Dureza"}, [8011] = {5,"Metin de Demonio"}, [8012] = {6,"Metin de Caida"}, [8013] = {6,"Metin de Muerte"}, [8014] = {8,"Metin Asesino"}, [8024] = {10,"Metin Pung-Ma"}, [8025] = {11,"Metin de Ma-An"}, [8026] = {12,"Metin de Tu-Young"}, [8027] = {13,"Metin Jeon-Un"} } Este array contiene 3 elementos
     

    [8027] Entre [ ] la id del metin de nuevo, si quereis añadir uno nuevo la poneis igual
     

    {12,"Metin de Tu-Young"}, Entre { va primero la cantidad de esferas que dara (en este caso 12) una coma y luego entre " " el nombre del metin (es opcional, lo dice por el chat al peta uno).
     
    Si quereis añadir una nueva linea pos haceis asi:
     

    {esferas,"nombre"}, Ojo! El ultimo de los metines NO debe llevar una , al acabar el }
     
    Y lo ultimo es poner la id de las esferas en el give_item
     

    pc.give_item2("27003",metin[npc.get_race()][1]) Donde yo tengo 27003 (si, las potas rojas G, me aburria xd) vosotros pondreis la id que le pongais a la esfera (o el item que useis).
     
    Paso 2: El npc de los canjes
     
    Podeis ponerle tantos canjes como querais, yo en este caso he puesto 7 posibles canjes que podemos editar de la siguiente manera:
     

    local elegir = select("Item1","Item2","Item3","Item4","Item5","Item6","Item7","Cancelar") Ponemos el nombre del item en cada caso. Si quereis añadir mas podeis hacer otra pagina (aunque a la segunda tendreis que hacerle vosotros las condiciones :trollface: ).
     
    Luego debeis configurar este array:
     

    local premios = { {27002,1,27003,1}, -- Premio1 {27002,5,27003,2}, -- Premio2 {27002,10,27003,3}, -- Premio3 {27002,15,27003,4}, --Premio4 {27002,50,27003,5}, --Premio5 {27002,100,27003,6}, --Premio6 {27002,200,27003,7} --Premio7 (sin la , despues del } recordad) } Os explico que hace cada cosa:
     
    - El 27002 es el item que te daran al canjear cada elemento.
    - El numero siguiente es la cantidad del premio que te daran.
    - El tercer elemento es la id de las esferas o el item que useis como necesario para canjear
    - El cuarto elemento es la cantidad de esferas que pedira cada premio.
     
    Si quereis añadir mas recordar que el local anterior esta ligado a este, asi que si haceis otra pagina tendreis que usar otro array (o hacerlo normal).
     
    Y eso seria todo, el resto de la quest ya esta configurada.
     
    Espero que os guste :tiocereales:
     
    P.D: Os dejo adjunto el icono de la esfera metin (solo icono sin item_proto ni na ya lo haceis vosotros :trolldad: )

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
  10. Me Gusta
    fuuton97 reacted to  Pantsu  in Sword Art Online - Elucidator Sword   
    Como muchos usuarios me la pedían pues aquí la tenéis, no la encontrareis en Google así que aquí la tenéis para vosotros, para disfrutarla y os podéis sentir como dentro de Aincrad (S.A.O). Arma dedicada para los aficionados del anime japones titulado Sword Art Online, sin mucho que decir que la disfrutéis y os dejo el enlace de descarga.

    Enlace de descarga: Debes iniciar sesión para ver el contenido del enlace en esta publicación.
    Créditos: @X-Cosplay por los planos y estructura en trozos de la espada.

    No he podido probarla ya que la verdad no dispongo de suficiente tiempo, si deseáis la hoja mas pequeña, mas grande, cambiar algo del diseño solamente decídmelo. Si hace falta arreglar o no se visualiza correctamente en el juego dejadme un mensaje privado o por este tópico y lo arreglaré encantado.
  11. Me Gusta
    fuuton97 reacted to Serex in SerexTool - WebTool for Private Servers   
    Hola chicos hoy os traigo mi nuevo proyecto, el cual llevo unas semanas haciendo en mi afán por aprender PHP.
     
     
    SerexTool - WebTool for private servers

    Esta herramienta os ayudara en la gestión del servidor, es perfecta para una gestión rápida y sencilla, con las operaciones más comunes cuenta con muchísimas opciones que os facilitarán vuestra tarea en la administración de vuestro servidor.


    Gestión de Cuentas



     
    Gestión de jugadores



     
    Gestión del servidor






    La herramienta como veis es bastante completa. En cuanto al apartado de "Ingresar coins" lleva otra contraseña y te da la opción de registrar los logs de quien mete MDs para controlar este tema que suele ser de los más importantes.


     
    Su instalación es bastante sencilla, una vez descargada la tool, la subis a vuestro sitio web en una carpeta o directorio vacío y modificais el archivo config.php con vuestros datos para vuestro servidor, y el acceso a la tool por user y pass.

    Si queréis el log para el ingreso de coins debéis ejecutar esta query en la base de datos account:

    /* Navicat MySQL Data Transfer[/center] Source Server : METIN2 ELEMENTS Source Server Version : 50528 Source Host : localhost Source Database : website Target Server Type : MYSQL Target Server Version : 50528 File Encoding : 65001 Date: 2013-05-06 23:46:50 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `coins_log` -- ---------------------------- DROP TABLE IF EXISTS `coins_log`; CREATE TABLE `coins_log` ( `cuenta` varchar(100) NOT NULL, `coins_ingresadas` varchar(100) NOT NULL, `motivo` varchar(100) NOT NULL, `ip` varchar(100) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- ---------------------------- -- Records of coins_log Y lo que esperabais la descarga: Debes iniciar sesión para ver el contenido del enlace en esta publicación.
  12. Me Gusta
    fuuton97 reacted to Croqueta in [Q]Itemshop without Mysql   
    Informacion:
    Hola a todos aca les traigo una quest de una item shop en el juego. realizada en su totalidad por mi
    Contiene:
    -Historial de Compras(log)
    -Historial De Donaciones (log)
    -Ingreso Como administrador (Agregar artículos / y quitarlos)
    -Tienda: Lecto de coins (Este archivo ha de ser creado manualmente)
    -Imagenes:
     
    Importante:
     
    Dentro de la descarga hay un archivo llamado vnumUtype.txt este se le modifica la extencion a .lua
     
    pathti="/usr/home/game/share/locale/germany/quest/test/" <<-- en esta ruta la tabla de la item shop y el vnumUtype.lua
    pathtc="/usr/home/game/share/locale/germany/quest/coins/"
     
    Se crea una nueva carpeta en las rutas anteriores, que depende de usted.
    Más importante aún es un punto que hay que generar la tabla en el juego,
    como un ejemplo de la matriz que me queda, por lo que puede orientarse a la misma.
     
    special thx on stein20 for help to translate
     
    imagen
     
     
     
    Quest
     

    quest ingameshop begin state start begin when 20006.chat."recharge ccoins" begin say_title(mob_name(npc.get_race())) spenden() end when 20006.chat."generate table" with pc.is_gm() begin --if pc.get_gm_level()!=5 then return end say("really generate table?") if select("Yes","No")==2 then return end local ingameshop={ --[[ if you use this first time, push Yes ]] {--weapons {item1,item2},--ids {coins1,cois2}--coins }, {--armor {item1,item2},--ids {coins1,coins2}--coins }, {--special tems {item1,item2},--ids {coins1,item2}--coins } } table.save(ingameshop,pathti.."testtabelle.lua") end when 20006.chat."ItemShop" begin local name_items={} local ingameshop=table.load(pathti.."testtabelle.lua") say_title(mob_name(npc.get_race())) say() say("Choose your category") local auswahl=select3(itemshopk) for i=1,table.getn(ingameshop[auswahl][1]) do table.insert(name_items,tostring(item_name(ingameshop[auswahl][1][i]))) end say_title(mob_name(npc.get_race())) say() say("select the item ") say() local itemshop_i = select3(name_items) if itemshop_i == table.getn(name_items) then return end say_title(string.format("Coins :%d ", get_coins())) say() say("Would you really buy the item?") say() say_gold("it cost "..ingameshop[auswahl][2][itemshop_i].." Coins") say_item_vnum(ingameshop[auswahl][1][itemshop_i]) say("") if select("Yes","No") == 2 then return end if get_coins()<ingameshop[auswahl][2][itemshop_i] then say("not enough coins ") return end say_green("you have buy "..item_name(ingameshop[auswahl][1][itemshop_i]).." for- ") say_green(ingameshop[auswahl][2][itemshop_i].." Coins") say_item_vnum(ingameshop[auswahl][1][itemshop_i]) coins_write((get_coins()-ingameshop[auswahl][2][itemshop_i])) pc.give_item2(ingameshop[auswahl][1][itemshop_i]) write_log(ingameshop[auswahl][1][itemshop_i],ingameshop[auswahl][2][itemshop_i]) end when 20006.chat."Manage Itemshop" with pc.is_gm() begin local tabelle=table.load(pathti.."vnumUtype.lua") local i_shop=table.load(pathti.."testtabelle.lua") say_title(mob_name(npc.get_race())) say() say("Hello "..string.format("%s",pc.get_name())) say("What would you like do?") local s=select("add new items","removing Items","Nothig") if s==3 then return end if s==1 then say_title(mob_name(npc.get_race())) say() say("Choose a category") say("where you want to add the item") local auswahl=select3(itemshopk) say_title(mob_name(npc.get_race())) say() say(itemshopk[auswahl]..": insert into this category?") if select("Yes","No") == 2 then return end say_title(mob_name(npc.get_race())) say() say("Which item you wish to add?") say("Enter the vnum") local vnum= tonumber(input()) if vnum ==nil then say("You have to enter something") return end if auswahl== 1 then if tabelle[vnum][1] != 1 then say("This is not a weapon") return end elseif auswahl == 2 then if tabelle[vnum][1] != 2 then say("This is not a amor") return end elseif auswahl == 3 then if tabelle[vnum][1] == 1 or tabelle[vnum][1]==2 then say("only for special items") return end end say_title(mob_name(npc.get_race())) say() say("Give the price of that item") say() local money= tonumber(input()) if money==nil then say("You have to enter something") return end say_title(mob_name(npc.get_race())) say() say("keeping?") say() say("Item: "..item_name(vnum).." Price: "..money) say_item_vnum(vnum) if select("Yes","No") == 2 then return end i_shop[auswahl][1][table.getn(i_shop[auswahl][1])+1]=vnum i_shop[auswahl][2][table.getn(i_shop[auswahl][2])+1]=money --table.insert(i_shop[auswahl][1],vnum) --table.insert(i_shop[auswahl][2],money) table.save(i_shop,pathti.."testtabelle.lua") say("you have add "..item_name(vnum)) elseif s==2 then local auswahl_items={} say("Choose the item that you wish to remove") say() local a=select3(itemshopk) for i=1,table.getn(i_shop[a][1]) do table.insert(auswahl_items,tostring(item_name(i_shop[a][1][i]))) end say("Choose the item that you wish to remove") say() local itemshop_r = select3(auswahl_items) if itemshop_r==table.getn(auswahl_items) then return end table.remove(i_shop[a][1],i_shop[a][1][itemshop_r]) table.remove(i_shop[a][2],i_shop[a][2][itemshop_r]) table.save(i_shop,pathti.."testtabelle.lua") --[[for i= 1,table.getn(ingameshop[auswahl][1]) do say(i_shop[auswahl][1][i].."\t"..i_shop[auswahl][2][i]) end]] end end end end questlib.lua
     

    pathti="/usr/home/game/share/locale/germany/quest/test/"--ruta de la tabla pathtc="/usr/home/game/share/locale/germany/quest/coins/"--ruta de los coins itemshopk={"Waffe","Rüstungen","Sonstiges"} function write_log(vnum,coins) local i_name=item_name(vnum) datei = io.open(pathti.."shop_log.lua", "a+") if datei==nil then say("Error loading the file") return end datei:write("PLayerID:\t"..pc.get_player_id().."\tPlayerName:\t"..pc.get_name().."\tItemName:\t"..i_name.."\tDate/Time:\t"..os.date("%c").."\tCoins:\t"..coins.."\n") datei:close() end function get_coins() local file = io.open(pathtc..""..pc.get_player_id()..".txt",'r') if file==nil then return 0 end for line in file:lines() do return line end file:close() end function coins_write(coins) file = io.open(pathtc..""..pc.get_player_id()..".txt","w") file:write(coins) file:close() end function spenden() say() say("How much you want to donate?") say_reward("Online Paysafecard will not be accepted") say() s = select("10","25","50","100","cancel") wert = { 10 , 25 , 50 , 100} if s==table.getn(wert)+1 then return end say_title(mob_name(20006)) say() say("Now give the PSC numbers") say() eing2= input() if string.len(eing2)~=16 then say("Your input has no 16 numbers") return end if string.sub(eing2,0,1)=='1' or string.sub(eing2,0,2)=='00' then say("Online Paysafecard will not be accepted") return end say_title(mob_name(20006)) say() say('The PSC is protected with a password?') if select("Yes","No")==2 then eing3=0 else say("Enter the password") eing3 = input() if eing3=='' then say("You have to enter something") return end end say() say("Your input:") say("cash: "..wert[s]) say("PSC: "..eing2) if eing3 == 0 then say("PW: /") else say("PW: "..eing3) end say("Keeping?") say() if select("Yes","No") == 2 then return end say("your Coins will be credited to you after the control") file = io.open(pathti.."psc_log.lua","a+") --file:write("PlayerName:\t"..pc.get_name().."\tCash:\t"..wert[s].."\tPSC:\t"..eing2.."\tPW:\t"..eing3.."\tDate/Time:\t"..os.date("%c").."\n") file:write("ID:\t"..pc.get_player_id().."PlayerName:\t"..pc.get_name().."\tCash:\t"..wert[s].."\tPSC:\t"..eing2.."\tPW:\t"..eing3.."\tDate:\t"..os.date("%c").."\t\n") file:close() end function select3(...) arg.n = nil local tp,max = arg,5 if type(tp[1]) == 'number' then max = tp[1] if type(tp[2]) == 'table' then tp = tp[2] else table.remove(tp,1) end elseif type(tp[1]) == 'table' then if type(tp[1][1]) == 'number' then max = tp[1][1] table.remove(tp[1],1) tp = tp[1] end tp = tp[1] end local str = '{' local tablen,act,incit = table.getn(tp),0,0 table.foreach(tp,function(i,l) act = act + 1 if act == 1 then str = str .. '{'..string.format('%q',l) elseif act == max+1 and tablen > act+incit then if tablen ~= act+incit+1 then str = str..'},{'..string.format('%q',l) else str=str..','..string.format('%q',l) end incit = incit + max act = 1 else str=str..','..string.format('%q',l) end end) local px = loadstring('return '..str ..'}}')() local function copy_tab(t) local p= {} for i = 1,table.getn(t) do p[i] = t[i] end return p end local pe = {} for i = 1,table.getn(px) do pe [i] = copy_tab(px[i]) end local function init(i,ip) pe[i] = copy_tab(px[i]) local next,back,exit = 0,0,0 if i < table.getn(pe) and table.getn(pe) ~=1 then table.insert(pe[i],table.getn(pe[i])+1,'Para alante Pagina '..(i+1)); next = table.getn(pe[i]) end if i > 1 then table.insert(pe[i],table.getn(pe[i])+1,'Para atraz pagina '..(i-1)); back = table.getn(pe[i]) end table.insert(pe[i],table.getn(pe[i])+1,'Cerrar'); exit = table.getn(pe[i]) if table.getn(pe) > 1 then say('pagina '..i..' de '..table.getn(pe)) end local e = select_table(pe[i]) if e == next then return init(i+1,ip+max) elseif e == back then return init(i-1,ip-max) elseif e == exit then return -1 else return e+ip,pe[i][e] end end return init(1,0) or -1 end local function exportstring( s ) return string.format("%q", s) end function table.save( tbl,filename ) local charS,charE = " ","\n" local file,err = io.open( filename, "wb" ) if err then return err end local tables,lookup = { tbl },{ [tbl] = 1 } file:write( "return {"..charE ) for idx,t in ipairs( tables ) do file:write( "-- Table: {"..idx.."}"..charE ) file:write( "{"..charE ) local thandled = {} for i,v in ipairs( t ) do thandled[i] = true local stype = type( v ) if stype == "table" then if not lookup[v] then table.insert( tables, v ) lookup[v] = table.getn(tables) end file:write( charS.."{"..lookup[v].."},"..charE ) elseif stype == "string" then file:write( charS..exportstring( v )..","..charE ) elseif stype == "number" then file:write( charS..tostring( v )..","..charE ) end end for i,v in pairs( t ) do if (not thandled[i]) then local str = "" local stype = type( i ) if stype == "table" then if not lookup[i] then table.insert( tables,i ) lookup[i] = table.getn(tables) end str = charS.."[{"..lookup[i].."}]=" elseif stype == "string" then str = charS.."["..exportstring( i ).."]=" elseif stype == "number" then str = charS.."["..tostring( i ).."]=" end if str ~= "" then stype = type( v ) if stype == "table" then if not lookup[v] then table.insert( tables,v ) lookup[v] = table.getn(tables) end file:write( str.."{"..lookup[v].."},"..charE ) elseif stype == "string" then file:write( str..exportstring( v )..","..charE ) elseif stype == "number" then file:write( str..tostring( v )..","..charE ) end end end end file:write( "},"..charE ) end file:write( "}" ) file:close() end function table.load( sfile ) local ftables,err = loadfile( sfile ) if err then return _,err end local tables = ftables() for idx = 1,table.getn(tables) do local tolinki = {} for i,v in pairs( tables[idx] ) do if type( v ) == "table" then tables[idx][i] = tables[v[1]] end if type( i ) == "table" and tables[i[1]] then table.insert( tolinki,{ i,tables[i[1]] } ) end end for _,v in ipairs( tolinki ) do tables[idx][v[2]],tables[idx][v[1]] = tables[idx][v[1]],nil end end return tables[1] end quest_function
     

    write_log get_coins coins_write spenden select3 table.save table.load
    http-~~-//www.youtube.com/watch?v=5avAKriuCTg

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
  13. Me Gusta
    fuuton97 got a reaction from Only4Fun in [QUEST + REGEN'S]Catacumbas funcionales.   
    Nuevo link agregado al post: Debes iniciar sesión para ver el contenido del enlace en esta publicación. 
    Saludos.
  14. Me Gusta
    fuuton97 reacted to Anghios in Protección del .bin   
    Bueno, hace muchísimo que no subo una guía, pero bueno, esto tal vez les interese a la gente que intenta obligar a sus players a que jueguen desde el un nombre determinado de un proceso de Metin2, o que ese proceso de Metin2 tenga los bytes exactos, que no sea un metin2.bin casero que puedan usar para hackear el cliente o similares.
     
    ¿Cómo se hace?
    Descompilamos root.epk y vamos a editar game.py (sí, el dichoso archivo tan delicado jajajaja)
    Buscáis:

    class GameWindow(ui.ScriptWindow): def __init__(self, stream):Y debajo ponéis lo siguiente: 

    #INICIO SISTEMA ANGHIOS #1 import sys from os.path import basename ruta_y_proceso_ejecutado = sys.executable proceso_ejecutado = basename(ruta_y_proceso_ejecutado) if proceso_ejecutado != "NOMBREDELPROCESO.LOQUESEA": os.system("taskkill /im %s /f" % proceso_ejecutado) #/En NOMBREDELPROCESO.LOQUESEA ponemos nuestro proceso, ya sea metin2.bin, metin2.exe, pacohostias.dll, metin2pene.src... lo que quieran  
    Ese sistema evita que entren con un proceso que no sea el que vosotros habéis puesto. El código obtiene el nombre del proceso que se está ejecutando, y si no es el mismo, mata el PID del proceso
     
    ----------
    Para obligar a la gente a que tenga tu .bin y no hagan uno casero para hackear:
     
    Debajo del código que hemos puesto arriba, podemos colindar este:
     

    #SISTEMA ANGHIOS #2 bytes_archivo = os.path.getsize(proceso_ejecutado) if bytes_archivo != BYTESARCHIVO: os.system("taskkill /im %s /f" % proceso_ejecutado) #/ En BYTESARCHIVO ponemos los bytes del .bin, para obtener sus bytes sobra con hacer 2º botón del ratón encima del .bin> propiedades>
    Os saldrá algo parecido a esto-> 4,16 MB (4.370.432 bytes)
    Pues los bytes son: 4370432
     
    Este sistema es igual de fácil que el otro, obtiene los bytes del .bin, si son diferentes a los que habéis puesto, mata el PID del proceso.
    Así que si actualizan el .bin, no olviden de actualizar root, o donde tengáis puesto este sistema
     
    Y esto es todo, un gran sistema al que nadie se le había ocurrido, y mucho menos compartirlo.
    Ea, a disfrutar!
     
     
    LICENCIA DE CREATIVE COMMONS, CREADA 100% POR ANGHIOS (NéSTOR GONZáLEZ). Si se publica en otro lugar, al menos que se tenga la decencia de dejar constancia del autor, del sitio y del hilo.
    Thanks babys.
  15. Me Gusta
    fuuton97 got a reaction from NataliMontoya in [PETICION]Quest Bienvenida   
    quest entrada_server begin
    state start begin
    when login with pc.get_level() == 1 begin
    notice_all("Bienvenido ".. pc.get_name() .." a TheBlackMt2")
    end
    end
    end

  16. Me Gusta
    fuuton97 got a reaction from Metin2Regal in [QUEST + REGEN'S]Catacumbas funcionales.   
    Hola zoneros, hoy les vengo a traer la quest de las catacumbas del diablo, 100% probada por mi, esta es la quest de BlackYuko. Cuenta con los portales como el oficial, en un máximo de 99% del oficial.
     
    Quest:

    --** --** Script Catacumbas del Diablo. --** by BlackYuko Skype: manu___88 --** quest catacombe begin state start begin --** --** Funciones --** function GetScriptData(data) local map_data = {['map_index'] = 15, -- index del mapa de catacumbas ['x'] = 3072, ['y'] = 12032, -- coordenadas X y Y, las del mapa catacumbas ['drop_frequency'] = 1000, -- frecuencia en los mob para que dropeen la llave cristal del alma ['min_lev'] = 100, -- nivel minimo para entrar a catacumbas, ['close_time'] = 60, -- tiempo (minutos) para estar en catacumbas ['testa_ristretta'] = 30320, -- vnum item de entrada que pide ['chiave_anime_cristallo'] = 30311, -- vnum item llave cistal del alma ['totem_smorfia'] = 30312, -- vnum totem ['forziere_azrael'] = 219, -- vnum drop al matar al azrael ['min_drop_lev'] = 100, -- nivel minimo para dropeo de la llave cristal ['max_drop_lev'] = 210} -- nivel maximo para dropeo de la lalve cristal return rawget(map_data, data) end function IsInDungeon(pc_index) local map_index = catacombe.GetScriptData('map_index') return (pc.in_dungeon() and pc_index >= map_index*10000 and pc_index < (map_index+1)*10000) end function CanDrop(pc_level) return (pc_level >= catacombe.GetScriptData('min_drop_lev') and pc_level <= catacombe.GetScriptData('max_drop_lev')) end --** --** NPC - Guardian entrada a catacumbas --** when 20351.chat."GM: Catacumbas Abrir" with pc.is_gm() begin say_title("GM: Catacumbas Abrir") say("¿Quieres abrir las Catacumbas?[ENTER]") local s = select("Si","No") if s == 2 then return end say_title("GM: Abrir Catacumbas") say("Operación Completada.[ENTER]") game.set_event_flag("catacomb_next_open", 1) end when 20351.chat."Entrada a Catacumbas" begin local mob_race = npc.get_race() local min_lev = catacombe.GetScriptData('min_lev') say_title(mob_name(mob_race)) if pc.get_level() < min_lev then say("Debes tener el mínimo Nivel "..min_lev) say("Para entrar.[ENTER]") return end if pc.count_item(catacombe.GetScriptData('testa_ristretta')) == 0 then say("Tienes que tener este Item para") say("Entrar:[ENTER]") say_item_vnum(catacombe.GetScriptData('testa_ristretta')) return end if get_time() < game.get_event_flag("catacomb_next_open") then say("Las Catacumbas están cerradas.[ENTER]") return end say("Hola aventurero. Las catacumbas del diablo") say("son un lugar muy peligroso.[ENTER]") local s = select("Entrar","No Entrar") if s == 2 then return end say_title(mob_name(mob_race)) say("Ok Viajero, ahora será telestrasportado.") say("Preste mucha atención.[ENTER]") wait() pc.warp((catacombe.GetScriptData('x')+80)*100, (catacombe.GetScriptData('y')+60)*100) end --** --** Primer Piso --** when login with pc.get_map_index()== catacombe.GetScriptData('map_index') begin pc.set_warp_location(15, 3152, 12092) end when logout with pc.get_map_index()== catacombe.GetScriptData('map_index') begin pc.delqf("mob_killed") end when 2501.kill or 2502.kill or 2503.kill or 2504.kill with pc.get_map_index()== catacombe.GetScriptData('map_index') begin pc.setqf("mob_killed", pc.getqf("mob_killed")+1) if math.mod(pc.getqf("mob_killed"), catacombe.GetScriptData('drop_frequency')) == 0 then game.drop_item_with_ownership(catacombe.GetScriptData('chiave_anime_cristallo'), 1) end end when 30101.take with item.get_vnum() == catacombe.GetScriptData('chiave_anime_cristallo') and pc.get_map_index() == catacombe.GetScriptData('map_index') begin say_title(mob_name(30101)) if get_time() < game.get_event_flag("catacomb_next_open") then say("Las Catacumbas están cerradas.[ENTER]") return end if party.is_party() and not party.is_leader() then say("Sólo arrastra el objeto sobre") say("El NPC.[ENTER]") return end pc.remove_item(item.get_vnum(), 1) say("Abrieron el seloo hacia.") say("El paso a la segunda planta.[ENTER]") if party.is_party() then say("Serán llevados, suerte viejeros.[ENTER]") end wait() game.set_event_flag("catacomb_next_open", get_time()+60*catacombe.GetScriptData('close_time')) pc.setqf("is_master", 1) timer("enter_floor_2", 2) end --** --** Entrada dungeon y timer --** when login with catacombe.IsInDungeon(pc.get_map_index()) begin pc.set_warp_location(15, 3152, 12092) if pc.getqf("is_master") == 1 then timer("start_timer", 2) end end when logout with catacombe.IsInDungeon(pc.get_map_index()) begin pc.remove_item(catacombe.GetScriptData('totem_smorfia'), pc.count_item(catacombe.GetScriptData('totem_smorfia'))) pc.remove_item(catacombe.GetScriptData('chiave_anime_cristallo'), pc.count_item(catacombe.GetScriptData('chiave_anime_cristallo'))) pc.delqf("is_master") end when start_timer.timer begin d.notice("Les que da "..catacombe.GetScriptData('close_time').." minutos de su tiempo.") d.notice("para complezar Catacumbas!") notice_all("Las Catacumbas se cerrarán en "..catacombe.GetScriptData('close_time').." minutos a partir de ahora.") server_timer("catacomb_open", 60*catacombe.GetScriptData('close_time'), pc.get_map_index()) end when catacomb_open.server_timer begin notice_all("Las Catacumbas están abiertas de nuevo.!") if d.select(get_server_timer_arg()) then clear_server_timer("catacomb_open", get_server_timer_arg()) d.notice("Tiempo Acabado, serán sacados de Catacumbas.") d.exit_all() end end --** --** Segundo piso --** when enter_floor_2.timer begin d.new_jump_all(15, 3617, 12075) d.regen_file("data/dungeon/catacumbas/dc_regen_ebene2.txt") d.setf("catacomb_floor", 2) end when 30103.take with item.get_vnum() == catacombe.GetScriptData('testa_ristretta') and catacombe.IsInDungeon(pc.get_map_index()) and d.getf("catacomb_floor") == 2 begin if pc.getqf("is_master") == 1 then pc.remove_item(item.get_vnum(), 1) d.notice("Serán llevados a la siguente planta") timer("enter_floor_3", 3) else d.notice("Solo el guerrero fuerte podrá poner el item.") end end --** --** Tercer piso --** when enter_floor_3.timer begin d.jump_all(3572, 12760) d.clear_regen() d.kill_all() d.regen_file("data/dungeon/catacumbas/dc_regen_ebene3.txt") d.setf("catacomb_floor", 3) d.notice("Buscar el metin correcto para avanzar!") local coord_metin = {{1340,348},{1243,357},{1334,151},{1252,148},{1149,148},{1139,244},{1148,355}} local right_metin = math.mod(os.time(),table.getn(coord_metin))+1 for i = 1,table.getn(coord_metin) do if i == right_metin then local v = d.spawn_mob(8025, coord_metin[i][1], coord_metin[i][2]) d.set_unique("real", v) --chat(coord_metin[i][1].." "..coord_metin[i][2]) else d.spawn_mob(8025, coord_metin[i][1], coord_metin[i][2]) end end end when 8025.kill with catacombe.IsInDungeon(pc.get_map_index()) and d.getf("catacomb_floor") == 3 begin if d.is_unique_dead("real") then d.notice("El metin destruido es el correcto!") d.notice("Serán llevados a la siguiente planta.") timer("enter_floor_4", 3) else d.notice("El metin destruido es falso.") end end --** --** Cuarto Piso --** when enter_floor_4.timer begin d.jump_all(3369, 12354) d.clear_regen() d.kill_all() local map_n = math.mod(os.time(),4)+1 d.regen_file("data/dungeon/catacumbas/piano_4_"..map_n.."_catacombe.txt") d.setf("catacomb_floor", 4) d.notice("Encontrar el camino correcto para avanzar!") end when 20352.chat."Avanzar a la Sig. Planta" with catacombe.IsInDungeon(pc.get_map_index()) and d.getf("catacomb_floor") == 4 begin if pc.getqf("is_master") == 1 then say("Muy bien, has conseguido llegar hasta aquí.") say("En la siguiente planta te enfrentarás con el") say("jefe de las catacumbas.[ENTER]") wait() setskin(0) d.notice("Serán llevados a la siguiente planta.") timer("enter_floor_5", 3) else say("Sólo el guerrero del grupo o subida podrá recompensar.[ENTER]") end end --** --** Quinto Piso --** when enter_floor_5.timer begin d.jump_all(3917, 12431) d.clear_regen() d.kill_all() d.regen_file("data/dungeon/catacumbas/dc_regen_ebene5.txt") d.setf("catacomb_floor", 5) d.setf("correct_killed", 0) d.notice("Encontrar y matar al Tártaro correcto para avanzar!") local coord_boss = {{848,570},{678,832},{685,632},{1031,637},{1003,856}} local right_boss = math.mod(os.time(),table.getn(coord_boss))+1 for i = 1,table.getn(coord_boss) do if i == right_boss then local v = d.spawn_mob(2591, coord_boss[i][1], coord_boss[i][2]) d.set_unique("real", v) --chat(coord_boss[i][1].." "..coord_boss[i][2]) else d.spawn_mob(2591, coord_boss[i][1], coord_boss[i][2]) end end end when 2591.kill with catacombe.IsInDungeon(pc.get_map_index()) and d.getf("catacomb_floor") == 5 begin if d.is_unique_dead("real") and d.getf("correct_killed") == 0 then d.setf("correct_killed", 1) d.notice("El Tártaro correcto fue destruido!") d.notice("Arrastra el Totém al pilar o NPC!") game.drop_item_with_ownership(catacombe.GetScriptData('totem_smorfia'), 1) else d.notice("El Tártaro es falso, no es el correcto.") end end when 30102.take with item.get_vnum() == catacombe.GetScriptData('totem_smorfia') begin pc.remove_item(item.get_vnum(), 1) d.notice("Serán llevados a la siguiente planta!") timer("enter_floor_6", 3) end --** --** Sexto Piso --** when enter_floor_6.timer begin d.jump_all(4372, 12732) d.clear_regen() d.kill_all() d.regen_file("data/dungeon/catacumbas/dc_regen_ebene6.txt") d.setf("catacomb_floor", 6) d.notice("Mata al Caronte para avanzar!") end when 2597.kill with catacombe.IsInDungeon(pc.get_map_index()) and d.getf("catacomb_floor") == 6 begin notice_all(" ".. pc.get_name() .." Ha destruido la Muerte!") notice_all("Felicitaciones Guerrero.") d.notice("El Caronte fue destruido!") d.notice("Serán llevados a la última planta, Suerte!") timer("enter_floor_7", 3) end --** --** Septimo Piso --** when enter_floor_7.timer begin d.jump_all(3146, 13142) d.clear_regen() d.kill_all() d.regen_file("data/dungeon/catacumbas/dc_regen_ebene7.txt") d.setf("catacomb_floor", 7) d.notice("Acaba con Azrael!") end when 2598.kill with catacombe.IsInDungeon(pc.get_map_index()) and d.getf("catacomb_floor") == 7 begin if catacombe.CanDrop(pc.get_level()) then game.drop_item_with_ownership(catacombe.GetScriptData('forziere_azrael'), 1) end notice_all("El Personaje o el Grupo de ".. pc.get_name() .." ha destruido al Azrael!") d.clear_regen() d.notice("Han acabado con el Mal del Azrael, FELICITACIONES!") d.notice("Tienen 20 segundos, y serán sacados de la mazmorra.") timer("exit_catacomb", 20) end when exit_catacomb.timer begin d.exit_all() end end end Por general cambian el index del mapa que es 15 (en mi caso), ustedes lo cambian por su número de index, es totalmente editable, cuenta con activación de las catacumbas por un gm.
     
    Poner en quest_functions:

    DragonLair.startRaid GetScriptData(data) IsInDungeon(pc_index) CanDrop(pc_level) catacombe.CanDrop catacombe.GetScriptData game.drop_item_with_ownership os.time rawget Introducir en player-->query-->new query: Estos son los portales.

    INSERT INTO mob_proto VALUES ('10201', '. 70 580', 0x2E20373020353830, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10202', '. 70 668', 0x2E20373020363638, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10203', '. 131 665', 0x2E2031333120363635, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10204', '. 183 566', 0x2E2031383320353636, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10205', '. 292 567', 0x2E203239322020353637, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10206', '. 281 636', 0x2E2032383120363336, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10207', '. 186 667', 0x2E2031383620363637, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10208', '. 345 558', 0x2E2033343520353538, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10209', '. 402 561', 0x2E2034303220353631, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10210', '. 68 811', 0x2E20363820383131, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10211', '. 140 818', 0x2E2031343020383138, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10212', '. 189 716', 0x2E2031383920373136, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10213', '. 274 716', 0x2E2032373420373136, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10214', '. 232 780', 0x2E2032333220373830, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10215', '. 325 779', 0x2E2033323520373739, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10216', '. 274 838', 0x2E2032373420383338, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10217', '. 359 717', 0x2E2033353920373137, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10218', '. 415 711', 0x2E2034313520373131, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10219', '. 368 776', 0x2E2033363820373736, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10220', '. 366 815', 0x2E2033363620383135, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10221', '. 350 840', 0x2E2033353020383430, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10222', '. 424 842', 0x2E2034323420383432, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10223', '. 94 843', 0x2E20393420383433, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10224', '. 59 864', 0x2E20353920383634, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10225', '. 138 864', 0x2E2031333820383634, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10226', '. 54 920', 0x2E20353420393230, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10227', '. 140 919', 0x2E2031343020393139, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10228', '. 90 945', 0x2E20393020393435, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10229', '. 194 865', 0x2E2031393420383635, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10230', '. 243 857', 0x2E2032343320383537, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10231', '. 312 856', 0x2E2033313220383536, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10232', '. 368 894', 0x2E2033363820383934, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10233', '. 406 875', 0x2E2034303620383735, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10235', '. 500 790', 0x2E2035303020373930, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10234', '. 427 934', 0x2E2034323720393334, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); Descargar regen's + la parte del servidor + regen portales (PARTE DEL SERVIDOR OBLIGATORIA PONER, PORQUE ES DIFERENTE SU SERVER_ATTR):
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    Solamente deberán cambiar las coordenadas de cada planta, y listo.
     
    Créditos quest: BlackYuko
     
    Saludos.
  17. Me Gusta
    fuuton97 got a reaction from Metin2 Soul in [QUEST + REGEN'S]Catacumbas funcionales.   
    Hola zoneros, hoy les vengo a traer la quest de las catacumbas del diablo, 100% probada por mi, esta es la quest de BlackYuko. Cuenta con los portales como el oficial, en un máximo de 99% del oficial.
     
    Quest:

    --** --** Script Catacumbas del Diablo. --** by BlackYuko Skype: manu___88 --** quest catacombe begin state start begin --** --** Funciones --** function GetScriptData(data) local map_data = {['map_index'] = 15, -- index del mapa de catacumbas ['x'] = 3072, ['y'] = 12032, -- coordenadas X y Y, las del mapa catacumbas ['drop_frequency'] = 1000, -- frecuencia en los mob para que dropeen la llave cristal del alma ['min_lev'] = 100, -- nivel minimo para entrar a catacumbas, ['close_time'] = 60, -- tiempo (minutos) para estar en catacumbas ['testa_ristretta'] = 30320, -- vnum item de entrada que pide ['chiave_anime_cristallo'] = 30311, -- vnum item llave cistal del alma ['totem_smorfia'] = 30312, -- vnum totem ['forziere_azrael'] = 219, -- vnum drop al matar al azrael ['min_drop_lev'] = 100, -- nivel minimo para dropeo de la llave cristal ['max_drop_lev'] = 210} -- nivel maximo para dropeo de la lalve cristal return rawget(map_data, data) end function IsInDungeon(pc_index) local map_index = catacombe.GetScriptData('map_index') return (pc.in_dungeon() and pc_index >= map_index*10000 and pc_index < (map_index+1)*10000) end function CanDrop(pc_level) return (pc_level >= catacombe.GetScriptData('min_drop_lev') and pc_level <= catacombe.GetScriptData('max_drop_lev')) end --** --** NPC - Guardian entrada a catacumbas --** when 20351.chat."GM: Catacumbas Abrir" with pc.is_gm() begin say_title("GM: Catacumbas Abrir") say("¿Quieres abrir las Catacumbas?[ENTER]") local s = select("Si","No") if s == 2 then return end say_title("GM: Abrir Catacumbas") say("Operación Completada.[ENTER]") game.set_event_flag("catacomb_next_open", 1) end when 20351.chat."Entrada a Catacumbas" begin local mob_race = npc.get_race() local min_lev = catacombe.GetScriptData('min_lev') say_title(mob_name(mob_race)) if pc.get_level() < min_lev then say("Debes tener el mínimo Nivel "..min_lev) say("Para entrar.[ENTER]") return end if pc.count_item(catacombe.GetScriptData('testa_ristretta')) == 0 then say("Tienes que tener este Item para") say("Entrar:[ENTER]") say_item_vnum(catacombe.GetScriptData('testa_ristretta')) return end if get_time() < game.get_event_flag("catacomb_next_open") then say("Las Catacumbas están cerradas.[ENTER]") return end say("Hola aventurero. Las catacumbas del diablo") say("son un lugar muy peligroso.[ENTER]") local s = select("Entrar","No Entrar") if s == 2 then return end say_title(mob_name(mob_race)) say("Ok Viajero, ahora será telestrasportado.") say("Preste mucha atención.[ENTER]") wait() pc.warp((catacombe.GetScriptData('x')+80)*100, (catacombe.GetScriptData('y')+60)*100) end --** --** Primer Piso --** when login with pc.get_map_index()== catacombe.GetScriptData('map_index') begin pc.set_warp_location(15, 3152, 12092) end when logout with pc.get_map_index()== catacombe.GetScriptData('map_index') begin pc.delqf("mob_killed") end when 2501.kill or 2502.kill or 2503.kill or 2504.kill with pc.get_map_index()== catacombe.GetScriptData('map_index') begin pc.setqf("mob_killed", pc.getqf("mob_killed")+1) if math.mod(pc.getqf("mob_killed"), catacombe.GetScriptData('drop_frequency')) == 0 then game.drop_item_with_ownership(catacombe.GetScriptData('chiave_anime_cristallo'), 1) end end when 30101.take with item.get_vnum() == catacombe.GetScriptData('chiave_anime_cristallo') and pc.get_map_index() == catacombe.GetScriptData('map_index') begin say_title(mob_name(30101)) if get_time() < game.get_event_flag("catacomb_next_open") then say("Las Catacumbas están cerradas.[ENTER]") return end if party.is_party() and not party.is_leader() then say("Sólo arrastra el objeto sobre") say("El NPC.[ENTER]") return end pc.remove_item(item.get_vnum(), 1) say("Abrieron el seloo hacia.") say("El paso a la segunda planta.[ENTER]") if party.is_party() then say("Serán llevados, suerte viejeros.[ENTER]") end wait() game.set_event_flag("catacomb_next_open", get_time()+60*catacombe.GetScriptData('close_time')) pc.setqf("is_master", 1) timer("enter_floor_2", 2) end --** --** Entrada dungeon y timer --** when login with catacombe.IsInDungeon(pc.get_map_index()) begin pc.set_warp_location(15, 3152, 12092) if pc.getqf("is_master") == 1 then timer("start_timer", 2) end end when logout with catacombe.IsInDungeon(pc.get_map_index()) begin pc.remove_item(catacombe.GetScriptData('totem_smorfia'), pc.count_item(catacombe.GetScriptData('totem_smorfia'))) pc.remove_item(catacombe.GetScriptData('chiave_anime_cristallo'), pc.count_item(catacombe.GetScriptData('chiave_anime_cristallo'))) pc.delqf("is_master") end when start_timer.timer begin d.notice("Les que da "..catacombe.GetScriptData('close_time').." minutos de su tiempo.") d.notice("para complezar Catacumbas!") notice_all("Las Catacumbas se cerrarán en "..catacombe.GetScriptData('close_time').." minutos a partir de ahora.") server_timer("catacomb_open", 60*catacombe.GetScriptData('close_time'), pc.get_map_index()) end when catacomb_open.server_timer begin notice_all("Las Catacumbas están abiertas de nuevo.!") if d.select(get_server_timer_arg()) then clear_server_timer("catacomb_open", get_server_timer_arg()) d.notice("Tiempo Acabado, serán sacados de Catacumbas.") d.exit_all() end end --** --** Segundo piso --** when enter_floor_2.timer begin d.new_jump_all(15, 3617, 12075) d.regen_file("data/dungeon/catacumbas/dc_regen_ebene2.txt") d.setf("catacomb_floor", 2) end when 30103.take with item.get_vnum() == catacombe.GetScriptData('testa_ristretta') and catacombe.IsInDungeon(pc.get_map_index()) and d.getf("catacomb_floor") == 2 begin if pc.getqf("is_master") == 1 then pc.remove_item(item.get_vnum(), 1) d.notice("Serán llevados a la siguente planta") timer("enter_floor_3", 3) else d.notice("Solo el guerrero fuerte podrá poner el item.") end end --** --** Tercer piso --** when enter_floor_3.timer begin d.jump_all(3572, 12760) d.clear_regen() d.kill_all() d.regen_file("data/dungeon/catacumbas/dc_regen_ebene3.txt") d.setf("catacomb_floor", 3) d.notice("Buscar el metin correcto para avanzar!") local coord_metin = {{1340,348},{1243,357},{1334,151},{1252,148},{1149,148},{1139,244},{1148,355}} local right_metin = math.mod(os.time(),table.getn(coord_metin))+1 for i = 1,table.getn(coord_metin) do if i == right_metin then local v = d.spawn_mob(8025, coord_metin[i][1], coord_metin[i][2]) d.set_unique("real", v) --chat(coord_metin[i][1].." "..coord_metin[i][2]) else d.spawn_mob(8025, coord_metin[i][1], coord_metin[i][2]) end end end when 8025.kill with catacombe.IsInDungeon(pc.get_map_index()) and d.getf("catacomb_floor") == 3 begin if d.is_unique_dead("real") then d.notice("El metin destruido es el correcto!") d.notice("Serán llevados a la siguiente planta.") timer("enter_floor_4", 3) else d.notice("El metin destruido es falso.") end end --** --** Cuarto Piso --** when enter_floor_4.timer begin d.jump_all(3369, 12354) d.clear_regen() d.kill_all() local map_n = math.mod(os.time(),4)+1 d.regen_file("data/dungeon/catacumbas/piano_4_"..map_n.."_catacombe.txt") d.setf("catacomb_floor", 4) d.notice("Encontrar el camino correcto para avanzar!") end when 20352.chat."Avanzar a la Sig. Planta" with catacombe.IsInDungeon(pc.get_map_index()) and d.getf("catacomb_floor") == 4 begin if pc.getqf("is_master") == 1 then say("Muy bien, has conseguido llegar hasta aquí.") say("En la siguiente planta te enfrentarás con el") say("jefe de las catacumbas.[ENTER]") wait() setskin(0) d.notice("Serán llevados a la siguiente planta.") timer("enter_floor_5", 3) else say("Sólo el guerrero del grupo o subida podrá recompensar.[ENTER]") end end --** --** Quinto Piso --** when enter_floor_5.timer begin d.jump_all(3917, 12431) d.clear_regen() d.kill_all() d.regen_file("data/dungeon/catacumbas/dc_regen_ebene5.txt") d.setf("catacomb_floor", 5) d.setf("correct_killed", 0) d.notice("Encontrar y matar al Tártaro correcto para avanzar!") local coord_boss = {{848,570},{678,832},{685,632},{1031,637},{1003,856}} local right_boss = math.mod(os.time(),table.getn(coord_boss))+1 for i = 1,table.getn(coord_boss) do if i == right_boss then local v = d.spawn_mob(2591, coord_boss[i][1], coord_boss[i][2]) d.set_unique("real", v) --chat(coord_boss[i][1].." "..coord_boss[i][2]) else d.spawn_mob(2591, coord_boss[i][1], coord_boss[i][2]) end end end when 2591.kill with catacombe.IsInDungeon(pc.get_map_index()) and d.getf("catacomb_floor") == 5 begin if d.is_unique_dead("real") and d.getf("correct_killed") == 0 then d.setf("correct_killed", 1) d.notice("El Tártaro correcto fue destruido!") d.notice("Arrastra el Totém al pilar o NPC!") game.drop_item_with_ownership(catacombe.GetScriptData('totem_smorfia'), 1) else d.notice("El Tártaro es falso, no es el correcto.") end end when 30102.take with item.get_vnum() == catacombe.GetScriptData('totem_smorfia') begin pc.remove_item(item.get_vnum(), 1) d.notice("Serán llevados a la siguiente planta!") timer("enter_floor_6", 3) end --** --** Sexto Piso --** when enter_floor_6.timer begin d.jump_all(4372, 12732) d.clear_regen() d.kill_all() d.regen_file("data/dungeon/catacumbas/dc_regen_ebene6.txt") d.setf("catacomb_floor", 6) d.notice("Mata al Caronte para avanzar!") end when 2597.kill with catacombe.IsInDungeon(pc.get_map_index()) and d.getf("catacomb_floor") == 6 begin notice_all(" ".. pc.get_name() .." Ha destruido la Muerte!") notice_all("Felicitaciones Guerrero.") d.notice("El Caronte fue destruido!") d.notice("Serán llevados a la última planta, Suerte!") timer("enter_floor_7", 3) end --** --** Septimo Piso --** when enter_floor_7.timer begin d.jump_all(3146, 13142) d.clear_regen() d.kill_all() d.regen_file("data/dungeon/catacumbas/dc_regen_ebene7.txt") d.setf("catacomb_floor", 7) d.notice("Acaba con Azrael!") end when 2598.kill with catacombe.IsInDungeon(pc.get_map_index()) and d.getf("catacomb_floor") == 7 begin if catacombe.CanDrop(pc.get_level()) then game.drop_item_with_ownership(catacombe.GetScriptData('forziere_azrael'), 1) end notice_all("El Personaje o el Grupo de ".. pc.get_name() .." ha destruido al Azrael!") d.clear_regen() d.notice("Han acabado con el Mal del Azrael, FELICITACIONES!") d.notice("Tienen 20 segundos, y serán sacados de la mazmorra.") timer("exit_catacomb", 20) end when exit_catacomb.timer begin d.exit_all() end end end Por general cambian el index del mapa que es 15 (en mi caso), ustedes lo cambian por su número de index, es totalmente editable, cuenta con activación de las catacumbas por un gm.
     
    Poner en quest_functions:

    DragonLair.startRaid GetScriptData(data) IsInDungeon(pc_index) CanDrop(pc_level) catacombe.CanDrop catacombe.GetScriptData game.drop_item_with_ownership os.time rawget Introducir en player-->query-->new query: Estos son los portales.

    INSERT INTO mob_proto VALUES ('10201', '. 70 580', 0x2E20373020353830, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10202', '. 70 668', 0x2E20373020363638, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10203', '. 131 665', 0x2E2031333120363635, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10204', '. 183 566', 0x2E2031383320353636, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10205', '. 292 567', 0x2E203239322020353637, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10206', '. 281 636', 0x2E2032383120363336, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10207', '. 186 667', 0x2E2031383620363637, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10208', '. 345 558', 0x2E2033343520353538, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10209', '. 402 561', 0x2E2034303220353631, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10210', '. 68 811', 0x2E20363820383131, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10211', '. 140 818', 0x2E2031343020383138, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10212', '. 189 716', 0x2E2031383920373136, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10213', '. 274 716', 0x2E2032373420373136, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10214', '. 232 780', 0x2E2032333220373830, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10215', '. 325 779', 0x2E2033323520373739, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10216', '. 274 838', 0x2E2032373420383338, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10217', '. 359 717', 0x2E2033353920373137, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10218', '. 415 711', 0x2E2034313520373131, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10219', '. 368 776', 0x2E2033363820373736, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10220', '. 366 815', 0x2E2033363620383135, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10221', '. 350 840', 0x2E2033353020383430, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10222', '. 424 842', 0x2E2034323420383432, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10223', '. 94 843', 0x2E20393420383433, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10224', '. 59 864', 0x2E20353920383634, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10225', '. 138 864', 0x2E2031333820383634, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10226', '. 54 920', 0x2E20353420393230, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10227', '. 140 919', 0x2E2031343020393139, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10228', '. 90 945', 0x2E20393020393435, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10229', '. 194 865', 0x2E2031393420383635, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10230', '. 243 857', 0x2E2032343320383537, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10231', '. 312 856', 0x2E2033313220383536, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10232', '. 368 894', 0x2E2033363820383934, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10233', '. 406 875', 0x2E2034303620383735, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10235', '. 500 790', 0x2E2035303020373930, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10234', '. 427 934', 0x2E2034323720393334, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); Descargar regen's + la parte del servidor + regen portales (PARTE DEL SERVIDOR OBLIGATORIA PONER, PORQUE ES DIFERENTE SU SERVER_ATTR):
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    Solamente deberán cambiar las coordenadas de cada planta, y listo.
     
    Créditos quest: BlackYuko
     
    Saludos.
  18. Me Gusta
    fuuton97 got a reaction from Frezi Op in [QUEST + REGEN'S]Catacumbas funcionales.   
    Hola zoneros, hoy les vengo a traer la quest de las catacumbas del diablo, 100% probada por mi, esta es la quest de BlackYuko. Cuenta con los portales como el oficial, en un máximo de 99% del oficial.
     
    Quest:

    --** --** Script Catacumbas del Diablo. --** by BlackYuko Skype: manu___88 --** quest catacombe begin state start begin --** --** Funciones --** function GetScriptData(data) local map_data = {['map_index'] = 15, -- index del mapa de catacumbas ['x'] = 3072, ['y'] = 12032, -- coordenadas X y Y, las del mapa catacumbas ['drop_frequency'] = 1000, -- frecuencia en los mob para que dropeen la llave cristal del alma ['min_lev'] = 100, -- nivel minimo para entrar a catacumbas, ['close_time'] = 60, -- tiempo (minutos) para estar en catacumbas ['testa_ristretta'] = 30320, -- vnum item de entrada que pide ['chiave_anime_cristallo'] = 30311, -- vnum item llave cistal del alma ['totem_smorfia'] = 30312, -- vnum totem ['forziere_azrael'] = 219, -- vnum drop al matar al azrael ['min_drop_lev'] = 100, -- nivel minimo para dropeo de la llave cristal ['max_drop_lev'] = 210} -- nivel maximo para dropeo de la lalve cristal return rawget(map_data, data) end function IsInDungeon(pc_index) local map_index = catacombe.GetScriptData('map_index') return (pc.in_dungeon() and pc_index >= map_index*10000 and pc_index < (map_index+1)*10000) end function CanDrop(pc_level) return (pc_level >= catacombe.GetScriptData('min_drop_lev') and pc_level <= catacombe.GetScriptData('max_drop_lev')) end --** --** NPC - Guardian entrada a catacumbas --** when 20351.chat."GM: Catacumbas Abrir" with pc.is_gm() begin say_title("GM: Catacumbas Abrir") say("¿Quieres abrir las Catacumbas?[ENTER]") local s = select("Si","No") if s == 2 then return end say_title("GM: Abrir Catacumbas") say("Operación Completada.[ENTER]") game.set_event_flag("catacomb_next_open", 1) end when 20351.chat."Entrada a Catacumbas" begin local mob_race = npc.get_race() local min_lev = catacombe.GetScriptData('min_lev') say_title(mob_name(mob_race)) if pc.get_level() < min_lev then say("Debes tener el mínimo Nivel "..min_lev) say("Para entrar.[ENTER]") return end if pc.count_item(catacombe.GetScriptData('testa_ristretta')) == 0 then say("Tienes que tener este Item para") say("Entrar:[ENTER]") say_item_vnum(catacombe.GetScriptData('testa_ristretta')) return end if get_time() < game.get_event_flag("catacomb_next_open") then say("Las Catacumbas están cerradas.[ENTER]") return end say("Hola aventurero. Las catacumbas del diablo") say("son un lugar muy peligroso.[ENTER]") local s = select("Entrar","No Entrar") if s == 2 then return end say_title(mob_name(mob_race)) say("Ok Viajero, ahora será telestrasportado.") say("Preste mucha atención.[ENTER]") wait() pc.warp((catacombe.GetScriptData('x')+80)*100, (catacombe.GetScriptData('y')+60)*100) end --** --** Primer Piso --** when login with pc.get_map_index()== catacombe.GetScriptData('map_index') begin pc.set_warp_location(15, 3152, 12092) end when logout with pc.get_map_index()== catacombe.GetScriptData('map_index') begin pc.delqf("mob_killed") end when 2501.kill or 2502.kill or 2503.kill or 2504.kill with pc.get_map_index()== catacombe.GetScriptData('map_index') begin pc.setqf("mob_killed", pc.getqf("mob_killed")+1) if math.mod(pc.getqf("mob_killed"), catacombe.GetScriptData('drop_frequency')) == 0 then game.drop_item_with_ownership(catacombe.GetScriptData('chiave_anime_cristallo'), 1) end end when 30101.take with item.get_vnum() == catacombe.GetScriptData('chiave_anime_cristallo') and pc.get_map_index() == catacombe.GetScriptData('map_index') begin say_title(mob_name(30101)) if get_time() < game.get_event_flag("catacomb_next_open") then say("Las Catacumbas están cerradas.[ENTER]") return end if party.is_party() and not party.is_leader() then say("Sólo arrastra el objeto sobre") say("El NPC.[ENTER]") return end pc.remove_item(item.get_vnum(), 1) say("Abrieron el seloo hacia.") say("El paso a la segunda planta.[ENTER]") if party.is_party() then say("Serán llevados, suerte viejeros.[ENTER]") end wait() game.set_event_flag("catacomb_next_open", get_time()+60*catacombe.GetScriptData('close_time')) pc.setqf("is_master", 1) timer("enter_floor_2", 2) end --** --** Entrada dungeon y timer --** when login with catacombe.IsInDungeon(pc.get_map_index()) begin pc.set_warp_location(15, 3152, 12092) if pc.getqf("is_master") == 1 then timer("start_timer", 2) end end when logout with catacombe.IsInDungeon(pc.get_map_index()) begin pc.remove_item(catacombe.GetScriptData('totem_smorfia'), pc.count_item(catacombe.GetScriptData('totem_smorfia'))) pc.remove_item(catacombe.GetScriptData('chiave_anime_cristallo'), pc.count_item(catacombe.GetScriptData('chiave_anime_cristallo'))) pc.delqf("is_master") end when start_timer.timer begin d.notice("Les que da "..catacombe.GetScriptData('close_time').." minutos de su tiempo.") d.notice("para complezar Catacumbas!") notice_all("Las Catacumbas se cerrarán en "..catacombe.GetScriptData('close_time').." minutos a partir de ahora.") server_timer("catacomb_open", 60*catacombe.GetScriptData('close_time'), pc.get_map_index()) end when catacomb_open.server_timer begin notice_all("Las Catacumbas están abiertas de nuevo.!") if d.select(get_server_timer_arg()) then clear_server_timer("catacomb_open", get_server_timer_arg()) d.notice("Tiempo Acabado, serán sacados de Catacumbas.") d.exit_all() end end --** --** Segundo piso --** when enter_floor_2.timer begin d.new_jump_all(15, 3617, 12075) d.regen_file("data/dungeon/catacumbas/dc_regen_ebene2.txt") d.setf("catacomb_floor", 2) end when 30103.take with item.get_vnum() == catacombe.GetScriptData('testa_ristretta') and catacombe.IsInDungeon(pc.get_map_index()) and d.getf("catacomb_floor") == 2 begin if pc.getqf("is_master") == 1 then pc.remove_item(item.get_vnum(), 1) d.notice("Serán llevados a la siguente planta") timer("enter_floor_3", 3) else d.notice("Solo el guerrero fuerte podrá poner el item.") end end --** --** Tercer piso --** when enter_floor_3.timer begin d.jump_all(3572, 12760) d.clear_regen() d.kill_all() d.regen_file("data/dungeon/catacumbas/dc_regen_ebene3.txt") d.setf("catacomb_floor", 3) d.notice("Buscar el metin correcto para avanzar!") local coord_metin = {{1340,348},{1243,357},{1334,151},{1252,148},{1149,148},{1139,244},{1148,355}} local right_metin = math.mod(os.time(),table.getn(coord_metin))+1 for i = 1,table.getn(coord_metin) do if i == right_metin then local v = d.spawn_mob(8025, coord_metin[i][1], coord_metin[i][2]) d.set_unique("real", v) --chat(coord_metin[i][1].." "..coord_metin[i][2]) else d.spawn_mob(8025, coord_metin[i][1], coord_metin[i][2]) end end end when 8025.kill with catacombe.IsInDungeon(pc.get_map_index()) and d.getf("catacomb_floor") == 3 begin if d.is_unique_dead("real") then d.notice("El metin destruido es el correcto!") d.notice("Serán llevados a la siguiente planta.") timer("enter_floor_4", 3) else d.notice("El metin destruido es falso.") end end --** --** Cuarto Piso --** when enter_floor_4.timer begin d.jump_all(3369, 12354) d.clear_regen() d.kill_all() local map_n = math.mod(os.time(),4)+1 d.regen_file("data/dungeon/catacumbas/piano_4_"..map_n.."_catacombe.txt") d.setf("catacomb_floor", 4) d.notice("Encontrar el camino correcto para avanzar!") end when 20352.chat."Avanzar a la Sig. Planta" with catacombe.IsInDungeon(pc.get_map_index()) and d.getf("catacomb_floor") == 4 begin if pc.getqf("is_master") == 1 then say("Muy bien, has conseguido llegar hasta aquí.") say("En la siguiente planta te enfrentarás con el") say("jefe de las catacumbas.[ENTER]") wait() setskin(0) d.notice("Serán llevados a la siguiente planta.") timer("enter_floor_5", 3) else say("Sólo el guerrero del grupo o subida podrá recompensar.[ENTER]") end end --** --** Quinto Piso --** when enter_floor_5.timer begin d.jump_all(3917, 12431) d.clear_regen() d.kill_all() d.regen_file("data/dungeon/catacumbas/dc_regen_ebene5.txt") d.setf("catacomb_floor", 5) d.setf("correct_killed", 0) d.notice("Encontrar y matar al Tártaro correcto para avanzar!") local coord_boss = {{848,570},{678,832},{685,632},{1031,637},{1003,856}} local right_boss = math.mod(os.time(),table.getn(coord_boss))+1 for i = 1,table.getn(coord_boss) do if i == right_boss then local v = d.spawn_mob(2591, coord_boss[i][1], coord_boss[i][2]) d.set_unique("real", v) --chat(coord_boss[i][1].." "..coord_boss[i][2]) else d.spawn_mob(2591, coord_boss[i][1], coord_boss[i][2]) end end end when 2591.kill with catacombe.IsInDungeon(pc.get_map_index()) and d.getf("catacomb_floor") == 5 begin if d.is_unique_dead("real") and d.getf("correct_killed") == 0 then d.setf("correct_killed", 1) d.notice("El Tártaro correcto fue destruido!") d.notice("Arrastra el Totém al pilar o NPC!") game.drop_item_with_ownership(catacombe.GetScriptData('totem_smorfia'), 1) else d.notice("El Tártaro es falso, no es el correcto.") end end when 30102.take with item.get_vnum() == catacombe.GetScriptData('totem_smorfia') begin pc.remove_item(item.get_vnum(), 1) d.notice("Serán llevados a la siguiente planta!") timer("enter_floor_6", 3) end --** --** Sexto Piso --** when enter_floor_6.timer begin d.jump_all(4372, 12732) d.clear_regen() d.kill_all() d.regen_file("data/dungeon/catacumbas/dc_regen_ebene6.txt") d.setf("catacomb_floor", 6) d.notice("Mata al Caronte para avanzar!") end when 2597.kill with catacombe.IsInDungeon(pc.get_map_index()) and d.getf("catacomb_floor") == 6 begin notice_all(" ".. pc.get_name() .." Ha destruido la Muerte!") notice_all("Felicitaciones Guerrero.") d.notice("El Caronte fue destruido!") d.notice("Serán llevados a la última planta, Suerte!") timer("enter_floor_7", 3) end --** --** Septimo Piso --** when enter_floor_7.timer begin d.jump_all(3146, 13142) d.clear_regen() d.kill_all() d.regen_file("data/dungeon/catacumbas/dc_regen_ebene7.txt") d.setf("catacomb_floor", 7) d.notice("Acaba con Azrael!") end when 2598.kill with catacombe.IsInDungeon(pc.get_map_index()) and d.getf("catacomb_floor") == 7 begin if catacombe.CanDrop(pc.get_level()) then game.drop_item_with_ownership(catacombe.GetScriptData('forziere_azrael'), 1) end notice_all("El Personaje o el Grupo de ".. pc.get_name() .." ha destruido al Azrael!") d.clear_regen() d.notice("Han acabado con el Mal del Azrael, FELICITACIONES!") d.notice("Tienen 20 segundos, y serán sacados de la mazmorra.") timer("exit_catacomb", 20) end when exit_catacomb.timer begin d.exit_all() end end end Por general cambian el index del mapa que es 15 (en mi caso), ustedes lo cambian por su número de index, es totalmente editable, cuenta con activación de las catacumbas por un gm.
     
    Poner en quest_functions:

    DragonLair.startRaid GetScriptData(data) IsInDungeon(pc_index) CanDrop(pc_level) catacombe.CanDrop catacombe.GetScriptData game.drop_item_with_ownership os.time rawget Introducir en player-->query-->new query: Estos son los portales.

    INSERT INTO mob_proto VALUES ('10201', '. 70 580', 0x2E20373020353830, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10202', '. 70 668', 0x2E20373020363638, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10203', '. 131 665', 0x2E2031333120363635, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10204', '. 183 566', 0x2E2031383320353636, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10205', '. 292 567', 0x2E203239322020353637, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10206', '. 281 636', 0x2E2032383120363336, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10207', '. 186 667', 0x2E2031383620363637, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10208', '. 345 558', 0x2E2033343520353538, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10209', '. 402 561', 0x2E2034303220353631, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10210', '. 68 811', 0x2E20363820383131, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10211', '. 140 818', 0x2E2031343020383138, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10212', '. 189 716', 0x2E2031383920373136, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10213', '. 274 716', 0x2E2032373420373136, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10214', '. 232 780', 0x2E2032333220373830, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10215', '. 325 779', 0x2E2033323520373739, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10216', '. 274 838', 0x2E2032373420383338, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10217', '. 359 717', 0x2E2033353920373137, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10218', '. 415 711', 0x2E2034313520373131, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10219', '. 368 776', 0x2E2033363820373736, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10220', '. 366 815', 0x2E2033363620383135, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10221', '. 350 840', 0x2E2033353020383430, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10222', '. 424 842', 0x2E2034323420383432, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10223', '. 94 843', 0x2E20393420383433, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10224', '. 59 864', 0x2E20353920383634, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10225', '. 138 864', 0x2E2031333820383634, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10226', '. 54 920', 0x2E20353420393230, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10227', '. 140 919', 0x2E2031343020393139, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10228', '. 90 945', 0x2E20393020393435, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10229', '. 194 865', 0x2E2031393420383635, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10230', '. 243 857', 0x2E2032343320383537, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10231', '. 312 856', 0x2E2033313220383536, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10232', '. 368 894', 0x2E2033363820383934, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10233', '. 406 875', 0x2E2034303620383735, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10235', '. 500 790', 0x2E2035303020373930, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); INSERT INTO mob_proto VALUES ('10234', '. 427 934', 0x2E2034323720393334, '1', '9', '0', '1', '', 'NOMOVE', '0', '', '', '0', '', '2', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '900', '1', '1', '1', '1', '2000', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'); Descargar regen's + la parte del servidor + regen portales (PARTE DEL SERVIDOR OBLIGATORIA PONER, PORQUE ES DIFERENTE SU SERVER_ATTR):
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    Solamente deberán cambiar las coordenadas de cada planta, y listo.
     
    Créditos quest: BlackYuko
     
    Saludos.
  19. Me Gusta
    fuuton97 got a reaction from Noob6969 in Seguridad Básica para Consola FreeBSD.   
    Buenas, hace rato sin entrar por este forillo, y ver las nuevas secciones me decidí a postear una seguridad básica de FreeBSD para cualquier versión existente, coste decir que es un manual de FreeBSD escrita por David Barbero.
     
    Todas las funciones las he probado en un dedicado de prueba y funcionan.
     
     
    Seguridad en el sistema de Ficheros
     
    El sistema de ficheros que monta FreeBSD es UFS 4.2BSD compatible con todos los BSD. Dentro de el UFS de Freebsd hay dos tipos:
     
    El primero es UFS, lo usa las ramas anteriores a 4.x (4.x incluida) y tiene la seguridad de siempre sin mejoras y soporta quotas.
     
    El Segundo es UFS2, se usa apartir de la rama 5,x y tiene mejoras significativas en seguridad. Sus más significativas son Mandatory Access Control (MAC), File System Access Control List, snapshots y quotas.
     
    No comentare más sobre los tipos de sistemas de ficheros, pero si haré unas recomendaciones para mejorar la seguridad desde el sistema de ficheros.
     
    Hay que considerar que el usuario root debemos usarlo SOLO y EXCLUSIVAMENTE para fines de administración, por lo cual usaremos los usuarios normales. Teniendo esto en cuenta, es de lógica que separemos la partición /home de su posicion original (/usr/home). Con esto también evitamos en parte de fragmentación ya que nuestra partición /usr no tendrá que ser tan grande.
     
    Tambien pondremos los flags NOSUID y NODEV a las particiones /tmp y /usr/home, asi nos aseguraremos que nadie podra usar programas potencialmente peligrosos en esas particiones.
     
    NOSUID No permite la Ejecución de programas con el bit suid, es decir, que se ejecutan como root y son potencialmente peligrosos para el sistema.
     
    NODEV no permite la creación de dispositivos de sistema en esa partición librandonos así de la posible instalación de programas potencialmente peligrosos para el sistema.
     
    Para Configurar esto es necesario mofificar el fichero /etc/fstab e incluir NODUID y NODEV en la sección Options quedando de una forma parecida a esto:
     
    # Device Mountpoint FStype Options Dump Pass#
    /dev/ad0s1b none swap sw 0 0
    /dev/ad0s1a / ufs rw 1 1
    /dev/ad0s1e /tmp ufs rw,noatime,nosuid,nodev 2 2
    /dev/ad0s1g /usr ufs rw,noatime 2 2
    /dev/ad0s1h /usr/home ufs rw,noatime,nosuid,nodev 2 2
    /dev/ad0s1f /var ufs rw,noatime 2 2
    /dev/ad2s1h /data ufs rw,noatime 2 2
    /dev/acd0c /cdrom cd9660 ro,noauto 0 0
    /dev/acd1c /cdrom1 cd9660 ro,noauto 0 0
    proc /proc procfs rw 0 0
    Una vez montado el sistema de ficheros si ejecutamos la orden mount veremos que efectivamente están las opciones que queriamos:
     
    hellen#mount
    /dev/ad0s1a on / (ufs, local)
    /dev/ad0s1e on /tmp (ufs, local, noatime, nosuid, nodev, soft-updates)
    /dev/ad0s1g on /usr (ufs, local, noatime, soft-updates)
    /dev/ad0s1h on /usr/home (ufs, local, noatime, nosuid, nodev, soft-updates)
    /dev/ad0s1f on /var (ufs, local, noatime, soft-updates)
    /dev/ad2s1h on /data (ufs, local, noatime, soft-updates)
    procfs on /proc (procfs, local)
    Para más información consultar fstab(5), fsck(8), mount(8), umount(8)
     
    Seguridad en las contraseñas
     
    Empezaremos aplicando una buena política de contraseñas, para lo cual debemos pensar cual será el máximo tiempo que un usuario estará con la misma contraseñ y de cuantos caracteres será como mínimo.
     
    Yo he decidido usar un mínimo de 8 caracteres para las contraseñas y un máximo de 30 días por contraseña. Tambien he decidido cambiar el sistema de cifrado de las contraseñas, que por defecto es md5, por uno más seguro, Blowfish.
     
    Para configurar estas opciones necesitamos que editar el archivo /etc/login.conf
     
    hellen# vi /etc/login.conf
    Para cambiar el cifrado tenemos que buscar la línea
     
    default:
    :passwd_format=md5:
    Una vez modificada quedaría de la siguiente forma:
     
    default:
    :passwd_format=blf:
    Con este cambio ya tendriamos configurado el sistema de cifrado usando Blowfish.
     
    Ahora vamos a cambiar la longitud mínima de caracteres para cada contraseña y hacer que cada usuario cambie su contraseña cada 30 días, Para ello pondremos lo siguiente al final de el apartado default:
     
    :umask=022:
    :minpasswordlen=8:
    :passwordtime=30d:
    Con esto lo que estamos haciendo es obligar a que la contraseña tenga un mínimo de 8 caracteres y que sea obligarorio cambiarla antes de 30 días. Esto influye en todos los usuarios del sistema, pero nosotros queremos que el usuario root tenga un minimo de 11 caracteres, por lo cual nos vamos a la sección root: y hacemos que quede de la siguiente forma:
     
    root:
    :ignorenologin:
    :minpasswordlen=11:
    :tc=default:
    Con esto hemos forzado que la contraseña de root tenga un mínimo de 11 caracteres.
     
    Una vez realizados estos cambios, tenemos que decirle al sistema que rehaga la base de datos del sistema de contraseñas, esto lo hacemos con la orden cap_mkdb de la siguiente manera:
     
    hellen# cap_mkdb /etc/login.conf
    Una vez ejecutado el comando para actualizar el sistema de contraseñas solo nos quedaría cambiar la contraseña para que el sistema la cifre con Blowfish, procedemos a ello:
     
    login: sico
    Password:
     
    passwd
    Changing local password for sico.
    Old password:
    New password:
    Please enter a password at least 8 characters in length.
    New password:
    Retype new password:
    passwd: updating the database...
    passwd: done
    Ya hemos visto que funciona correctamente, ahora solo nos queda con el usuario root, precedemos a ello:
     
    su
    Password:
     
    passwd root
    Changing local password for root.
    New password:
    Please enter a password at least 11 characters in length.
    New password:
    Retype new password:
    passwd: updating the database...
    passwd: done
    Un último cambio más, nos queda modificar un archivo para que cuando demos de alta un nuevo usuario en el sistema la contraseña se cibre con Blowfish, este achivo es /etc/auth.conf y en el hay que buscar la línea
     
    # crypt_default = md5 des
    y sustituirla por:
     
    crypt_default = blf
    Seguridad en el servidor ssh
     
    El Servidor SSH se instala por defecto con una configuración no demasiado propicia para la seguridad, hay que decir que es buena, pero se puede mejorar.
     
    Lo primero que tenemos que hacer es configurar el servidor SSH para que solo acepte conexiones por el protocolo 2 que es bastante más seguro que el protocolo 1, para lo cual modificaremos el archivo /etc/ssh/sshd_config
     
    hellen#vi /etc/ssh/sshd_config
    En el cual buscamos las siguiente línas:
     
    #Port 22
    #Protocol 1 2
    #ListenAddress 0.0.0.0
    #Banner /some/path
    Y las sustituimos por:
     
    Port 22
    Protocol 2
    ListenAddress 192.168.10.1
    Banner /etc/ssh/banner
    La explicación de estos cambios son muy sencillos:
     
    Port nos indica el puerto por el cual los clientes se van a conectar.
     
    Protocol nos indica el protocolo que vamos a usar, nosotros elegimos el protocolo 2 por que es mucho más seguro.
     
    ListenAddress indica la ip de la tarjeta de red por la que queremos que escuche, 192.168.10.1 es un ejemplo que habría que sustituir por la vuestra IP.
     
    Banner que realmente no es una opción de seguridad, pero si lo es de advertencia, cuando el cliente se conecta al servidor, este pondra el banner antes de poder loguearse en nuestro FreeBSD.
     
    Como seguramente /etc/ssh/banner no exista lo tendremos que crear, este es el contenido que tengo yo:
     
    hellen# cat /etc/ssh/banner
    ************************************************************************
     
    This is a private system!!! All connection attempts are logged and
    monitored. All unauthorized connection attempts will be investigated and
    handed over to the proper authorities.
     
    ************************************************************************
    hellen#
    Una vez que ya teneis el banner ya tenemos casi configurado el servidor ssh, solo nos faltaría decidir que usuarios pueden conectar por SSH a nuestra máquina. Dentro de esta situación tenemos dos posibilidades, Filtrar por la IP del cliente, o filtrar por Usuario, La primera Opción muchas veces no es posible ya que tenemos que tener un firewall instalado en la máquina y ademas de esto, muchos clientes utilizan conexiones por rtb (Modem Analógico en Línea analógica) en las cuales no disponen de IP fija y cada conexión tienen una diferente, asi que vamos a filtrar por Usuarios.
     
    La opción para filtrar por usuarios es muy fácil, es AllowUsers y tambien hay que ponerla dentro de /etc/ssh/sshd_config
     
    Una vez decididos que usuarios van a poder conectar, vamos a configurarlo
     
    hellen# echo AllowUsers [email protected] syvic toni >> /etc/ssh/sshd_config
    hellen# cat /etc/ssh/sshd_config
    Port 22
    Protocol 2
    ListenAddress 192.168.10.1
    ...
    ...
    # override default of no subsystems
    Subsystem sftp /usr/libexec/sftp-server
     
    AllowUsers [email protected] syvic toni
    hellen#
    Como veis he añadido a tres usuarios, el primero a sico que ademas le he dicho desde que IP puede conectar, es decir, sico podria conectar desde 192.168.10.2 y despues he puesto a los usuarios syvic y toni que pueden conectar desde cualquier lugar.
     
    Seguridad en Consola
     
    La seguridad en Consola es bastante importante puesto que álguien podría arrancar nuestra máquina en modo mono-usuario y trastear en ella con privilegios de root, o simplemente podriamos dejar una consola con una sesión iniciada, ausentarnos y álguien podría usar nuestra sesión para hacer algo que a nadie nos gustase.
     
    Primero vamos a configurar el sistema para que si arranca en modo mono-usuario nos pida las contraseña de root para poder usar la máaquina. Para ello tenemos que editar el archivo /etc/ttys y localizar la línea que pone:
     
    console none unknown off secure
    Esta línea tenemos que modificarla dejandola de la siguiente manera.
     
    console none unknown off insecure
    De esta manera nadie que no posea la contraseña de root podra iniciar sesión si arranca la máquina en modo mono-usuario.
     
    Una vez que tenemos el modo mono-usuario vamos a explicar como bloquear una consola por si nos tenemos que ausentar de la máquina y no podemos cerrar la sesión.
     
    Para bloquear la sesión disponemos de una orden del propio sistema, esta orden se llama lock y bloquea la consola en la que estemos trabajando, por defecto la bloquea durante 15 minutos, pero podemos indicarle que este más tiempo ejecutando lock -n, otra peculiaridad que tiene esta orden es que te pide que pongas una contraseña que no tiene nada que ver con la del sistema, pero si prefieres usar la contraseña sistema puedes ejecutar el comando lock -p
     
    hellen# lock
    Key:
    Again:
    lock: /dev/ttyp0 root timeout in 15 minutes
    time now is Thu Jan 30 03:00:34 CET 2003
    Key:
    Aunque yo personalmente prefiero usar vlock que aunque no se encuentra en la base del sistema está en los ports y su uso es muy fácil.
     
    hellen# cd /usr/ports/security/vlock && make install clean
    Una vez instalado su funcionamiento es muy fácil, simplemente se ejecuta vlock y tenemos bloqueada la consola en la que nos encontremos, tambien se puede usar vlock -a y bloqueariamos todas las consolas.
     
    hellen# vlock -a
    The entire console display is now completely locked.
    You will not be able to switch to another virtual console.
    Please enter the password to unlock.
    root's password:
    Esto es todo en la sección sobre Consolas.
     
    Cerrando Puertos
     
    Lo primero que tenemos que saber es que cuando instalamos el sistema por defecto solemos arrancar servicios que realmente no usamos, por lo cual vamos a ir localizando y cerrando estos servicios que mas de una vez pueden comprometer nuestro sistema.
     
    Vamos a empezar usando la orden sockstat -4 el cual nos va a decir que puertos tenemos abiertos.
     
    hellen# sockstat -4
    USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
    root sshd 873 3 tcp4 *:22 *:*
    root inetd 92 4 tcp4 *:21 *:*
    root syslogd 77 4 udp4 *:514 *:*
    root X_SERV 234 4 tcp4 *:6000 *:*
    root sendmail 92 4 tcp4 *:25 *:*
    root submission 245 4 tcp4 *:587 *:*
     
    hellen#
    Como veis hay ciertos puertos que están abiertos y que realmente no voy a usar nunca, es el caso del 587 (Submission), el 25 (SMTP) puesto que yo no tengo en esta máquina un servidor de correo, el 6000 tampoco lo vamos a usar puesto que sirve para conexiones remotas a un servidor X-window, el 21 que es el puerto del ftp tampoco voy a usarlos, asi que vamos a ir cerrando puertos y asegurando el sistema.
     
    Lo que vamos a cerrar primero es el puerto 6000 ya que nosotros no vamos a servir entorno grafico a nadie, para esto necesitamos editar el archivo /usr/X11R6/bin/startx Y lo calizar la linea
     
    serverargs=""
    Modificarla hasta que quede de la siguiente forma:
     
    serverargs="-nolisten tcp"
    Con esto ya tenemos un puerto menos abierto, ahora vamos a cerrar el 587 (Submission), este puerto no se necesita para mandar ni recibir correo, pero pertenece al sendmail, para cerrarlo necesitamos editar el archivo /etc/mail/sendmail.cf y buscar la línea
     
    O DaemonPortOptions=Port=587, Name=MSA, M=E
    Es ta línea hay que comentarla para que sendmail no la cargue por defecto.
     
    #O DaemonPortOptions=Port=587, Name=MSA, M=E
    Ahora vamos a cerrar el puerto 25 ya que por norma general los correos nos los descargamos desde otro servidor y no los recibe directamente mi máquina, por lo cual voy a hacer que no arranque sendmail.
     
    Para esto necesitamos editar el archivo /etc/rc.conf y añadir la siguiente línea dependiendo de la versión de nuestro FreeBSD.
     
    Si tenemos una versión de FreeBSD inferior a una 4.6-RELEASE:
     
    sendmail_enable="NO"
    Si es superior o Igual a 4.6-RELEASE:
     
    sendmail_enable="NONE"
    En mi ejemplo no ha salido el puerto 111 (sunrpc) pero es muy habitual que este puerto salga, para eliminar este puerto tenemos que seguir editando /etc/rc.conf y poner dentro
     
    nfs_server_enable="NO"
    nfs_client_enable="NO"
    portmap_enable="NO"
    otro puerto de los que tenemos abierto es el 514 que pertenece al syslogd y esta a la espera de poder brindar la oportunidad de logear remotamente, como realmente lo que nos interesa es que registre lo que ocurre en nuestra máquina, vamos a poner lo siguiente en /etc/rc.conf
     
    syslogd_enable="YES"
    syslogd_flags="-ss"
    Luego por último teniamos abierto el puerto 21 que corresponde al servidor ftp, el cual en esta máquina no me va a servir de nada, por lo cual lo voy a cerrar, como se ve en la salida de sockstat -4 estaba ejecutandose desde el inetd, asi que vamos a cortar el inetd para que no arranque el ftp y otros servicios que no nos interesan, para ello ponemos lo siguiente en /etc/rc.conf
     
    inetd_enable="NO"
    Ahora despues de esto solo nos queda pasar el sistema a monopuesto y volverlo a multipuesto para que recargue las variables modificadas, otra solución es reiniciar la máquina, yo prefiero pasar a monopusuario:
     
    shutdown now
    Una vez que ya hemos pasado a multiusuario ejecutamos sockstat -4 y comprobamos que esta a nuestro gusto.
     
    hellen# sockstat -4
    USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
    root sshd 873 3 tcp4 *:22 *:*
     
    hellen#
    Otra sección acabada ;o)
     
    Seguridad con los usuarios
     
    Una vez llegado a este punto lo siguiente que haremos es activar el acconuting para tener un cierto control sobre los usuarios, para hacer esto tenemos que editar el archivo /etc/rc.conf y añadirle la siguiente línea:
     
    accounting_enable="YES"
    Para ver las opciones que tiene la opción de accouting te aconsejo ver el manual de sa y de lastcomm
     
    hellen# man sa
    hellen# man lastcomm
    En el sistema existe un usuario llamado toor que tiene privilegios de root, este usuario nunca se usa, por lo cual vamos a eliminarlo para dejar el sistema lo más limpio posible.
     
    hellen# vipw
    # $FreeBSD: src/etc/master.passwd,v 1.25.2.6 2002/06/30 17:57:17 des Exp $
    #
    root:$2a$04$i/o8gD2EdrL8BVw2VXumpuXxXxXxXxXxu0xijdQPPewnWDM2bjr2m:0:0::0:0:Charlie &:/root:/bin/csh
    toor:*:0:0::0:0:Bourne-again Superuser:/root:
    daemon:*:1:1::0:0:Owner of many system processes:/root:/sbin/nologin
    Como vemos el usuario toor existe, lo borramos, y ya que estamos vamos tambien a cambiar el nombre del root que por defecto está puesto en Charlie &, para ello dejamos la configuración de la siguiente manera:
     
    # $FreeBSD: src/etc/master.passwd,v 1.25.2.6 2002/06/30 17:57:17 des Exp $
    #
    root:$2a$04$i/o8gD2EdrL8BVw2VXumpuXxXxXxXxXxdQPPewnWDM2bjr2m:0:0::0:0:Sico:/root:/bin/csh
    daemon:*:1:1::0:0:Owner of many system processes:/root:/sbin/nologin
    Yo en el nombre de root he puesto sico, pero lo podeis sustituir por vuestro nombre o lo que querais.
     
    Ahora vamos a decidir que usuarios pueden hacerse root usando la orden su, estos usuarios para poder usar dicha orden deben estar dentro del grupo wheel, si no lo están no podran hacerse root.
     
    hellen# vi /etc/group
    # $FreeBSD: src/etc/group,v 1.19.2.3 2002/06/30 17:57:17 des Exp $
    #
    wheel:*:0:root
    daemon:*:1:daemon
    Como vemos ahora mismo solo está root dentro del grupo, si intentamos hacernos root desde un usuario nos dirá lo siguiente:
     
    %su
    su: you are not in the correct group (wheel) to su root.
    %
    Para permitir que nos deje hacernos root debemos dejar la línea de la siguiente manera:
     
    # $FreeBSD: src/etc/group,v 1.19.2.3 2002/06/30 17:57:17 des Exp $
    #
    wheel:*:0:root,sico
    daemon:*:1:daemon
    Yo he decidido que el usuario sico se va a poder hacerse root, guardamos los cambios y comprobamos que funciona:
     
    hellen:~> su -
    Password:
    hellen#
    Una ultima opción para controlar que ningún usuario mal intencionado pueda dejar algun programa en los directorios temporales es aconsejable poner en /etc/rc.conf la siguiente línea:
     
    clear_tmp_enable="YES"
    Bueno, Pues esto es todo, aun se podrian introducir un par de cosas más para mejorar la seguridad, pero las dejare para la futura actualización de este documento.
     
    Saludos, cualquier duda hacerla saber.
     
    PD: Es copiada del Manual Original de FreeBSD.
  20. Me Gusta
    fuuton97 got a reaction from Marcos Pinheiro in [MiniCurso] - ¿Cómo Empezar a Crear tu Propia Misión?   
    Buenas, y Hola a todos los zoneros y/o visitantes, presentes en el día de hoy, la presente de este Mini-Curso es para enseñarles como crear su propia misión de Metin2, primero que nada comenzaremos con lo principal de una misión de metin2, como es un Mini-Curso no lo alargaré mucho, después de cierto tiempo prudente veré y crearé un CURSO con todo los "juguetes".
     
    Bien, primero que nada necesitaremos la disponibilidad de GANAS y TIEMPO, esos son las partes más fundamentales, y no solo eso, tener mentalidad de creación y difusión. Hay que tener en cuenta que esto conlleva a un proceso de paciencia, puede que les de error si es su primera vez, sino les irá super bien; no obstante con este Mini-Curso que les voy a entregar aprenderán a crear quest de misión de Metin2, espero que aprecien mi tiempo y trabajo, que es 100% para ustedes.
     
    Materiales a Utilizar:
     
    - Un servidor de Metin2, sea hamachi, sin hamachi o Dedicado.
    - Saber compilar las quest o cargar.
     
    Bien, comencemos:
     
    1- Abrimos un archivo .txt en el escritorio, ponemos de nombre: "misión_test", y cambiamos la extensión .txt a .quest, y guardamos.
     
    2- Abrimos el archivo: mision_test.quest con un editor de texto, recomiendo Notepad++. La primera función: Cómo todos saben existe desde se inicia y ejecute la quest, para ellos escribirán esto:

    quest mision_test begin state start begin 3- Toda misión requiere sobre su Nivel para efectuarla, por defecto pondremos nivel 100, y lo colocamos:

    when login or levelup or enter with pc.get_level() == 100 begin La función: "login" dice que al loguearse en el juego saldrá la misión, y "levelup" que al llegar al nivel puesto, en este caso 100 saldrá la misión al instante.
     
    4- Ahora debemos comenzar con un set_state, lo hacemos de esta manera, y lo colocamos:
     

    set_state( mision_test ) Agregamos dos end, para cerrar de el begin de pc.get_level() y el primero de la ejecución:

    end end Hasta ahora les deberá quedar así:

    quest mison_test begin state start begin when login or levelup or enter with pc.get_level() == 100 begin set_state( mision_test ) end end 5- Ahora debemos llamar el state, seguimos y colocamos:

    state mision_test begin 6- Escribimos y ponemos el llamado de when letter:

    when letter begin 7- Ahora ponemos la función de send_letter, osea a mostrar el nombre de la misión que aparecerá, escribimos:

    send_letter("Misión Test By Fuuton97") 8- Cerramos con un "END" por el begin, y escribimos:

    end Hasta el momento la misión debe quedarnos así:

    quest mision_test begin state start begin when login or levelup or enter with pc.get_level() >= 100 begin set_state( mision_test ) end end state mision_test begin when letter begin send_letter("Misión Test By Fuuton97") end 9- Bien, ahora pondremos la función de "button or info", para que al darle click a la misión o el pergamino les salga el escrito o la misión a realizar, y escribimos:

    when button or info begin 10- Seguidamente colocamos la información con las funciones: say, say_title y/o say_reward, y escribimos:

    say_title("Bienvenido a la Misión Test By Fuuton97") say("Hola ".. pc.get_name() .." ,esto es una misión tester") say("en donde tendrás una misión épica.") say("Recuerda que esto es un tester de una misión") say("que está creando Fuuton97 para Metin2 Zone.") say("Destruye un Metin de Nivel 80.")  
    Ese es el texto, ustedes podrán añadirle más texto, con solo seguir los parámetros de "say("")"
     
    11- Agregamos dos "END" y un set_state, y escribimos:

    set_state(test) end end Hasta ahora debería quedarnos así:
     

    quest mision_test begin state start begin when login or levelup or enter with pc.get_level() >= 100 begin set_state( mision_test ) end end state mision_test begin when letter begin send_letter("Misión Test By Fuuton97") end when button or info begin say_title("Bienvenido a la Misión Test By Fuuton97") say("Hola ".. pc.get_name() .." ,esto es una misión tester") say("en donde tendrás una misión épica.") say("Recuerda que esto es un tester de una misión") say("que está creando Fuuton97 para Metin2 Zone.") say("Destruye un Metin de Nivel 80.") set_state(test) end end 12- Ahora agregamos e iniciamos con el state "test" y un letter; y escribimos:

    state test begin when letter begin 13- Escribimos un send_letter y un end al final, y escribimos:

    send_letter("Destruye el Metin - Misión Test By Fuuton97") end 14- Luego escribimos un button or info y su respectivo texto, más 1 end al final, y ponemos:

    when button or info begin say_title("TEST MISIóN:") say_reward( " Vete a las zonas donde esté el Metin de Nivel 80, Mapa Bosque") say("") end Hasta ahora toda la misión debería estar así:
     

    quest mision_test begin state start begin when login or levelup or enter with pc.get_level() >= 100 begin set_state( mision_test ) end end state mision_test begin when letter begin send_letter("Misión Test By Fuuton97") end when button or info begin say_title("Bienvenido a la Misión Test By Fuuton97") say("Hola ".. pc.get_name() .." ,esto es una misión tester") say("en donde tendrás una misión épica.") say("Recuerda que esto es un tester de una misión") say("que está creando Fuuton97 para Metin2 Zone.") say("Destruye un Metin de Nivel 80.") set_state(test) end end state test begin when letter begin send_letter("Destruye el Metin - Misión Test By Fuuton97") end when button or info begin say_title("TEST MISIóN:") say_reward( " Vete a las zonas donde esté el Metin de Nivel 80, Mapa Bosque") say("") end 15- Bien, ahora procederemos a poner la función .kill al metin, para que al destruirlo complete la misión el personaje y di su premio, y escribimos:
     

    when 8025.kill begin 16- Ahora solo nos tocará poner el texto final, y escribimos:

    say_title("Misión TEST ACABADA:!") say("Has acabado con el Metin 80!") say("Misión Test By Fuuton97") say("Recibirás tu recompensa:") say_reward("500.000.000 Exp") say_reward("100.000.000 Yang") 17- Ahora solo nos falta colocar la función de dar yang: pc.change_money(xxxxxxx) y la de experiencia: pc.give_expe2(xxxxxxx), y escribimos:

    pc.change_money(1000000000) pc.give_exp2(5000000000) 18- Añadimos una función de chat(), para texto final, un clear_letter() y cerramos el set de la misión COMPLETADA, y escribimos:

    chat("Has completado la Misión Test.") chat("By Fuuton97.") clear_letter() set_state(__COMPLETE__) 19- Por último añadimos los END'S, más el state de la misión COMPLETADA, y escribimos:

    end end end state __COMPLETE__ begin end end Ahora les deberá que dar la misión TODA COMPLETA y TERMINADA ASí:

    quest mision_test begin state start begin when login or levelup or enter with pc.get_level() >= 100 begin set_state( mision_test ) end end state mision_test begin when letter begin send_letter("Misión Test By Fuuton97") end when button or info begin say_title("Bienvenido a la Misión Test By Fuuton97") say("Hola ".. pc.get_name() .." ,esto es una misión tester") say("en donde tendrás una misión épica.") say("Recuerda que esto es un tester de una misión") say("que está creando Fuuton97 para Metin2 Zone.") say("Destruye un Metin de Nivel 80.") set_state(test) end end state test begin when letter begin send_letter("Destruye el Metin - Misión Test By Fuuton97") end when button or info begin say_title("TEST MISIóN:") say_reward( " Vete a las zonas donde esté el Metin de Nivel 80, Mapa Bosque") say("") end when 8025.kill begin say_title("Misión TEST ACABADA:!") say("Has acabado con el Metin 80!") say("Misión Test By Fuuton97") say("Recibirás tu recompensa:") say_reward("500.000.000 Exp") say_reward("100.000.000 Yang") pc.change_money(1000000000) pc.give_exp2(5000000000) chat("Has completado la Misión Test.") chat("By Fuuton97.") clear_letter() set_state(__COMPLETE__) end end end state __COMPLETE__ begin end end 20- último paso, compilar la quest, solo subimos el archivo cuyo nombre le pusimos que fue: mision_test.quest al directorio vía Winscp a: /home/game/share/locale/germay/quest la suben y dan permisos 777, seguidamente abren le english_list, o hongkong_list y ponen abajo el nombre de la quest: mision_test.quest
     
    Por último compilamos la quest, vamos a nuestro Putty, si es dedicado o en la máquina virtual de Virtual BOX, y ejecutamos este comando:

    ./qc mision_test.quest Y Listo.
     
    Bueno, hemos llegado al final de este MiniCurso sobre cómo crear una misión desde 0, espero que valoren mi tiempo y trabajo, solo exclusivamente para METIN2 ZONE, y si piensan postear en otra parte dejen créditos.
     
    Próximo MiniCurso: Creación de Misión con pc.getqf + asignar un valor de cuantos mob o metines destruir.
     
    Saludos.
  21. Me Gusta
    fuuton97 got a reaction from Hanakimachi in [MiniCurso] - ¿Cómo Empezar a Crear tu Propia Misión?   
    Buenas, y Hola a todos los zoneros y/o visitantes, presentes en el día de hoy, la presente de este Mini-Curso es para enseñarles como crear su propia misión de Metin2, primero que nada comenzaremos con lo principal de una misión de metin2, como es un Mini-Curso no lo alargaré mucho, después de cierto tiempo prudente veré y crearé un CURSO con todo los "juguetes".
     
    Bien, primero que nada necesitaremos la disponibilidad de GANAS y TIEMPO, esos son las partes más fundamentales, y no solo eso, tener mentalidad de creación y difusión. Hay que tener en cuenta que esto conlleva a un proceso de paciencia, puede que les de error si es su primera vez, sino les irá super bien; no obstante con este Mini-Curso que les voy a entregar aprenderán a crear quest de misión de Metin2, espero que aprecien mi tiempo y trabajo, que es 100% para ustedes.
     
    Materiales a Utilizar:
     
    - Un servidor de Metin2, sea hamachi, sin hamachi o Dedicado.
    - Saber compilar las quest o cargar.
     
    Bien, comencemos:
     
    1- Abrimos un archivo .txt en el escritorio, ponemos de nombre: "misión_test", y cambiamos la extensión .txt a .quest, y guardamos.
     
    2- Abrimos el archivo: mision_test.quest con un editor de texto, recomiendo Notepad++. La primera función: Cómo todos saben existe desde se inicia y ejecute la quest, para ellos escribirán esto:

    quest mision_test begin state start begin 3- Toda misión requiere sobre su Nivel para efectuarla, por defecto pondremos nivel 100, y lo colocamos:

    when login or levelup or enter with pc.get_level() == 100 begin La función: "login" dice que al loguearse en el juego saldrá la misión, y "levelup" que al llegar al nivel puesto, en este caso 100 saldrá la misión al instante.
     
    4- Ahora debemos comenzar con un set_state, lo hacemos de esta manera, y lo colocamos:
     

    set_state( mision_test ) Agregamos dos end, para cerrar de el begin de pc.get_level() y el primero de la ejecución:

    end end Hasta ahora les deberá quedar así:

    quest mison_test begin state start begin when login or levelup or enter with pc.get_level() == 100 begin set_state( mision_test ) end end 5- Ahora debemos llamar el state, seguimos y colocamos:

    state mision_test begin 6- Escribimos y ponemos el llamado de when letter:

    when letter begin 7- Ahora ponemos la función de send_letter, osea a mostrar el nombre de la misión que aparecerá, escribimos:

    send_letter("Misión Test By Fuuton97") 8- Cerramos con un "END" por el begin, y escribimos:

    end Hasta el momento la misión debe quedarnos así:

    quest mision_test begin state start begin when login or levelup or enter with pc.get_level() >= 100 begin set_state( mision_test ) end end state mision_test begin when letter begin send_letter("Misión Test By Fuuton97") end 9- Bien, ahora pondremos la función de "button or info", para que al darle click a la misión o el pergamino les salga el escrito o la misión a realizar, y escribimos:

    when button or info begin 10- Seguidamente colocamos la información con las funciones: say, say_title y/o say_reward, y escribimos:

    say_title("Bienvenido a la Misión Test By Fuuton97") say("Hola ".. pc.get_name() .." ,esto es una misión tester") say("en donde tendrás una misión épica.") say("Recuerda que esto es un tester de una misión") say("que está creando Fuuton97 para Metin2 Zone.") say("Destruye un Metin de Nivel 80.")  
    Ese es el texto, ustedes podrán añadirle más texto, con solo seguir los parámetros de "say("")"
     
    11- Agregamos dos "END" y un set_state, y escribimos:

    set_state(test) end end Hasta ahora debería quedarnos así:
     

    quest mision_test begin state start begin when login or levelup or enter with pc.get_level() >= 100 begin set_state( mision_test ) end end state mision_test begin when letter begin send_letter("Misión Test By Fuuton97") end when button or info begin say_title("Bienvenido a la Misión Test By Fuuton97") say("Hola ".. pc.get_name() .." ,esto es una misión tester") say("en donde tendrás una misión épica.") say("Recuerda que esto es un tester de una misión") say("que está creando Fuuton97 para Metin2 Zone.") say("Destruye un Metin de Nivel 80.") set_state(test) end end 12- Ahora agregamos e iniciamos con el state "test" y un letter; y escribimos:

    state test begin when letter begin 13- Escribimos un send_letter y un end al final, y escribimos:

    send_letter("Destruye el Metin - Misión Test By Fuuton97") end 14- Luego escribimos un button or info y su respectivo texto, más 1 end al final, y ponemos:

    when button or info begin say_title("TEST MISIóN:") say_reward( " Vete a las zonas donde esté el Metin de Nivel 80, Mapa Bosque") say("") end Hasta ahora toda la misión debería estar así:
     

    quest mision_test begin state start begin when login or levelup or enter with pc.get_level() >= 100 begin set_state( mision_test ) end end state mision_test begin when letter begin send_letter("Misión Test By Fuuton97") end when button or info begin say_title("Bienvenido a la Misión Test By Fuuton97") say("Hola ".. pc.get_name() .." ,esto es una misión tester") say("en donde tendrás una misión épica.") say("Recuerda que esto es un tester de una misión") say("que está creando Fuuton97 para Metin2 Zone.") say("Destruye un Metin de Nivel 80.") set_state(test) end end state test begin when letter begin send_letter("Destruye el Metin - Misión Test By Fuuton97") end when button or info begin say_title("TEST MISIóN:") say_reward( " Vete a las zonas donde esté el Metin de Nivel 80, Mapa Bosque") say("") end 15- Bien, ahora procederemos a poner la función .kill al metin, para que al destruirlo complete la misión el personaje y di su premio, y escribimos:
     

    when 8025.kill begin 16- Ahora solo nos tocará poner el texto final, y escribimos:

    say_title("Misión TEST ACABADA:!") say("Has acabado con el Metin 80!") say("Misión Test By Fuuton97") say("Recibirás tu recompensa:") say_reward("500.000.000 Exp") say_reward("100.000.000 Yang") 17- Ahora solo nos falta colocar la función de dar yang: pc.change_money(xxxxxxx) y la de experiencia: pc.give_expe2(xxxxxxx), y escribimos:

    pc.change_money(1000000000) pc.give_exp2(5000000000) 18- Añadimos una función de chat(), para texto final, un clear_letter() y cerramos el set de la misión COMPLETADA, y escribimos:

    chat("Has completado la Misión Test.") chat("By Fuuton97.") clear_letter() set_state(__COMPLETE__) 19- Por último añadimos los END'S, más el state de la misión COMPLETADA, y escribimos:

    end end end state __COMPLETE__ begin end end Ahora les deberá que dar la misión TODA COMPLETA y TERMINADA ASí:

    quest mision_test begin state start begin when login or levelup or enter with pc.get_level() >= 100 begin set_state( mision_test ) end end state mision_test begin when letter begin send_letter("Misión Test By Fuuton97") end when button or info begin say_title("Bienvenido a la Misión Test By Fuuton97") say("Hola ".. pc.get_name() .." ,esto es una misión tester") say("en donde tendrás una misión épica.") say("Recuerda que esto es un tester de una misión") say("que está creando Fuuton97 para Metin2 Zone.") say("Destruye un Metin de Nivel 80.") set_state(test) end end state test begin when letter begin send_letter("Destruye el Metin - Misión Test By Fuuton97") end when button or info begin say_title("TEST MISIóN:") say_reward( " Vete a las zonas donde esté el Metin de Nivel 80, Mapa Bosque") say("") end when 8025.kill begin say_title("Misión TEST ACABADA:!") say("Has acabado con el Metin 80!") say("Misión Test By Fuuton97") say("Recibirás tu recompensa:") say_reward("500.000.000 Exp") say_reward("100.000.000 Yang") pc.change_money(1000000000) pc.give_exp2(5000000000) chat("Has completado la Misión Test.") chat("By Fuuton97.") clear_letter() set_state(__COMPLETE__) end end end state __COMPLETE__ begin end end 20- último paso, compilar la quest, solo subimos el archivo cuyo nombre le pusimos que fue: mision_test.quest al directorio vía Winscp a: /home/game/share/locale/germay/quest la suben y dan permisos 777, seguidamente abren le english_list, o hongkong_list y ponen abajo el nombre de la quest: mision_test.quest
     
    Por último compilamos la quest, vamos a nuestro Putty, si es dedicado o en la máquina virtual de Virtual BOX, y ejecutamos este comando:

    ./qc mision_test.quest Y Listo.
     
    Bueno, hemos llegado al final de este MiniCurso sobre cómo crear una misión desde 0, espero que valoren mi tiempo y trabajo, solo exclusivamente para METIN2 ZONE, y si piensan postear en otra parte dejen créditos.
     
    Próximo MiniCurso: Creación de Misión con pc.getqf + asignar un valor de cuantos mob o metines destruir.
     
    Saludos.
  22. Me Gusta
    fuuton97 got a reaction from oreflenidoria in [MiniCurso] - ¿Cómo Empezar a Crear tu Propia Misión?   
    Buenas, y Hola a todos los zoneros y/o visitantes, presentes en el día de hoy, la presente de este Mini-Curso es para enseñarles como crear su propia misión de Metin2, primero que nada comenzaremos con lo principal de una misión de metin2, como es un Mini-Curso no lo alargaré mucho, después de cierto tiempo prudente veré y crearé un CURSO con todo los "juguetes".
     
    Bien, primero que nada necesitaremos la disponibilidad de GANAS y TIEMPO, esos son las partes más fundamentales, y no solo eso, tener mentalidad de creación y difusión. Hay que tener en cuenta que esto conlleva a un proceso de paciencia, puede que les de error si es su primera vez, sino les irá super bien; no obstante con este Mini-Curso que les voy a entregar aprenderán a crear quest de misión de Metin2, espero que aprecien mi tiempo y trabajo, que es 100% para ustedes.
     
    Materiales a Utilizar:
     
    - Un servidor de Metin2, sea hamachi, sin hamachi o Dedicado.
    - Saber compilar las quest o cargar.
     
    Bien, comencemos:
     
    1- Abrimos un archivo .txt en el escritorio, ponemos de nombre: "misión_test", y cambiamos la extensión .txt a .quest, y guardamos.
     
    2- Abrimos el archivo: mision_test.quest con un editor de texto, recomiendo Notepad++. La primera función: Cómo todos saben existe desde se inicia y ejecute la quest, para ellos escribirán esto:

    quest mision_test begin state start begin 3- Toda misión requiere sobre su Nivel para efectuarla, por defecto pondremos nivel 100, y lo colocamos:

    when login or levelup or enter with pc.get_level() == 100 begin La función: "login" dice que al loguearse en el juego saldrá la misión, y "levelup" que al llegar al nivel puesto, en este caso 100 saldrá la misión al instante.
     
    4- Ahora debemos comenzar con un set_state, lo hacemos de esta manera, y lo colocamos:
     

    set_state( mision_test ) Agregamos dos end, para cerrar de el begin de pc.get_level() y el primero de la ejecución:

    end end Hasta ahora les deberá quedar así:

    quest mison_test begin state start begin when login or levelup or enter with pc.get_level() == 100 begin set_state( mision_test ) end end 5- Ahora debemos llamar el state, seguimos y colocamos:

    state mision_test begin 6- Escribimos y ponemos el llamado de when letter:

    when letter begin 7- Ahora ponemos la función de send_letter, osea a mostrar el nombre de la misión que aparecerá, escribimos:

    send_letter("Misión Test By Fuuton97") 8- Cerramos con un "END" por el begin, y escribimos:

    end Hasta el momento la misión debe quedarnos así:

    quest mision_test begin state start begin when login or levelup or enter with pc.get_level() >= 100 begin set_state( mision_test ) end end state mision_test begin when letter begin send_letter("Misión Test By Fuuton97") end 9- Bien, ahora pondremos la función de "button or info", para que al darle click a la misión o el pergamino les salga el escrito o la misión a realizar, y escribimos:

    when button or info begin 10- Seguidamente colocamos la información con las funciones: say, say_title y/o say_reward, y escribimos:

    say_title("Bienvenido a la Misión Test By Fuuton97") say("Hola ".. pc.get_name() .." ,esto es una misión tester") say("en donde tendrás una misión épica.") say("Recuerda que esto es un tester de una misión") say("que está creando Fuuton97 para Metin2 Zone.") say("Destruye un Metin de Nivel 80.")  
    Ese es el texto, ustedes podrán añadirle más texto, con solo seguir los parámetros de "say("")"
     
    11- Agregamos dos "END" y un set_state, y escribimos:

    set_state(test) end end Hasta ahora debería quedarnos así:
     

    quest mision_test begin state start begin when login or levelup or enter with pc.get_level() >= 100 begin set_state( mision_test ) end end state mision_test begin when letter begin send_letter("Misión Test By Fuuton97") end when button or info begin say_title("Bienvenido a la Misión Test By Fuuton97") say("Hola ".. pc.get_name() .." ,esto es una misión tester") say("en donde tendrás una misión épica.") say("Recuerda que esto es un tester de una misión") say("que está creando Fuuton97 para Metin2 Zone.") say("Destruye un Metin de Nivel 80.") set_state(test) end end 12- Ahora agregamos e iniciamos con el state "test" y un letter; y escribimos:

    state test begin when letter begin 13- Escribimos un send_letter y un end al final, y escribimos:

    send_letter("Destruye el Metin - Misión Test By Fuuton97") end 14- Luego escribimos un button or info y su respectivo texto, más 1 end al final, y ponemos:

    when button or info begin say_title("TEST MISIóN:") say_reward( " Vete a las zonas donde esté el Metin de Nivel 80, Mapa Bosque") say("") end Hasta ahora toda la misión debería estar así:
     

    quest mision_test begin state start begin when login or levelup or enter with pc.get_level() >= 100 begin set_state( mision_test ) end end state mision_test begin when letter begin send_letter("Misión Test By Fuuton97") end when button or info begin say_title("Bienvenido a la Misión Test By Fuuton97") say("Hola ".. pc.get_name() .." ,esto es una misión tester") say("en donde tendrás una misión épica.") say("Recuerda que esto es un tester de una misión") say("que está creando Fuuton97 para Metin2 Zone.") say("Destruye un Metin de Nivel 80.") set_state(test) end end state test begin when letter begin send_letter("Destruye el Metin - Misión Test By Fuuton97") end when button or info begin say_title("TEST MISIóN:") say_reward( " Vete a las zonas donde esté el Metin de Nivel 80, Mapa Bosque") say("") end 15- Bien, ahora procederemos a poner la función .kill al metin, para que al destruirlo complete la misión el personaje y di su premio, y escribimos:
     

    when 8025.kill begin 16- Ahora solo nos tocará poner el texto final, y escribimos:

    say_title("Misión TEST ACABADA:!") say("Has acabado con el Metin 80!") say("Misión Test By Fuuton97") say("Recibirás tu recompensa:") say_reward("500.000.000 Exp") say_reward("100.000.000 Yang") 17- Ahora solo nos falta colocar la función de dar yang: pc.change_money(xxxxxxx) y la de experiencia: pc.give_expe2(xxxxxxx), y escribimos:

    pc.change_money(1000000000) pc.give_exp2(5000000000) 18- Añadimos una función de chat(), para texto final, un clear_letter() y cerramos el set de la misión COMPLETADA, y escribimos:

    chat("Has completado la Misión Test.") chat("By Fuuton97.") clear_letter() set_state(__COMPLETE__) 19- Por último añadimos los END'S, más el state de la misión COMPLETADA, y escribimos:

    end end end state __COMPLETE__ begin end end Ahora les deberá que dar la misión TODA COMPLETA y TERMINADA ASí:

    quest mision_test begin state start begin when login or levelup or enter with pc.get_level() >= 100 begin set_state( mision_test ) end end state mision_test begin when letter begin send_letter("Misión Test By Fuuton97") end when button or info begin say_title("Bienvenido a la Misión Test By Fuuton97") say("Hola ".. pc.get_name() .." ,esto es una misión tester") say("en donde tendrás una misión épica.") say("Recuerda que esto es un tester de una misión") say("que está creando Fuuton97 para Metin2 Zone.") say("Destruye un Metin de Nivel 80.") set_state(test) end end state test begin when letter begin send_letter("Destruye el Metin - Misión Test By Fuuton97") end when button or info begin say_title("TEST MISIóN:") say_reward( " Vete a las zonas donde esté el Metin de Nivel 80, Mapa Bosque") say("") end when 8025.kill begin say_title("Misión TEST ACABADA:!") say("Has acabado con el Metin 80!") say("Misión Test By Fuuton97") say("Recibirás tu recompensa:") say_reward("500.000.000 Exp") say_reward("100.000.000 Yang") pc.change_money(1000000000) pc.give_exp2(5000000000) chat("Has completado la Misión Test.") chat("By Fuuton97.") clear_letter() set_state(__COMPLETE__) end end end state __COMPLETE__ begin end end 20- último paso, compilar la quest, solo subimos el archivo cuyo nombre le pusimos que fue: mision_test.quest al directorio vía Winscp a: /home/game/share/locale/germay/quest la suben y dan permisos 777, seguidamente abren le english_list, o hongkong_list y ponen abajo el nombre de la quest: mision_test.quest
     
    Por último compilamos la quest, vamos a nuestro Putty, si es dedicado o en la máquina virtual de Virtual BOX, y ejecutamos este comando:

    ./qc mision_test.quest Y Listo.
     
    Bueno, hemos llegado al final de este MiniCurso sobre cómo crear una misión desde 0, espero que valoren mi tiempo y trabajo, solo exclusivamente para METIN2 ZONE, y si piensan postear en otra parte dejen créditos.
     
    Próximo MiniCurso: Creación de Misión con pc.getqf + asignar un valor de cuantos mob o metines destruir.
     
    Saludos.
  23. Me Gusta
    fuuton97 got a reaction from EzekielitohMercury in [PETICION]Quest Bienvenida   
    quest entrada_server begin
    state start begin
    when login with pc.get_level() == 1 begin
    notice_all("Bienvenido ".. pc.get_name() .." a TheBlackMt2")
    end
    end
    end

  24. Me Gusta
    fuuton97 got a reaction from EzekielitohMercury in [PETICION]Quest Bienvenida   
    Mal estructurado, función STATE_COMPLETE es usado para misones.
     
    Has probado que eso funcione?
  25. Me Gusta
    fuuton97 got a reaction from EzekielitohMercury in [PETICION]Quest Bienvenida   
    Por lo mismo xD, misión, y eso no es misión, para eso debería llevar un state al principio como toda misión, y peor xD no has probado .
×
×
  • Crear nuevo...