Skip to content

How to use MetaTarget RU

Shararvev edited this page Jul 2, 2022 · 8 revisions

This page is available in English

Hook

GM:OnMapLogicInitialized(Entity controller, string mapName)

Arguments

Entity controller

  • Энтить контроллера map_logic_controller, который вызывает этот хук.

string mapName

  • Имя карты, для которой контроллер пытается инициализировать логику.

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

Всегда проверяйте mapName, чтобы ваш скрипт не создавал скриптовые ошибки на других картах.

mapName может отличатся от реального имени текущей карты, если вы установили консольную переменную map_logic_override.

Simple test

Создайте новый скрипт в папке 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.