Difference between revisions of "Creating an energy ball launcher and catcher"

From Valve Developer Community
Jump to: navigation, search
m (Introduction)
(Fixed inaccuracies and removed the func_tracktrain. The tracktrain doesn't even work in Portal and is leftover from Episode One)
 
Line 21: Line 21:
  
 
To create the launcher:
 
To create the launcher:
: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".
+
: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". Disable the shadows.
 
:2. Place the new entity where you want it in your map.
 
:2. Place the new entity where you want it in your map.
 
:3. Create a <code>point_energy_ball_launcher</code> entity, set its name to "ball", <code>Ball count</code> to 1, and <code>Ball radius</code> to 12.0.
 
:3. Create a <code>point_energy_ball_launcher</code> entity, set its name to "ball", <code>Ball count</code> to 1, and <code>Ball radius</code> to 12.0.
Line 52: Line 52:
 
* [[env_sprite]]
 
* [[env_sprite]]
 
* [[filter_combineball_type]]
 
* [[filter_combineball_type]]
* [[func_tracktrain]]
 
 
* [[logic_relay]]
 
* [[logic_relay]]
* [[path_track]] (2)
 
 
* [[point_spotlight]]
 
* [[point_spotlight]]
 
* [[prop_dynamic]] (2)
 
* [[prop_dynamic]] (2)
Line 64: Line 62:
  
 
To create the catcher:
 
To create the catcher:
: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".
+
: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". Disable the shadows.
 
:2. Place the entity where you want it in your map.
 
: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.}}
 
{{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.}}
Line 82: Line 80:
 
|-
 
|-
 
| [[Image:Io11.png]] || OnSpawn || ball_trap_sprite || SetParentAttachment || ball_attachment || 0.00 || No
 
| [[Image:Io11.png]] || OnSpawn || ball_trap_sprite || SetParentAttachment || ball_attachment || 0.00 || No
|}
 
: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.
 
: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.
 
: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
 
|-
 
| First Stop Target || path_ball_trap_01
 
|-
 
| Move Sound || d3_citadel.podarm_move
 
|-
 
| Start Sound || d3_citadel.podarm_move_start
 
|-
 
| Stop Sound || d3_citadel.podarm_move_stop
 
|-
 
| Change Angles || Never (Fixed Orientation)
 
|-
 
| Height Above Tracks || 0
 
|}
 
 
:Also be sure to have these flags checked:
 
 
::{| class=standard-table
 
!  Property Name || Value
 
|-
 
| No user Control || Checked
 
|-
 
| Fixed Orientation || Checked
 
 
|}
 
|}
  
:20. Open up the property window for "path_ball_trap_02" and set this output:
+
:12. 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.
::{| class=standard-table
+
:13. 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.
!  || My Output || Target Entity || Target Input || Parameter || Delay || Only Once
+
:14. Create an <code>ambient_generic</code> entity and <code>Name</code> it "ball_trap_sound"
|-
+
:15. 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.
| [[Image:Io11.png]] || OnPass || ball_trap_door || SetSpeed || 0 || 0.00 || No
+
:16. Open the property window for "trigger_ball_trap" and set these outputs:
|}
 
: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.
 
:23. Create an <code>ambient_generic</code> entity and <code>Name</code> it "ball_trap_sound"
 
: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.
 
:25. Open the property window for "trigger_ball_trap" and set these outputs:
 
 
::{| class=standard-table
 
::{| class=standard-table
 
!  || My Output || Target Entity || Target Input || Parameter || Delay || Only Once
 
!  || My Output || Target Entity || Target Input || Parameter || Delay || Only Once
Line 144: Line 103:
 
|-
 
|-
 
| [[Image:Io11.png]] || OnStartTouch || ball_trap_spotlight || LightOff || <none> || 0.00 || No
 
| [[Image:Io11.png]] || OnStartTouch || ball_trap_spotlight || LightOff || <none> || 0.00 || No
|-
 
| [[Image:Io11.png]] || OnStartTouch || ball_trap_door || SetSpeed || .5 || 0.00 || No
 
 
|-
 
|-
 
| [[Image:Io11.png]] || OnStartTouch || ball_trap_sound || PlaySound || <none> || 0.00 || No
 
| [[Image:Io11.png]] || OnStartTouch || ball_trap_sound || PlaySound || <none> || 0.00 || No
Line 152: Line 109:
  
 
The Aperture Science High Energy Pellet Target is now complete.
 
The Aperture Science High Energy Pellet Target is now complete.
 
{{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>.}}
 
  
 
== The theory ==
 
== The theory ==

Latest revision as of 14:36, 23 July 2021

Portal Level Creation

Русский

Introduction

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.

The Aperture Science High Energy Pellet Launcher

Launcher assembly.
func_noportal_volume postioning.

The launcher is comprised of four entities:

The model used is:

  • models/props/combine_ball_launcher.mdl

To create the launcher:

1. Create a prop_dynamic entity (Shift+E) with a World Model set to "models/props/combine_ball_launcher.mdl" and the Name key of "ball_launcher". Disable the shadows.
2. Place the new entity where you want it in your map.
3. Create a point_energy_ball_launcher entity, set its name to "ball", Ball count to 1, and Ball radius to 12.0.
4. Place the new entity inside the dome of the "ball_launcher" model.
5. Create a 1w*20l*20h brush with the nodraw texture.
6. Turn this brush into a func_brush entity (Ctrl+T) and name it "ball_launcher_shield".
7. Place the "ball_launcher_shield" so that it is touching the black circular shield of the "ball_launcher model".
8. Open up the point_energy_ball_launcher properties and set these outputs:
My Output Target Entity Target Input Parameter Delay Only Once
Io11.png OnPostSpawnBall ball_launcher SetAnimation close 0.00 No
Io11.png OnPostSpawnBall ball_launcher_shield Disable <none> 0.00 No
Io11.png OnPostSpawnBall ball_launcher_shield Enable <none> 2.00 No
9. Adjust the keyvalues of point_energy_ball_launcher to set the desired Direction, Speed (400 is usually what's used), Type, and Life of the ball.
10. Create a 8w*80l*80h with the invisible texture. Tie this brush to the func_noportal_volume brush entity. Place the brush on the wall and make sure the brush's center is lined up with the ball and the shield brush. Look at the image to the right for more context.

The Aperture Science High Energy Pellet Launcher is now complete.

Note.png Note: If necessary, you can also place the point_energy_ball_launcher outside of the "ball_launcher" model and remove the "ball_launcher_shield" outputs.
Note.png 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.

The Aperture Science High Energy Pellet Target

Target assembly.

The target is comprised of eleven entities:

The models used are:

  • /models/props/combine_ball_catcher.mdl
  • /models/Effects/combineball.mdl

To create the catcher:

1. Create a prop_dynamic entity with a World Model key pointing to "models/props/combine_ball_catcher.mdl" and the Name set to "ball_trap". Disable the shadows.
2. Place the entity where you want it in your map.
Note.png 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.
3. Create a filter_combineball_type entity and name it "filter_ball".
4. Set the ball type for "filter_ball" to "Launched by point_combine_ball_launcher".
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 trigger_multiple entity and name it "trigger_ball_trap", also set the filter_name to "filter_ball". Make sure to have the flags Physics Objects selected.
7. Create a prop_dynamic entity with a World Model of "models/Effects/combineball.mdl", set its Parent to "ball_trap" and Name it "ball_trap_ball". Also make sure to have Start Disabled set to "Yes".
8. Create a env_sprite entity, set its Sprite Name to "sprites/physring1.vmt", set its Parent to "ball_trap" and Name 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 logic_relay entity and name it "relay_ball_trap_spawn".
11. Open up the logic_relay properties and set these outputs:
My Output Target Entity Target Input Parameter Delay Only Once
Io11.png OnSpawn ball_trap_ball SetParentAttachment ball_attachment 0.00 No
Io11.png OnSpawn ball_trap_sprite SetParentAttachment ball_attachment 0.00 No
12. Create a point_spotlight entity (Shift+E) and name it "ball_trap_spotlight". You may also want to disable the Dynamic Light flag.
13. Set the Color for "ball_trap_spotlight" to "255 0 0", the Beam Length is normally the length of the room, and Beam Width somewhere between 20 and 40.
14. Create an ambient_generic entity and Name it "ball_trap_sound"
15. Set the Sound Name key for "ball_trap_sound" to "AlyxEMP.Charge". Set it's Source Entity Name to the Main Prop_dynamic.
16. Open the property window for "trigger_ball_trap" and set these outputs:
My Output Target Entity Target Input Parameter Delay Only Once
Io11.png OnStartTouch trigger_ball_trap Disable <none> 0.00 No
Io11.png OnStartTouch ball Disable <none> 0.00 No
Io11.png OnStartTouch !activator Kill <none> 0.00 No
Io11.png OnStartTouch ball_trap_ball Enable <none> 0.00 No
Io11.png OnStartTouch ball_trap_sprite ToggleSprite <none> 0.00 No
Io11.png OnStartTouch ball_trap SetAnimation close 0.00 No
Io11.png OnStartTouch ball_trap_spotlight LightOff <none> 0.00 No
Io11.png OnStartTouch ball_trap_sound PlaySound <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.

The theory

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.

See also

External links

  • Example map Example map using this tutorial. VMF included.