Introduction to GoldSrc Programming
Setting up Visual Studio
You can find the accompanying PDF here.
The Original Tutorial can be read here.
Install Visual Studio (2010, 2012, 2013 or 2015) (you are required to create a free account)
Note: The Half-Life SDK available on Github was built using Visual Studio 2010 so it will run out of the box with that version. Newer versions require that the Solutions be converted to work with these newer versions of the IDE. The IDE will tell you when it performs this conversion.
Download the Half-Life SDK from Valve’s Github repository, You can place and extract the downloaded ZIP anywhere you like.
Note: For those using Visual Studio 2015 changes to the C Library have caused many warnings in Valves Half-Life SDK. Community member Malortie has created a fork which compiles for Visual Studio 2015. I would suggest using it until Valve makes changes to support Visual Studio 2015 in the official repository.
Mine is located here:
Opening the Project and Configuring
Open the projects.sln
from the projects directory in the downloaded Half-life Master
Note: You may see the following if you are using a version of Visual Studio newer than 2010 Simply click OK
and let it work. This is the conversion process I noted earlier.
I also suggest you change the color scheme to Dark to make viewing and editing the code easier. This can be done from Tools > Options > Environment > General and setting Color Theme
To the right hand side of the IDE
note the Solution Explorer
which should have 6 projects included:
The one of interest to us is hldll as highlighted in bold ( Bold
highlighting indicates that it is the start-up project )
If it is not highlighted in bold simply right click on it an Select Set as StartUp Project.
We need to make some changes to hldll’s properties. To access these simply right click and select Properties
Firstly let’s change Configuration
in the top left corner to “All Configurations”. This means that changes we make to the properties page will propagate through all project configurations in this case both Debug
Then we should turn off the post Build process which can be disabled by setting Use In Build
in Configuration Properties > Build Events > Post-Build Event ( This command when it works correctly would have copied the complied DLL
to the Mod directory, simply put for the scope of this tutorial we do not need it )
Next we must Change under Configuration Properties -> General the Output Directory
to the directory inside your Half-Life
installation where hl.dll
resides. In my case it is here:
If we want to be able to debug our code within Visual Studio we need to tell Visual Studio where hl.exe
Under Debugging -> Command provide the path to hl.exe
. For me this is:
Add the following to Command Arguments:
Set the working directory to the root Half Life Directory, in my case:
We should Unload
the remaining Projects in the solution that we are currently not using. Right click on all unwanted projects (hl_cdll, dmcdll, etc..) and select Unload
from the menu. hldll should be the only remaining “loaded”
Build the Project
Now it is time to build the project for the first time,
Select Project Only > Build Only hldll ( saves time compared to building all projects )
If you unloaded all other projects you can simply click under Build
“Build Solution”, it will build the remaining loaded projects.
It should take a few minutes and you will probably get quite some warnings in the Output towards the bottom of the screen, This can be ignored (These errors occur due to changes to C++, Visual studio and the source code down through the years)
The SDK was developed originally in the mid-nineties and was not updated for new C++ standards when it was released on Github in 2013
Let’s disable these common warnings.
Right click on hldll and under Properties
navigate to Configurations Properties -> C/C++ -> Advanced, (Make sure to set “All Configurations” so that it affects both Debug & Release)
For “Disable Specific Warnings“ add the following:
Apply these settings and compile again. The warnings should no longer be present in the log.
You should see that the build has succeeded, You can now double check the generated hl.dll
file’s timestamp to ensure that it created a fresh Library in the right location.
For me it can be located here:
If all looks good we can now try and run the game from within Visual studio. Click on Local Windows Debugger to launch the game.
You will get the following error if Steam is not running:
Failed to Initialize authentication interface. Exiting...
Start up Steam, Half-Life should then run and you should be able to play through the original game without issue.
So let’s do something to the code:
Let’s add a message for when the player jumps.
To do this locate player.cpp
inside hldll > Source Files > dlls in Visual Studio Ctrl – F
to Find the word “Jump”
Locate the following:
m_IdealActivity = ACT_HOP;
Let’s append a line that outputs a custom message when the player jumps in-game
UTIL_ClientPrintAll(HUD_PRINTNOTIFY, UTIL_VarArgs("Hello Half-Life")); // Message
m_IdealActivity = ACT_HOP;
Save the changes and build hldll, Then enter the game and jump. You should see in the top left hand corner the message “Hello Half-Life
Post Build Notes
Printing to the Console Only:
If you want to print to the console and not the console & HUD as described above use the following commands
For printing to the server (hldll) console this is:
ALERT( at_console, "Hello Half-Life\n" );
The \n is important because it adds a line break so that the next call to this method doesn’t simply stick text to the end of your statement but rather creates its own newline.
The equivalent in the client (hl_cdll) is:
gEngfuncs.Con_Printf( "Hello Half-Life\n" );
Server Vs Client:
(aka hldll) contains all the code that is common between all players, These include AI, Monsters, Items, Weapons, gamerules, entities, etc.. The Client
(aka hl_cdll) contains all the code that is specific to each player, Things such as the HUD, events system, input processing, VGUI (MOTD, TFC team/class selection, command menu) as well as some items for rendering.
You can learn more about this kind of game architecture here
Build your binaries in release mode when you are making a final binary to distribute to friends or the community. To do this simply right click on the project, select Properties -> Configuration Manager (Top Right). In the window that appears select Release
from the Top-Left drop down box. This sets the active configuration to Release
as opposed to Debug
which is the default setting. Close the window and compile the project again.
This will create a Release
folder next to your Debug
folder in the solution (code) directory. If you set your settings to affect all configurations as described earlier the newly compiled dll
will have copied to the correct mod folder.
When compared to the Debug
binaries the Release
binaries are typically smaller in size and contain optimizations to improve performance at runtime.
I want to extend my thanks to Shepard62700FR
who provided some very helpful advice which I added to the tutorial.
I want to thank Malortie
for his Visual Studio 2015 compatible version of the Half-Life SDK which I am sure many of you will find useful.
And finally I want to thank you the reader who took the time to read this, I hope this short tutorial helps you in some small way. If you find any issues or if you know of anything this tutorial should include please feel free to send an e-mail
onto me concerning it.
The support thread for this tutorial can be found over at the forums