-
Notifications
You must be signed in to change notification settings - Fork 0
How to use MetaTarget RU
This page is available in English
GM:OnMapLogicInitialized(Entity controller, string mapName)
Entity controller
- Энтить контроллера map_logic_controller, который вызывает этот хук.
string mapName
- Имя карты, для которой контроллер пытается инициализировать логику.
Используйте уникальное имя хука и файла, чтобы избежать конфликта с другими аддонами. Лучше всего вписать часть названия вашей карты.
Всегда проверяйте mapName
, чтобы ваш скрипт не создавал скриптовые ошибки на других картах.
mapName
может отличатся от реального имени текущей карты, если вы установили консольную переменную map_logic_override
.
Создайте новый скрипт в папке autorun/server
, добавьте хук OnMapLogicInitialized
.
На самом деле этот код можно запустить из любого места со стороны сервера.
local function Init(controller, mapName)
-- always check mapName to prevent script errors on other maps
if mapName ~= "rp_pb_industrial17_v2" then
return
end
local button1 = controller:GetMetaTarget("start_button_no")
button1.OnPressed = function(ent, activator)
print(activator, "just pressed", ent)
end
button1:Fire("Press") -- for test only
local testActivator = button1[1] -- direct access to the entity
-- if entity has no name, we can pass it directly
local button2 = controller:GetMetaTarget(ents.GetMapCreatedEntity(2591))
button2.OnPressed = function(ent, activator)
print(activator, "just pressed", ent)
end
button2:Fire("Press", nil, 1, testActivator, testActivator) -- delay 1 sec, activator is previous button
end
hook.Add("OnMapLogicInitialized", "pb_v2_tests", Init)
Этот пример напечатает
+ [NULL Entity] just pressed Entity [1306][func_button]
+ Entity [1306][func_button] just pressed Entity [1292][func_button]
Нажатие кнопок из скрипта не очень полезно, это сделано чтобы показать как работает контроллер.
button1
и button2
это объекты MetaTarget, а не энтити.
Когда мы вызываем какой-либо метод, MetaTarget пытается вызвать его на энтитях, которые он содержит, за исключением чисел.
Числовой ключ - это получение энтити по ее порядковому номеру.
Когда мы пытаемся присвоить новую переменную MetaTarget, он воспринимает это как попытку создать новый оутпут.
Поэтому код button1.OnPressed = function
на самом деле создает оутпут для вложенных энтитей.
Метод button1:Fire
говорит движку вызвать инпут, однако этот инпут будет вызван после окончания инициализации.
Поэтому нам не важно находится ли он до или после объявления оутпутов.
Пожалуйста, воздержитесь от Entity:Input
- Entity.Input method behavior.