Tutorial: Keys Last edited 1 year ago2022-09-01 11:39:29 UTC

Download attachment

Have you ever wondered why Half-Life doesn't have a key system, where keys have to picked up in order to open this or that door? As far as I can remember, most of our favourite first person shooters (from Id's magnum opus DOOM and Wolfenstein 3d to Quake and not forgetting Duke Nukem, Blood, Heretic, Hexen...) all had some kind of key action like this:
We've come a looooong wayWe've come a looooong way
Go through a mess of monsters in order to get the blue key which will grant you access to the red key that can be used to open the red door so you can get the yellow key that opens the door before the EXIT button.

Looks a lot like Doom, doesn't it? Well, I know that this kind of mapping is boring compared to the quick action and breath-taking design of Half-Life maps but still, whatever happened to keys?

As far as I can remember, there are no keys in the original game. What if we want to add some key action? Well, we can take a look at the Tutorial: Security Cards that shows us how to use a keycard to open a door. This is cool but, what if we want to use more than one keycard, just like in DOOM? We could use the same keycard over and over although it would always look the same and could be a bit confusing.

But this would only work with a keycard-compatible theme. Maybe you are mapping an old castle or an ultra modern complex where those keycards would be a little bit out of place and an actual key would be more accurate. I wonder how Xen doors are closed: what do Xen keys look like? I am pretty sure they don't look like they need a keycard!

And this is where we want to get. In this tutorial we will learn how to do the following stuff: If you are new to this, you could learn loads of interesting stuff so keep on reading.

Somewhere to work

You need to create an environment for the key to work. In the example are two rooms separated by a door. In the first room is a desk, chair and the key. In the second room, you'll find, Barney, an armchair and a shotgun.
Top ViewTop View
The door connecting both rooms is a func_door_rotating: great for key-locked doors.

Step One - Creating Our Key

First of all, we need a key we can use to open the door. There are two ways of making it:
  1. Using a Key model like the one I provide with in this tutorial.
  2. Using a Brush-Made key.
1. - The Key Model

We will have to model the key ourselves. If you don't know how and don't want to learn either, drop a message in the General Mapping Forum, maybe someone will help you with the task.
Key modelKey model
This kind of key has a few advantages: it will look better than the brush key, and you have more flexibility in designing how it looks and changing the shape and skin (texture).

Model your key and export it into Half-Life model format so you can use it, or use mine from the example download.

Once this is done, we need to put our model key where the game engine will find it. Half-Life will normally look for models in the models folder: no surprises there. If you are making keys for your new Mod, just add a models folder with a Key folder in it. For this tutorial, I have added the folder Mykey to the models folder and placed mykey.mdl inside that.

IMPORTANT NOTE: Before you run the example map, create the Mykey folder and copy the mykey.mdl to Half-Life\Valve\Models\Mykey.

Now open your .rmf in Worldcraft/Hammer and decide where you want to place your key. We are going to use the monster_furniture entity to bring our key to the world. However, you can use a monster_generic or a cycler_weapon. Placement of the monster_furniture isn't all that critical. If you place the entity a few units above the desk, so that none of it is stuck in the desk, then the key will float down to the first solid brush when the game runs. If you don't place it correctly, and it is spawned in a brush, you will get an error and yellow dots buzzing around the desk. All you need to do is adjust the entity's position to fix this.

Enter the following values for our Monster_furniture:

Name: myfirstkey
Model: Models\Mykey\mykey.mdl

You don't have to check any Flags
Use the Angle feature to choose the angle you want your key to face. Easy, ain't it?

For those of you using Hammer 3.5, it is even simpler. You will be presented with an actual shot of the model so placement is really easy.

Now you can run your map and see your key just where you placed it, but your key does nothing. It can't be picked up. We will look at this in Step Two.

Now let's look at how a brush model is made.

2. - The Key Brush

Create your key or keycard with brushes and texture it to suit your door. It may look like this:
Brush KeyBrush Key
Not precisely state-of-art, but hey, we've got to start somewhere!

Select all the brushes of the key and group it (Ctrl+G) and then tie it to a func_wall_toggle.

Assign only this property to your key:
Name : keypick

You can run your map now and marvel at the brilliance of your newly formed key.

Step Two - Getting Our Key To Work

The first thing we need to know is that there are two little differences in getting our key to work depending on if it is Brush-Based or Model-Based. These differences will be treated separately.

We want our key to do the following: First, let's make it so our key can be picked up. Create a brush that covers our key, but also extends to the area we want to to be able to pick it up from. Texture this brush with AAATRIGGER and assign it to a trigger_once. With this entity, you can make things happen ONCE when you touch or walk through them.
Trigger positionTrigger position
Set the values of our trigger_once as following:
The Target field indicates what happens when we walk through or touch our entity. In this case, it happens our pickupkeymm. What does it mean? Well, we are going to create a multi_manager with that name. A multi_manager is an entity that can trigger multiple entities when triggered. Intrigued? Have look at the Tutorial: Multi_manager for more information.

Place a Multi Manager in your map and open its properties dialog box and Name it pickupkeymm, then click the SmartEdit button. You will need to add all these keys and values:
MM ValuesMM Values
keypick - 0.0001 This one will make our key dissapear.
keysound - 0.0001 This one will trigger a sound when it dissapears.
keytext - 0.0001 This one will show a text to tell us it has dissapeared.
keyoperation - 0,0001 This one will allow the door to be opened.

Making the key disappear

We can make it disappear in two ways.

Model Key: Our model key is not pickupable. In fact, it is not coded to be, so all we can do with it is HIDE it from the player's view. Create an outside hollowed area outside your map or find a place where the key can fit and can't be seen by the player. Place a scripted_sequence in the box as it will makes our key move there when we want it to, more info in Scripts.

Name your Scripted Sequence keypick and add these values:

TargetMonster : myfirstkey
Move to Position : Instantaneous

Leave other fields as they are, as well as flags. In our example map, the hiding place is built outside the main map.

Now you can run your map and see that when you walk over your key it dissapears! Well, it does not dissapear, but it's taken to the place that the player cannot see. In fact, if you go there, you'll see your key, but hey, our player doesn't have to know this so let's keep it a secret.

[This method is useful for removing monsters and other model type objects]

Brush Key: If your key is a brush, it is solid, and therefore a part of the world. We want it to dissapear when we walk over it. When you named your Key keypick and assigned it to a func_wall_toggle entity that it is activated by a Multi Manager, you solved the problem. Run your map and check it out, just walk over the key and it's gone. Why? Simple, func_wall_toggle makes itself disappear when triggered, so our key is not there when we walk over it and activate our trigger_once!

Making the key provide a sound

We want sound played when we picked up the key, don't we?

To do this we need: If your are going to use a custom sound take it sound to the Half-Life\Valve\Sounds folder or to your Sounds folder if you are mapping for a mod. It won't work if you don't place them in the proper folder. In our example map, we are going to use one of the Half Life sounds, "bell.wav". This .wav file is found in the ambientfvox folder. To find all the available Half-Life sounds, you will need to unpack the 0pak file with something like Wally.

In order to play the sound in the game, we need add an ambient_generic near the key. Name it keysound so it is triggered by our Multi Manager when the key disappears.

You need to add the path to the sound .wav like this:
Ambient GenericAmbient Generic
Note that the root directory for the sound isn't needed, but the folder the .wav file is in does need to be added.

Flags that need to be checked are:

Small Radius
Starts Silent
Not Toggled

You can run your map and pick up the key. You will see it makes a nice sound as it disappears!

Making text appear when the key is picked up

Create a game_text near the key and name it keytext (it will be triggered by the multi_manager).

The rest of the properties are reasonably flexible. All you need to do is add the text. If you want to change the properties, then have a look at the Entity guide to find out what each setting does. Now our key tells us that we have picked it up when we play our map. Half of our work is done. Now we got to make our key work!

Making it open the door

To make sure the door is locked and can only be opened with the key we need to add a multisource entity and name it keyoperation. You can find more information in the Tutorial: Multisource. Don't worry about the door now, ok? If you run the map, the door will open anyway and you will yell "I've been fooled!" so please, be patient. Still, we haven't worked on the door, but I want you to check out and to understand what you have done: All right, let's get back to work. Our key is not complete without a door and we need to adjust our multisource (you know, the lock).

Step Three - Creating and Locking the Door

I suppose you know how to do a door. If you don't, take a look at the Tutorial: Doors tutorial.

Anyway, create your door and adjust the door's properties. No need to give your door a name, just set the door locked sounds as you want, as well as the stop and moving sounds. But the important setting is changing the Master field to keyoperation.

But we don't want to end up here. What if (I am sure you HATE this!) the player does not find the key and skips the door forever? It would be disastrous! We need something to tell the player that this is a special door and that it MUST be opened for our mapping skills to be taken into consideration (and in most cases, for our map to be played). We are going to set text again, but this time it will be a little different. We will: 1 - The Closed text

Create a trigger brush very close to the door, texture it as AAATRIGGER and then set it as a trigger_multiple entity. You may want to modify the size of the brush so the message triggers at different distances of the door. This entity works so it will trigger something each time we walk through it. In our case, we want to trigger the text whenever the player tries to open the closed door without the key.

Fill the fields as following:

Target : closedtxt
Name : doorclosedtxt

Next create a game_text entity near the door and name it closedtxt and enter the message "This door will be closed until you find a key".

Run your map: each time we are near the door it tells us that it's closed, but it also tells us that when we have opened it! We're gonna fix this!

2 - The Opened text

Create a trigger brush covering the previous one but slightly larger. (If you are unsure of the position, just have a look at the .rmf included in the download.) Texture it as AAATRIGGER. This brush will inform us that we've got the key and we have opened the door with it, so assign it to a trigger_once entity. With this trigger, we are going to make the closed text trigger invalid.

You will need to add these properties to the trigger_once:

Target : openedtxt
Kill target : doorclosedtxt
Master : keyoperation
You don't need to Name the trigger!

Add a game_text with the name openedtxt. And the message "This door has been opened with the Key", or something like that.

What have we done? Simple: once we walk into it, it will activate "openedtxt" displaying the message and making the other Closed trigger and text inactive. By adding the Master to the Opened trigger, it will only be active when the multisource is.

Run your map and play around: now we're done! Realise what you've done? If you don't have the key, text will appear telling you to look for the key. Once you've got it, it activates the lock so when you walk near the door, you activate the trigger_once (hence the size, a bit larger than the other one so it's triggered first once you activated the Multisource lock) that shows text about your newly acquired key and also prevents the other text from showing by just making its trigger invalid. A work of pure genius is what you've done.

Step Four (Optional) - Little Bits of Detail Here and There

There are more things to do, but I'm not explaining them there, only giving the ideas for you (and your brain) to work. You can do lots of great effects such as: Effects such as lights and glows would get the player's attention, but will remain there once the key is picked up. This can be easily solved if treated as part of the routine we've learned (i.e. Multi_managers). Also, with a bit of imagination and skill, you can create keys for carved doors (the ones with glass panels).

Well, that's about it. If you've got any doubts, just drop them in the General Mapping Questions Forum for the community to answer and to share everything you come up with.

PS: I wish to thank the TWHL community for their help and support in my map initiation two months ago. Guys, you're real cool! These words are dedicated to my girlfriend, who doesn't like mapping, but loves me anyway. Tutorial done while listening to Dimmu Borgir and Michael Jackson.


You must log in to post a comment. You can login or register a new account.