-
Notifications
You must be signed in to change notification settings - Fork 0
MetaTarget definition RU
This page is available in English
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))
.
string name; Entity ent; table entities
- Имя энтити targetname в Hammer. Также может быть сама Entity или список энтитей.
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
.
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.
boolean MetaTarget.IsValid()
- Вернет
true
если хоть одна вложенная энтить валидна и валиден контроллер. Вернетfalse
, если энтитей не было совсем или все они были удалены, либо удален контроллер.
Вы создаете функцию, в качестве названия переменной (ключа) указываете имя оутпута у энтити. Разные энтити имеют разные оутпуты, вам нужно смотреть названия оутпутов на 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)
Entity ent
- Энтить, на которой сработал этот оутпут. Поскольку вложенных энтитей может быть несколько, вам необходимо использовать эту переменную для обращения к энтити напрямую.
Entity activator
- Энтить, которая запустила цепочку событий. Если кнопку нажал игрок, то здесь будет энтить игрока. Если вы вручную запустили
button1:Fire("Press")
и не передали аргумент activator, то здесь будет NULL.
Entity activator
- Энтить, которая непосредственно запускает оутпут. Например, кнопка, которая была нажата.
any value
- Если оутпут имеет генерируемый параметр, то это значение передается сюда в виде string, number или boolean. Например,
momentary_rot_button > Position
илиmath_counter > OutValue
. В остальных случаях это будет nil.