Point template
Оригинал Point_template
Содержание
Описание
Объект point_template используется для клонирования любого объекта или группы объектов.
Особенности использования
- Этот объект обновляется в каждом раунде. Это означает что любые изменения объекта НЕ будут наследоваться в последующих раундах.
- Объект может быть установлен в любом месте на карте.
- На карте может быть установлено множество этих объектов
- Объект не может клонировать сам себя. Попытки такого клонирования просто игнорироваться, но все остальные объекты, указанные в свойствах "Template 1-16" будут созданы. В целом, этот объект не может клонировать объекты point_template.
- Другие объекты, которые не обновляются в начале каждого раунда, не могут быть клонированы при помощи этого объекта.
- Этот объект может использоваться объектом env_entity_maker для автоматизирования операций клонирования.
Ошибки
Внимание: Этот объект является потенциально опасным, потому что его использование может привести к краху игры. Причина в том, что этот объект может создавать множественные экземпляры одних и тех же объектов. Каждый новый экземпляр прибавляет к счётчику экземпляров +1. Экспериментальным путём было выяснено, что при достижении счётчика значения 100 игра завершится крахом с ошибкой CUtlLinkedList overflow!
(переполнение связанного списка). Это баг движка Source, который проявил себя только для объектов:
- func_physbox
- func_physbox_multiplayer
Разберём результаты экспериментов над этим объектом:
- 1. Флажок "Preserve Entity Names" установлен. Создаём 100 экземпляров объекта(-ов) func_physbox_multiplayer и/или func_physbox (в сумме за один раунд, при помощи любого количества объектов point_template). Выскакивает ошибка и игра завершается.
- 2. Флажок "Preserve Entity Names" установлен. Создаём 99 экземпляров объекта(-ов) func_physbox_multiplayer и/или func_physbox (в сумме за один раунд, при помощи любого количества объектов point_template). Удаляем все созданные экземпляры функцией "Kill". Создаём ещё 99 экземпляров объекта(-ов) func_physbox_multiplayer и/или func_physbox и т.д. Ошибки не возникает!
- 3. Флажок "Preserve Entity Names" снят. Создаём 100 экземпляров объекта func_physbox_multiplayer и/или func_physbox (В СУММЕ ПО ВСЕМ РАУНДАМ, при помощи любого количества объектов point_template). Выскакивает ошибка и игра завершается. То есть можно создать в первом раунде 50, во втором раунде 30 и в третьем раунде 20, чтобы ошибка проявилась.
Ещё раз нужно отметить, что эта ошибка проявляется ТОЛЬКО если в свойствах "Template 1-16" указано имя хотя бы одного объекта "func_physbox" или "func_physbox_multiplayer". Были так же проверены:
- Prop-объекты – без ошибок (проверены все варианты);
- Brush-объекты – без ошибок (проверено частично);
- Point-объекты – без ошибок (проверено частично).
Резервирование имён
Иногда может понадобиться выполнять какие-то действия с клонируемой группой объектов. Например: есть бочка и таймер; бочка удаляется при помощи таймера через 10 секунд. Если указать имена бочки и таймера в одном point_template и установить для него флажок "Preserve Entity Names", то имена всех клонируемых бочек и таймеров будут одинаковые, а это приведёт к тому, что все бочки, клонированные за первые 10 секунд, будут удалены первым же таймером. Если для того же объекта point_template снять флажок "Preserve Entity Names", то при клонировании новых бочек и таймеров им будут автоматически выдаваться новые имена вида "<старое_имя>&0000", где "0000" будут заменяться другими неповторяющимися числами. Благодаря этому каждая клонированная бочка будет удаляться своим таймером ровно через 10 секунд с момента её клонирования. Кстати, не нужно думать, что можно выполнить только "9999" операций клонирования. Тесты показали, что после "9999" объекта счётчик снова начинает идти с "0000".
Обратите внимание, что переименование объектов производится только в том случае, если среди всех объектов "Template 1-16" имеются такие, которые выполняют функции для других – как в примере выше.
Чтобы найти все клонированные объекты можно использовать символы-джокеры * (Wildcard). Например: my_barrel_2* - найдёт все объекты, имя которых начинается на "my_barrel_2".
Смотрите пункт "Ошибки", чтобы избежать ошибок при создании ваших карт.
Параметры
- Template 1-16 – имена объектов, которые будут клонироваться.
Флаги
- Don't Remove Template Entities – НЕ удалять объекты "Template 1-16" в начале каждого раунда; если не установлен этот флажок, то объекты "Template 1-16" будут удаляться в начале каждого раунда;
- Preserve Entity Names – сохранять имена для клонируемых объектов; все клонируемые объекты будут иметь одинаковые имена – такие же, как указаны в редакторе Hammer; (см. пункт "Резервирование имён").
Inputs
- ForceSpawn – выполнить клонирование.
Outputs
- OnEntitySpawned – выполняется в момент клонирования объектов "Template 1-16".
Карта
csssdk_point_template.vmf
Используются объекты
- point_template
- func_button
- func_detail
- prop_physics
- logic_relay
- env_entity_maker
- weapon_mp5navy
- weapon_hegrenade
Описание карты
На карте размещено четыре пульта, на каждом из которых помещено по две кнопки – большая и маленькая. Большая кнопка запускает процесс клонировании, а маленькая удаляет результат клонирования. Большая кнопка первого пульта левой части карты создаёт обычную бочку, притом в неограниченных количествах. Воспользуйтесь маленькой кнопкой на пульте, когда вам покажется что бочек стало слишком много. Большая кнопка первого пульта в правой части карты создаёт два типа оружия – гранаты и автомат. Обратите внимание, что это оружие можно поднимать и использовать, но если поднять автомат, а затем его выбросить, то его имя сотрётся и удалить такой автомат при помощи маленькой кнопки пульта будет нельзя. Это справедливо для любого типа оружия, потому что в движке Source чётко указано, что при подъёме оружия, его имя стирается.
Большая кнопка второго пульта левой части карты создаёт группу зависимых объектов – бочка barrel3 (prop_physics) и объект relay1 (logic_relay). На relay установлено событие, которое удаляет сам relay и бочку через 3 секунды с момента клонирования. При клонировании этой группы объектов, маленькой кнопочкой на пульте можно вообще не пользоваться, так как каждая бочка и relay будут удаляться автоматически в указанное время. Для объекта point_template, который клонирует эту группу объектов, не установлен флажок "Preserve Entity Names", поэтому имена бочки и таймера будут автоматически изменены в момент клонировании. Смотрите об этом подробнее в пункте "Резервирование имён". При помощи консольной команды "ent_text *" вы можете посмотреть какие имена имеют переименованные бочки. Перед использованием этой команды нужно выполнить в консоли команду "sv_cheats 1".
Большую кнопку на последнем пульте можно вообще не нажимать, потому что объект point_template, рядом с этим пультом, используется неявно объектом env_entity_maker, который автоматически создаёт новую бочку когда старая будет сломана.