RE:NODE

Guides11 min read

Killing Floor 2 mutators and custom modes

Run Killing Floor 2 mutators and custom modes: how ?Mutator= and ?Game= work, Workshop delivery, Controlled Difficulty, endless overhauls, ranked status and fixes.

0 readers

In Killing Floor 2, a mutator is an UnrealScript class that changes the rules of whichever mode is running, and a custom game mode is a class that replaces the mode entirely. Both are loaded from the launch line: ?Mutator=Package.ClassName (several separated by commas inside one parameter) and ?Game=Package.ClassName. The package arrives through the Workshop - listed by item id in PCServer-KFEngine.ini, downloaded to KFGame/Cache on the next start - and joining players fetch the same items from Steam. Anything not on Tripwire's whitelist makes the server Unranked, so players earn no perk XP on it. Decide whether you are running a ranked server or a modded one before you install anything, because you cannot be both.

The base server - install, the main ini files, web admin, ports, workshop maps - is in the Killing Floor 2 server guide. This post is everything above that: how mutators and modes load, the popular ones and what they cost, running a difficulty-control mode properly, and fixing the usual failures.

Mutators versus game modes#

The launch line names a map, then URL-style options:

bash
$ ./KFGameSteamServer.bin.x86_64 \    KF-BurningParis?Game=KFGameContent.KFGameInfo_Survival?Difficulty=3?GameLength=1?Mutator=PackageA.MutA,PackageB.MutB \    -Port=7777 -QueryPort=27015

?Game= picks the game info class - the code that defines what a match is. The stock ones live in KFGameContent: KFGameInfo_Survival, KFGameInfo_Endless, KFGameInfo_WeeklySurvival, KFGameInfo_Objective and KFGameInfo_VersusSurvival. A custom mode is just a different class in a different package, and it replaces the stock one completely - wave logic, spawning, trader, sometimes perks and the shop.

?Mutator= loads one or more mutator classes on top of whatever mode is running. A mutator hooks into game events - a player spawning, a Zed spawning, a wave starting, damage being dealt - and changes the outcome. Mutators stack, which is both their strength and the source of most conflicts.

Custom game modeMutator
Loaded with?Game=Package.Class?Mutator=Package.Class
How manyExactly oneSeveral, comma-separated
ScopeReplaces the modeModifies the mode
Typical useDifficulty control, endless overhaulsPlayer count, trader time, quality of life
Conflict riskLow with stock mutators, higher with othersRises with every one added

The syntax trap people fall into: several mutators go in one ?Mutator= separated by commas. Repeating ?Mutator= twice on the line keeps only one of them.

Where the code comes from: Workshop and manual installs#

Mutators and modes are packages - compiled .u files, sometimes with content packages beside them. There are two ways to get them onto a server.

Through the Workshop, the normal route. List each item id in the engine ini, one line per item:

KFGame/Config/PCServer-KFEngine.ini
[OnlineSubsystemSteamworks.KFWorkshopSteamworks]ServerSubscribedWorkshopItems=1111111111ServerSubscribedWorkshopItems=2222222222[IpDrv.TcpNetDriver]DownloadManagers=OnlineSubsystemSteamworks.SteamWorkshopDownload

The ids above are placeholders - take the real ones from the item's Workshop URL. On the next start the server downloads each item to KFGame/Cache/<id>/. Players joining are pointed at the same items and Steam downloads them, which is how client-side parts of a mutator (a HUD, a menu, a custom weapon model) reach people. The DownloadManagers line has to be the first entry in that section, as explained in the main guide.

Manually, by placing the package files in the server's content folders. This works for purely server-side code and for your own builds, but clients get nothing from it - anything with a client-side component then fails for every player who does not already have the files.

Whichever route, the package name in ?Mutator=Package.Class is the file name of the .u without its extension, and the class name is given by the author. Workshop descriptions for serious mods state the exact string to paste. Copy it rather than guessing from the item title; the title and the package rarely match.

read at startdownloads by idjoinssame itemsPCServer-KFEngine.inisubscribed itemsSteam Workshopitem idKFGame/Cachedownloaded packagePlayerSteam fetches itemsKF2 server?Mutator= loads class
How a KF2 mutator reaches the server and the players

Ranked, Unranked and the whitelist#

Tripwire maintains a whitelist of approved modifications. A server running only stock content and whitelisted mutators stays Ranked: players earn perk XP and the server is treated like an official one. Run anything off the list and the server is Unranked, and nobody earns XP while playing on it.

This is the most important fact about modded Killing Floor 2 hosting, because perk progression is why most players are in the game at all. Three consequences:

  • Say it in the name. Players filter by reading. "Unranked" or "Custom" in ServerName saves you a stream of complaints from people who joined to level a perk.
  • Many popular mods are Unranked by design. Difficulty overhauls, larger player counts and endless reworks change the balance that XP is earned against. Their players know and accept it.
  • Some small mutators are whitelisted. If you want to stay Ranked, check the item page and Tripwire's current list before installing; status can change between game updates.

Progression is stored on each player's Steam account rather than on your server, so an Unranked night does not take anything away from anyone. It just does not add.

Raising the player count#

The six-player cap in Survival is enforced by the game mode, not the engine, which is why editing MaxPlayers alone does not work. Communities that want eight or twelve players in co-op use a max-players mutator, plus a HUD or scoreboard mutator so the extra players appear in the interface. The usual pattern is:

  1. Subscribe the server to the mutator and add it to ?Mutator=.
  2. Set the target player count where the mutator documents it - usually ?MaxPlayers= on the launch line or a key in the ini file it creates.
  3. Add a scoreboard or HUD mutator if the main one does not handle that itself.
  4. Restart and test with real players, not just the browser number.

Be honest with yourself about what this does to the game. Wave size, dosh and boss health scale for up to six players; at twelve, each player sees fewer Zeds and more money, so the game gets easier and noisier. Difficulty-control modes, below, are the way to put the challenge back. CPU cost rises with players and Zeds together; a twelve-player server with large waves on Hell on Earth is a real single-thread load. CPU vs RAM for game servers covers which one to watch.

Controlled Difficulty and other custom modes#

Controlled Difficulty

Controlled Difficulty (CD) is the best-known custom mode and the standard for experienced groups. It replaces Survival with a version where nearly every spawning variable is exposed: how many Zeds are alive at once, how fast they spawn, the spawn cycle (which Zed types come in which waves), how long the trader stays open, which boss appears.

It loads as a game class, not a mutator. Several maintained builds exist, published by different authors, and they use different package names - typically along the lines of ControlledDifficulty_<Author>.CD_Survival. Use the exact string from the Workshop page of the build you subscribe to:

code
KF-BioticsLab?Game=<CDPackage>.CD_Survival?Difficulty=3?GameLength=2?SpawnCycle=basic_moderate

Settings commonly exposed by CD builds include SpawnCycle, MaxMonsters, CohortSize, SpawnPoll, WaveSizeFakes, TraderTime and Boss. They can be set on the launch line or in the ini the mode writes on its first start, and most builds also let players query the current values in chat. Names and defaults differ between builds, so read the build's documentation rather than a guide written for another one.

A few practical notes:

  • Spawn cycles are the heart of it. A cycle defines the exact Zed mix wave by wave. Communities share cycle names; a group that wants a consistent challenge picks one and keeps it.
  • `WaveSizeFakes` scales wave size as if more players were present. It is how a four-player group gets a six-player or larger wave.
  • CD is Unranked. Everyone who plays it knows this, but new players may not.
  • Watch CPU on high `MaxMonsters`. CD lets you put far more Zeds on the map at once than stock Survival. The server's game thread pays for every one.

Endless overhauls and other modes

Beyond CD, the Workshop holds full endless reworks - Zedternal is the best known - that replace perks, the trader and progression with their own systems for very long runs. They load with ?Game= using the class on the item page, generally want their own ini tuning, and are Unranked. Expect memory to climb over a long session and plan a restart between runs; restart schedules that help covers timing.

Pick one custom mode per server. Two game classes cannot run together, and mutators written for stock Survival may not work under a custom mode at all - check each mutator's page for compatibility notes before adding it to a CD or endless server.

Configuring mutators and avoiding conflicts#

Mutators that have settings usually create an ini file of their own in KFGame/Config/ on the first start with the mutator loaded. The file name depends on the mod. The same rule applies as for the main configuration: start once, stop cleanly, then edit, because a running server writes its config back on shutdown.

code
1. Add the item id to PCServer-KFEngine.ini2. Add Package.Class to ?Mutator= or ?Game=3. Start, wait for the map to load, read the log4. Stop cleanly5. Edit the new ini file the mod created6. Start again and test in a real match

Conflicts happen when two mutators change the same thing - two that both adjust spawning, two that both replace the scoreboard, a max-players mutator and a custom mode that has its own player limit. Symptoms range from one silently overriding the other to errors at wave start. The method for finding a conflict is boring and reliable:

  1. Remove every mutator. Confirm the server runs clean.
  2. Add them back one at a time, restarting and testing each.
  3. When something breaks, the last one added is involved; check it against each of the others in pairs.

Keep the working launch line written down somewhere outside the server, with the Workshop ids and the date. When an author updates an item and the server breaks the morning after, that note is how you roll back. What to do when a mod update breaks is the general playbook, and keeping a modded server clean the case for a short list.

Updates and Workshop drift#

Two kinds of update hit a modded Killing Floor 2 server:

  • Game updates. Tripwire's patches can break compiled mutators until their authors rebuild them. Update the server, then check each mutator's page and the log before reopening.
  • Workshop updates. When an author republishes, the server fetches the new version on its next start and players fetch it on their next join. A broken update arrives with no action on your side.

The defence is a backup before every change and every patch. The whole state of a Killing Floor 2 server is KFGame/Config/ plus whatever you placed by hand; the cache can be re-downloaded. On RE:NODE backup slots come with every Killing Floor 2 plan and restore with one button, and the Schedules tab can take a nightly backup and restart the server at a fixed hour so Workshop changes arrive at a predictable time rather than in the middle of a wave.

Troubleshooting#

The mutator is listed but nothing changes. It did not load. Search the log for the package name. Usual causes: wrong Package.Class string, the Workshop item failed to download, or a second ?Mutator= replaced the first.

Players are stuck loading or kicked on join. The mutator has client-side content and their download failed, or the DownloadManagers line is missing or not first.

The server became Unranked. Something on it is not whitelisted. Remove mutators one at a time to find which, or accept it and say so in the server name.

MaxPlayers is ignored. The per-mode cap still applies. Use a max-players mutator, and check that a custom mode is not enforcing its own limit.

Settings in the mutator's ini revert. The server was running when you edited. Stop, edit, start.

Wave start crashes or errors. Two mutators conflict, or a mutator is incompatible with the custom mode. Bisect as above.

Lag in late waves with a custom mode. Too many Zeds alive at once for one core. Reduce the mode's alive-at-once setting before buying a bigger plan.

FAQ#

How do I add more than one mutator to a KF2 server?

Put them all in a single ?Mutator= option, separated by commas: ?Mutator=PackageA.MutA,PackageB.MutB. Repeating ?Mutator= keeps only one.

Do mutators make my server Unranked?

Any modification not on Tripwire's whitelist does. Players on an Unranked server earn no perk XP. Some small mutators are whitelisted; most difficulty and player-count mods are not.

Do players need to install mutators themselves?

No. If the mutator is delivered through the Workshop and the download manager is configured, joining players get it from Steam automatically. Manually installed packages are not sent to clients.

What is the difference between ?Game= and ?Mutator=?

?Game= chooses the game mode class and replaces the mode entirely; there can be only one. ?Mutator= adds modifications on top of the running mode, and several can be loaded.

Is Controlled Difficulty a mutator?

It is a custom game mode, loaded with ?Game= and a class from the build you subscribe to. Different builds use different package names, so copy the exact string from the Workshop page.

Can I run a 12-player Survival server?

Yes, with a max-players mutator and usually a scoreboard fix. It will be Unranked, and the game gets easier at higher counts unless you add a difficulty-control mode.


Comments

Completely anonymous: no account, no email, no cookie. We store the name you type, the text and the time - nothing else. Links are limited and markup is not rendered.

0/2000