-
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.