Template (remove json comments before usage):
{
"passthrough": "<remote match id here>",
"mapPool": [ // map pool can contain any number of maps, but must be big enough for the given election steps, see below for more information
"de_ancient", // use the name of the map file
"de_anubis/anubis", // or add a friendly name for players when picking/banning maps
"de_inferno",
"de_mirage",
"de_nuke",
"de_overpass",
"de_vertigo",
"3070923343/fy_pool_day" // workshop maps consists of numbers only (their workshop id), consider adding a friendly name for players when picking/banning maps
],
"teamA": {
"name": "Alpha",
"passthrough": "<remote team a id here>",
"advantage": 0
},
"teamB": {
"name": "Bravo",
"passthrough": "<remote team a id here>",
"advantage": 0
},
"electionSteps": [
// see below for templates
],
"gameServer": { // can be `null` instead of object if game servers are managed by TMT itself
"ip": "localhost",
"port": 27016,
"rconPassword": "blob"
},
"rconCommands": {
"init": [ // these rcon commands will be executed only once: when the match is created
"game_type 0; game_mode 1; sv_game_mode_flags 0; sv_skirmish_id 0", // normal competitive, see below for other examples
"say > RCON INIT LOADED <"
],
"knife": [ // these rcon commands will only be executed at the start of a knife round
"mp_give_player_c4 0; mp_startmoney 0; mp_ct_default_secondary \"\"; mp_t_default_secondary \"\"",
"say > SPECIAL KNIFE CONFIG LOADED <"
],
"match": [ // these rcon commands will be executed at the start of each match map (after knife or when both teams are ready)
"mp_give_player_c4 1; mp_startmoney 800; mp_ct_default_secondary \"weapon_hkp2000\"; mp_t_default_secondary \"weapon_glock\"",
"mp_overtime_enable 1",
"say > MATCH CONFIG LOADED <"
],
"end": [ // these rcon commands will be executed only once: after the end of the last map, or when the match has been stopped (by api)
"say > MATCH END RCON LOADED <"
]
},
"tmtLogAddress": "http://localhost:8080" // tmt's http address the game server must send the logs to
}
Notes:
- The
passthrough
fields can be set to any value to match the data of webhooks.
Depending on the action that should happen in a step a different json payload is need. The bare minimum to select a step mode is:
{
"map": {
"mode": "<map mode goes here>"
}
}
The different map modes are:
AGREE
- Both teams must agree on a map *BAN
- A team must ban a map *FIXED
- A specific map will be played. Map pool will be ignored.PICK
- A team must pick a map *RANDOM_BAN
- TMT bans a random map *RANDOM_PICK
- TMT picks a random map *
* from the remaining map pool
If the map.mode
leads to a map being selected to play on, a side
payload is required. The bare minimum is again a mode
:
{
"map": {
"mode": "<map mode goes here>"
},
"side": {
"mode": "<side mode goes here>"
}
}
The different side modes are:
FIXED
- The teams (TeamA
andTeamB
) will be statically assigned to CT and TKNIFE
- The winner of a knife round can choose the starting sidePICK
- A team during the election step phase can choose the starting sideRANDOM
- The teams will be assigned randomly
Every time a team can perform an action a map.who
or/and side.who
attribute is needed. Example:
{
"map": {
"mode": "<map mode goes here>",
"who": "<map who goes here>"
}
}
The different who
s are:
TEAM_A
,TEAM_B
- Team A and B as given in the match init payload dataTEAM_X
,TEAM_Y
- Any Team can perform this action, but when (for example) Team A performs a Team X action it is assigned as being Team X from now on and Team Y becomes Team B
// BAN
{
"map": {
"mode": "BAN",
"who": "TEAM_A" // or TEAM_B, TEAM_X, TEAM_Y
}
}
// RANDOM BAN
{
"map": {
"mode": "RANDOM_BAN"
}
}
// AGREE
{
"map": {
"mode": "AGREE"
},
"side": { // or any other side configuration (see below)
"mode": "KNIFE"
}
}
// FIXED
{
"map": {
"mode": "FIXED",
"fixed": "de_anubis"
},
"side": { // or any other side configuration (see below)
"mode": "KNIFE"
}
}
// PICK
{
"map": {
"mode": "PICK",
"who": "TEAM_A" // or TEAM_B, TEAM_X, TEAM_Y
},
"side": { // or any other side configuration (see below)
"mode": "KNIFE"
}
}
// RANDOM_PICK
{
"map": {
"mode": "RANDOM_PICK"
},
"side": { // or any other side configuration (see below)
"mode": "KNIFE"
}
}
Possible side configurations:
// FIXED
{
"map": { // or any other map configuration (see above)
"mode": "RANDOM_PICK"
},
"side": {
"mode": "FIXED",
"fixed": "TEAM_A_CT"
}
}
// KNIFE
{
"map": { // or any other map configuration (see above)
"mode": "RANDOM_PICK"
},
"side": {
"mode": "KNIFE"
}
}
// PICK
{
"map": { // or any other map configuration (see above)
"mode": "RANDOM_PICK"
},
"side": {
"mode": "PICK",
"who": "TEAM_A" // or TEAM_B, TEAM_X, TEAM_Y
}
}
// RANDOM
{
"map": { // or any other map configuration (see above)
"mode": "RANDOM_PICK"
},
"side": {
"mode": "RANDOM"
}
}
// Best-of-1
// Alternating map bans
// Knife for Side on last map
{
"electionSteps": [
{ "map": { "mode": "BAN", "who": "TEAM_A" } },
{ "map": { "mode": "BAN", "who": "TEAM_B" } },
{ "map": { "mode": "BAN", "who": "TEAM_A" } },
{ "map": { "mode": "BAN", "who": "TEAM_B" } },
{ "map": { "mode": "BAN", "who": "TEAM_A" } },
{ "map": { "mode": "BAN", "who": "TEAM_B" } },
{
"map": { "mode": "RANDOM_PICK" },
"side": { "mode": "KNIFE" }
}
]
}
// Best-of-3
// Alternating Ban->Ban->Pick->Pick->Ban->Ban
// When a team picks am map, the starting side will be picked by the opponent
// Knife for Side on last map
{
"electionSteps": [
{ "map": { "mode": "BAN", "who": "TEAM_A" } },
{ "map": { "mode": "BAN", "who": "TEAM_B" } },
{
"map": { "mode": "PICK", "who": "TEAM_A" },
"side": { "mode": "PICK", "who": "TEAM_B" }
},
{
"map": { "mode": "PICK", "who": "TEAM_B" },
"side": { "mode": "PICK", "who": "TEAM_A" }
},
{ "map": { "mode": "BAN", "who": "TEAM_A" } },
{ "map": { "mode": "BAN", "who": "TEAM_B" } },
{
"map": { "mode": "RANDOM_PICK" },
"side": { "mode": "KNIFE" }
}
]
}
// Premier Mode like in Counter-Strike 2
// 2 Bans by Team A
// 3 Bans by Team B
// 1 Ban by Team A
// Team B picks starting side on last map
{
"electionSteps": [
{ "map": { "mode": "BAN", "who": "TEAM_A" } },
{ "map": { "mode": "BAN", "who": "TEAM_A" } },
{ "map": { "mode": "BAN", "who": "TEAM_B" } },
{ "map": { "mode": "BAN", "who": "TEAM_B" } },
{ "map": { "mode": "BAN", "who": "TEAM_B" } },
{ "map": { "mode": "BAN", "who": "TEAM_A" } },
{
"map": { "mode": "RANDOM_PICK" },
"side": { "mode": "PICK", "who": "TEAM_B" }
}
]
}
// Double Elimination Final
// BO3, but max. two maps, because of advantage for one team
{
"electionSteps": [
{ "map": { "mode": "BAN", "who": "TEAM_A" } },
{ "map": { "mode": "BAN", "who": "TEAM_B" } },
{
"map": { "mode": "PICK", "who": "TEAM_A" },
"side": { "mode": "PICK", "who": "TEAM_B" }
},
{
"map": { "mode": "PICK", "who": "TEAM_B" },
"side": { "mode": "PICK", "who": "TEAM_A" }
}
]
}
quick tmt2 for testing
BO1, active duty map pool
- team A map ban
- 2* team B map ban
- 2* team A map ban
- team B map ban
- remaining map, knife for side
Double elimination final (BO3, but max. two maps, because of advantage for one team):
- team A map ban
- team B map ban
- team A map pick + team B side pick
- team B map pick + team A side pick
BO3, active duty map pool
- team A map ban
- team B map ban
- team A map pick + team B side pick
- team B map pick + team A side pick
- team A map ban
- team B map ban
- remaining map, knife for side
quick tmt2 for testing (loop mode)
See also Game Modes on Valve's wiki.
After changing the values, a new map must be loaded with map
or changelevel
game_type 0
game_mode 1
sv_game_mode_flags 0
sv_skirmish_id 0
game_type 0
game_mode 1
sv_game_mode_flags 32
sv_skirmish_id 0
game_type 0
game_mode 2
sv_game_mode_flags 0
sv_skirmish_id 0