yyler asked me to compile a FAQ of common problems and their solutions. Being one of the first to make a MvM map after it's release, I ran into a lot of problems and had to figure out most of the solutions on my own as I was the only one encountering them.
So here's a list of problems, solutions and tips I've learned from making paradigm.
I will of course continue to update this, and I hope I can answer questions asked if I forgot something on this list.
- Common problems and solutions
My bots aren't spawning at their spawn points!
This can be caused by a few problems. The first and easiest one to fix, is the same as broken spawns on any normal map - spawns being blocked by geometry, stuck inside displacements or the floor. Make sure your spawns are hovering a few units above the floor, and the flag too.
The second problem, one I ran into a lot, is when you have your map set up similar to the official ones with a "cliff" for the bots to drop down from after they spawn. The problem is when your bots don't spawn up there, but instead spawn right at the base of the cliff.
This happens because your nav mesh hasn't generated properly to the top of the cliff. Bots can only spawn where there's a nav mesh, and usually the cliff is too high for the simple nav_generate to propagate it's sampling too. The way to fix this is quite simple, use nav_mark_walkable on all the levels of your map (the main map and the top of the cliff) before doing nav_generate, and it will generate and automatically connect the two levels.
My tank is spawning at the hatch!
This is a problem that I ran into a lot as well. It's caused by the population file referring to a path_track for the tank to spawn at, and that path track either doesn't exist or doesn't follow along a path to the hatch. If the final path node of the track that the pop_file is referring to isn't in the hatch area, then the tank will just spawn on the hatch and drop it's bomb immediately. It may also be caused by loops in the track.
Make sure your starting path node is correctly referenced in the population file, and that the path_track continues properly all the way to the hatch.
Another thing that may be causing this is the nav mesh. The tank doesn't actually follow the path like a payload cart does, for example. It uses them as a guide on where to go, but in fact uses the nav mesh for it's movement. You can have the path tracks placed at random heights, and the tank will properly angle itself to the incline below, no matter the angle, and drive directly along the surface. This means if the nav file is broken - such as there being no nav data where the tank spawns, it will teleport to the hatch.
The bots are hugging the walls, trying to pass through solid geometry!
This is caused by having jump (or other) connections to the other side of the wall in the nav mesh that the bots try to take but can't. Use nav_edit 1 too see the connections. nav_mark to select the first cell, aim at the second and nav_disconnect to break the connection. Make sure to do nav_analyse at the end of this editing or your nav mesh won't work!
- Basic tips
Learn your nav commands, they help a lot debugging problems. The most useful I found were;
- nav_edit. This command allows you to physically see the nav mesh, which is for obvious reasons extremely useful. It's also needed for a lot of other nav-related commands.
- nav_mark_walkable. As I mentioned before, this marks another area (apart from where the player is standing) for the nav mesh to start generation from. Multiple of these means you can generate two nav meshes that are normally not connected, such as the bot dropdown.
- nav_mark. This marks a cell of the nav mesh under the cursor, useful for the next command.
- nav_connect. This connects the area under your cursor with the area marked using the last command. This means you can manually assign a dropdown point between a low and high nav cell if the game doesn't originally connect them.
The pop file supports custom wave end/start output firing. You can use this in creative ways. An example, not nearly the best use however, is the forward upgrade station in Paradigm that only opens in the downtime between waves.
tf_mvm_jump_to_wave allows you to jump to a specific wave number without having to go through the previous ones. This is very useful for testing if tanks are broken or not.
- Pop File
This is half your MvM map, so it easily deserves it's own section. I'm not the best on pop files, and I don't know the more complex side of them, but I can try to get down the basics of one.
The pop file is what decides what bots spawn, where they spawn, when they spawn and how they act. It also dictates the currency and some of the entity logic.
Missions
You can generally leave missions alone unless you intend on doing something very special and unique with your bots. They basically spawn bots under more unique conditions than the general waves - for example, the sentry buster spawning when X damage is dealt by sentries, or spies spawning with custom behaviour. I haven't delved into missions much, so I can't tell you much more.
Wave
A wave is, well, a wave. They are read by the game in the order they're written in the pop file, and the number of waves you have depends on the number of separate Wave {}'s you have. Everything surrounded by the { }'s will be executed before the game saves a checkpoint and the players are given the opportunity to ready up.
Wavespawn
Wavespawn is the meat of your pop file. These go inside a corresponding Wave {}, and a wavespawn contains the information about the bots themselves.
The barebones of a wavespawn is;
That's essentially the makings of a pop file. They're quite simple, just a bunch of waves with nested wavespawns. There are some more complex parts, such as squads , which I recommend you refer to the dev wiki or the example pop file for.
Until you get further into your map, I recommend copying an official pop file, such as decoy or coaltown, and working from that rather than writing a whole new one.
So here's a list of problems, solutions and tips I've learned from making paradigm.
I will of course continue to update this, and I hope I can answer questions asked if I forgot something on this list.
- Common problems and solutions
My bots aren't spawning at their spawn points!
This can be caused by a few problems. The first and easiest one to fix, is the same as broken spawns on any normal map - spawns being blocked by geometry, stuck inside displacements or the floor. Make sure your spawns are hovering a few units above the floor, and the flag too.
The second problem, one I ran into a lot, is when you have your map set up similar to the official ones with a "cliff" for the bots to drop down from after they spawn. The problem is when your bots don't spawn up there, but instead spawn right at the base of the cliff.
This happens because your nav mesh hasn't generated properly to the top of the cliff. Bots can only spawn where there's a nav mesh, and usually the cliff is too high for the simple nav_generate to propagate it's sampling too. The way to fix this is quite simple, use nav_mark_walkable on all the levels of your map (the main map and the top of the cliff) before doing nav_generate, and it will generate and automatically connect the two levels.
My tank is spawning at the hatch!
This is a problem that I ran into a lot as well. It's caused by the population file referring to a path_track for the tank to spawn at, and that path track either doesn't exist or doesn't follow along a path to the hatch. If the final path node of the track that the pop_file is referring to isn't in the hatch area, then the tank will just spawn on the hatch and drop it's bomb immediately. It may also be caused by loops in the track.
Make sure your starting path node is correctly referenced in the population file, and that the path_track continues properly all the way to the hatch.
Another thing that may be causing this is the nav mesh. The tank doesn't actually follow the path like a payload cart does, for example. It uses them as a guide on where to go, but in fact uses the nav mesh for it's movement. You can have the path tracks placed at random heights, and the tank will properly angle itself to the incline below, no matter the angle, and drive directly along the surface. This means if the nav file is broken - such as there being no nav data where the tank spawns, it will teleport to the hatch.
The bots are hugging the walls, trying to pass through solid geometry!
This is caused by having jump (or other) connections to the other side of the wall in the nav mesh that the bots try to take but can't. Use nav_edit 1 too see the connections. nav_mark to select the first cell, aim at the second and nav_disconnect to break the connection. Make sure to do nav_analyse at the end of this editing or your nav mesh won't work!
- Basic tips
Learn your nav commands, they help a lot debugging problems. The most useful I found were;
- nav_edit. This command allows you to physically see the nav mesh, which is for obvious reasons extremely useful. It's also needed for a lot of other nav-related commands.
- nav_mark_walkable. As I mentioned before, this marks another area (apart from where the player is standing) for the nav mesh to start generation from. Multiple of these means you can generate two nav meshes that are normally not connected, such as the bot dropdown.
- nav_mark. This marks a cell of the nav mesh under the cursor, useful for the next command.
- nav_connect. This connects the area under your cursor with the area marked using the last command. This means you can manually assign a dropdown point between a low and high nav cell if the game doesn't originally connect them.
The pop file supports custom wave end/start output firing. You can use this in creative ways. An example, not nearly the best use however, is the forward upgrade station in Paradigm that only opens in the downtime between waves.
tf_mvm_jump_to_wave allows you to jump to a specific wave number without having to go through the previous ones. This is very useful for testing if tanks are broken or not.
- Pop File
This is half your MvM map, so it easily deserves it's own section. I'm not the best on pop files, and I don't know the more complex side of them, but I can try to get down the basics of one.
The pop file is what decides what bots spawn, where they spawn, when they spawn and how they act. It also dictates the currency and some of the entity logic.
Missions
You can generally leave missions alone unless you intend on doing something very special and unique with your bots. They basically spawn bots under more unique conditions than the general waves - for example, the sentry buster spawning when X damage is dealt by sentries, or spies spawning with custom behaviour. I haven't delved into missions much, so I can't tell you much more.
Wave
A wave is, well, a wave. They are read by the game in the order they're written in the pop file, and the number of waves you have depends on the number of separate Wave {}'s you have. Everything surrounded by the { }'s will be executed before the game saves a checkpoint and the players are given the opportunity to ready up.
Wavespawn
Wavespawn is the meat of your pop file. These go inside a corresponding Wave {}, and a wavespawn contains the information about the bots themselves.
The barebones of a wavespawn is;
Code:
Wavespawn {
Where spawnbot //this tells the game where to spawn the bots in this group. It referres to names of named info_team_spawns
TotalCount 50 //this is the number of bots to spawn in this group. Not necessarily all at once, but all the bots inside this group will be the same.
MaxActive 10 //the maximum number of bots part of this group that can be alive at the same time. When some die, more are spawned so there's always 10 in the map (to a max of 50 total spawned, obviously)
SpawnCount 5 // The number of bots spawned per spawn
WaitBetweenSpawns 5 //The time in seconds between SpawnCount spawns a new set of bots, as long as MaxActive isn't reached.
WaitBeforeStarting 0 // The time from the start of the wave before bots in this group starts to spawn
TotalCurrency 200 // The total currency dropped from this group. This is yours to balance, but if your total currency is 200, and you have 50 bots, each bot will drop 4 cash.
Support 1 // This is if you want your wave to be a support wave. TotalCount has no bearing if this is set to 1, they will keep spawning (still heeds MaxActive and SpawnCount) until the non-support wavespawns in this wave {} have been killed.
TFBot {
Class Scout
Skill Easy
} // This is the part where you enter information about your bots. It should be self-explanatory. Refer to the example pop file for more info on what you can stick here.
}
That's essentially the makings of a pop file. They're quite simple, just a bunch of waves with nested wavespawns. There are some more complex parts, such as squads , which I recommend you refer to the dev wiki or the example pop file for.
Until you get further into your map, I recommend copying an official pop file, such as decoy or coaltown, and working from that rather than writing a whole new one.
Last edited: