RU/Element tree: Difference between revisions

From Multi Theft Auto: Wiki
Jump to navigation Jump to search
No edit summary
Line 1: Line 1:
{{translate}}
[[File:Tre.png|frame|Element tree]]
В MTA используется так называемое ''Дерево элементов'', которое содержит все элементы, расположенные на сервере и клиенте. Это непосредственно связано с расположением работающих [[ресурсов]] и XML файлов карт, хотя может быть изменено во время работы с помощью скриптов.
MTA использует так называемое ''дерево элементов'' для хранения всех элементов, которые существуют на сервере и клиенте. Это напрямую связано с набором запущенных [[resources|ресурсов]] и XML-устройством их map-файлов, хотя все можно изменить скриптово прямо во время их работы.


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


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


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


==Пример==
==Пример==
Этот пример для серверной стороны, который сохраняет дамп дерева сервера в XML файл во время его работы.
Это пример серверного дерева, выведенного в XML от запущенного сервера.
''Просим заметить, что в некоторых местах имеются сокращения ради краткости обзора функции.''
''Пожалуйста, заметьте, что в некоторых местах для целей обзора оно укорочено.''
<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml">
<root>
<root>
Line 46: Line 46:
<map id="dynamic"/>
<map id="dynamic"/>
<map id="as-farm.map">
<map id="as-farm.map">
<meta>
<author/>
<version/>
<name/>
<description/>
</meta>
<spawngroup req="" type="attacker">
<spawngroup req="" type="attacker">
<spawnarea posY="-8.3976354598999" posX="20.182683944702" skins="9" ... />
<spawnarea posY="-8.3976354598999" posX="20.182683944702" skins="9" ... />
Line 71: Line 65:
</syntaxhighlight>
</syntaxhighlight>
===Пояснение===
===Пояснение===
Это дерево состоит из нескольких корневых элементов ресурсов, [[Element/Console|серверной консоли]] и двух элементов [[Element/Player|игрок]]ов, которые являются прямо дочерними '''корневого''' элемента. Каждый из этих ресурсов имеет ''динамическую карту'' в качестве дочернего элемента (для некоторых здесь она не отображена). Они содержат элементы, которые создаются ресурсом динамически с помощью скриптов, например [[Element/Vehicle|транспортное средство]]. Если у ресурса есть файл карты, он также является дочерним элементом, включающим в себя все элементы из файла .map.
Это дерево состоит из некоторого количество элементов resource root, [[Element/Console|консоли сервера]] и двух элементов [[player]], которые являются непосредственными "детьми" элемета '''root'''. Все эти ресурсы в качестве дочернего элемента имеют ''динамическую карту'' (для большинства их она просто не показана). Она содержит элементы, динамически создаваемые ее ресурсом посредством скриптов, например, [[vehicle]] (транспорт). Если у ресурса еще есть и map-файл, то он тоже будет являться дочерним элементом и будет содержать в себе все элементы из .map-файла.


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


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


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


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


Таким образом такое код установит размер для всех маркеров (единственный тип элементов, с которым может работать функция setMarkerSize), которые ниже коренного элемента в ''2.5''.
Таким образом, следующий код установит размер всех маркеров (единственный тип элементов, с которым функция setMarkerSize может работать), находящихся ниже root элемента на ''2.5''.
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
setMarkerSize ( getRootElement(), 2.5 )
setMarkerSize ( getRootElement(), 2.5 )
</syntaxhighlight>
</syntaxhighlight>


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


===Менеджер карт===
===Map manager===
The [[#Example|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|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.
[[#Пример|Пример выше]] демонстрирует, как [[map manager]] использует различные ресурсы. Ресурс 'assault' - мод, который управляет происходящим на сервере используя скрипты и, следовательно, посредством динамического создания элементов в дереве. При старте ресурса-карты мод получает [[resource|указатель ресурса]], ссылающийся на запустившийся ресурс - в данном случае это ''as-farm'' - из него вы можете запросить и сохранить элемент resource root. Используя данный элемент вкупе с такими функциями, как [[getElementsByType]], [[getElementData]] и различными другими, вы можете получить доступ к любой информации, загруженной в дерево через скрипты ресура-мода из файла 'as-farm.map'.


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).
Другая вещь, связанная с деревом элементов, которой следует уделить внимание - тот факт, что при смене карты вам не нужно удалять какие-либо созданные вами внутри ресурса-карты элементы, но вам '''нужно''' удалять элементы, созданные внутри ресурса-мода, '''если''' они специфичны карте (что возможно и будет применимо к таким, которые вы создали, базируясь на информации, прочитанной из .map-файлов ресурса-карты).


==Element browser==
==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).
Вы можете запустить ресурс ''elementbrowser'', чтобы увидеть, как дерево элементов вашего сервера выглядит в данный момент. Просто запустите ресурс, в браузере зайдите на веб-страницу вашего сервера и выберите опцию ''Element browser'' в боковой панели (на данный момент только в firefox).
 
[[Category:Scripting Concepts]]
[[Category:Scripting Concepts]]
[[en:Element tree]]
[[es:Árbol de elementos]]

Revision as of 19:00, 1 July 2012

Element tree

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

Если вы знакомы с понятием деревьев в информатике, понять это не составит труда. Если же нет, представьте себе это в качестве генеалогического древа, за тем лишь исключением, что все имеют только по одному родителю. Каждый элемент имеет родительский элемент.

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

Элементы дерева

  • root: (корень) Он располагается в самом начале дерева - все элементы являются по отношении к этому элементу дочерними (или потомками).
  • resource: Это различные дочерние элементы root элемента - по одному на каждый запущенный ресурс. Этот элемент называется resource root (корень ресурса). Его ID содержит имя ресурса.
  • map: Каждый элемент ресурса содержит как минимум один 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">
			<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>

Пояснение

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

Давайте присмотримся к ресурсу assault: Он содержит одну единственную динамеческую карту, которая в качестве дочерних элементов имеет 2 команды, 3 радарных метки, 1 маркер и 1 колшейп (colshape). Они и являются элементами, создаваемыми скриптово, например, маркер, колшейп и одна из меток возможно используются для обозначения цели.

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

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

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

Присвоение элементам данных

При вызове функции set... по отношении к узлу дерева элементов, она затронет каждый элемент внутри него (на котором она сработает).

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

setMarkerSize ( getRootElement(), 2.5 )

То же самое можно сделать с любым элементом, это не ограничено root элементом.

Map manager

Пример выше демонстрирует, как map manager использует различные ресурсы. Ресурс 'assault' - мод, который управляет происходящим на сервере используя скрипты и, следовательно, посредством динамического создания элементов в дереве. При старте ресурса-карты мод получает указатель ресурса, ссылающийся на запустившийся ресурс - в данном случае это as-farm - из него вы можете запросить и сохранить элемент resource root. Используя данный элемент вкупе с такими функциями, как getElementsByType, getElementData и различными другими, вы можете получить доступ к любой информации, загруженной в дерево через скрипты ресура-мода из файла 'as-farm.map'.

Другая вещь, связанная с деревом элементов, которой следует уделить внимание - тот факт, что при смене карты вам не нужно удалять какие-либо созданные вами внутри ресурса-карты элементы, но вам нужно удалять элементы, созданные внутри ресурса-мода, если они специфичны карте (что возможно и будет применимо к таким, которые вы создали, базируясь на информации, прочитанной из .map-файлов ресурса-карты).

Element browser

Вы можете запустить ресурс elementbrowser, чтобы увидеть, как дерево элементов вашего сервера выглядит в данный момент. Просто запустите ресурс, в браузере зайдите на веб-страницу вашего сервера и выберите опцию Element browser в боковой панели (на данный момент только в firefox).