RunUO Community

This is a sample guest message. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

Tutorial xmlspawner (Spanish)

Foruno

Sorceror
Tutorial xmlspawner (Spanish)

TUTORIAL COMPLETO DE XMLSPAWNER EN CASTELLANO

1 Introducción: Xmlspawner: Que es y para que sirve

El xmlspawner es un programa que nos ayuda a los gms a spawnear nuestro servidor. Con el xmlspawner, se pueden personalizar los spawns
tanto como se quiera. Asi por ejemplo podremos hacer que spawnee un ogro, cullo nombre sea Bob, y su color el verde. Ademas de añadirle un loot
personalizado con unas sencillas instrucciones en lenguaje xml.
Para comenzar a trabajar con él, tendremos que introducir el comando [add xmlspawner y señalar un punto en el suelo. La representación gráfica en el juego para el xmlspawner es la misma que un cristal mágico -->

Una vez situado el cristal en el lugar desado, clicaremos dos veces sobre él para que nos aparezca la interfaz gráfica donde podremos personalizar nuestro spawn.


Interfaz gráfica del xmlspawner by Foruno


A continuación crearemos un spawn sencillo:

1- Crea un xmlspaner con el comando [add xmlspawner. Colocalo sobre el suelo, cerca de ti.
2-Cliquea dos veces para que aparezca la interfaz gráfica. Ahora escribimos en la primera celda: Chicken, y pulsamos el boton "Actualizar" de al lado (la flecha)
3-Si lo hemos escrito bien, aparecera la palabra donde la colocamos, y si no nos dará un mensaje en rojo en la parte inferior.
4-Le damos al boton "up" de la izquierda una vez, asi nos quedará que solo saque UNA gallina.
Fin ¡Ya tienes tu primer spawn, felicidades!

El xmlspawner viene configurado por defecto para que invoque a las criaturas en un intervalo de tiempo que va entre 5 y 10 minutos. Por lo tanto, si se elimina del mapa a la criatura, el xmlspawner invocara otra en ese periodo de tiempo dentro de un rango 5 (que es el que viene por defecto)

Pero ¿como se modifican esas variables?
Utilizando el botón props, pero eso ya lo veremos más adelante. Antes vamos a hacerle algunos cambios a nuestra gallina.
En primer lugar localizar el boton que está a la derecha de la celda de la gallina. El de la flecha no, el otro, que es el boton que abre el libro.

1 Pulsamos sobre dicho botón y vereis que se abre el gump del libro del uo de toda la vida. En la primera pagina vemos que pone Chicken


Para hacer que la criatura salga con el nombre que nosotros queramos añadimos lo siguiente Chicken/Name/El pollo magico
Esta sentencia llama a la propiedad Name de chiquen y la modifica. Pero solo para este spawn, es decir el resto de chickens del server seguiran conservando su nombre.

Ahora queremos que el pollo magico sea de un color especial, para que la gente vea que es mágico.
asi que al igual que antes, en el libro ponemos: Chicken/Name/El pollo magico/HUE/154

Y finalmente, vamos a hacer que nuestro pollo mágico tenga en su backpack un plátano mágico de color verde. Para ello ponemos:
Chicken/Name/El pollo magico/HUE/154/ADD/Banana
Ahora deberemos definir las propiedades de banana, esto se hace utilizando las etiquetas <>, la cosa quedaría así:
Chicken/Name/El pollo magico/HUE/154/ADD/<Banana/name/Platano Magico/HUE/61>



Cerramos el libro con click derecho, actualizamos y probamos pulsando el boton Respawn, situado en la parte inferior.
¡Ya tienes tu pollo mágico!

Bien, ahora que ya tenemos a nuestro pollo vamos a ver sus propiedades. Para ello hacemos [props sobre el pollo. Se nos abre el menu de las props.
Bien no me he parado a probarlas todas, pero son todas esas propiedades las que podemos modificar en el xmlspawner antes de que la criatura "nazca"
utilizando la sencilla sintaxis anterior Pollo/propiedad/valor/propiedad/valor................... y asi hasta el infinito

1.2 SPAWNS SECUANCIALES Y SUBGRUPOS.
Una vez vistos los aspectos básicos del xmlspawner vamos a ver la propiedad SequentialSpawn.
Para empezar añadimos un spawn y lo abrimos con doble clik.
Le damos a la flecha de abajo, junto al boton Short.
Nos saldrá algo parecido a esto.

Antes de pasar a ver el gump es importante conocer dos props del xmlspawner: SequentialSpawn y Group. La primero indica el subgrupo donde se inicializa el spawn, a medida que este avanza, va cambiando de valor. Normalmente se pone a 0 cuando el primer subgrupo es el 1.
Group es una propiedad que si es puesta en true hará que el spawn se detenga hasta que no hallan muerto todas las criaturas del subgrupo en rigor.



2 Empezamos a fliparlo: Propiedades del xmlspaner

Hasta ahora hemos visto lo básico, y ahora vamos a seguir viendo cosas básicas xD pero un poco más complejas.

Bien abramos nuestro spawner Pollo Magico haciendo doble click sobre el cristal magico.

Como todo objeto en runuo, xmlspawner tb tiene sus propiedades, para acceder a ellas pulsaremos sobre el botón Props situado en la parte inferior. Se nos tiene que abrir algo parecido a esto:



Como podemos ver, al lado de la mayoria de las propiedades hay una flecha, la cual pulsaremos siempre que queramos editar la propiedad.

2.1 Propiedades principales del xmlspawner
maxDelay -> Indica el tiempo máximo que tardará el spawn en invocar a TODAS las criaturas que tenga programadas.

minDelay ->Este no se si fija el tiempo minimo que tarda el xmlspawner entre criatura y criatura, o es el tiempo minimo que tarda en salir la primera criatura.

SpawnRange -> Esta propiedad define el area donde apareceran nuestras criaturas. No confundir con HomeRange (ver más abajo)

showBounds -> Si lo ponemos en True veremos unas columnas de humo que nos indican la zona de alcance del spawn. Es decir, las criaturas que vallan saliendo caeran aleatoriamente dentro de ese rango. Este rango se modifica en spawnRange

NoTriggerOnCarried -> Si pulsamos en la flechita de al lado de esta propiedad se nos abrira un gump donde poder introducir el nombre de un item. Siempre que alguien se acerque al spawn con ese objeto (tiene que estar en el primer nivel de la mochila) el spawn se bloqueará

TriggerOnCarried -> Al contrario que la anterior, esta propiedad hace que el spawn solo se active en presencia del item definido.

X1_Y1 y X2_Y2 -> La primera de estas propiedades define la esquina NO del spawnRange, y la segunda, la esquina SE. Si pulsamos la flechita de al lado, vemos que en el gump emergente tenemos varias maneras de definir las coordenadas, tarjeteando, usando nuestra ubicación o introduciendolo a mano.

HomeRange -> Es el rango donde las criaturas regresan si se alejan demasiado del spawn. Por ejemplo, el mono Manolo, ha salido del spawn hace unas horas y comienza a aburrirse. De repente oye no muy lejos unas pisadas, se sube a un arbol y ve a un par de noobs explorando lost lands. Manolo hecha a correr dejandose atrás su spawn, con la intención de hablar con los pitus. Estos que ven llegar a un orangután a la carrera aprovechan que no tienen lag y hechan a correr hasta Papua, donde Manolo no puede entrar. Manolo cabizbajo regresa a su HomeRange para seguir esperando unos amiguitos.



El mono Manolo en su HomeRange

TOD (Time Of Day) -> Esta propiedad es de solo lectura, y nos puede dar dos tipos de información. O bien la hora real, o bien la hora del juego. Esto se define en la propiedad TODmode. Usando estas propiedades (las TOD´s) podremos controlar el periodo horario en que nuestros spawns estaran activos. Estas son las propiedades TOD

TODMode -> Como se ha dicho, esta propiedad define si vamos a utilar realtime o playertime para definir las funciones que haremos con estas propiedades.

TODStart -> Aquí podremos introducir a que hora del día comenzará a funcionar el spawn
TODEnd -> Y aquí definimos cuando acabará.
Las criaturas que ya hubiesen salido del spawn antes del TODend continuaran en el mundo, pero si se eliminase, ya no volverían a salir más hasta que no diese comienzo de nuevo el TODstart. Hay que tener en cuenta, que el spawn no estará activo aunque tengamos definido un item en TriggerOnCarried y/o en NoTriggerOnCarried

TriggerAccesLevel -> Esta propiedad define que nivel de cuenta de usuario UO debe de tener la persona para activar el spawn. Osea, que si queremos probar el spawn por nosotros mismos, deberemos o bien ponernos la capita, o bien cambiar esto a nuestro nivel de cuenta.

PlayerTriggerProp -> Con esta propiedad podemos hacer que el spawn se active tan solo cuando el pj que entra dentro del ProximityRange (ver más abajo) tiene cierta “prop” a cierto valor.
Por ejemplo: Queremos hacer un spaw que haga aparecer un curandero, pero solo queremos que aparezca si el pj en cuestión tiene 1 punto de vida. Pues nada más facil que abrir nuestro PlayerTriggerProp e introducir en el gump emergente lo siguiente: HIT=1
Que queremos que salga solo cuando el pj baja de los 30 puntos. Pues ponemos : HIT<30

MobTriggerName y MobTriggerProp -> Ahora por ejemplo lo que queremos hacer es un spawn que se active, no si el jugador que se acerca tiene HIT=1, sino que su nueva mascota, El Mono Manolo, tenga la propiedad HIT=1. Con introducir el nombre del MOB en MobTriggerName que deseamos que detecte (en este caso “El Mono Manolo”) y en MobTriggerProp HIT=1 ya lo tendriamos. Un spawn que saltaría siempre que El Mono Manolo estuviese en el ProximityRange (ver más abajo) (Es importante para nuestros experimentos con Triggers poner el maxdelay y el mindelay a 00:00:01, pues asi la creación de la criatura será instantanea. Tampoco olvidemos el TriggerAccesLevel ;) )

ProximityRange -> Si nos fijamos, el valor predefinido para esta propiedad es -1. Esto quiere decir que está desactivado “el sensor de movimiento del spawn” como yo lo he definido. Sin embargo, si abrimos el gump emergente podremos introducir a que distancia detectará al pj que active el spawn. Si no lo tenemos activado los triggers que se desencadenen detectando la proximidad no funcionaran; estos son entre otros: MobTriggerProp, MobTriggerName, PlayerTriggerProp, etc…

ProximityMSG -> Al abrir el menú emergente de esta propiedad, podremos cambiar el valor null que viene por defecto por un mensaje que aparecerá encima del pj cuando active el spawn

ProximitySound -> Aquí introducimos el sonido que queremos que el uo reproduzca cuando se active el spawn. Por defecto viene el número 500. Para conocer el numero de los sonidos yo lo que hago es irme al Pandora y en la pestaña “General” abajo en el centro tenemos los sonidos. Basta con seleccionar uno y pulsar el boton sound. Una vez hecho esto le damos a alt + q y nos aparecerá el numero del sonido ;)

SpeechTrigger -> Esta propiedad nos permite introducir una palabra o frase en el gump emergente. Puede ser combinada con el resto de propiedades de trigger y hace que obliguemos al pj a decir la palabra o frase para activar el spawn.
Con esta propiedad y con el ProximityRange puesto a una distancia amplia, se puede conseguir, por ejemplo, un sistema de guards diferente del que viene en el UO.

TriggerObject -> Esta propiedad nos sirve para definir un objeto. Con el cual haremos ciertas comprobaciones en las siguientes propiedades (ver más abajo). A diferencia de TriggerOnCarried este objeto no hace falta que este en la mochila, puede estar en cualquier parte del mundo. Si abrimos el menú emergente tendremos varias opciones para definir el objeto, entre ellas, la primera, donde pone Null nos permite tarjetear el objeto en cuestion con el que vamos a trabajar.

TriggerOnProperty -> Aquí comprobamos cualquier propiedad del objeto definido en TriggerObject. Usaremos la sintaxis habitual HUE=61, name=pocholo, etc…
Con esto se pueden hacer juegos con palancas y botones. O hacer que un spawn invoque a las criaturas cuando se cierra o abre una puerta. (open=true)

TriggerProbability -> Esta propiedad define la probabilidad de que acontezca el spawn cuando se den todas las condiciones (si es que tenia condiciones) Si lo dejamos a 1 como viene por defecto las criaturas apareceran de manera normal, si lo fijamos a 0 no apareceran. El rango como podemos deducir va del 0 al 1 y supongo que se podrán meter números decimales, a mayor sea el número, más posibilidades de que el spawn funcione.
Esto se puede utilizar para crear spawns de monturas que querramos considerar infrecuentes. También se puede convinar con las propiedades TOD para por ejemplo, crear un spawn de unicornios que solo aparecen las noches de luna llena, aunque no lo hagan siempre.

Duration -> Tiempo que estarán las criaturas en el mundo. Una vez transcurrido este tiempo, las criaturas desaparecerán y el spawn volverá a comenzar de nuevo.
Siguiendo el ejemplo anterior, podemos hacer que el unicornio desaparezca cuando amanece.

SkillTrig -> Define una skill para ser invocada mediante el keyword
TRIGSKILL,name|value|base|cap

Refractory -> Las refractory se parecen a min y max delay solo que controlan el tiempo de spawn a partir de la segunda vez que se spawnea.
Por ejemplo ponemos un spawn que haga aparecer un leon si un pj no lleva cierto objeto. El spawn detecta a un player y hace spawnear al leon ya que le hemos puesto min max delay a 01 segundos. El player finalmente mata al león. Pero claro como está a min y maxD a 01 volvería a salir otro seguidamente. Para eso sirven las refractory.


2.2 OTRAS PROPIEDADES

AllowGhostTrig-> Con esto podremos permitir, poniendolo a “true”, que los personajes muertos también provoquen el spawn. (No estoy seguro aun si los vivos podrian seguir activando el spawn, seguiré investigando xD)

ExternalTriggering y ExtTrigState -> Primero de todo, para comenzar a utilizar estar propiedades tenemos que poner ExternalTriggering en “True”. Esto activará que podamos activar o desactivar el spawn desde otros objetos, por ejemplo palancas.
Para entender todo esto vamos a ver un ejemplo sencillo:
Primero que todo situamos nuestro xmlspawner sobre el suelo, y a poca distancia de él una palanca ([add SimpleLeaver) Le decimos al xmlspawner que queremos que aparezcan 5 criaturas (si has seguido el tutorial sabrás como hacer esto) A continuación abrimos las propiedades y ponemos el minDelay y maxDelay a 00:00:01. Vamos a ExternalTriggering y lo cambiamos a True, fijate que ExtTrigState viene por defecto en false.
Ahora abrimos las props de la palanca. Estas palancas pueden funcionar de dos modos: Two_State y Three_State, lo que quiere decir que la palanca puede tener hasta tres posiciones diferentes: 0,1 y 2, para este ejemplo usaremos Two_State. Ahora vamos a Target0Item y lo abrimos, en el menú emergente seleccionamos null y tarjeteamos nuestro spawn. Esto le está diciendo a la palanca que cuando se encuentre en la posición 0 invoque al objeto spawner, pero de momento no le hemos dicho que tiene que hacer con el objeto spawner. Para eso abrimos Target0Property y le introducimos lo siguiente /ExtTrigState/True, con lo que cambiamos dicha propiedad del XMLspawner a True activando el spawn. Ahora si el spawn tuviese algun SpeechTrigger u otro tipo de condicionante para que spawneara, funcionaria normalmente. Como es lógico en la prop Target1Item de la palanca volvemos targetar el spawn y ponemos en Target1Property: /ExtTrigState/False. Desactivando así el spawn si la palanca se coloca en la posición 1. Ojo, las criaturas que ya estuviesen spawneadas no desaparecerán.
Si ahora pusiesemos la propiedad ExternalTriggering a false, todo esto no nos serviria de nada y el spawn funcionaría normamente.
Esto se puede utilizar en quests con puzzles de palancas, haciendo que el pj no solo adivine la frase que activará el spawn si no también en que posiciones debe dejar una palanca u otra.

SmartSpawning -> Si ponemos esta propiedad en true el spawn no creara nada a no ser que halla pjs cerca. Esto se puede utlizar por ejemplo en spawns grandes de animalejos varios en lost lands, así cuando pasen los players pueden ver la fauna que habita los parajes pero cuando no halla nadie los animales desapareceran. Con esto se evitan tiempos de saves y loads de MOBS con lo que se reduce el lag ^^


3 .Y SIGUE Y SIGUE…: QUESTS, INTERACCIONES NCP’s-PLAYERS Y BUSQUEDAS DE OBJETOS

3.0 Ententiendo el concepto de quest en xmlspawner.

La definición de quest sería la de un conjunto de condiciones que de ser cumplidas dan lugar a una recompensa, o no. Nosotros los gms, somos los que vamos a crear esas condiciones en nuestra imaginación, por ejemplo: matar al dragón, o conseguir la espada del cristal infinito.
Como hemos visto en el capitulo anterior, el xmlspaner dispone de muchos modos de actuación y podemos hacer que se active o desactive comprobando ciertos factores externos o internos, como por ejemplo el HUE de un item que ha de portar el pj que se acerque al spawn en su mochila. Utilizando esto, con inteligencia y lo que estudiaremos en este capítulo, se podrán crear las condiciones de las que hablábamos al principio

3.1 Objetivos de Quest
Dice Tracy Hickman en los Apéndices de sus Crónicas anotadas de la Dragonlance, que el héroe no tendría razón de ser si su búsqueda no tuviese una finalidad. El xmlspawner admite hasta siete tipos de objetivos para crear quests:

KILL, KILLNAMED, COLLECT, COLLECTNAMED, ESCORT, GIVE, GIVENAMED

Ejemplos tontos pero prácticos de los siete objetivos de quest:

Kill: El objetivo kill se usará en quests en las que halla que eliminar a uno o varios enemigos no especificos. Su sintaxis es la siguiente: KILL,mobtype,count,proptest. Por ejemplo: Kill,chickens,100, STR=100 iniciaría una búsqueda en la que tendríamos que matar a 100 pollos siempre y cuando nuestra fuerza fuese 100.

Killnamed: Este objetivo sirve para quests en las que hay que eliminar a una criatura específica. Su sintaxis es: Killednamed,mobname,type,count,proptest. Por ejemplo, una quest en la que hubiese que a matar a 2 pollos mágicos quedaría así: killnamed, Pollo Magico, chicken, 2. no utilizamos proptest porque no queremos definir ningún condicionante por propiedad para que de comienzo la quest.

Collect: Cuando queramos que la quest valla de busquedas de varios objetos iguales usaremos: Collect, itemtype, count, proptest. Un ejemplo de esto sería una quest en la que halla que recolectar 100 diamantes para poder atravesar la puerta al país de las vírgenes danzando algremente por los campos de tulipanes ^^: Collect, diamond, 100

Collectnamed: Igual que la anterior pero esta vez la busqueda sería de algún objeto específico. Un ejemplo sería la quest de los huesos de doom: collectnamed,daemon bones, 1000

(Hay que tener en cuenta que tanto Collect y Collectnamed son busquedas de objetos, no de busqueda y entrega, eso es el caso de Give y Givenamed)
Escort: La tipica de escoltar a una joven dama que ha perdido su carruaje, su sintaxis es la siguiente: Escort, mobtype, proptest. Podria ser que la dama se interesase más si fueses un diestro espadachín, la cosa quedaría así: Escort, Fencing>85

Give: Busqueda y recuperación de un objeto no específico. Give, mobname/itemname, count, proptest. Un ejemplo de un tipo de quest de este tipo sería un jardinero que te pidiese tres semillas que necesita para terminar de plantar el jardin del conde: Give, seed, 3,. O quizá fuese un viejo director de circo al que acaba de jubilar a sus dos leones y necesita unos nuevos para remplazarlos en la funcion: Give, lion, 2

Givenamed: Busqueda de objetos específicos. Givenamed, mobname/itemname, type, count, proptest.
Un ejemplo de givenamed sería un mago que te pide que le traigas un ingrediente magico que solo nace en la cumbre más alta de las montañas más altas y que solo crece una vez cada mil años: Givenamed, nombreDelReg.

Como se puede apreciar, en algunos ejemplos he obviado propiedades (count, mobtype, etc…) esto es porque no todas son requisito indispensable para la definición del objetivo. Para entender esto con más claridad abrimos el menú ayuda del xmlspawner pulsando el botón help en la parte inferior izquierda. Nos vamos a la página nº 4 y allí tenemos las quest types. Como podemos apreciar algunas propiedades vienen entre [corchetes] esas son las propiedades NO indispensables. Las que van libres habrá que introducirlas siempre para definir correctamente el objetivo de quest.



4 COMO JOSE LUIS MORENO Y SUS MUÑECOS: ADICIÓN Y EDICIÓN DE NPCQUESTS Y CONFIGURACIÓN DEL QUESTHOLDER

4.0 En este capítulo aprenderemos a configurar otro gump que nos trae el sistema XML, este gump nos servirá para editar la conversación que mantendrán los players con los npcquests. También conoceremos un item nuevo, el questholder, que no es otra cosa que el libro que guarda toda la información de la quest y que normalmente se crea en la mochila del player.

4.1 Haciendo nuevos amigos: Los XmlQuestNpc
Estos npcs se comportan igual que un npc cualquiera, pero en ellos configuraremos el dialogo.
Añadid un XmlQuestNpc con el comando [add XmlQuestNpc
Ahora usad el comando [xmledit sobre el npc recien creado. Os saldrá el siguiente gump.


Interfaz gráfica de xmledit by Foruno

Merece una especial explicación el recuadro Depends.
Como se explica en la imagen, este valor sirve para decirle al npc si ignorar (poniendolo a -1) el trigeroncarried y el notrigeroncarried o no hacerlo (poniendolo a -2)
Pero esto solo se usa normalmente en la primera frase.
En el resto de frases el dependsON se convierte en el valor que nos dice desde que ID viene dada esta respuesta. Esto se hace añadiendo en depends el valor de ID de la frase con la que queramos conectar.

5 QUIERO SER PRO: PALABRAS CLAVES EN LA PROGRAMACIÓN DE XMLSPAWNER Y CONDICIONES MÁS COMPLEJAS PARA EL SPAWN
5.0 Ahora viene cuando la matan. Las listas que estudiaremos a continuación incluyen la mayoría de palabras claves que utiliza el xmlspawner. Estas palabras nos van a servir para hacer pijadas como por ejemplo lograr que cuando un pj llegue al spawn se vea rodeado (y digo rodeado literalmente) por una banda de orcos. O hacer que el pj quede encerrado entre cuatro paredes que aparecen de la nada.
Estas palabras se van a utilizar tanto en la creación de quests como en la creación de spawns normales. No obstante la mayoría de las veces las vamos a utilizar en quests. Tambíen nos van a ayudar a definir cuando queremos que salte un gump o como introduciremos los datos para que definir correctamente el questholder que nos guiará durante toda nuestra quest.


5.1 Palabras clave (keywords)Las palabras claves se pueden separar en cinco grupos. Estos son los grupos y las keywords:

-VALUE KEYWORDS: RND, RNDBOOL, RNDLIST, RNDSTRLIST, RANDNAME, INC, MUL, MOB, SERIAL, SKILL

-CONTROL KEYWORDS: WAITUNTIL, IF, WHILE, and GOTO

-ACTION KEYWORDS: ADD, EQUIP, GIVE, TAKE, TAKEBYTYPE, CAST, SAY, MSG, SENDMSG, BCAST, RESURRECT, POISON, DAMAGE, MUSIC, EFFECT, SOUND, GUMP, DESPAWN, DELETE

-LOOT KEYWORDS: ARMOR, WEAPON, JEWELRY, JARMOR, JWEAPON, SARMOR, SHIELD, LOOT, LOOTPACK, POTION, SCROLL, NECROSCROLL

-ACCES KEYWORDS: GET, GETONTHIS, GETONPARENT, GETFROMFILE, GETONSPAWN, GETONCARRIED, GETONMOB, GETONTRIGMOB, SET, SETONTHIS, SETONPARENT, SETONSPAWN, SETONSPAWNENTRY, SETONCARRIED, SETONMOB, SETONTRIGMOB, PLAYERSINRANGE, TRIGSKILL


5.1.1 Value keywords
Estas key se usan para comprobrar y generar valores. Valores por ejemplo de las props de un npc o de un player.

RND-> Usaremos esta propiedad cuando querramos crear una aleatoriedad en un valor numerico. Por ejemplo orc/HUE/RND,0,300 crearia un orco con un HUE que fuese del 0 al 300. Si ahora queremos que este orco de loot una katana el 30% de las veces, usaremos lo siguiente orc/HUE/RND,0,300/ADD,0.3/katana

RNDBOOL -> Devuelve un valor boleano True o False, 0 o 1 etc…

RNDLIST y RNDSTRLIST -> Se usa para generar valores aleatorios a partir de una lista.
Vamos a crear un spawn de un orco, pero queremos que ese orco pueda tener cuatro HUE’s diferentes y tres nombres. La manera sería la siguiente:
orc/hue/RNDLIST,100,200,300,400/name/RNDSTRLIST,Urko,Grof, Ralf.
La diferencia entre RNDLIST y RNDSTRLIST es que la primera solo pude contener valores númericos, y la otra frases y palabras.

RANDNAME -> Se usa para definir el nombre de una criatura por tipo. Como sabeis el uo viene con unas listas de nombres. Nombres para orcos, hombres rata, etc… si lo que queremos es que nuestro spawn genere un orco con un nombre generado aleatoriamente de la lista de hombres rata pondremos lo siguiente:
orc/name/RANDNAME/ratean
Esto lo podriamos usar en con nuestras propias listas de nombres.
INC y MUL -> Vamos a ver un ejemplo: Queremos crear un spawn, que haga que el que se acerque le quite 10 de vida. En la primera celda del xmlsapwner ponemos lo siguiente: SETONTRIGMOB/hits/INC,-10. El maxD y minD a 0 y el proximity range a 1.
(El MUL funciona de manera parecida pero aun estoy investigandolo, en breve lo actualizaré. En las pruebas que hice con el inc, cuando el pj llega a 0 hits no muere, pero si pones [set hits 0 y apuntas al player tampoco muere, asi que no debe de ser fallo del xmlspawner)

MOB -> Propiedad que sirve para invocar cualquier MOB que exista en ese momento en el mundo y que tenga un nombre único, su sintaxis es /MOB,name/. Un ejemplo de esto sería un spawn del que saliera un orco llamado Grush, y luego otro donde saliera un ogro llamado Grash que atacase a Grush, la cosa sería así: Ogre/name/Grash/combatant/MOB,Grush.

SERIAL -> Palabra clave poco usada que sirve para traernos el id serial de un mob o de un item. Solo funciona junto con GetProperty y SetProperty

SKILL -> Hay dos maneras de acceder a las skills:
ogre/SKILL,anatomy/100
ogre/skills.anatomy.base/100
Los dos spawnearian un ogro con Anatomy a GM. De momento no se si existe diferencia entre las dos maneras de acceder a skills, seguiré investigando.


5.1.2 Control Keywords
Estas palabras se usan basicamente junto conlos spawns secuenciales y subgrupos.

WAITUNTIL -> Palabra que nos sirve para crear una pausa en un spawn sequencial. Su sintaxis es:
WAITUNTIL[,duration][,timeout][/condition][/spawngroup]
Normalmente si se usa duration, no se usará condition
Duration es un tiempo (en minutos). Pasado ese tiempo el spawn seguirá normalmente.
Condition es una condición que exijiremos por ejemplo: WAITUNTIL/SETONTRIGMOB,STR=100
el spawn no continuará hasta que el player no tenga una str de 100.
Spawngroup lo usaremos cuando querramos dirigir el spawn a un subgrupo u otro.
El timeout sirve para resetear el spawn si finalmente no se cumple la condición (en minutos también)

IF -> If es un condicional que lo que hace es preguntar si está resuelta una condición. Si lo está, va hasta el subgrupo especificado:
IF/condition/thenspawn[/elsespawn]

WHILE -> WHILE/condition/spawngroup
Significa -> Mientras/ocurre esta condición/quedate en este spawngroup. Más facil no puede ser xD
Una vez la condición ha cambiado, el spawn continua desde donde se introdujo la palabra WHILE

GOTO ->Se usa para llevar el índice del spawn al un subgrupo especificado:
GOTO/subgrupo


5.1.3 Action Keywords
Como su propio nombre indica, estas palabras provocan acciones.

ADD -> Esta palabra clave se usa para añadir un loot a las criaturas que spawneamos. La sintaxis es: ogre/ADD/longsword. Si queremos crear una probabilidad la sintaxis sería esta: ogre/ADD, 0.3/longsword. Esto nos daría un ogro que cada vez que nace tiene un 30% de tener una espada larga en el loot.

EQUIP -> Al igual que ADD, esta keyword añade un objeto, pero este objeto saldrá equipado en la criatura (si es posible, claro, pq si le decimos que EQUIP/jarron, el jarrón saldrá en la mochila como si hubiesemos utilizado ADD) La sintaxis es la misma que para ADD (incluida las probabilidades)

GIVE Give, en ingles, significa: Dar. Es sencilla esta keyword pues lo que hace es dejar en la mochila del player que activó el spawn un item específico. GIVE/longsword GIVE,0.4/longsword (dará una espada larga el 40% de las veces)

TAKE -> Esta palabra se usa para coger un item de la mochila del player. La sintaxis es TAKE/item o TAKE,0.5/item (El item ha de estar en el primer nivel de la mochila del player, si no, no funcionará.

TAKEBYTYPE -> Esta keyword es parecida a TAKE, pero buscará un item por su tipo, no por su nombre, se suele usar cuando hay que coger varios ítems del mismo tipo de la mochila del player, como por ejemplo cierta cantidad de oro o cierta cantidad de regs. La sintaxis es sencilla: TAKEBYTYPE,probabilidad,cantidad/item. Por ejemplo, una quest de un mendigo que nos pide 10 de oro. Si le decimos si, en la linea Action pondríamos: TAKEBYTYPE,1,10/gold (Cuando un a keyword nos pide que introduzcamos la probabilidad obligatoriamiente, como es el caso, pero nostros queremos que esto pase siempre, pondremos un 1)

(Tanto TAKE como TAKEBYTYPE no buscan en el bank del player, solo en la mochila)



CAST -> Como es evidente esta keyword hace que el spawn ejecute un hechizo. La sintaxis es la siguiente: CAST,spellname[,arg] (Recordad que los valores que van entre [corchetes] son opcionales)
Para poder ver como debemos introducir los nombres de los spells, miramos en Scripts/Spells/initializer.cs. Dentro de la carpeta de Runuo. El [,arg] que hemos visto puede significar varias cosas dependiendo del hechizo. Por ejemplo la sintaxis CAST,PolymorphSpell,216 lanzaria el conjuro poliformar sobre el player que activó el spawn (sea por el trigger que sea) y el 216 nos dice que lo convertimos en un Oso Marrón (aun no he podido encontrar una lista con los valores para cada trasformación, mire en el script del hechizo y no sale, seguiré investigando)
Sin embargo, un conjuro de por ejemplo invocar blades sería así: CAST,BladeSpiritSpell,5 (aquí el [,arg] lo usamos para crear una distancia aleatoria de +-5 en relación al player) Los conjuros de magia no tienen encuenta los regs ni mana, en cambio los de paladin y los de necro si (Aunque convendría experimentar antes con cada spawn que hagamos para conocer bien el funcionamiento en cada caso)

SAY -> Esta es sencillita, se usa para hacer que la criatura que spawnea diga un mensaje. SAY puede tener probabilidad: ogre/SAY,0.3/Te voy a matar! (Esto crea un ogro de un spawn, que dirá “Te voy a matar” el 30% de las veces que salga.

MSG MSG es igual que SAY, la unica diferencia es que MSG la podemos usar en cualquier sitio donde querramos hacer aparecer un mensaje (Cuando una puerta se abre, cuando se mueve una palanca, etc…) También adminte probabilidad. MSG,prob/Mensaje a decir.

SENDMSG -> Esta key hace aparecer un mensaje en el notice del player. (Abajo, donde aparecen las frases de las partys y los guilds) la sintaxis es muy sencilla: SENDMSG/Soy muy feo (admite probabilidad)

(Existen tambien SENDASCIIMSG y ASCIIMSG a los cuales se les puede indicar el hue y la font pero yo he estado probando y no sale, seguiré investigando)

BCAST Este key hace que al ser activado el spawn se envie un mensaje global que verán todos los players del Server. BCAST/mensaje

RESURRECT Keyword que se utiliza para resucitar (tanto pets como pjs) la sintaxis es:
RESURRECT[,range][,PETS]
Si ponemos solo RESURRECT, el spawn solo resucitará al player que lo active.
RESURRECT,5 resucitará a todo fantasma a 5 tiles de distancia del spawn
RESURRECT,5,PETS resucitará a todas las mascotas que halla a 5 tiles de distancia.
EJ: Un spawn que resucite a todo fantasma que se acerque a cambio de algo de dinero, sería:
RESURRECT/TAKEBYTYPE,1,100/gold (Resucita a cambio de 100 de oro)
Hay que tener en cuenta que aquí no sale el gump de res ni se baja fama o karma. Eso se puede hacer con INC o MUL (ver más arriba)

POISON Poison se utiliza para envenenar, tiene una sintaxis con varios elementos opcionales, vamos a verlos
POISON,niveldeVeneno[,range][,playeronly]
El nivel de veneno no es opcional y admite los cuatro tipos: Lesser, Regular, Greater, y Deadly
[,range] le indicamos el alcance del veneno, en tiles. Todas las criaturas (players y MOBS) que hallan en la zona quedarán envenenados cuando se active el spawn.
[,playeronly] Esto es un flag que se usa si solo queremos que el veneno afecte a pjs y no a MOBS dentro del rango de alcance.

DAMAGE Muy parecido a POISON. La sintaxis es:
DAMAGE,dañoAcausar,fisico,fuego,frio,veneno,energia[,range][,playeronly]
dañoAcausar es el total de daño que queremos hacer. Las resistencias nos indica como repartimos ese daño (en tantos por ciento) por ejemplo, queremos un spawn que haga 50 de daño fisico:
DAMAGE,50,100,0,0,0,0 Esto hara que el pj reciba 50 de daño fisico (ya que le dijimos a “fisico” que efectuara el 100%)

Si quisieramos un spawn que hiciera lo mismo pero que ademas hiciera 25 de daño por fuego, pondríamos:
DAMAGE,50,100,50,0,0,0 (Seguiría haciendo los 50 de daño fisicos, pero solo el 50% de 50 de fuego, osea 25)
Hay que tener en cuenta a la hora de colocar estos spawns que el daño total se resta a las resistencias de los pjs

MUSIC -> La he probado y no funciona. La sintaxis es:
MUSIC,musicname[,range]
MUSIC,musicnumero[,range]
No voy a explicarlas porque no van, pero en teoría tendría que sonar la musiquita que le indicaramos.

EFFECT y SOUND -> Para explicaros estos dos keywords vamos a hacer una prueba:
Poned un xmlspawner en el suelo y escribid en la primera celda lo siguiente: orc/EFFECT,8139,18/SOUND,526 (Puedes copiarlo de aquí y pegarlo con ctrl.v) Le damos a la flechita para arriba varias veces… A que mola… xD
Vamos a ver como lo ha hecho.
EFFECT tiene dos argumentos: EFFECT,itemid,tiempo. Abre el Pandora, en Deco -> Animations -> Black Moongate y selecciona el primero de la lista de la derecha. Le damos hacia abajo al cursor y nos fijamos en la imagen. Eso es más o menos lo que hace este keyword. El tiempo creo que viene dado en milisegundos, en el ejemplo se supone que el gate está en pantalla 1,8 segundos.
Pero sin SOUND la cosa no queda tan chula. SOUND solo tiene un argumento: SOUND,numsonido.
Para localizar el numero de sonido ver en este tutorial la propiedad SoundRange en el primer capítulo.


GUMP -> Hay 6 tipos diferentes de GUMPs, van numerados del 0 al 6, una sintaxis general sería:
GUMP,title,numeroTipoGump[,gumpconstructor]/text
El titulo va arriba del todo, normalmente se suele poner el nombre del npcquest que lo activa.
El numeroTipoGump es un numero del 0 al 6, con esto indicamos que GUMP queremos, pues como veremos a continuación cada uno tiene sus peculiaridades.
El gumpconstructor es opcional, y sirve para cuando queremos invocar un GUMP hecho por script.
Text es el texto del GUMP
Nota: La función principal de un gump es obtener una respuesta del player. Como veremos, el player dispone de varias maneras de responder, a traves de botones, radiobutons, textos de entrada, etc… Esa respuesta tendrá asignada un “valor” el cual se genera al pulsar el boton de ok. El valor, normalmente, será una palabra que tendrá que ver con la respuesta marcada (los gump que solo tienen un boton de ok generan un valor de respuesta “done”) Será esa palabra la que introduciremos en el campo keyword en el xmledit para llevar a esa linea la conversación. (Para más información consultar el capítulo 4)

GUMP 0: Texto simple
El GUMP tipo 0 es un GUMP en el cual se exibe el text y viene con un solo boton de ok. El valor de respuesta que genera este botón es “done”


GUMP,GUMP 0,0/Este es un gump de tipo 0


GUMP 1: Elección Si o No
Este tipo de GUMP viene con dos radioButons (si y no) y un boton de okay. El valor devuelto por el boton es “Yes” o “No”, según hallamos marcado


GUMP, GUMP 1, 1/Elije entre si o no en el GUMP tipo 1


GUMP 2: Lo que diga la rubia…
Estos GUMPs vienen con una entrada de texto para el player y un boton. El valor devuelto es lo que halla escrito el player.


GUMP, GUMP 2, 2/Aquí el usuario puede escribir.


GUMP 3: Parecido al GUMP 1 pero en vez de si o no, decimos Acepto o Declino, para usar en quests. El valor devuelto será “accept” “decline”


GUMP, GUMP 3, 3/Aceptas la oferta?

GUMP 4
Este GUMP ya deja personalizarse un poco más. Su sintaxis: GUMP,tituloGump,tipoGump/texto;respuesta1;valor1;respuesta2;valor2;respuesta3;valor3…
El valor es la palabra que usaremos después para introducir en el campo keyword del xmledit.


GUMP,GUMP 4, 4/Como te gustan las mujeres?;Me gustan rubias;rubias;Me gustan por delante;delante;Y me gustan por detras;detras.

GUMP 5: Totalmente customizable
Este gump ya es otra cosa (nunca me han gustado los gumps que vienen por defecto para las quests) porque te permite usar constructores para personalizarlo como quieras. Una sintaxis general sería:
GUMP,nombreGUMP,5/anchura,altura;gumpitem1;valor1;gumpitem2;valor2;gumpitem3;valor3…

Los gumpitems son una seria de accesorios para gumps como botones, textos de entradas etc. En realidad este GUMP trae las funciones que los otros llevan por separado… Estos son los objetos con su sintaxis (Cuando veamos “x” e “y” en la sintaxis querrá decir que tendremos que introducir donde queremos poner el item dentro del GUMP)

-BUTTON,gumpid,x,y ->Esto crea un boton tomando como fondo la imagen del gumpid que le especifiquemos, y lo coloca dentro del GUMP donde le especifiquemos la X y la Y
-RADIO,gumpid1,gumpid2,x,y[,initialstate] -> Los RADIO nos permiten elegir una opción entre varias. El gumpid1 es la imagen que tomará el RADIO cuando esté seleccionado, y el gumpid2 cuando no lo esté. [,initialstate] es opcional y sirve para que aparezca un RADIO seleccionado por defecto.
-TEXTENTRY,x,y,width,height[,text][,textcolor] -> Este elemento nos permite crear una entrada de texto para que el player pueda escribir y generar una respuesta. A TEXTENTRY no es necesario añadirle un valor pues el valor es lo que se introduce. Como vemos, [,text] y [,textcolor] son opcionales. Text es para que venga algo escrito por defecto y el text color para definir el HUE del texto.
-LABEL,x,y,labelstring[,labelcolor] -> Un label es como si cogieramos un trocito de celo y lo pegasemos en una parte del GUMP para poder escribir encima. El labelstring es una frase que querramos poner, y el labelcolor (opcional) el color de la fuente de esa frase.
-HTML,x,y,width,height,text -> Esto nos permite crear un cuadro de texto desplazabale hacia arriba y hacia abajo mediante una barra lateral. Tendremos que definirle la anchura y la altura y escribir un texto.
-IMAGE,gumpid,x,y[,hue] -> Gumpitem que nos permite introducir la imagen de un gump del uo. El gumpid es el id del gump que querramos mostrar y el [,hue] nos servirá para cambiar el color de ese gump.
-IMAGETILED,gumpid,x,y,width,height -> Este es curioso. Coje una imagen especificada en gumpid y la coloca en mosaico por todo el gump. Para delimitar el mosaico usaremos las cordenadas x e y, y la anchura y la altura.
-ITEM,itemid,x,y[,hue] -> Al igual que las dos anteriores pero ahora con un item, especificado en itemid. El hue es opcional.



-Anexos a los GUMP’s
Para los gumpitems que no generan valor, usaremos un valor vacio. Ejemplos:

LABEL, 100, 50, Hello there ;;
IMAGE, 0x2060, 100, 50 ;;
IMAGETILED, 10460,50,50,100,23 ;;

DESPAWN -> DESPAWN[,spawnername],subgroup
Sirve para eliminar las criaturas de un spawn.
Spawname se usa cuando queremos referirnos a otro spawn diferente
Subgroup indica el numero de subgrupo que queremos eliminar.
DESPAWN solo funciona en subgrupos que tengan marcada la casilla CLR

DELETE -> Esta keyword se considera autonoma, pues no tiene arguentos. Algunos ejemplos de su utilización son:
-SET,Espada de la luz,longsword/DELETE --> Elimina una espada llamada Espada de la luz
-SETONMOB,Astaroth,Balron/DELETE --> Elimina un balron que se llame Astaroth
-SETONCARRIED,,Gold/DELETE --> Elimina oro de la mochila del player que activó el spawn.
-SETONSPAWN,Dragones,2/DELETE --> Elimina el subgrupo 2 de un spawn llamado Dragones.
Esto ultimo sería como usar DESPAWN pero DELETE, no tiene en cuenta la casilla CLR

5.1.4 Loot Keywords
Las loot keywords se usan para crear un loot aleatorio entre varias cosas. Cada palabra genera un item.

WEAPON -> Para el xspaner existen 5 niveles de armas mágicas. Las de nivel 1 tienen menos poder y las de nivel 5 más. La sintaxis es:
WEAPON,minLvl,maxLvl -> Esto genera un random entre los niveles especificados. Si queremos un nivel de arma en concreto usaremos el mismo numero en las dos entradas. Por ejemplo un arma de nivel cinco sería: WEAPON,5,5

ARMOR -> Igual que wapon pero con armaduras :p

SCROLL -> SCROLL,minCircle,maxCircle
Genera un scroll de nivel aleatorio según le especifiquemos en los argumentes min y max circle. Por lo demas funciona como WEAPON


NECROSCROLL -> NECROSCROLL,index
Da un scroll de necro del index que le digamos.

POTION -> Esta no tiene argumentos, genera una poción aleatoria.

JEWELRY ->JEWELRY,minLvl,maxLvl
Genera una joya mágica dentro de min y max lvl. Por lo demas funciona como weapon.

JWEAPON y JARMOR -> Funcionan igual que WEAPON y ARMOR pero puede dar o bien armas o joyas, o armaduras o joyas.

SARMOR -> SARMOR,minLv,maxLvl
Genera un escudo o una armadura. Por lo demas fuciona como weapon

SHIELD -> SHIELD,minLvl,maxLvl
Genera un escudo aleatorio dentro de los niveles especificados. Por lo demas funciona como weapon

LOOT -> Para entender esta keyword primero debemos saber como genera el loot aleatorio el uo. En la carpeta script/misc encontramos un archivo que se llama Loot.cs. Ese archivo controla unas listas de loot aleatorio mediante unos controladores que en programación se llaman metodos.
Esos metodos tienen unos nombres, y serán los que usaremos como argumentos para esta keyword, que lo que hace aplicarle el metodo especificado a la criatura.

Por ejemplo, uno de los metodos se llama: RandomGem
Para crear un orco cuyo loot fuese generado de la lista que controla RandomGem pondríamos
orc/ADD/LOOT,RandomGem
varios ejemplos son:

LOOT,RandomGem
LOOT,RandomClothing
LOOT,RandomWand
LOOT,RandomReagent[/amount][/cantidadRegs]
LOOT,RandomInstrument
LOOT,RandomNecromancyReagent
LOOT,RandomArmorOrShieldOrWeaponOrJewelry
LOOT,RandomGrimmochJournal

LOOTPACK -> No funciona pero genera varios niveles de loot la sintaxis es:
LOOTPACK,nivelLoot
Los niveles se definen mediante otros keywordos, que son:
poor, meager, average, rich, filthyrich, ultrarich y superboss. De más pobre a más rico.


5.1.5 Access keywords
Hay dos tipos de Access keys las GET y las SET. Genericamente, las GET nos sirven para cargar un valor en una variable y las SET para cambiar el valor de una variable. Las variables pueden ser, propiedades, colores, etc…

GET -> Sirve para buscar la propiedad de un item.
GET,itemname[,itemtype],property

GETONPARENT y GETONTHIS -> GETONPARENT,propiedad GETONTHIS,propiedad.
Si por ejemplo quisieramos personalizar el saludo de un npcquest que se llamase Juan para que dijese: “Hola me llamo Juan” pondríamos lo siguiente en la linea Text del xmledit:
Hola me llamo {GETONPARENT, name}
Como vemos sirve para cargar una propiedad del npc dentro de una frase
GETONTHIS es lo mismo pero lo hace con las propiedades del player.

GETFROMFILE -> GETFROMFILE,nombre de archivo
No estoy seguro, pero creo que carga el contenido de un archivo de texto.

GETONSPAWN ->
GETONSPAWN[,spawnername],subgroup,COUNT
GETONSPAWN[,spawnername],subgroup,propertyname
Esta palabra nos sirve para cargar la propiedad de un spawn. Será el mismo spawn desde donde se carguen los valores si no ponemos el spawnername
Si en vez de popertyname ponemos COUNT no traerá el numero de criaturas activas de ese subgrupo.

GETONCARRIED ->GETONCARRIED,itemname[,itemtype],property
Esta key se utiliza para buscar el valor de una propiedad de algun objeto de la mochila del player.
Si usamos: GETONCARRIED,,itemtype,property
Busacrá por tipo de item y no por el nombre.

GETONMOB -> GETONMOB,mobname,property
Nos trae devuelta el valor de una propiedad de una criatura especificada por su nombre en mobname.

GETONTRIGMOB -> GETONTRIGMOB,property
Devuelve una propiedad del MOB que provocó el spawn.

SET -> SET,itemname[,itemtype]/property/value/...
Nos sirve para modificar la propiedad de un item

SETONTHIS y SETONPARENT ->
SETONTHIS/porp1/valor1/prop2/valor2…
SETONPARENT/porp1/valor1/prop2/valor2…
La primera se usa para modificar el valor de una prop del npcquest y la segunda del player.

SETONSPAWN -> SETONSPAWN[,spawnername],subgroup/prop/value/
Nos sirve para modificar el valor de una prop subgrupo especificado. Esto solo sirve para las propiedades de los grupos, si quisieramos acceder a las propiedades generales del spawner usariamos SETONPARENT

SETONSPAWNENTRY -> SETONSPAWNENTRY[,spawnername],entrystring/prop/value/
Sirve para acceder a las propiedades de una fila en un spawn.
[,spawnername] define el nombre del spawn al que queremos acceder
,entrystring Palabra de busqueda. Todas las entradas donde halla esa palabra serán sujetas a las modificaciones
/prop/ Propiedad a cambiar
/value/ Nuevo valor

SETONCARRIED SETONCARRIED,itemname[,itemtype]/prop/value
Se usa para acceder a las propiedades de un item que el player ha de llevar en la mochila
,itemname Nombre del item
[,itemtype] Para buscar el item por tipo. Es opcional.
/prop/ Propiedad a definir
/value/ Nuevo valor

SETONMOB SETONMOB,mobname[,mobtype]/prop/value
Se usa para acceder a las props de un MOB (criatura) y modificarla
,mobname Nombre del MOB
[,mobtype] Para buscar el MOB por tipo. Es opcional.
/prop/ Propiedad a definir
/value/ Nuevo valor

SETONTRIGMOB SETONTRIGMOB/prop/value
Se usa para acceder a las props del MOB que activó el spawn
/prop/ Propiedad a definir
/value/ Nuevo valor

PLAYERSINRANGE PLAYERSINRANGE,range
Verifica los players que hay dentro de “,range”


APENDICES

Apendice 1 - Entendiendo los XmlQuestNpc
 

Kenko

Page
Too bad he is spanish and not latino, but quite a guide there, I just hate some spanish terms (from Spain, I mean)

example: "flipar".. hate that word ¬¬
 

Foruno

Sorceror
ArteGordon said:
yes, thanks for this. I will add a link to it in the tutorial section of the xmlspawner support site as well.

Quise publicar el tutorial en xmlspawnerfan pero no me llego el mail de confirmacion para el foro y no pude hacerlo. Si puedes linkarlo hazlo ArteGordon, un saludo.

Sorry but i dont understant inglish very good...
 

Kenko

Page
Foruno said:
Quise publicar el tutorial en xmlspawnerfan pero no me llego el mail de confirmacion para el foro y no pude hacerlo. Si puedes linkarlo hazlo ArteGordon, un saludo.

Sorry but i dont understant inglish very good...
He said:
foruno said:
I wanted to publish the tutorial in XMLSpawnerFan, but I didn't get the confirmation mail to register an account there, and I couldn't do it. If you can link it, do it ArteGordon, byes.

Need a good translator anyone? :p
 

Foruno

Sorceror
KENKO said:
Too bad he is spanish and not latino, but quite a guide there, I just hate some spanish terms (from Spain, I mean)

example: "flipar".. hate that word ¬¬


The title say: Tutorial xmlspawner en CASTELLANO you know? all right...
 
Top