Trigger Events Between Levels

From Valve Developer Community
Jump to navigation Jump to search

Introduction

Note.pngNote:This article is for singleplayer, as multiplayer games do not handle trigger_changelevel. For round based multiplayer games, you may change the nature of the next round using the same entity. See External links at the bottom for more information.

As levels become more complex, you may be unable to create a sequence where, for example, a button toggles a light due to engine limits. However, this doesn't mean it isn't possible to have an activator trigger an event in another map.

Note.pngNote:This article assumes you know how to set up level changes.

Single Use Env_Global

This first section highlights how to create an env_global that can be fired once only after being activated by an activator, which will be a button in this article.

Note.pngNote:An env_global holds information that can be transferred to the next map transition or even after 15 map transitions. It doesn't matter. This is how the Half-Life 2 mod Underhell handles the number of cards you have picked up (it makes use of the env_global's counter feature as well, however, its code has been modified to include new I/O information.

The Maps Setup

First Map Entity Setup.
Second Map Entity Setup.
Env_global settings. They are identical in both maps.

First Map - Entity Setup

In the first map, you need:

  • An activator (in this example - a button named button with a delay before reset set to -1 and Don't Move set in Flags)
  • An env_global named light_global- with a Global State To Read set to turn_on_light
Note.pngNote:You do not have to choose from the drop down list. The Global State To Read can be anything, i.e. you can type anything in it. It is best to keep it simple and organized.
  • (Optional) A game_text named text_button_on to check the env_global's state
Note.pngNote:Use the console command developer 4 if you want to print out entity information (such as outputs being called, etc.) and other meaningful information. The game_text entity is simply used to print text seperately from the developer console command so that if your map has complex I/O sequences spamming (such as logic_timer and logic_case entities), the game_text makes it easier.


Second Map - Entity Setup

In the second map, you need:

  • A logic_auto - with a Global State To Read set to turn_on_light (it must be the same as the env_global's)
  • The entity you want to fire (in this example - a light named red)

The Input/Output Setup

First Map - Outputs

Open the activator (the button here) that will fire the env_global.

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnPressed light_global TurnOn <none> 0.00 Yes
Io11.png OnPressed !self Lock <none> 0.01 Yes

If you are using a game_text, fire it as well as you enable the env_global. Remember that the game_text is only used for debugging purposes. Remove it before shipping your level.

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnPressed text_button_on Display <none> 0.00 Yes

Second Map - Outputs

Open the logic_auto that will fire the entity or sequence (the light here).

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnMapSpawn red TurnOn <none> 0.00 Yes
Icon-Bug.pngBug:Avoid using OnMapTransition with the logic_auto as crashing during a transition will cause problems when reloading a save.  [todo tested in?]

And that's it. If the button isn't pressed, the light will be off in the next level. As soon as it is pressed, the light will be turned on.

Multiple Use Env_Global

Let's say we want the light to be toggled on and off when pressing the button. It requires a little more setup, but the process is fairly easy.

First Map - Entity Setup

First Map Entity Setup.
Second Map Entity Setup.

In the first map, you need:

  • An activator (in this example - a button named button with a delay before reset set to -1 and Toggle and Don't Move set in Flags)
  • 2 env_global entities:
    • The first one named light_global- with a Global State To Read set to turn_on_light
    • The second one named light_global_off- with a Global State To Read set to turn_off_light
  • (Optional) 2 game_text entities to check the env_global entities state
    • The first one named text_button_on
    • The second one named text_button_off

Second Map - Entity Setup

  • 2 logic_auto entities:
    • The first one with a Global State To Read set to turn_on_light (it must be the same as the first env_global in the first map)
    • The second one with a Global State To Read set to turn_off_light (it must be the same as the second env_global in the first map)
  • The entity you want to fire (in this example - a light named red)

First Map - Outputs

Open the activator (the button here) that will fire the env_global entities.

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnPressed light_global TurnOn <none> 0.00 No
Io11.png OnPressed light_global_off TurnOff <none> 0.00 No
Io11.png OnPressed text_button_on Display <none> 0.00 No
Io11.png OnPressed !self Lock <none> 0.01 No
Io11.png OnUseLocked light_global_off TurnOn <none> 0.00 No
Io11.png OnUseLocked light_global_on TurnOff <none> 0.00 No
Io11.png OnUseLocked text_button_off Display <none> 0.00 No
Io11.png OnUseLocked !self Unlock <none> 0.01 No

Second Map - Outputs

Open the logic_auto with Global State To Read set to turn_on_light (logic_auto that will turn on the light)

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnMapSpawn red TurnOn <none> 0.00 No

Open the logic_auto with Global State To Read set to turn_off_light (logic_auto that will turn off the light)

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnMapSpawn red TurnOff <none> 0.00 No

And that's all there is to it.

External links

Multiplayer - Change The Nature Of Next Round

See also