Lightning
This is a tutorial for adding a lightning storm to a map.
It is assumed that the reader knows how to create a 3D skybox before reading this tutorial.
Custom lightning sprites
Here are all the sprites of (normal) lightning bolts in the HL2 SDK:
- bluelight1.vmt
- lgtning.vmt
- lgtning_noz.vmt
- physcannon_bluelight1b.vmt
You can also download some custom made lightning sprites (seen in the screenshot to the right, but not required for this tutorial). Just create a new sprites folder in the hl2/materials/ folder, unpack the custom sprite files into it, and refresh the SDK content, before running the example map.
Setting up
1. Unless lightning is intended to be close enough to strike within the playing area, create the 3D skybox that will house the lightning storm. Make sure that its fog is disabled.
2. Create two env_sprites and place them next to each other.
3. Select the one of these sprite entities, and open it's properties. This sprite will be the actual lighting bolt. This tutorial example will set the values as follows:
Class: env_sprite | ||
Keyvalues | Comments | |
Name | lightning1 | The name of the lightning sprite. |
Render FX | Faster Strobe | |
Render Mode | Additive | |
FX Amount (0-255) | 200 | |
Sprite Name | sprites/lgtning.vmt | The sprite to use for the lightning. (Don't forget to add ".vmt".) |
Scale | 2 | |
4. Open the properties of the other sprite. This sprite will be the background glow of the lightning, so that it will light up the sky. This tutorial example will set the values as follows:
Class: env_sprite | ||
Keyvalues | Comments | |
Name | lightning1glow | The name of the glow sprite. |
Render FX | Faster Strobe | |
Render Mode | Additive | |
FX Amount (0-255) | 25 | |
Sprite Name | sprites/light_glow02.vmt | The sprite to use for the lightning glow. (Don't forget to add ".vmt".) |
Scale | 7 | |
5. To add some thunder sounds it is recommended to use a soundscape (which is not covered by this tutorial), but a quicker way is to place an ambient_generic entity somewhere in the map in the direction of the lightning strike (Do not place it in the skybox.) and change its properties as follows:
Class: ambient_generic | ||
Keyvalues | Comments | |
Name | thunder1 | The name of the thunder. |
Sound Name | k_lab.teleport_post_thunder | You can find four more good thunder sounds if you search for thunder in the sound browser. |
Timing it
1. Place a logic_timer in the map, preferably somewhere near your sprites. Open its properties and make the following alterations:
Class: logic_timer | ||
Keyvalues | Comments | |
Name | lightning1timer | The name of the timer. |
Use Random Time | Yes | The lightning will strike at random intervals. |
Min Random Interval | 5 | Minimum time between strikes. Set it lower than this and the thunder will cut itself. |
Max Random Interval | 60 | Maximum time between strikes. |
2. Click on the Outputs tab and create the follow outputs:
My output | Target entity | Target input | Parameter | Delay | Only once | Comments | ||
OnTimer | lightning1glow | ShowSprite | 0.00 | No | ||||
OnTimer | lightning1 | ShowSprite | 0.00 | No | ||||
OnTimer | lightning1glow | HideSprite | 0.50 | No | ||||
OnTimer | lightning1 | HideSprite | 0.50 | No | ||||
OnTimer | thunder1 | PlaySound | <delay> | No | <delay> is a value reflecting how far away the lightning struck. | |||
3. Save it and test the map.
4. So far only one lightning bolt has been created. To create more of them, simply place a number of copies of this created set around in the skybox, and name them in sequential order (lightning2, lightning3, lightning4, and so on).
Randomized lightning
To prevent the lightning from unrealistically striking at the same spot over and over again, you can also make the sprites rotate around the skybox. (The lightning will fortunately strike so fast that its movement while visible will barely be noticeable.)
1. Create a small brush textured with the invisible tool texture, turn it into a func_rotating entity, and change its properties as follows:
Class: func_rotating | ||
Keyvalues | Comments | |
Name | lightningrotator | The name of the rotator. |
max rotating speed | 3 | |
Also set the following flag:
Flag | ||||
Start ON | ||||
2. Go back to your two sprites and set their Parent field:
Class: env_sprite | ||
Keyvalues | Comments | |
Parent | lightningrotator | The name of the rotator. |
3. You could make another rotator within the actual map, to match the direction of the thunder with the lightning flashes, but using a single stationary ambient_generic for all the bolts won't make that much of a difference.
Just open the ambient_generic entity and set the following flag:
Flag | ||||
Play everywhere | ||||
4. Save and test the map.