Creating a HUD Theme¶
Basics¶
A HUD theme is just a normal addon for TTT2 and therefore is in no way different than other addons. Check out the getting started guide to learn more about creation of addons.
If you want to create a HUD element with the TTT2 system for one of your addons, check out this article.
Basic Setup¶
In order to create a new HUD, you have to create a specific folder structure in your project.
<YOUR_ADDON>/
├── lua/
│ └── terrortown/
│ ├── autorun/
│ │ ├── your other lua files ...
│ │ └── ttt2_<YOUR_HUD_NAME>_force_download.lua
│ └── gamemode/
│ └── shared/
│ ├── hud_elements/
│ │ ├── base_elements/
│ │ │ └── <YOUR_HUD_NAME>_element.lua
│ │ ├── tttinfopanel/
│ │ │ └── <YOUR_HUD_NAME>_playerinfo.lua
│ │ └── bunch of others...
│ └── huds/
│ └── <YOUR_HUD_NAME>/
│ └── cl_init.lua
├── materials/
│ └── vgui/
│ └── ttt/
│ └── huds/
│ └── <YOUR_HUD_NAME>/
│ └── preview.png
└── resource/
└── fonts/
The force_download
file in the autorun
folder is not mendatory but recommended. You have to add the textures of your HUD, like the preview image found found in the materials
folder, to a downloadlist at some place.
The file in hud_elements/base_elements
is your base used by all of your following HUD elemenets. It is recommended to inherit from dynamic_hud_element
to have all of the nice TTT2 features such as rescaling and repositioning. All your HUD elements will be placed in the same folder.
In order for your HUD to load at all, you have to create a cl_init.lua
file in the right directory. It is the starting point of your custom HUD.
Initialize your new HUD¶
To make a new HUD, you have to start with a initialization file. It is called cl_init.lua
for our HUD system and it should be located in a folder with the name of your HUD inside the hud
folder, shown in Basic Setup
.
Besides defining the base class with
local base = "scalable_hud"
DEFINE_BASECLASS(base)
HUD.Base = base
a function for the initialization has to be defined in the next step. It loos like this:
function HUD:Initialize()
-- something
end
Inside of this element all HUD elements belonging to you custom scheme have to be forced. Keep in mind that you are not forced to implement all HUD elements found in TTT2. You can implement whichever you want, even adding new ones. But it is recommended to implement and force at least the main elements such as tttinfopanel
and tttwswitch
since they are always displayed. Some elements needed in the game, such as tttdrowning
, tttmstack
, tttsidebar
etc will use a fallback when not implemented by you.
Additionaly elements like tttminiscoreboard
found in pure_skin
will not use a fallback when not implemented by you. If you want to use this feature without adding you own style to it, force the pure_skin
ones. An example would look like this:
function HUD:Initialize()
self:ForceElement("octagonal_playerinfo")
self:ForceElement("octagonal_wswitch")
self:ForceElement("octagonal_drowning")
self:ForceElement("octagonal_mstack")
self:ForceElement("octagonal_sidebar")
self:ForceElement("octagonal_punchometer")
self:ForceElement("octagonal_target")
-- use pure skin fallback for roundinfo elements
self:ForceElement("pure_skin_roundinfo")
self:ForceElement("pure_skin_teamindicator")
self:ForceElement("pure_skin_miniscoreboard")
BaseClass.Initialize(self)
end
Fonts, default color and the path of the preview image are defined in this file as well.
You can check out an example here.
Creating the Base Element¶
The base element of your hud should inherit from the TTT2 base hud element so you do not have to reimplement all the features such as rescaling, recoloring and repositioning. It is done like this:
local base = "dynamic_hud_element"
One important note is that the first part of this file name has to be the name of your hud!
Additionally this base class should be used for functions and variables that you use over and over again in your project. Since all following elements inherit from it, they are able to use this.
Check out the octagonal_element.lua
from the octagonal HUD here. Feel free to copy the things needed for your HUD.
Creating HUD Elements¶
All further elements should be based on your HUD element. //TODO
Special Cases¶
//TODO about elements such as voice