Teamspeak 3 Overlay

Documentation

Installation instructions

The easy way

Download the setup from the main page and execute it. The setup will automatically detect the location of your Teamspeak 3 installation and install the plugin there.

The hard way

You also can install the plugin "manually" by downloading the "files only" archive from the homepage. The first thing is to execute the dxwebsetup.exe, which will download and install some DirectX helper files (Microsoft DirectX End User Runtime) from Microsoft. You also can find this file on the Microsoft homepage.

Next, find your Teamspeak 3 plugins directory. In most cases, you can find it under C:\Program Files\Teamspeak 3 Client\plugins

Copy the content of the plugins folder from the archive (dx_overlay_plugin.dll, dx_overlayplugin_x64.dll as well as the ts3overlay subdirectory) to the Teamspeak 3 plugin directory. If you installed the 32bit installation of Teamspeak 3, you can omit the dx_overlay_plugin_x64.dll, if you installed the 64bit installation of Teamspeak 3, you can omit the dx_overlay_plugin.dll.

That's it

Enabling the plugin

Start your Teamspeak client and open the plugin menu. Find the overlay in the list and enable it by selecting the checkbox before its name.

What now?

If you installed the plugin correctly, You can now simply start your game. The overlay should be shown immediately.

How do I use the overlay?

Repositioning

If you start up your game, you should be able to see the overlay right ahead. If you're also connected to a server, you will see the current channel name in the titlebar. The people in your current channel will also be displayed, most probably in a dark yellow colour. If someone starts talking, its color will change to a brighter yellow. Muted clients will be shown in green, whispering clients in red.

If you want to reposition the overlay, press the scroll-lock button. A small popup will appear and you're able to drag the window around. Dragging the corners of the window will resize it.

This surely only works, if you have a mouse cursor, so in some games, you need to open an in-game options menu. In some games, the cursor position that you can see does not match the position of the hardware cursor. In this cases, you can enable a cursor replacement by pressing 'Scroll-Lock'.

If you still cannot drag the window around, check the section 'mouse.hook_all_threads' in the configuration chapter below.

Switching between the different modes

The overlay comes in three different flavors, which I call 'minimal', 'normal' and 'full'.

In normal mode, you'll see the people in your current channel, no matter if they're talking or not. You can distinguish between talking and not-talking people by the colours.

The minimal mode is just the same as normal mode, but you won't see any people that aren't talking.

The full mode is a tree view that shows all channels on the server. You can use this mode to switch between channels or to move other players to/from other channels.

You can switch between the normal and the minimal mode by clicking the 'X'-button in the top right corner of the overlay.

To reach the full mode, look for a (pretty small, 16x16) Teamspeak icon, which initially can be found in the bottom left corner of the screen. The icon is transparent, so it might be a little bit hard to see. However, it will highlight, if you move the mouse cursor above it. Right clicking it will open up a context menu, where you can switch to full mode.

Disabling titlebar and resizing

Disabling the titlebar and the resize functionality is done via the context menu (Display - Show Titlebar / Hide Titlebar)

Channel-switching

Enter the full mode and double-click on your wanted channel. If you're allowed to move users to other channels, you can simply drag the users to the target channel.

Configuring colours

The configuration screen can be reached via the context menu. You can select the transparency of the main window, as well as the colours for the different talking states (e.g. talking, not talking, whispering, mute).

Storing the settings

You can store the settings (per game) by opening the configuration screen and press 'Save'. This will save the current position of the overlay and the icon, the display mode, as well as the colours.

Where is the configuration stored?

The configuration is stored in two different files. The first one is called 'config_default.ini' and can be found in the plugins\ts3overlay subdirectory of your Teamspeak 3 installation. This file contains the basic configuration that should be valid for all games and must not be changed, as it will be overwritten with each new version of the plugin.

The second file is called 'config_user.ini'. This is where you want to tweak your personal settings. You can find this file in your application data directory: Open your explorer and type "%appdata%\ts3overlay" in the titlebar, and it will lead you there. In versions before 2.0.16, this file could be found in the plugins\ts3overlay subdirectory of your Teamspeak 3 installation, however an upgrade to 2.0.17 copied the user-configuration file already to the 'final' position.

What do the configuration entries mean?

Ok, so you want to fiddle around with the settings in the 'raw' way? No problem, here we go.

Please don't fiddle around in the config_default.ini, use the config_user.ini instead.

If the configuration is loaded, the values are loaded in the following order:

  • config_user.ini, sectionname like the executable
  • config_default.ini, sectionname like the executable
  • config_user.ini, section [default]
  • config_default.ini, section [default]
  • As you can see, the config_user.ini will override all other settings, so this is the place to go.

    Also, it might be a good idea to change your settings only in the applicatino specific section, so it doesn't affect all other program.

    dll.disable_loading

    This value can be overridden for a "blacklist"

    The overlay is injected into every single process. It then starts to check regularily (every couple of seconds, if it should display an overlay or not (if OpenGL / DirectX is used or not). Some programs don't like such a behavior and simply crash, other programs may display the overlay correctly, but you may dislike it (e.g. video players, flash animations in your browser, etc).

    If you need to change this value because of a program crash, please leave me a note in the forum, so I can add the program / game to the default blacklist.

    dll.force_loading

    Since version 2.0.17, there is an auto-detection, whether a game / program crashes after the overlay is injected. If the program crashed the first time you used the overlay, it won't be loaded again - until you set this entry to 'true'.

    dll.retry_injection_after_seconds

    If the overlay disappears after a while (for whatever reason) you may configure a timer here, when the overlay tries to re-initialize the overlay.

    logs.directory

    This entry defines, where the log files are stored. Normally you can find the logs in your Application Data folder. Open the explorer and type "%appdata%\ts3overlay\logs" and it will lead you there.

    If you want to store your logs in a different directory (for whatever reason), you can change the folder here.

    d3d8.enable, d3d9.enable, ... (enhanced)

    You can disable whole injection paths for not required painting engines. Normally, the overlay auto-detects the engine, but this may be necessary, if a game e.g. uses d3d9 for paining the intro and afterwards switches to d3d11.

    d3d9.use_present_hook (enhanced)

    It's hard to explain this functionality to people, that don't develop software, so I'll make it short: If you're game starts up, the log file looks brilliant (e.g. you see the line 'successfully rendered first frame'), but you don't see the overlay, you may try to enable this setting. Please leave me a note in the forum if you modified this value and the overlay was displayed afterwards.

    For the more experience users (some internals here):

    The overlay tries to hook the IDirect3D9::EndScene() as well as the IDirect3D9::Present() methods.

    If a call to IDirect3D9::EndScene() is found, the IDirect3D9::Present() method will be unhooked immediately and the drawing will happen from the EndScene()-method. If the game doesn't call EndScene, the drawing will be done in Present.

    Some games however seem to call both functions, but the display may be modified after the call to EndScene, so no overlay may be shown. This parameter enforces, that the drawing will happen in the Present() method. The EndScene won't be hooked in this case.

    d3d9.use_release_hook (2.x.x only)

    In older versions, the IDirect3D9::Release() method was hooked to allow correct uninitialization of the overlay. However, as this lead to crashes on some XP systems, I decided to disable this behavior by default and to allow some potential memory leaks.

    Some textures aren't destroyed and the IDirect3D9Device isn't correctly shut down if the game ends. However, as the OS takes care of this, this won't produce any leaks in most cases. It may only be a problem, if an application shuts down the complete Direct3D engine and restarts it again, this will a) leak and b) could lead to crashes. However, this is pretty unlikely.

    In the 3.x.x versions, the Release method is hooked correctly, so this parameter is ignored.

    overlay.*

    Most of these values can be configured from the game itself, but they are pretty self-explanatory, if you still need to configure it manually.

    hook.follow_steam_trampoline (enhanced)

    If you run your game via the steam client, the Teamspeak 3 overlay may interfere with the steam overlay. Enable this setting to defer the initialization of the overlay until the steam overlay is completely initialized. This setting won't try to hook the Direct3D methods, but instead will try to hook the matching methods from the steam overlay.

    hook.method (2.x.x only)

    In 2.x.x there are two different approaches to hooking. The first one (value = 0) uses the excellent engine from N-CodeHook (http://newgre.net/ncodehook), while the second one (value = 1) uses a more trivial approach - the trivial approach however doesn't succeed, if it finds near-jump instructions in the first few bytes of the method to hook. The trivial approach is still there, as this is my code and I know that it works :-P I'm currently thinking of a third kind of hooking, similar to the approach of the mumble overlay, but this is yet to come.

    In 3.x.x this feature is disabled

    mouse.hook_all_threads

    If you see the overlay, but cannot move it, you may try to enable this setting.

    keyboard.hook_all_threads

    This is pretty much the same as the mouse.hook_all_threads parameter, but for keyboard input. If you cannot type in the configuration window, you may want to enable this setting, too.

    keyboard.activation_key (since 3.0.4)

    Configure this value, if the scroll-lock button doesn't work for you for any reason (e.g. newer Dell laptops doesn't have a scroll-lock key).

    Check this page for a complete list of supported keycodes

    statistics.*

    Those values were introduced with version 2.0.17. They are used for automatically detecting, if it's necessary (or dangerous) to load the overlay into a process.

    The 'tried_in_version' parameter is immediately set if a game is loaded, 'doesnt_crash_in_version' is set, if the game is unloaded correctly (e.g. didn't crash). 'no_painting_required_in_version' is set on unloading, if not a single frame was painted.