SCP: Secret Laboratory LabAPI plugin that shows when the next respawn wave will happen.
- Fully customizable timer — displays round time, server TPS, spectator count, active generators and more
- Custom hints — add advertisements or gameplay tips that cycle through the interface
- Toggle per player — players can show or hide the timer via Server-Specific Settings
- Multiple variants — compatible with HintServiceMeow, RueI and the base game hint system
- Public API — full C# API for other plugins to register custom placeholders
- Download the release that matches your setup from GitHub Releases:
RespawnTimer.dll— base game hint systemRespawnTimer-HSM.dll— HintServiceMeow (my fork of it you can get it, from here)RespawnTimer-RueI.dll— RueI
- Place the
.dllin your server's plugins folder.- Linux:
~/.config/SCP Secret Laboratory/LabAPI/plugins/global/ - Windows:
%appdata%/SCP Secret Laboratory/LabAPI/plugins/global/
- Linux:
- Start the server — the timer files are generated automatically.
Timer files are stored in:
- Linux:
~/.config/SCP Secret Laboratory/LabAPI/configs/RespawnTimer/ - Windows:
%appdata%/SCP Secret Laboratory/LabAPI/configs/RespawnTimer/
configs/
└── RespawnTimer/
├── TimerBeforeSpawn.txt
├── TimerDuringSpawn.txt
├── Properties.yml
└── Hints.txt
All of these are generated on first launch with their default contents. The plugin checks them on every start, so deleting a single file (to reset it, for example) is enough — only that file is regenerated, the rest are left untouched. No internet connection is needed.
Upgrading from an older version? The plugin will automatically migrate your files from the old
DefaultTimer/folder to the new location.
| Placeholder | Description |
|---|---|
{cminutes} / {cseconds} |
Chaos Insurgency spawn countdown |
{nminutes} / {nseconds} |
NTF spawn countdown |
{mcminutes} / {mcseconds} |
Mini CI spawn countdown |
{mnminutes} / {mnseconds} |
Mini NTF spawn countdown |
{mctoken} / {mntoken} |
Mini wave respawn tokens |
{sminutes} / {sseconds} |
Spawn countdown during wave (all factions) |
{round_hours} / {round_minutes} / {round_seconds} |
Current round time |
{spectators_num} |
Number of spectators |
{team} |
Currently spawning team name (only while a wave is spawning) |
{next_team} |
Name of the wave that can spawn next, colored via Properties.yml |
{warhead_status} |
Current warhead status |
{detonation_time} |
Warhead detonation countdown |
{generator_engaged} / {generator_count} |
Generator counts |
{tps} / {tickrate} |
Server TPS and tickrate |
{hint} |
Current cycling hint from Hints.txt |
{RANDOM_COLOR} |
Random hex color code |
Other plugins can register custom placeholders via TimerAPI:
// Register a custom placeholder
TimerAPI.RegisterProperty("my_placeholder", player => player.Nickname);
// Unregister it
TimerAPI.UnregisterProperty("my_placeholder");Once registered, {my_placeholder} can be used in TimerBeforeSpawn.txt and TimerDuringSpawn.txt. The value provider receives the spectated player as the argument.
| Method | Description |
|---|---|
RegisterProperty(string placeholder, Func<Player, string> valueProvider) |
Registers a new custom placeholder |
UnregisterProperty(string placeholder) |
Removes a previously registered placeholder |
Plugins that add their own TimeBasedWave can register it so the timer can display it:
// displayName is used for {team} and {next_team}, "x" enables {xminutes}/{xseconds}/{xtoken},
// and 14f is the length of the wave's spawn animation, used for the {s...} countdown.
TimerAPI.RegisterWave<MyWave>("<color=#FF96DE>My Wave</color>", "x", 14f);
// Unregister it
TimerAPI.UnregisterWave<MyWave>();Register RespawnTimer as a soft dependency where possible, so your plugin keeps working when it
is not installed. RespawnTimer ships as three separate assemblies (RespawnTimer, RespawnTimer-HSM
and RespawnTimer-RueI) that all expose the same RespawnTimer.API.TimerAPI type, so a hard
assembly reference binds your plugin to one specific variant. See
SerpentsHand for a reflection-based example.
| Method | Description |
|---|---|
RegisterWave<T>(string displayName, string placeholder = null, float spawnDuration = 18f) |
Registers a wave with a fixed display name |
RegisterWave<T>(Func<string> displayNameProvider, string placeholder = null, float spawnDuration = 18f) |
Registers a wave whose display name is resolved on each update |
RegisterWave(Type waveType, ...) |
Same as above, for when the wave type is not known at compile time |
UnregisterWave<T>() / UnregisterWave(Type waveType) |
Removes a previously registered wave |
- Original plugin by Michal78900
- Maintained by MedveMarci
