Самый большой и часто используемый на картах класс объектов. Все объекты func являются брашевыми. Для создания func-объекта сначала создается обычный браш, затем он превращается, нажатием [Ctrl-T], в энтити, в списке выбирается нужный тип func-объекта.
У большинства объектов func в свойствах есть параметры
отображения (Render FX, Render Mode, FX Amount, FX Color), которые
отвечают за то, как будут выглядеть объекты в игре. Всю необходимую
информацию об этих важных параметрах Вы можете получить в статье
«Параметры отображения».
На de-картах данный объект определяет место для
закладки бомбы. Используется вместо info_bomb_target, более того
отменяет его действие (если он присутствует на карте). Позволяет более
точно определить место закладки бомбы. Для создания места закладки бомбы
необходимо сделать браш, окрашенный со всех сторон текстурой AAAtrigger
и затем превратить его в энтити func_bomb_target.
свойства:
Target (then bomb blows) Имя объекта, который должен
взорваться вместе с бомбой (как например, ящики на de_dust). Чтобы
взорвать несколько объектов одновременно (например, 5 ящиков), следует
превратить их в func_breakable, дать одинаковые имена и поставить у
каждого флаг «Only trigger»
2. Func_breakable
Разбиваемый объект (стекла, ящики и пр.).
свойства:
Name Если дать объекту имя, то его можно будет разрушить другим объектом, как если бы в него просто выстрелили
Target on break Имя объекта, который будет активирован при разрушении func_breakable
Strength Прочность разбиваемого объекта. Значение прочности в
25-30 приблизительно соответствует 1 выстрелу из винтовки, 50-60 — 2
выстрела и т.д. Можно выставлять любые значения вплоть до нескольких
тысяч
Material type Тип материала (объект будет разваливаться на куски выбранного материала)
Gibs direction Направление разлета кусков разрушенного
объекта (Random — в разные стороны, Relative to attack — взависимости от
того, с какой стороны объект был разрушен)
Delay before fire Время в секундах от разрушения объекта до активации обьекта, указанного в «Target on break»
Gib model Тип кусков при разрушении (можно не указывать)
Spawn on break Обьект, который появляется из разрушенного объекта (в CS не используется)
Explode magnitude (0=none) Мощность взрыва при разрушении объекта (поставьте здесь значение 0, чтобы взрыва не было)
Only trigger Если отмечено, то объект нельзя будет разрушить
просто стреляя в него. Он разрушится только, если его активировать
другим объектом (триггером)
Touch Если отмечено, то объект разрушится от прикосновения
Pressure Если отмечено, то объект разрушится от давления
Instant crowbar Если отмечено, то объект разрушится от 1 удара монтировкой (относится к Half-Life)
3. Func_button
Создает кнопку, которую можно использовать для
активации других объектов (например, для открытия дверей). При нажатии
кнопка двигается в сторону, указанную в поле «Angle» на расстояние
равное своей толщине.
свойства:
Name Если дать кнопке имя, то ее можно будет активировать другим объектом
Speed Скорость, с которой кнопка движется при нажатии, по умолчанию 5 (не работает при установленном флаге «Don't move»)
Targetted object Имя объекта, который будет активирован при нажатии на кнопку
Health (shootable if > 0) «Прочность» кнопки, по
умолчанию 1. Чтобы кнопку можно было нажать выстрелив в нее, поставьте
значение большее 0. Кнопка нажмется после того, как уровень повреждений
превысит указанное значение
Lip Если необходимо, чтобы при нажатии кнопка сдвигалась
дальше или наооборот ближе, чем на расстояние своей толщины, то укажите
здесь необходимое количество юнитов для дополнительного сдвига. Возможно
как положительное, так и отрицательное значение (расстояние = толщина
кнопки - Lip
Master Имя объекта multisource
Sounds Звук при нажатии
Delay before reset (-1 stay) Время в секундах, в течении
которого кнопка не может быть нажата повторно. По истечении этого
времени кнопку вновь можно нажимать (поставьте значение «-1», чтобы
кнопку можно было нажать только 1 раз за раунд)
Delay before trigger Время в секундах от нажатия на кнопку до активации объекта, указанного в «Targetted object»
Locked sound, Unlocked sound, Locked sentence, Unlocked sentence Звуки при разных состояниях кнопки (можно не указывать)
флаги:
Don't move Если отмечено, то при нажатии кнопка остается неподвижной и при этом мгновенно сработает (рекомендуем отметить этот флаг)
Toggle Если отмечено, то после нажатия кнопка останется вдавленной, чтобы отжать — надо еще раз нажать
Sparks Если отмечено, то из ненажатой кнопки будут в разные стороны сыпать искры
Touch activates Если отмечено, то нажать кнопку можно будет всего лишь дотрагиванием до нее (не надо нажимать «E»)
4. Func_buyzone
Определяет зону для покупки оружия (обычно
размещается на базах команд). Объект необходимо закрашивать со всех
сторон специальной текстурой AAAtrigger.
свойства:
Team Здесь указывается какая из команд может покупать оружие
внутри данной зоны (All teams — обе команды / Terrorist /
Counter-Terrorist)
5. Func_conveyor
С помощью этого объекта создается конвейер.
Конвейер толкает игрока с определенной скоростью и в сторону, указанную в
параметре «Angle». Для создания иллюзии движения конвейера его
необходимо закрасить текстурой, начинающейся со слова SCROLL (например,
SCROLL_CONV3, SCROLLTOXIC или SCROLLWATER1).
свойства:
Name Если дать конвейеру имя, то его можно будет
активировать кнопкой или триггером (при каждой активации конвейер будет
менять направление своего движения)
Conveyor speed Скорость движения конвейера
флаги:
Not Push Если отмечено, то конвейер не будет двигать объекты, а только игрока
Not Solid Если отмечено, то конвейер будет нематериальным, т.е. через него можно будет проходить
6. Func_door
Создает дверь, сдвигающуюся в сторону. Нужное
направление открытия двери указывается параметром «Angle» (цифрами или
поворотом черточки на нужный угол). Для правильного определения
направления (угла) открытия поставьте вид сверху (2D top), тогда
открытие налево будет равносильно 180°, направо — 0°. Также Вы можете выбрать в списке «Up» или «Down», чтобы дверь открывалась вверх (в потолок) или вниз (в пол).
На самом деле использование этого объекта не ограничивается созданием
только лишь сдвигающихся дверей. При помощи func_door можно создать
лифт, платформу и другие подобные объекты.
свойства:
Name Если дать двери имя, то ее можно будет открыть кнопкой или триггером
Kill target Впишите сюда имя объекта, который необходимо
уничтожить (удалить) после открытия двери (Внимание! Объект будет удален
на все оставшиеся раунды!)
Speed Скорость движения двери при открытии/закрытии, по умолчанию 100
Master Имя объекта multisource
Move sound Звук при движении двери
Stop sound Звук при закрытии двери
Delay before close, -1 stay open Время в секундах до автоматического закрытия двери (поставьте значение «-1», чтобы дверь осталась открытой)
Lip По умолчанию дверь сдвигается на расстояние равное своей
ширине. Если выставить здесь какое-то значение, то дверь откроется на:
(расстояние = ширина - Lip). Установите отрицательное значение, чтобы
дверь сдвинулась дальше, положительное — меньше
Damage inflicted when blocked Количество процентов жизни, отнимаемых у игрока при попадании его под закрывающуюся дверь (лучше оставить 0)
Target Сюда можно вписать имя объекта, который будет активирован при открытии двери
Delay before fire Время в секундах от закрытия двери до активации объекта, указанного в «Fire on close»
Fire on close Сюда можно вписать имя объекта, который будет активирован при закрытии двери
Health (shoot open) «Прочность» двери, по умолчанию 1. Чтобы
дверь можно было открыть выстрелив в нее, поставьте значение большее 0.
Дверь откроется после того, как уровень повреждений превысит указанное
значение
Locked sound, Unlocked sound, Locked sentence, Unlocked sentence Звуки при разных состояниях двери (можно не указывать)
флаги:
Starts open Если отмечено, то дверь в начале каждого раунда будет открыта
Passable Если отмечено, то дверь будет нематериальной, т.е. через нее можно будет проходить
Toggle Если отмечено, то после открытия дверь не будет закрываться автоматически, пока ее снова не активируют
Use only Если отмечено, то дверь будет открываться только при нажатии на кнопку «Use» (по умолчанию «Е»)
7. Func_door_rotating
Создает вращающуюся дверь. Постройте браш в виде
двери и ось вращения (ось вращения определяется ORIGIN-брашем, т.е.
брашем, со всех сторон окрашенным текстурой ORIGIN). Разместите браш-ось
вместо оси вращения. Выделите одновременно браш-дверь и браш-ось и
превратите их в func_door_rotating, затем приступайте к выставлению
свойств.
свойства:
Свойства аналогичны свойствам сдвигающейся двери func_door, вот лишь один новый параметр:
Distance (deg) Угол поворота двери при открытии в градусах (по умолчанию 90)
Флаги аналогичны флагам сдвигающейся двери func_door, вот лишь несколько новых:
Reverse dir Если отмечено, то дверь будет открываться в противоположную сторону
One-way Если отмечено, то дверь будет открываться всегда в одну и ту же сторону
X Axis, Y Axis Если необходимо здесь можно указать
ось, относительно которой будет открываться дверь (по умолчанию дверь
открывается относительно вертикальной оси Z)
8. Func_escapezone
Определяет зону для «спасения» террористов на
es-картах, т.е. место, куда должны прибегать террористы, чтобы считаться
сбежавшими.
9. Func_friction
Позволяет создать область с пониженным уровнем
сцепления, т.е. скользкое место (можно использовать для иммитации
движения по льду).
свойства:
Percentage of standard (0-100) Уровень сцепления с
поверхностью в процентах от стандартного (чем меньше значение, тем
сильнее игрок будет скользить). Значения от 0 до 100
Позволяет создать движущуюся мишень. Данный объект
очень похож на func_train, т.к. для создания траектории его движения
используются объекты path_corner.
свойства:
Name Дайте func_guntarget имя, чтобы можно было запустить мишень кнопкой или триггером
Speed (units per second) Скорость движения мишени, юнитов в секунду
First stop target Укажите здесь имя первого объекта path_corner (начальной точки траектории движения)
Fire on damage Когда func_guntarget будет поврежден (т.к. это мишень), объект, чье имя указано здесь, будет активирован
Damage to take Количество повреждений, которые нужно нанести
мишени (func_guntarget), прежде чем она окончательно остановится и
активирует объект, указанный в «Fire on damage»
Global entity name Глобальное имя объекта (в CS не используется)
11. Func_healthcharger
Игроку, активировавшему этот объект, постепенно прибавляются проценты жизни.
свойства:
Global entity name Глобальное имя объекта (в CS не используется)
На cs-картах данный объект определяет место для
спасения заложников. Используется вместо info_hostage_rescue, более того
отменяет его действие (если он присутствует на карте). Позволяет более
точно определить место спасения заложников.
13. Func_illusionary
Создает нематериальный объект, т.е. через который можно свободно проходить.
1. Создание прозрачных решеток или заборов
Используя func_illusionary, Вы можете создать простреливаемый забор
или решетку, который одновременно будет блокировать передвижение игроку.
Для этого необходимо закрасить такой забор текстурой с маской (названия
таких текстур начинаются с фигурной скобки «{»).
Затем превратите забор в func_illusionary и в свойствах выставьте следующие параметры: «Render Mode» — Solid, «FX Amount» — 255 (это сделает синие места на текстурах прозрачными в игре).
Теперь создайте обычный браш (такого же размера как и забор), но со
всех сторон окрашенный текстурой CLIP и разместите вплотную к забору.
Теперь у Вас есть простреливаемый прозрачный забор, через который нельзя
пройти
2. Создание объектов, не цепляющих игрока
В узких местах (коридорах, туннелях, вентиляциях) некоторые мелкие
объекты, например, фонарики и т.п. могут мешать передвижению игрока
(цеплять его). Чтобы этого не происходило, просто превратите такой
объект в func_illusionary. Никаких дополнительных свойств выставлять не
требуется.
свойства:
Name Имя (не обязательно)
Contents Заполнение объекта (рекомендуем оставить «Empty»)
Создает невидимую (в игре) область, по которой
игрок может подниматься. Используется для создания вертикальных лестниц.
Сначала необходимо создать браш в форме лестницы (для закрашивания
используйте текстуру с маской, название таких текстур начинается на
круглую скобку «{», например, {LADDER1), затем превратите браш в
func_illusionary и в свойствах выставьте следующие параметры: «Render
Mode» — Solid, «FX Amount» — 255. Затем вплотную к этому брашу создайте
таких же размеров еще один браш, окрашенный со всех сторон текстурой
AAAtrigger и превратите его в func_ladder.
свойства:
Name Имя (не обязательно)
15. Func_mortar_field
Определяет место на карте, из которого может быть вызван авиаудар.
свойства:
Name Дайте объекту имя, чтобы его можно было активировать кнопкой или триггером
Repeat count Количество бомб, которые будут сброшены за один налет
Targeting Способ наведения (Random — случайный, Activator — в место активирования, Table — по таблице)
X controller, Y controller Эти параметры должны совпадать с именами объектов momentary_rot_button, которые определяют место удара с помощью Table
16. Func_pendulum
Позволяет создавать маятник и объекты похожие на
него (раскачивающиеся из стороны в сторону). Так как это вращающийся
объект, то необходимо определить ось вращения. Для этого следует
построить браш, со всех сторон окрашенный текстурой ORIGIN, затем
разместить его вместо оси вращения. Дальше следует выделить маятник и
браш-ось и превратить в func_pendulum.
Distance (deg) Угол раскачивания маятника в градусах (установите отрицательное значение для реверса движений)
Damping (0-1000) Замедление маятника. Если Вы установите
здесь какое-либо значение, то с течением времени маятник остановится.
Причем остановится он в положении равном половине значения указанного в
«Distance». Например, если в «Distance» указано 90°, то маятник
остановится в положении 45°. Значения от 0 до 1000
Damage inflicted when blocked Количество процентов жизни, отнимаемых у игрока при попадании его под маятник
флаги:
Start on Если отмечено, то маятник будет раскачиваться вначале раунда
Passable Если отмечено, то маятник будет нематериальным, т.е. через него можно будет проходить
Auto-return Если отмечено, то при каждой активации маятник
будет возвращен в исходное положение (рекомендуем не устанавливать этот
флаг, т.к. он работает не правильно)
X asis, Y asis Если необходимо, здесь можно указать
ось, относительно которой будет раскачиваться маятник (по умолчанию
относительно вертикальной оси Z)
17. Func_plat
Создает платформу, которая начинает подниматься,
как только игрок встает на нее. Размещать платформу следует в верхней
позиции (куда платформа должна приехать), а в игре она появится как и
положено снизу.
свойства:
Name Если дать платформе имя, то ее можно будет активировать кнопкой или триггером
Move sound Звук, издаваемый платформой при движении
Stop sound Звук при остановке платформы
Sound volume 0.0-1.0 Громкость звука. Значения от 0.0 до 1.0 (1.0 — максимально громкий)
Travel altitude (can be negative) Расстояние в юнитах, на
которое будет подниматься платформа (если Вы разместили платформу в
верхней (конечной) позиции, то задайте положительное значение, а если — в
нижней (начальной) позиции, то отрицательное)
Speed Скорость движения платформы, юнитов в секунду
флаги:
Toggle Если отмечено и платформа активируется кнопкой или
триггером, то поднявшись, она не станет опускаться автоматически. Чтобы
опустить платформу, ее необходимо будет активировать повторно
18. Func_platrot
Создает платформу, которая начинает подниматься,
как только игрок встает на нее, при этом она еще и вращается. Размещать
платформу следует в верхней позиции (куда платформа должна приехать), а в
игре она появится как и положено — снизу. Так как это вращающийся
объект, необходимо определить ось вращения. Для этого следует построить
браш, со всех сторон покрашенный текстурой ORIGIN, затем разместить его
вместо оси вращения. Дальше следует выделить платформу и браш-ось и
превратить в func_platrot.
свойства:
Свойства аналогичны свойствам обычной платформы func_plat, вот лишь два новых параметра:
Toggle Если отмечено и платформа активируется кнопкой или
триггером, то поднявшись, она не станет опускаться автоматически. Чтобы
опустить платформу, ее необходимо будет активировать повторно
X asis, Y asis Если необходимо здесь можно указать
ось, относительно которой будет вращаться платформа (по умолчанию
относительно вертикальной оси Z)
19. Func_pushable
Создает объект, который можно передвигать.
свойства:
Свойства этого объекта аналогичны func_breakable, вот лишь три новых параметра:
Hull Size Размер объекта (рекомендуем установить «Point size»)
Friction (0-400) Этот параметр определяет степень
сопротивления передвижению, когда игрок толкает предмет, чем он больше,
тем труднее его толкать. Значения от 0 до 400
Buoyancy Плавучесть объекта (на сколько объект погрузится в воду), по умолчанию 20
флаги:
Breakable Если отмечено, то объект можно не только
передвинуть, но и разрушить (Внимание! Объект можно будет разрушить
только один раз, во всех последующих раундах этого объекта уже не
будет!)
20. Func_recharge
У игрока, активировавшего этот объект, постепенно прибавляются проценты к бронежилету.
свойства:
Global entity name Глобальное имя объекта (в CS не используется)
Создает рычаг (рубильник), который можно
использовать для активации других объектов. Так как это вращающийся
объект, необходимо определить ось вращения. Для этого следует построить
браш, со всех сторон покрашенный текстурой ORIGIN, затем разместить его
вместо оси вращения. Дальше следует выделить рычаг и браш-ось и
превратить в func_rot_button.
свойства:
Name Если дать рычагу имя, то его можно будет активировать не только игроком, но и триггером
Targetted object Имя объекта, который будет активирован при нажатии на рычаг
Master Имя объекта multisource
Speed Скорость движения (поворота) рычага, по умолчанию 50
Health (shootable if > 0) «Прочность» рычага, по
умолчанию 1. Чтобы рычаг можно было активировать, выстрелив в него,
поставьте значение большее 0. Рычаг сработает после того, как уровень
повреждений превысит указанное значение
Sounds Звук при срабатывании рычага
Delay before reset Время в секундах, в течении которого
кнопка не может быть нажата (использована) повторно. По истечении этого
времени кнопку вновь можно нажимать
Delay before trigger Время в секундах между нажатием на рычаг и активацией объекта, указанного в «Targetted object»
Not solid Если отмечено, то рычаг будет нематериальным
Reverse dir Если отмечено, то рычаг будет поворачиваться в противоположную сторону
Toggle Если отмечено, то после нажатия рычаг автоматически не вернется в исходное положение, чтобы вернуть - надо еще раз активировать
X asis, Y asis Если необходимо здесь можно указать ось, относительно которой будет вращаться рычаг
Touch activates Если отмечено, то рычаг будет активироваться при простом дотрагивании до него (не надо нажимать кнопку «E»)
22. Func_rotating
Позволяет создавать вращающиеся объекты. С помощью
этой энтити можно сделать, например, вентилятор. Так как это вращающийся
объект, необходимо определить ось вращения. Для этого следует построить
браш, со всех сторон покрашенный текстурой ORIGIN, затем разместить его
вместо оси вращения. Дальше следует выделить объект и браш-ось и
превратить в func_rotating.
свойства:
Name Если дать имя, то вращающийся объект можно будет остановить и вновь запустить кнопкой или триггером
Rotation speed Максимальная скорость вращения объекта
Volume (10 = loudest) Громкость звука, издаваемого при вращении. Значения от 0 до 10 (10 — максимально громкий)
Friction (0-100%) Параметр отвечает за плавность разгона и торможения вентилятора (необходимо отметить флаг «Acc/Dcc»). Значения от 0 до 100%
Fan sounds Звук, издаваемый при вращении
WAV Name Если Вам не нравятся стандартные звуки, то здесь Вы можете указать путь к своему звуку в формате WAV
Damage inflicted when blocked Количество процентов жизни, отнимаемых у игрока при попадании его под вращающийся объект
флаги:
Start on Если отмечено и у объекта есть имя, то в начале каждого раунда он будет вращаться (не надо дополнительно активировать)
Reverse direction Если отмечено, то объект будет вращаться в противоположную сторону
X asis, Y asis Если необходимо здесь можно указать
ось, относительно которой будет вращаться объект (по умолчанию
относительно вертикальной оси Z)
Acc/Dcc Если отмечено, то объект сможет разгоняться/замедляться при включении/отключении
Fan Pain Если отмечено, то игроку будут наноситься повреждения, если он попадет под вращающийся объект
Not solid Если отмечено, то объект будет нематериальным, т.е. через него можно будет проходить
Small radius Устанавливает маленький радиус распространения звука
Medium radius Устанавливает средний радиус распространения звука
Large radius Устанавливает большой радиус распространения звука
23. Func_tank
Создает управляемый (вращающийся) пулемет (пушку).
Пулемет следует размещать дулом направо на виде сверху. Угол поворота
пулемета (реальный угол, на который пулемет будет повернут в игре)
устанавливается в поле «Angle» цифрами или поворотом черточки на нужный
угол. Так как это вращающийся объект, необходимо определить ось
вращения. Для этого следует построить браш, со всех сторон покрашенный
текстурой ORIGIN, затем разместить его вместо оси вращения. Дальше
следует выделить пулемет и браш-ось и превратить в func_tank. Для
возможности управления таким пулеметом необходимо создать
func_tankcontrols.
свойства:
Name Дайте пулемету имя, чтобы им можно было управлять используя func_tankcontrols
Target Имя объекта ambient_generic, т.е. звука, издаваемого при выстрелах. Ambient_generic следует устанавливать рядом с пулеметом
Yaw rate Скорость движения пулемета по горизонтали, по умолчанию 30. Для удобства управления рекомендуем выставить чуть бОльшее значение
Yaw range Угол поворота по горизонтали в градусах
Pitch rate Скорость движения пулемета по вертикали, по умолчанию 15. Для удобства управления рекомендуем выставить чуть бОльшее значение
Pitch range Угол поворота по вертикали в градусах
Barrel Length Расстояние в юнитах от центра ORIGIN-браша до конца ствола
Barrel Horizontal Расстояние в юнитах от центра ORIGIN-браша до центра ствола по горизонтали
Barrel Vertical Расстояние в юнитах от центра ORIGIN-браша до центра ствола по вертикали
Smoke sprite Имя спрайта, который будет появляться как дым при стрельбе
Flash sprite Имя спрайта, который будет появляться на конце ствола как вспышка при стрельбе (пламя), например, sprites/muzzleflash2.spr
Sprite scale Масштаб спрайта, по умолчанию 1
Rotate sound Звук при вращении пулемета
Rate of Fire Скорострельность пулемета (выстрелов в секунду), по умолчанию 1
Damage Per Bullet Убойная сила пуль
Firing persistence Применяется для неуправляемых пулеметов.
Когда игрок выйдет из «поля видимости», то пулемет будет стрелять в его
сторону еще некоторое время, вместо немедленного прекращения стрельбы, по умолчанию 1
Bullet accuracy Точность выстрелов
Minimum target range Минимальная дальность ведения огня
Maximum target range Максимальная дальность ведения огня
Bullets Тип пуль (неопределен, 9мм, MP5, 12мм)
флаги:
Active Активирует пулемет, применяется для управления пулеметом монстрами (в CS флаг не нужен)
Only direct Если отмечено, то пулемет будет стрелять только по видимым целям
Controllable Необходимо отметить, чтобы пулеметом можно было управлять
Чтобы пулеметом можно было управлять, присвойте ему имя («Name») и
отметьте во флагах «Controllable», затем разместите прямо за ним объект
func_tankcontrols. У объекта func_tankcontrols в параметр «Tank entity
name» впишите имя пулемета.
24. Func_tankcontrols
Объект используется для создания области, из
которой игрок может управлять пулеметом func_tank. Для этого объекта
необходимо сделать браш, окрашенный со всех сторон текстурой AAAtrigger и
затем превратить его в энтити func_tankcontrols.
свойства:
Tank entity name Впишите сюда имя пулемета func_tank, которым игрок будет управлять
25. Func_tanklaser
Разновидность объекта func_tank, также создает
управляемый пулемет, с той разницей, что этот пулемет стреляет лазером.
Для создания также понадобится объект env_laser. Присвойте объекту
env_laser имя и впишите в параметр «Target of Laser» имя пулемета. В
самом пулемете в параметр «env_laser Entity» впишите имя объекта
env_laser. Теперь пулемет будет стрелять лазерными лучами.
Если Вы используете вместе с env_laser еще и объект ambient_generic
(звук при выстрелах), то дайте этим двум объектам одинаковые имена.
Тогда при выстрелах из миномета будет раздаваться и звук, и будут
появляться лазерные лучи.
свойства:
Свойства аналогичны свойствам обычного пулемета func_tank, вот лишь один новый параметр:
env_laser Entity Впишите сюда имя объекта env_laser