Point template

Материал из CSM Wiki
Перейти к навигации Перейти к поиску

Оригинал Point_template

Описание

Объект point_template используется для клонирования любого объекта или группы объектов.

Особенности использования

  • Этот объект обновляется в каждом раунде. Это означает что любые изменения объекта НЕ будут наследоваться в последующих раундах.
  • Объект может быть установлен в любом месте на карте.
  • На карте может быть установлено множество этих объектов
  • Объект не может клонировать сам себя. Попытки такого клонирования просто игнорироваться, но все остальные объекты, указанные в свойствах "Template 1-16" будут созданы. В целом, этот объект не может клонировать объекты point_template.
  • Другие объекты, которые не обновляются в начале каждого раунда, не могут быть клонированы при помощи этого объекта.
  • Этот объект может использоваться объектом env_entity_maker для автоматизирования операций клонирования.

Ошибки

  Warning.png Внимание:  Этот объект является потенциально опасным, потому что его использование может привести к краху игры. Причина в том, что этот объект может создавать множественные экземпляры одних и тех же объектов. Каждый новый экземпляр прибавляет к счётчику экземпляров +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, который автоматически создаёт новую бочку когда старая будет сломана.

Смотрите также