Alright, since this is the only resource on the internet on how to disable gauntlets, I'll add my alternative solution, with functioning examples for the L4D1 maps. Basically you write a custom mutation and use vscript to remove gauntlets - the L4D1 mutation already contains a bunch of example code. The benefit is that you don't need -insecure, and you don't need addons.
- In Steam\steamapps\common\Left 4 Dead 2\left4dead2\modes create a file called 'mutationname.txt', with the following code:
Code:
"mutationname"
{
"base" "coop"
"maxplayers" "4"
"hasdifficulty" "1"
"singlechapter" "0"
"DisplayTitle" "Some suitable name to display when loading"
"Description" "Some suitable description"
"Image" "maps/any"
"Author" "Your name goes here"
}
"base" determines which gamemode to inherit settings from. This is important because some map components rely on this to function (e.g. some finales). You can use coop/versus/survival/scavenge/realism, or an existing mutation.
singlechapter should be set to 1 for e.g. scavenge/survival, 0 for coop/versus.
hasdifficulty sets the default difficulty, one of 0/1/2/3. Can still be changed in-game.
-In C:\Program Files\Steam\steamapps\common\Left 4 Dead 2\left4dead2\scripts\vscripts create a file named 'mutationname.nut' with the following code:
Code:
MutationOptions <-
{
}
DirectorOptions <-
{
}
function OnGameEvent_round_start_post_nav( params )
{
if ( SessionState.MapName == "c10m4_mainstreet" )
{
local relay = Entities.FindByName( null, "forklift_relay" );
if ( relay )
{
EntityOutputs.RemoveOutput( relay, "OnTrigger", "director", "BeginScript", "c10m4_onslaught" );
EntityOutputs.AddOutput( relay, "OnTrigger", "director", "ForcePanicEvent", "", 9.0, -1 );
}
EntFire( "onslaught1", "Kill" );
}
else if ( SessionState.MapName == "c11m4_terminal" )
{
local van = Entities.FindByName( null, "van_button" );
if ( van )
{
EntityOutputs.RemoveOutput( van, "OnPressed", "@director", "", "" );
EntityOutputs.AddOutput( van, "OnPressed", "@director", "ForcePanicEvent", "", 3.0, -1 );
}
local relay = Entities.FindByName( null, "alarm_on_relay" );
if ( relay )
{
EntityOutputs.RemoveOutput( relay, "OnTrigger", "@director", "", "" );
EntityOutputs.RemoveOutput( relay, "OnTrigger", "alarm_safety_relay", "", "" );
EntityOutputs.AddOutput( relay, "OnTrigger", "@director", "ForcePanicEvent", "", 0.0, -1 );
EntityOutputs.AddOutput( relay, "OnTrigger", "alarm_off_relay", "Trigger", "", 15.0, -1 );
}
EntFire( "van_follow_trigger", "Kill" );
EntFire( "van_endscript_relay", "Kill" );
EntFire( "onslaught_hint_trigger", "Kill" );
}
else if ( SessionState.MapName == "c12m3_bridge" )
{
local relay = Entities.FindByName( null, "train_engine_relay" );
printl(relay) //([0] logic_relay: train_engine_relay)
if ( relay )
{
EntityOutputs.RemoveOutput( relay, "OnTrigger", "director", "BeginScript", "c12m3_onslaught" );
EntityOutputs.AddOutput( relay, "OnTrigger", "director", "ForcePanicEvent", "", 2.0, -1 );
}
EntFire( "zombie_spawn1", "Kill" );
EntFire( "onslaught_hint_template", "Kill" );
}
else if ( SessionState.MapName == "c12m4_barn" )
{
EntFire( "window_trigger", "Kill" );
}
}
The function OnGameEvent_round_start_post_nav is executed on map load.
Entities.FindByName finds an entity. This is where stripper is useful - in the stripper dump file, look for the "targetname" field, e.g. "targetname" "forklift_relay" for c10m4_mainstreet. In there there's a line that says "OnTrigger" "director BeginScript c10m4_onslaught 7 -1". If you want to remove this using vscript, you get
EntityOutputs.RemoveOutput( relay, "OnTrigger", "director", "BeginScript", "c10m4_onslaught" );
If you want to replace the gauntlet with a regular horde you can add EntityOutputs.AddOutput( relay, "OnTrigger", "director", "ForcePanicEvent", "", 9.0, -1 ); The first number is the delay in seconds before it starts.
For other gauntlets it's a bit of a puzzle so let me know if anyone figures anything out. E.g. the corn field in Blood Harvest has a gauntlet, and I had to use
Code:
local relay = Entities.FindByName(null, "cornfield_trigger");
if ( relay )
{
EntFire("@director","Kill");
}
However, I haven't managed to spawn a horde there instead.
To play your mutation simply use the following console command:
Code:
map mapname mutationname difficulty
Where mapname is the name of the map, e.g. c12m1_hilltop, mutationname is the name of the mutation, and difficulty is one of Easy, Normal, Hard, Impossible.
EDIT:
I've finished the mutation and uploaded the files here. To run them:
-Place nogauntlets.txt in ~\Steam\steamapps\common\Left 4 Dead 2\left4dead2\modes.
-Rename nogauntlets.nut.txt to nogauntlets.nut and place it in ~\Steam\steamapps\common\Left 4 Dead 2\left4dead2\scripts\vscripts.
-Start L4D2, open a console, type the command 'map mapname nogauntlets difficulty', and hit enter.
---Here, mapname should be the filename of the map you want to play (e.g. c12m1_hilltop - if you just type 'map c' it'll try to autocomplete and you can use the arrow keys to search through the maps).
---difficulty should be the difficulty level you want, where you can choose from Easy/Normal/Hard/Impossible.
---So, for example, to play Dark Carnival without gauntlets on advanced, use the command 'map c2m1_highway nogauntlets Hard'.
NOTE! This does not remove the gauntlet finales - the hordes in the Dead Center and Cold Stream finales will still be endless (otherwise they're a horde followed by a long, boring, walk). However, you can remove them by adding the following to the script:
Code:
function Update()
{
director_panic_forever = 0
}
EDIT2: The code for c12m4_barn doesn't work. It needs to be this:
Code:
else if ( SessionState.MapName == "c12m4_barn" )
{
local relay = Entities.FindByName( null, "window_trigger" );
if ( relay )
{
EntityOutputs.RemoveOutput( relay, "OnTrigger", "director", "BeginScript", "c12m4_onslaught" );
EntityOutputs.RemoveOutput( relay, "OnTrigger", "zombie_spawn_relay", "Trigger", "" );
EntityOutputs.RemoveOutput( relay, "OnTrigger", "onslaught", "GenerateGameEvent", "" );
//EntityOutputs.AddOutput( relay, "OnTrigger", "director", "ForcePanicEvent", "", 4.0, -1 );
}
local relay2 = Entities.FindByName( null, "zombie_spawn_relay" );
if ( relay2 )
{
EntityOutputs.RemoveOutput( relay2, "OnTrigger", "spawn_zombie_run", "SpawnZombie", "" );
EntityOutputs.RemoveOutput( relay2, "OnTrigger", "spawn_zombie_end", "SpawnZombie", "" );
}
local relay3 = Entities.FindByModel( null, "*173" );
if ( relay3 )
{
EntityOutputs.RemoveOutput( relay3, "OnTrigger", "director", "BeginScript", "c12m4_reserved_wanderers" );
}
}
Remove the comment tag // if you want a regular mob to appear.