Creating an energy ball launcher and catcher: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
m (Removed "back" link at the top for consistency, and added example map link)
(Removed skill level)
 
(28 intermediate revisions by 8 users not shown)
Line 1: Line 1:
== Introduction ==
{{DISPLAYTITLE: Portal - Tutorial - Energy Ball Launcher and Catcher}}
The purpose of this tutorial is to illustrate how to create a single ball launcher and have a single ball catcher as its target. Both, the launcher and the catcher instructions will detail how the basic animations as well as the visual and sound effects work.
{{lang|Portal - Tutorial - Energy Ball Launcher and Catcher}}
{{back | Portal Level Creation}}


== The Aperture Science High Energy Pellet Launcher ==
==Introduction==
[[Image:launcher-catcher01.jpg|right|thumb|Launcher assembly.]]
This page will show you how to create Energy Ball Launchers and Catchers.


The launcher is comprised of three entities:
==Launcher==
* [[func_brush]]
* [[point_energy_ball_launcher]]
* [[prop_dynamic]]


The model used is:
===Launcher Base===
* <code>models/props/combine_ball_launcher.mdl</code>
[[File:portal_eball_launcher_base_brush.PNG|thumb|right|200px|Concrete Slab]]
Create a 8w*128l*128h brush with the <code>[[nodraw]]</code> texture. Tie this brush to a <code>[[func_detail]]</code>. Texture the front face with <code>concrete/concrete_modular_wall001a</code> and the border faces with <code>signage/hazard_orange_03b</code>. Rotate the textures if they aren't aligned.


To create the launcher:
{{note|The base isn't needed if your launcher is on a metal wall}}
:1. Create a <code>prop_dynamic</code> entity (<code>Shift+E</code>) with a <code>World Model</code> set to "<code>models/props/combine_ball_launcher.mdl</code>" and the <code>Name</code> key of "ball_launcher".
{{clr}}
:2. Place the new entity where you want it in your map.
===Launcher Model===
:3. Create a <code>point_energy_ball_launcher</code> entity and set its name to "ball".
[[File:portal_eball_launcher_model.PNG|thumb|right|200px|Launcher Model]]
:4. Place the new entity inside the dome of the "ball_launcher" model.
Create a <code>[[prop_dynamic]]</code> entity and enter the following properties:
:5. Create a new sqare brush 20 units or so on each side and 1 unit thick with the [[Tool textures|nodraw texture]].
{| class=standard-table
:6. Turn this brush into a <code>func_brush</code> entity (<code>Ctrl+T</code>) and name it "ball_launcher_shield".
!  Property Name || Value
:7. Place the "ball_launcher_shield" so that it is touching the black circular shield of the "ball_launcher model".
|-
:8. Open up the <code>point_energy_ball_launcher</code> properties and set these outputs:
| Name || ball_spawner_prop
::{| class=standard-table
|-
!   || My Output || Target Entity || Target Input || Parameter || Delay || Only Once
| World Model || models/props/combine_ball_launcher.mdl
|}
{{clr}}
===Launcher Lighting===
[[File:portal_eball_launcher_light.PNG|thumb|right|200px|Launcher Light Entity]]
Create a <code>[[light]]</code> entity and enter the following properties:
{| class=standard-table
!  Property Name || Value
|-
| Brightness || 218 76 26 30
|-
| BrightnessHDR || 218 76 26 30
|}
Place the light inside the Launcher Model.
{{clr}}
===Launcher Clipping===
[[File:portal_eball_launcher_playerclip.PNG|thumb|right|200px|Launcher Clip Brush]]
Create a 32w*64l*64h brush with the <code>playerclip</code> texture. Position this brush in front of the Launcher Base.
{{clr}}
===Launcher noportal===
[[File:portal_eball_launcher_noportal.PNG|thumb|right|200px|Launcher noportal volume]]
Create a 8w*96l*96h brush with the <code>invisible</code> texture.
{{note|The noportal brush isn't needed if your launcher is on a metal wall}}
{{clr}}
===Launcher Collision===
[[File:portal_eball_launcher_collision.PNG|thumb|right|200px|Launcher Collision]]
Create a 1w*16l*16h brush with the <code>nodraw</code> texture. Position this brush in the front in the model. Tie this brush to a <code>func_detail</code>.
{{clr}}
===Launcher Spawner===
[[File:portal_eball_launcher_spawner.PNG|thumb|right|200px|Launcher Spawner]]
Create a <code>[[point_energy_ball_launcher]]</code> entity and position the entity right in front of the Collision Brush, touching the outer face.
 
Enter the following properties:
 
{| class=standard-table
! Property Name || Value
|-
| Name || energy_ball_launcher
|-
|-
| [[Image:Io11.png]] || OnPostSpawnBall || ball_launcher || SetAnimation || close || 0.00 || No
| Ball count || 1
|-
|-
| [[Image:Io11.png]] || OnPostSpawnBall || ball_launcher_shield || Disable || <none> || 0.00 || No
| Min ball speed || 200
|-
|-
| [[Image:Io11.png]] || OnPostSpawnBall || ball_launcher_shield || Enable || <none> || 2.00 || No
| Max ball speed || 200
|-
| Ball radius || 12.0
|-
| Ball Respawn Time || 2.0
|}
|}
:9. Adjust the [[Keyvalue|keyvalues]] of <code>point_energy_ball_launcher</code> to set the desired <code>Direction</code>, <code>Speed</code>, <code>Type</code>, and <code>Life</code> of the ball.
{{note| The <code>Min ball speed</code> and <code>Max ball speed</code> values can be changed, but make sure they are the same value. The minimum value to enter is 200 and the max is 400.}}
The Aperture Science High Energy Pellet Launcher is now complete.
 
Sometimes under flags, the launcher starts inactive and gets activated when you touch a trigger.
 
Enter the following output:
{| {{OutputsTable}}
| [[File:Io21.png]] || OnPostSpawnBall || ball_spawner_prop || SetAnimation || close || 0.00 || No
|}
{{clr}}
 
==Ball Catcher==
 
{{note|Ball Catchers are modified ball catchers from [[Half-Life 2: Episode One]].}}
 
===Catcher Base===
[[File:portal_eball_catcher_base.PNG|thumb|right|200px|Catcher Base]]
Create 2 8w*40l*128h brushes with the <code>nodraw</code> texture.
 
Create 2 8w*48l*40h brushes with the <code>nodraw</code> texture.
 
Texture the front faces with <code>concrete/concrete_modular_wall001a</code> and the outer edge faces with <code>signage/hazard_orange_03b</code>. Rotate the textures if they aren't aligned.
 
Create an 8w*48l*48h brush with the <code>playerclip</code> texture and put the brush inside of the concrete base so the player can't fall through.


{{note|If necessary, you can also place the <code>point_energy_ball_launcher</code> outside of the "ball_launcher" model and remove the "ball_launcher_shield" outputs.}}
{{note|The base isn't needed if your catcher is on a metal wall}}
{{note|If you're not using a Trigger to fire the launcher you'll need to go into the "ball" entity, go to its flags page, and uncheck the "Start Inactive" flag.  Now the ball will start firing as soon as the level is loaded.}}
{{clr}}
===Catcher Interior===
[[File:portal_eball_catcher_interior.PNG|thumb|right|200px|Catcher Interior]]
Create 2 16w*16l*48h brushes with the <code>nodraw</code> texture.


== The Aperture Science High Energy Pellet Target ==
Create 2 16w*48l*16h brushes with the <code>nodraw</code> texture.
[[Image:launcher-catcher02.JPG|right|thumb|Target assembly.]]


The target is comprised of eleven entities:
Create a 16w*48l*48h brush with the <code>nodraw</code> texture.
* [[ambient_generic]]
* [[env_sprite]]
* [[filter_combineball_type]]
* [[func_tracktrain]]
* [[logic_relay]]
* [[path_track]] (2)
* [[point_spotlight]]
* [[prop_dynamic]] (2)
* [[trigger_multiple]]


The models used are:
Put these brushes behind the Catcher Base.
* <code>/models/props/combine_ball_catcher.mdl</code>
{{clr}}
* <code>/models/Effects/combineball.mdl</code>
===Catcher Model===
[[File:portal_eball_catcher_model.PNG|thumb|right|200px|Catcher Model]]
Create a <code>prop_dynamic</code> entity and enter the following properties:
{| class=standard-table
!  Property Name || Value
|-
| World Model || models/props/combine_ball_catcher.mdl
|-
| Disable Shadows || Yes
|-
| Name || ball_trap_1_housing
|}
{{clr}}
===Catcher Sprites===
[[File:portal_eball_catcher_sprites.PNG|thumb|right|200px|Catcher Sprites]]
Create an <code>[[env_sprite]]</code> entity and enter the following properties:


To create the catcher:
{| class=standard-table
:1. Create a <code>prop_dynamic</code> entity with a <code>World Model</code> key pointing to "<code>models/props/combine_ball_catcher.mdl</code>" and the <code>Name</code> set to "ball_trap".
! Property Name || Value
:2. Place the entity where you want it in your map.
|-
{{note|The model requires a hole of at least 32 units square and 8 units deep. Otherwise, when the model animates to its closed state, part of the model will be hidden in a wall.}}
| Name || ball_trap_1_sprite
:3. Create a <code>filter_combineball_type</code> entity and name it "filter_ball".
:4. Set the ball type for "filter_ball" to "Launched by <code>point_combine_ball_launcher</code>".
:5. Create a cylinder brush with 8 faces, and size it to same the length and width, as the Dynamic prop. Texture it with the trigger texture to cover the opening of the "ball_trap" model.
:6. Turn this brush into a <code>trigger_multiple</code> entity and name it "trigger_ball_trap", also set the <code>filter_name</code> to "filter_ball". Make sure to have the ''flags'' Physics Objects selected.
:7. Create a <code>prop_dynamic</code> entity with a <code>World Model</code> of "<code>models/Effects/combineball.mdl</code>", set its <code>Parent</code> to "ball_trap" and <code>Name</code> it "ball_trap_ball".
:8. Create a <code>env_sprite</code> entity, set its <code>Sprite Name</code> to "<code>sprites/physring1.vmt</code>", set its <code>Parent</code> to "ball_trap" and <code>Name</code> it "ball_trap_sprite". Make sure to have 'Render mode' set to ''Additive''. Also, the 'Scale should be set to ''1.5'' 'Size of Glow proxy' set to ''0'', and HDR Color Scale set to 1.0, yet all these values can be changed to your liking. Also be sure to have 'Render Fx' set to ''Distort''.
:9. Place both "ball_trap_ball" and "ball_trap_sprite" somewhere near the front of the "ball_trap" model.
:10. Create a <code>logic_relay</code> entity and name it "relay_ball_trap_spawn".
:11. Open up the <code>logic_relay</code> properties and set these outputs:
::{| class=standard-table
!   || My Output || Target Entity || Target Input || Parameter || Delay || Only Once
|-
|-
| [[Image:Io11.png]] || OnSpawn || ball_trap_ball || SetParentAttachment || ball_attachment || 0.00 || No
| Parent || ball_trap_1_housing
|-
|-
| [[Image:Io11.png]] || OnSpawn || ball_trap_sprite || SetParentAttachment || ball_attachment || 0.00 || No
| Render FX || Distort
|-
| Render Mode || Additive
|-
| Framerate || 30
|-
| Sprite Name || materials/sprites/physring1.vmt
|-
| Scale || 1.5
|-
| Size of Glow Proxy Geometry || 0
|}
|}
:12. Create a <code>path_track</code> entity and name it "path_ball_trap_01", set <code>Next Stop Target</code> to "path_ball_trap_02".
 
:13. Place "path_ball_trap_01" ''34'' units from the base of "ball_trap" model and 18 Units High from the center of the base model.
Create another <code>env_sprite</code> entity and enter the following properties:
:14. Create a <code>path_track</code> entity and name it "path_ball_trap_02, set <code>Next Stop Target</code> to "path_ball_trap_01".
 
:15. Place "path_ball_trap_02"  56 units away from the center of the original path_track. Make sure to have both even in a straight line, and matching up.
{| class=standard-table
:16. Create a brush with the nodraw texture. Its measurements should be '''14x8x16''', Length, Width Height.
:17. Turn this brush into a <code>func_tracktrain</code> entity and name it "ball_trap_door".
:18. The placing doesn't matter, so feel free to place it anywhere you like.
:19. Open up the property window for "ball_trap_door" and set these keyvalues:
::{| class=standard-table
!  Property Name || Value
!  Property Name || Value
|-
| Name || ball_trap_1_sprite
|-
| Parent || ball_trap_1_housing
|-
|-
| First Stop Target || path_ball_trap_01
| Render FX || Distort
|-
|-
| Move Sound || d3_citadel.podarm_move
| Render Mode || World Space Glow
|-
|-
| Start Sound || d3_citadel.podarm_move_start
| Framerate || 30
|-
|-
| Stop Sound || d3_citadel.podarm_move_stop
| Sprite Name || materials/sprites/glow01.vmt
|-
|-
| Change Angles || Never (Fixed Orientation)
| Scale || 2
|-
|-
| Height Above Tracks || 0
| Size of Glow Proxy Geometry || 0
|}
|}
{{clr}}
===Catcher Ball===
[[File:portal_eball_catcher_ball_model.PNG|thumb|right|200px|Ball Model]]
Create a <code>prop_dynamic</code> entity and enter the following properties:


:Also be sure to have these flags checked:
{| class=standard-table
!  Property Name || Value
|-
| Parent || ball_trap_1_housing
|-
| World Model || models/Effects/combineball.mdl
|-
| Name || ball_trap_1_ball
|-
| Start Disabled || Yes
|}
{{clr}}
===Catcher Spotlight===
[[File:portal_eball_catcher_spotlight.PNG|thumb|right|200px|Catcher Spotlight]]


::{| class=standard-table
Create a <code>[[point_spotlight]]</code> entity and enter the following properties:
{| class=standard-table
!  Property Name || Value
!  Property Name || Value
|-
| Name || spotlight1
|-
| Color || 218 76 26
|-
|-
| No user Control || Checked
| Spotlight Length || 256
|-
|-
| Fixed Orientation || Checked
| Spotlight Width || 32
|-
| HDR color scale || 2.0
|}
|}
{{clr}}
===Catcher Filter===
[[File:portal_eball_catcher_filter.PNG|thumb|right|200px|Ball Filter]]


:20. Open up the property window for "path_ball_trap_02" and set this output:
Create a <code>filter_combineball_type</code> entity and enter the following properties:
::{| class=standard-table
{| class=standard-table
!   || My Output || Target Entity || Target Input || Parameter || Delay || Only Once
! Property Name || Value
|-
| Parent || ball_trap_1_housing
|-
| Name || filter_combine_ballpermit_alt
|-
| Ball Type || Launched by point_combine_ball_launcher
|}
{{clr}}
===Catcher Sounds===
[[File:portal_eball_catcher_sounds.PNG|thumb|right|200px|Catcher Sound]]
 
Create an <code>[[ambient_generic]]</code> entity and enter the following properties:
{| class=standard-table
!  Property Name || Value
|-
| Name || sound_activate
|-
|-
| [[Image:Io11.png]] || OnPass || ball_trap_door || SetSpeed || 0 || 0.00 || No
| Sound Name || AlyxEMP.Charge
|}
{{clr}}
===Catcher Setup===
[[File:portal_eball_catcher_setup.PNG|thumb|right|200px|Catcher Sound]]
 
Create a <code>[[logic_relay]]</code> entity and enter the following property:
{| class=standard-table
!  Property Name || Value
|-
| Name || relay_ball_trap_1_setup
|}
|}
:21. Create a <code>point_spotlight</code> entity (<code>Shift+E</code>) and name it "ball_trap_spotlight". You may also want to disable the <code>Dynamic Light</code> flag.
 
:22. Set the <code>Color</code> for "ball_trap_spotlight" to "255 0 0", the <code>Beam Length</code> is normally the length of the room, and <code>Beam Width</code> somewhere between 20 and 40.
Enter the following outputs:
:23. Create an <code>ambient_generic</code> entity and <code>Name</code> it "ball_trap_sound"
Enter the following output:
:24. Set the <code>Sound Name</code> key for "ball_trap_sound" to "AlyxEMP.Charge". Set it's Source Entity Name to the Main Prop_dynamic.
{| {{OutputsTable}}
:25. Open the property window for "trigger_ball_trap" and set these outputs:
| [[File:Io21.png]] || OnSpawn || ball_trap_1_ball || SetParentAttachment || ball_attachment || 0.00 || No
::{| class=standard-table
|| My Output || Target Entity || Target Input || Parameter || Delay || Only Once
|-
|-
| [[Image:Io11.png]] || OnStartTouch || trigger_ball_trap || Disable || <none> || 0.00 || No
| [[File:Io21.png]] || OnSpawn || ball_trap_1_sprite || SetParentAttachment || ball_attachment || 0.00 || No
|}
{{clr}}
===Catcher Trigger===
[[File:portal_eball_catcher_trigger.PNG|thumb|right|200px|Catcher Trigger]]
 
Create a 96w*96l*32h cylinder with 8 sides with the <code>trigger</code> texture
 
Use the [[Hammer Transform Dialog]] and set its Y rotation value to 90.
 
Position the brush inside of the catcher.
 
Tie this brush to a <code>[[trigger_multiple]]</code> entity and enter the following properties:
 
{| class=standard-table
!  Property Name || Value
|-
| Name || ball_trap_1
|-
|-
| [[Image:Io11.png]] || OnStartTouch || ball || Disable || <none> || 0.00 || No
| Filter Name || filter_combine_ballpermit_alt
|}
 
Enter the following outputs:
{| {{OutputsTable}}
| [[File:Io21.png]] || OnTrigger || !activator || Kill || <none> || 0.00 || No
|-
|-
| [[Image:Io11.png]] || OnStartTouch || !activator || Kill || <none> || 0.00 || No
| [[File:Io21.png]] || OnTrigger || ball_trap_1_ball || Enable || <none> || 0.00 || No
|-
|-
| [[Image:Io11.png]] || OnStartTouch || ball_trap_ball || Enable || <none> || 0.00 || No
| [[File:Io21.png]] || OnTrigger || ball_trap_1_housing || SetAnimation || close || 0.00 || No
|-
|-
| [[Image:Io11.png]] || OnStartTouch || ball_trap_sprite || ToggleSprite || <none> || 0.00 || No
| [[File:Io21.png]] || OnTrigger || ball_trap_1_housing || SetAnimation || closed || 2.00 || No
|-
|-
| [[Image:Io11.png]] || OnStartTouch || ball_trap || SetAnimation|| close || 0.00 || No
| [[File:Io21.png]] || OnTrigger || ball_trap_1_sprite || ShowSprite || <none> || 0.00 || No
|-
|-
| [[Image:Io11.png]] || OnStartTouch || ball_trap_spotlight || LightOff || <none> || 0.00 || No
| [[File:Io21.png]] || OnTrigger || energy_ball_launcher || Disable || <none> || 0.00 || No
|-
|-
| [[Image:Io11.png]] || OnStartTouch || ball_trap_door || SetSpeed || .5 || 0.00 || No
| [[File:Io21.png]] || OnTrigger || sound_activate || PlaySound || <none> || 0.00 || No
|-
|-
| [[Image:Io11.png]] || OnStartTouch || ball_trap_sound || PlaySound || <none> || 0.00 || No
| [[File:Io21.png]] || OnTrigger || spotlight1 || LightOff || <none> || 0.00 || No
|}
|}
::Then under the Flags tab un-check "clients" and check everything else.


The Aperture Science High Energy Pellet Target is now complete.
Under Flags, modify the following:


{{note|The "ball_trap_door" sounds are drowned out by the "ball_trap_sound", you may want to adjust the delay for the <code>PlaySound</code>.}}
{{entity-flag-start}}
{{entity-flag|Clients|off|}}
{{entity-flag|Physics Objects|on|}}
{{entity-flag-end}}


== The theory ==
{{clr}}
[[Image:launcher-catcher03.jpg|right|thumb|Energy Pellet Launcher and Target at work.]]


These instructions illustrate the most basic use of the launcher and catchers. Theoretically you should be able to have one launcher and multiple catchers, or even catchers that reset themselves.{{clr}}
==Implementation==
 
You should have the same amount of launchers as catchers. If you have multiple catchers and launchers, remember to change the <code>energy_ball_launcher</code> in the trigger's outputs.


== See also ==
== See also ==
* [[Portal Level Creation]]
* [[Portal Level Creation]]


== External links ==
* [http://forums.thinkingwithportals.com/downloads.php?view=detail&df_id=187 Example map] Example map using this tutorial. VMF included.
[[Category:Level Design Tutorials]]
[[Category:Portal]]
[[Category:Portal]]
[[Category:Level Design]]
[[Category:Tutorials]]

Latest revision as of 17:51, 19 April 2025

English (en)Русский (ru)Translate (Translate)
Portal Level Creation

Introduction

This page will show you how to create Energy Ball Launchers and Catchers.

Launcher

Launcher Base

Concrete Slab

Create a 8w*128l*128h brush with the nodraw texture. Tie this brush to a func_detail. Texture the front face with concrete/concrete_modular_wall001a and the border faces with signage/hazard_orange_03b. Rotate the textures if they aren't aligned.

Note.pngNote:The base isn't needed if your launcher is on a metal wall

Launcher Model

Launcher Model

Create a prop_dynamic entity and enter the following properties:

Property Name Value
Name ball_spawner_prop
World Model models/props/combine_ball_launcher.mdl

Launcher Lighting

Launcher Light Entity

Create a light entity and enter the following properties:

Property Name Value
Brightness 218 76 26 30
BrightnessHDR 218 76 26 30

Place the light inside the Launcher Model.

Launcher Clipping

Launcher Clip Brush

Create a 32w*64l*64h brush with the playerclip texture. Position this brush in front of the Launcher Base.

Launcher noportal

Launcher noportal volume

Create a 8w*96l*96h brush with the invisible texture.

Note.pngNote:The noportal brush isn't needed if your launcher is on a metal wall

Launcher Collision

Launcher Collision

Create a 1w*16l*16h brush with the nodraw texture. Position this brush in the front in the model. Tie this brush to a func_detail.

Launcher Spawner

Launcher Spawner

Create a point_energy_ball_launcher entity and position the entity right in front of the Collision Brush, touching the outer face.

Enter the following properties:

Property Name Value
Name energy_ball_launcher
Ball count 1
Min ball speed 200
Max ball speed 200
Ball radius 12.0
Ball Respawn Time 2.0
Note.pngNote: The Min ball speed and Max ball speed values can be changed, but make sure they are the same value. The minimum value to enter is 200 and the max is 400.

Sometimes under flags, the launcher starts inactive and gets activated when you touch a trigger.

Enter the following output:

  My Output Target Entity Target Input Parameter Delay Only Once
Io21.png OnPostSpawnBall ball_spawner_prop SetAnimation close 0.00 No

Ball Catcher

Note.pngNote:Ball Catchers are modified ball catchers from Half-Life 2: Episode One.

Catcher Base

Catcher Base

Create 2 8w*40l*128h brushes with the nodraw texture.

Create 2 8w*48l*40h brushes with the nodraw texture.

Texture the front faces with concrete/concrete_modular_wall001a and the outer edge faces with signage/hazard_orange_03b. Rotate the textures if they aren't aligned.

Create an 8w*48l*48h brush with the playerclip texture and put the brush inside of the concrete base so the player can't fall through.

Note.pngNote:The base isn't needed if your catcher is on a metal wall

Catcher Interior

Catcher Interior

Create 2 16w*16l*48h brushes with the nodraw texture.

Create 2 16w*48l*16h brushes with the nodraw texture.

Create a 16w*48l*48h brush with the nodraw texture.

Put these brushes behind the Catcher Base.

Catcher Model

Catcher Model

Create a prop_dynamic entity and enter the following properties:

Property Name Value
World Model models/props/combine_ball_catcher.mdl
Disable Shadows Yes
Name ball_trap_1_housing

Catcher Sprites

Catcher Sprites

Create an env_sprite entity and enter the following properties:

Property Name Value
Name ball_trap_1_sprite
Parent ball_trap_1_housing
Render FX Distort
Render Mode Additive
Framerate 30
Sprite Name materials/sprites/physring1.vmt
Scale 1.5
Size of Glow Proxy Geometry 0

Create another env_sprite entity and enter the following properties:

Property Name Value
Name ball_trap_1_sprite
Parent ball_trap_1_housing
Render FX Distort
Render Mode World Space Glow
Framerate 30
Sprite Name materials/sprites/glow01.vmt
Scale 2
Size of Glow Proxy Geometry 0

Catcher Ball

Ball Model

Create a prop_dynamic entity and enter the following properties:

Property Name Value
Parent ball_trap_1_housing
World Model models/Effects/combineball.mdl
Name ball_trap_1_ball
Start Disabled Yes

Catcher Spotlight

Catcher Spotlight

Create a point_spotlight entity and enter the following properties:

Property Name Value
Name spotlight1
Color 218 76 26
Spotlight Length 256
Spotlight Width 32
HDR color scale 2.0

Catcher Filter

Ball Filter

Create a filter_combineball_type entity and enter the following properties:

Property Name Value
Parent ball_trap_1_housing
Name filter_combine_ballpermit_alt
Ball Type Launched by point_combine_ball_launcher

Catcher Sounds

Catcher Sound

Create an ambient_generic entity and enter the following properties:

Property Name Value
Name sound_activate
Sound Name AlyxEMP.Charge

Catcher Setup

Catcher Sound

Create a logic_relay entity and enter the following property:

Property Name Value
Name relay_ball_trap_1_setup

Enter the following outputs: Enter the following output:

  My Output Target Entity Target Input Parameter Delay Only Once
Io21.png OnSpawn ball_trap_1_ball SetParentAttachment ball_attachment 0.00 No
Io21.png OnSpawn ball_trap_1_sprite SetParentAttachment ball_attachment 0.00 No

Catcher Trigger

Catcher Trigger

Create a 96w*96l*32h cylinder with 8 sides with the trigger texture

Use the Hammer Transform Dialog and set its Y rotation value to 90.

Position the brush inside of the catcher.

Tie this brush to a trigger_multiple entity and enter the following properties:

Property Name Value
Name ball_trap_1
Filter Name filter_combine_ballpermit_alt

Enter the following outputs:

  My Output Target Entity Target Input Parameter Delay Only Once
Io21.png OnTrigger !activator Kill <none> 0.00 No
Io21.png OnTrigger ball_trap_1_ball Enable <none> 0.00 No
Io21.png OnTrigger ball_trap_1_housing SetAnimation close 0.00 No
Io21.png OnTrigger ball_trap_1_housing SetAnimation closed 2.00 No
Io21.png OnTrigger ball_trap_1_sprite ShowSprite <none> 0.00 No
Io21.png OnTrigger energy_ball_launcher Disable <none> 0.00 No
Io21.png OnTrigger sound_activate PlaySound <none> 0.00 No
Io21.png OnTrigger spotlight1 LightOff <none> 0.00 No

Under Flags, modify the following:

Flag
Checkbox-off.png Clients
Checkbox-on.png Physics Objects

Implementation

You should have the same amount of launchers as catchers. If you have multiple catchers and launchers, remember to change the energy_ball_launcher in the trigger's outputs.

See also