Skip to content

MetaTarget definition RU

Shararvev edited this page Dec 24, 2022 · 11 revisions

This page is available in English

Get MetaTarget

MetaTarget controller:GetMetaTarget(string name)

MetaTarget controller:GetMetaTarget(Entity ent)

MetaTarget controller:GetMetaTarget(table entities)

Возвращает структуру MetaTarget, которая олицетворяет набор энтитей с указанным именем, или переданных энтитей.

Обратите внимание, что для создания Lua оутпутов имя энтити targetname вообще не имеет значения.

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

В противном случае вам нужно будет вручную создать кеш имен с помощью controller:CacheEntNames() и потом очистить его controller.cache = nil. Для единичного использования лучше вызвать controller:GetMetaTarget(ents.FindByName(name)).

Arguments

string name; Entity ent; table entities

  • Имя энтити targetname в Hammer. Также может быть сама Entity или список энтитей.

Returns

MetaTarget

  • Последовательная таблица всех найденных энтитей. Таблица имеет определенную мету.

MetaTarget

Объект, который олицетворяет набор энтитей с указанным именем, и предоставляет быстрый доступ. Эта структура последовательно хранит в себе энтити. Поэтому вы можете получить энтить напрямую через target[i]. Если на карте нет энтитей с таким именем, то таблица пустая #target == 0, а вызов IsValid(target) вернет false.

Когда мы вызываем какой-либо метод на этом объекте, MetaTarget пересылает этот вызов на вложенные энтити, за исключением чисел. Числовой ключ - это получение энтити по ее порядковому номеру.

Обратите внимание, что MetaTarget не возвращает результат вызова методов, потому что вы пытаетесь получить значение от разных энтитей. Вам необходимо явно обращаться к энтити local pos = target[1]:GetPos().

Когда мы пытаемся присвоить новую переменную MetaTarget, он воспринимает это как попытку создать новый оутпут. Поэтому код target.OnPressed = function() end на самом деле создает оутпут для вложенных энтитей. В объект MetaTarget нельзя добавить переменные без обхода меты, поэтому код target.myVal = true является ошибкой, он не сработает как вы ожидаете, а создаст несуществующий оутпут myVal. Обойти мету можно с помощью rawset.

Variables

string MetaTarget.name

  • Имя энтитей, для которых был создан MetaTarget. Если использовать энтить или список, то имя может быть пустой строкой. Из списка берется имя первой энтити.

Entity MetaTarget.controller

  • Энтить контроллера, которой принадлежит этот MetaTarget.

integer MetaTarget.nextOutputId

  • Устанавливает уникальный id оутпута, это позволяет создавать независимые функции обратного вызова. После создания оутпута сбрасывается на значение по умолчанию 1.

number MetaTarget.nextOutputDelay

  • Устанавливает значение delay для следующего создаваемого оутпута. После создания оутпута сбрасывается на значение по умолчанию 0.

integer MetaTarget.nextOutputRepetitions

  • Устанавливает значение max times to fire для следующего создаваемого оутпута. После создания оутпута сбрасывается на значение по умолчанию -1. Значение 0 то же самое, что и -1.

Пожалуйста воздержитесь от использования переменных nextOutputId, nextOutputDelay, nextOutputRepetitions с MetaTarget, поскольку они предназначены для поддержки методов Entity.AddOutput Entity.RemoveOutput Entity.GetOutputs methods.

Methods

boolean MetaTarget.IsValid()

  • Вернет true если хоть одна вложенная энтить валидна и валиден контроллер. Вернет false, если энтитей не было совсем или все они были удалены, либо удален контроллер.

Lua outputs

Вы создаете функцию, в качестве названия переменной (ключа) указываете имя оутпута у энтити. Разные энтити имеют разные оутпуты, вам нужно смотреть названия оутпутов на Valve Developer Wiki.

button1.OnPressed = function(ent, activator, caller, value)
	-- use ent instead button1 or button1[1]
	ent:EmitSound("buttons/button24.wav")
end

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

В большинстве случаев caller является самой энтитью ent, но отдельные оутпуты могут переопределять ее. См. Keywords примечания и особые случаи. Так, например, если вы создадите оутпут OnLockedUse для func_door, то activator и caller будет игрок.

Некоторые энтити неправильно работают с оутпутами, и вместо игрока activator будет сама энтить ent. Так, например, если вы создадите оутпут OnOpen или OnClose для func_door, то activator и caller будет эта дверь. Это ошибка движка.

MetaTarget.OnOutputName(Entity ent, Entity activator, Entity caller, any value)

Arguments

Entity ent

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

Entity activator

  • Энтить, которая запустила цепочку событий. Если кнопку нажал игрок, то здесь будет энтить игрока. Если вы вручную запустили button1:Fire("Press") и не передали аргумент activator, то здесь будет NULL.

Entity activator

  • Энтить, которая непосредственно запускает оутпут. Например, кнопка, которая была нажата.

any value

  • Если оутпут имеет генерируемый параметр, то это значение передается сюда в виде string, number или boolean. Например, momentary_rot_button > Position или math_counter > OutValue. В остальных случаях это будет nil.