[mapping] Rotating Beams
Thanks to npocTo_LaM for this method ;) An example of these beams in use can be seen on the map 35hp_party_2 To create rotating beams we will need Env_beam (16 pcs.) Func_train (16 pcs.) Info_target (1 pc.) Path_corner (16 pcs.) Multi_manager (2 pcs.) Trigger_auto (1 pc.) How it works The beams…


Thanks to npocTo_LaM for this method ;)
An example of these beams in use can be seen on the map 35hp_party_2
To create rotating beams we will need
- Env_beam (16 pcs.)
- Func_train (16 pcs.)
- Info_target (1 pc.)
- Path_corner (16 pcs.)
- Multi_manager (2 pcs.)
- Trigger_auto (1 pc.)
How it works
The beams are made with env_beam entities. The starting point of the beams will be an info_target entity, and the end points will be func_trains. The train moves along paths made of path_corners. But for the train, and therefore the beams, to move, the func_trains have to be activated. For that we will use a multi_manager that lists the names of the target trains. And to make our mechanism run on its own, we'll create a trigger_auto targeting the multi_manager. It's all very simple.
Abbreviations in Name/Target etc.:
l_start | Laser Start |
lp_01 | Laser Path_number |
lt_01 | Laser Train_number |
l_start_mm | Laser Start MultiManager |
Building the mechanism
1) First, we create the info_target entity. It will serve as the point the beams come out of (the start).
Parameters:
Info_target | Value |
Name | l_start |
2) We've created the start point. The next step is to create the paths for the beams. In our case the beams have to rotate in a circle. To place our paths more accurately, we create a cylinder. We only need the cylinder itself right now, and at the very end we'll definitely delete it. We'll place path_corner entities on the vertices of the cylinder.

Fig. 1 — creating the cylinder.
There are 16 vertices in total, so I want to use all of them.
We create the first path_corner with these parameters:
Parameters:
Path_corner | Value | // |
Name | lp_01 | Entity name |
Next Stop target | lp_02 | Name of the next path_corner |
Accordingly, the next path_corner will have these parameters:
Path_corner | Value |
Name | lp_02 |
Next Stop target | lp_03 |
In the end there are 16 path_corner objects. The last path_corner has these parameters:
Path_corner | Value |
Name | lp_16 |
Next Stop target | lp_01 |
So we get a perpetual motion machine.

Fig. 2 — Placing path_corners on the vertices of the cylinder.
3) Let's send our train along the paths we've already created. It serves as a target; we'll use it to specify the end of the beam.
First we create a brush sized 16x16x16 units and cover it with the texture null. In the center of our brush we create another one sized 8x8x8 and apply the texture origin. We select the two brushes, turn them (Ctrl+T) into a func_train entity with these parameters:
Parameters:
Func_train | Value | // |
Name | lt_01 | Target name |
Render Mode | Normal | Display mode |
FX Ammount | 0 | Transparency. Fully transparent |
First stop target | lp_01 | Name of the corresponding Path_corner. |
Speed | 256 | Speed. Units/s. |
Sound volume | 0.00001 |
Flags:
Flags | |
Not Solid | Makes the train non-solid |

Fig. 3 — The first func_train target. The last object shows what the target train looks like in cross-section.
We do the same thing as with the paths (path_corner):

Fig. 4 — Placing func_trains opposite the path_corners.

Fig. 4.1 — Intermediate picture. Pay attention to the names of the func_trains.
4) Almost everything is ready to finish our mechanism, but where are the beams themselves? We've finally got to creating them. We'll use env_beam.
We create the first env_beam with these parameters:
Parameters:
Env_beam | Value | // |
Start Entity | l_start | Target name (do not change) |
Ending Entity | lt_01 | The end of the beam. We point it at the corresponding target train. |
Brightness | 255 | Brightness (0-255). Bright. |
Beam Color | 0 170 0 | The color of the beams. RGB. The color of each beam is not restricted in any way. |
Life | 0 | Beam lifetime in s. 0 – infinite time. |
Width of beam (pixels*0.1) 0-255 | 20 | Beam width. Pixels*0.1. In our case it comes out to 2 pixels. |
Amount of noise | 0 | How much the beam is distorted (0 - 255). |
Damage | 0 | Damage per second |
Flags:
Flags | |
Start on | On at the start of the round (optional, since the beam has no name, so it's already on). |
Fade Start | Fading at the start of the beam. We won't use it. |
Fade End | Fading at the end of the beam. |
We place all 16 env_beam objects opposite each target they refer to. This is for convenience; they can be placed in any order.

Fig. 5 — Placing the beams opposite their targets.
5) The final stage. To make our beams move, all the func_trains have to be activated. We'll use a multi_manager and a trigger_auto.
We create a trigger_auto with these parameters:
Parameters:
Trigger_auto | Value | // |
Start Entity | l_start_mm | Name of the multi_manager |
Trigger State | on | Trigger state |
Flags:
Flags | |
Remove on fire | Untick the checkbox. Destroy the t_a object for all rounds. |
Next step: we create 2 multi_managers with these parameters:
Parameters of the 1st mm:
To add new parameters, turn off the SmartEdit button
Multi_manager | Value | // |
targetname | l_start_mm | Name of the multi_manager |
lt_01 | 0 | Activates the object after a delay. |
lt_02 | 0 | |
lt_03 | 0 | |
lt_04 | 0 | |
lt_05 | 0 | |
lt_06 | 0 | |
lt_07 | 0 | |
lt_08 | 0 |
Parameters of the 2nd mm:
To add new parameters, turn off the SmartEdit button
Multi_manager | Value | // |
targetname | l_start_mm | Name of the multi_manager |
lt_09 | 0 | |
lt_10 | 0 | |
lt_11 | 0 | |
lt_12 | 0 | |
lt_13 | 0 | |
lt_14 | 0 | |
lt_15 | 0 | |
lt_16 | 0 |

Fig. 6 — This is the picture we end up with:
Author: Skrip
Example map, source + tutorial in doc:
https://www.dropbox.com/s/1f1g507dvszf8w6/CSM.rar?dl=0