ES/Árbol de elementos

From Multi Theft Auto: Wiki
Árbol de elementos (En inglés)

MTA usa un llamado árbol de elementos para almacenar todos los elementos que existen en el servidor y en el cliente. Esto está directamente relacionado con los resources y el diseño de los archivos de mapa XML, aunque se puede cambiar mediante scripts mientras se ejecuta.

Si conoces el concepto de árboles en computación, deberías entenderlo fácilmente. Si no, piensa que es un árbol genealógico o familiar - solo que todos tienen un solo padre. Cada elemento tiene un elemento padre.

Todos los elementos creados dentro de un script o desde un archivo .map son elementos hijos del resource al que pertenecen. Por esta razón, la mayor parte de los elementos (excepto para los clientes) existen solo dentro de los resources y además son destruidos tan pronto como el resource es detenido.

Elementos de árbol

  • raíz o root: Es la base de todo el árbol - todos los elementos son hijos (o descendientes) de este elemento.
  • resource: Son hijos directos del elemento raíz - con uno por cada resource que se está ejecutando. Este elemento es llamado la raíz del resource. Su ID siguen con el mismo nombre del resource.
  • map o mapa: Cada elemento resource contiene por lo menos un elemento mapa que puede representar un archivo ".map" dentro del resource o el que contiene los elementos creados por los scripts (que es llamado el mapa dinámico). Sus IDs contienen los nombres de los archivos de mapa, o dynamic para el mapa dinámico.
    • Los archivos de mapa también puede contener otros elementos así como también una cantidad ilimitada de elementos personalizados.

Ejemplo

Este es un ejemplo de un árbol del lado del servidor volcado a un XML de un servidor en ejecución. El archivo se encuentra acortado en ciertos lugaras por razones de espacio.

<root>
	<console/>
	<player dontRespawn="false"/>
	<player dontRespawn="false" lastSpawnarea=""/>
	<resource id="resourcebrowser"/>
	<resource id="ajax"/>
	<resource id="resourcemanager"/>
	<resource id="spawnmanager"/>
	<resource id="mapmanager"/>
	<resource id="runcode"/>
	<resource id="fr">
		<map id="dynamic">
			<vehicle/>
		</map>
	</resource>
	<resource id="elementbrowser"/>
	<resource id="assault">
		<map id="dynamic">
			<team/>
			<team/>
			<blip/>
			<marker/>
			<colshape/>
			<blip/>
			<blip/>
		</map>
	</resource>
	<resource id="as-farm">
		<map id="dynamic"/>
		<map id="as-farm.map">
			<spawngroup req="" type="attacker">
				<spawnarea posY="-8.3976354598999" posX="20.182683944702" skins="9" ... />
			</spawngroup>
			<spawngroup req="" type="attacker">
				<spawnarea posY="32.166355133057" posX="-46.90763092041" skins="9" ... />
			</spawngroup>
			<spawngroup req="" type="attacker">
				<spawnarea posY="35.214984893799" posX="-33.486911773682" skins="9" ... />
			</spawngroup>
			<spawngroup req="" type="attacker">
				<spawnarea posY="35.214984893799" posX="-33.486911773682" skins="9" ... />
			</spawngroup>
			<objective id="first" type="checkpoint" description="Breach into the farm" ... />
			<pickup type="weapon" ... />
		</map>
	</resource>
</root>

Explicación

Este árbol consiste en una cantidad de elementos raíz de un resource, la consola del servidor y dos elementos jugador, que son hijos directos del elemento raíz (o root element). Todos estos resources tienen un mapa dinámico como elemento hijo (que no se muestra completamente). Estos contienen los elementos que son creados dinámicamente por este resource usando scripts, por ejemplo un vehículo. Si el resource tiene un archivo de mapa, este también sería un elemento hijo, por si mismo contiene todos los elementos dentro del archivo .map.

Centremos la mirada en el resource assault: Este contiene solo un mapa dinámico que tiene 2 equipos, 3 blips (puntos en el radar), 1 marcador y 1 figura de choque (colshape) como elementos hijos. Estos son los elementos creados por el script, por ejemplo el marcador, la figura de choque y uno de los blips son usados probablemente para el objetivo.

La funcion del resource as-farm del lado contrario está para ser un mapa para el modo de juego assault. El mapa dinámico está vacío (podría contener elementos si hubiese un script dentro de él), mientras hay un mapa llamado 'as-farm.map', que contene cierto número de elementos. Mayoritariamente hay elementos personalizados (como spawngroup, spawnarea, objective) pero tambien hay ciertos elementos que MTA crea automáticamente lusgo de cargar el mapa (como un pickup). Dentro de los paréntesis, después del tipo de elemento, se pueden apreciar los datos que contiene, los cuales son idénticos a los atributos que el archivo .map contiene dentro de estos elementos, mientras que puedes ajustar y obtener datos de de cualquier otro elemento (p.el. jugadores) con setElementData and getElementData.

Aplicación práctica

Los elementos pueden tener tantos hijos como se deseen. Esto no afecta directamente al mapa mapa de ninguna forma, sin embargo cuando se combina con el sistema de scripts puede suceder.

Estableciendo datos para los elementos

Si llamamos una función set... en un nodo del árbol de elementos, la función afectará a cada elemento dentro de este (si es aplicable).

Así, el siguiente código debería establecer el tamaño de cada marcador (que es el único elemento con el que funciona la función setMarkerSize) que está bajo el elemento raíz en 2.5.

setMarkerSize ( getRootElement(), 2.5 )

The same can be done on any element, it is not restricted to the root element.

El Mapmanager

El ejemplo anterior la manera en que el mapmanager usa diferentes resources. El resource 'assault' es el modo de juego, que controla lo que sucede en el servidor usando scripts y por tanto creando elementos en el árbol dinámicamente. Cuando se inicia un resource de mapa, el modo de juego recibe un puntero hacia el resource haciendo referencia al resource iniciado - en este caso es as-farm - desde el cual se pueden recuperar y almacenar elementos raíces de resources. Usar este elemento en conjunto con funciones como getElementsByType, getElementData y muchas otras, puedes acceder a toda la información que fue cargada dentro del árbol desde el archivo 'as-farm.map' por medio de scripts en el resource de modo de juego.

Otro asunto a considerar relacionado con el árbol de elementos es el hecho de que cuando cambias el mapa, no debes quitar ningún elemento que hayas creado dentro del resource de mapa, mientras que tienes que quitar los elementos que son creados dentro del resource de modo de juego, si y solo si son específicos para el mapa (el cual será probablemente el caso en el que esos items que creaste estén basados en información que lean desde el archivo .map del resource de mapa).

Navegador de elementos

Puedes iniciar el resource elementbrowser para obtener una visión actual del árbol de elementos de tu servidor. Basta con iniciar el resource y navegar por la página web de tu servidor y elegir la opción Element browser en la barra lateral.