RU/Element tree

From Multi Theft Auto: Wiki
Jump to navigation Jump to search
Warning.png This page requires local translation. If page will remain not translated in reasonable period of time it would be deleted.
After translating the page completely, please remove the ‎{{translate}}‎ tag from the page.

В MTA используется так называемое Дерево элементов, которое содержит все элементы, расположенные на сервере и клиенте. Это непосредственно связано с расположением работающих ресурсов и XML файлов карт, хотя может быть изменено во время работы с помощью скриптов.

Если вы знакомы с компьютерным понятием Дерево(ветка, куст и т.д.), то вам будет легче разобраться. Если вы не понимаете, о чем речь, то Дерево элементов можно представить как Семейное дерево - в нём каждый человек имеет родителя. Так же и здесь. Каждый элемент(в дальнейшем потомок) имеет своего родителя.

Все элементы, которые созданы внутри скриптов или файлов карт, являются потомками ресурса, которому они принадлежат. По этому, большинство элементов (за исключением клиентских) существуют только во время работы ресурсов и перестают работать при остановке этих ресурсов.

Дерево элементов

  • root(корень): Это самый главный начальный элемент - корень. Все элементы - потомки этого элемента.
  • resource(ресурсы): Это прямой потомок корня, с одним для каждого запущенным ресурсом(ресурсов может быть множество). Его так же можно назвать корень ресурса. Его ID номер - это название ресурса.
  • map(карта): Каждый элемент ресурса может содержать по крайней мере один элемент карты - это так называемые ".map" файлы находящиеся в ресурсах. Так же карта может быть создана скриптом - тогда такие карты называются динамическими. Их ID номера содержат название карт, плюс дополнительно dynamic для динамических карт.
    • Файлы карт могут содержать различное число элементов.

Пример

Этот пример для серверной стороны, который сохраняет дамп дерева сервера в XML файл во время его работы. Просим заметить, что в некоторых местах имеются сокращения ради краткости обзора функции.

<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">
			<meta>
				<author/>
				<version/>
				<name/>
				<description/>
			</meta>
			<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>

Пояснение

Это дерево состоит из нескольких корневых элементов ресурсов, серверной консоли и двух элементов игроков, которые являются прямо дочерними корневого элемента. Каждый из этих ресурсов имеет динамическую карту в качестве дочернего элемента (для некоторых здесь она не отображена). Они содержат элементы, которые создаются ресурсом динамически с помощью скриптов, например транспортное средство. Если у ресурса есть файл карты, он также является дочерним элементом, включающим в себя все элементы из файла .map.

Рассмотрим поближе ресурс assault: он содержит одну динамическую карту, которая содержит 2 команды, 3 иконки, 1 маркер и 1 форму в качестве дочерних элементов. Это элементы созданные скриптом, например, маркер, иконка и форма скорее всего используются в качестве цели.

Функция ресурса as-farm напротив в том, чтобыбыть картой для игрового режима assault. Динамическая карта пуста (хотя она может содержать элементы если в ресурсе карты есть скрипт), пока есть карта 'as-farm.map', которая содержит элементы. Это в основном пользовательские элементы (такие как spawngroup, spawnarea, objective) но также присутствуют несколько элементов, которые MTA создает автоматически после загрузки карты (например, пикап). В скобках после типа элемента находится данные, которые содержит элемент. Они идентичны атрибутам, связанным в .map файле с этими элементами, в то же время вы можете установить и получить данные любого другого элемента (например, игроков) с помощью setElementData и getElementData.

Практическое применение

Элементы могут иметь сколько угодно дочерних. Это не оказывает как либо влияния на карту напрямую, но это происходит при взаимодействии со скриптинговой системой.

Установка данных для элементов

Если вы вызовете функцию set... для какой либо ветви в дереве элементов, то функция отразится на всех элементах внутри нее (если может работать с этим элементом).

Таким образом такое код установит размер для всех маркеров (единственный тип элементов, с которым может работать функция setMarkerSize), которые ниже коренного элемента в 2.5.

setMarkerSize ( getRootElement(), 2.5 )

Также можно поступить с любым элементом, это не запрещено для корневого элемента.

Менеджер карт

The example above shows the way the map manager uses different resources. The 'assault' resource is the gamemode, that manages what happens on the server using scripts and thus by creating elements in the tree dynamically. When a map resource is started, the gamemode receives a resource pointer referring to the started resource - in this case as-farm - from which you can retrieve and store the resource root element. Using this element in conjunction with functions like getElementsByType, getElementData and various others, you can access any of the information that was loaded into the tree from the 'as-farm.map'-file through scripts in the gamemode resource.

Another thing that has to be considered related to the tree of elements is the fact that when you change the map, you don't have to remove any elements you created within the map resource, while you do have to remove elements that are created within the gamemode resource, if they are specific to the map (which will be probably the case for those items you create based on information read from the map resource's .map files).

Element browser

You can start the resource elementbrowser to see a live view of the element tree on your server. Just start the resource and browser to your server's web page and choose the Element browser option in the sidebar (firefox only currently).