Skip to content

Instantly share code, notes, and snippets.

@Tsuey
Created July 17, 2021 10:29
Show Gist options
  • Save Tsuey/f0bc7e2c25dea66fcd148a631908a43e to your computer and use it in GitHub Desktop.
Save Tsuey/f0bc7e2c25dea66fcd148a631908a43e to your computer and use it in GitHub Desktop.
Tank Stuck Spawn Fixes for L4D2-Community-Update Commit
THE NIGHTMARE COMMIT
====================
Steam News / Kerry Changelog:
+ Patched a few permstuck spots and added QoL clips
+ Dramatically reduced stuck Tank spawns in VS Survival on maps:
c1m2_streets
c3m1_plankcountry
c5m4_quarter
c8m2_subway
c9m2_lots
c10m2_drainage
c10m4_mainstreet
c11m2_offices
c12m3_bridge
+ Dramatically reduced stuck Tank spawns in Taaannnk! on maps:
c1m2_streets
c2m2_fairgrounds
c3m1_plankcountry
c5m2_park
c5m4_quarter
c6m1_riverbank
c8m1_apartment
c8m2_subway
c8m3_sewers
c9m2_lots
c10m1_caves
c10m2_drainage
c10m3_ranchhouse
c10m4_mainstreet
c11m1_greenhouse
c11m2_offices
c11m3_garage
c12m1_hilltop
c12m2_traintunnel
c12m3_bridge
c12m4_barn
+ Resolved a stuck spawn behind tunnel barricade on Death Toll 1
+ Resolved a stuck spawn behind some rubble on Dead Air Terminal
+ Added visual step to get back in bounds on VS Survival Generator Room
+ Thickened several clips across many maps to resolve stuck Tank spawns
+ Prevented an easy Cold Stream 2 event skip
+ Allow Infected player access into end closet on Sacrifice 2
+ Updated "z_developer_showupdate.nut" to support "trigger_look"
+ Mitigator for getting stuck in scissor lift on No Mercy sewers
There's a few "sections" to this massive changelog:
Changes that are safe to go in:
c8m3_sewers.nut -- FRED
+ Update that file, with the best new Fred we've come up with
mutation15.nut -- VERSUS SURVIVAL
+ Minimum Tank stuck spawn fixes relevant to this mode's arenas
+ Like RocketDude, will likely require a 10-15 second delay
before deletions, so that anv_mapfixes had time to fully spawn
+ IGNORE_REFERENCE_ONLY
mutation19.nut -- TAAANNNK! MUTATION
+ Same deal as above, except for this Mutation
+ IGNORE_REFERENCE_ONLY
MAP-SPECIFIC SCRIPT SPLITS
+ Above mutation15/mutation19 code, copied, and re-formatted,
to go into map-specific split "\anv_mapfixes\" files
anv_versus.nut -- MAKE_CLIP() THICKENINGS
+ Clips added with TLS (due to re-worked func_playerinfected_clip)
that weren't thick enough, and simply need Find/Replace thickenings
MISC -- UNRELATED / RANDOM BUGS FIXED AS SEEN
+ Bonus fixes
Verbose documentation that can be ignored:
VERBOSE STUDY OF ALL MAPS (& FRED TESTS)
+ SCRIPT FOR VIEWING FUNC_PLAYERINFECTED_CLIP
+ BUG REPORTS SPREADSHEET :: FUTURE TARGETS IN SIGHT
Change of plans:
Regarding mutation15/19, there's 3 options of where this code could go:
1. Place into individual mutation15/19 scripts.
2. Create a new "anv_mutations.nut" file with above's script.
3. Place into individual map-specific \anv_mapfixes\ *.nut files.
Options 1 and 2 result in the same previous "hell" that anv_mapfixes.nut
used to be, before the map-specific split. Though they'd be easier to
maintain there in direct reference to the mutation15/19 scripts, reality
is it'll end up being the opposite as some of these are "band-aid" fixes
for content that was cut from TLS (i.e. restoring the inaccessible Infected
ladders behind the Death Toll 4 barricade's undeletable wrongway signs)
that, once finalized properly, mutation15/19's fixes will change, thus it
instead makes sense to have them all in one place with option 3. Gradually,
like with Dead Air 4 and Death Toll 1, we may find that "SI Players" should
be changed to "SI Players and AI", so it's best to have them all in one spot.
"\anv_mapfixes\" doesn't need to be "just" fixes -- Versus content is going
into them, too. Also un-used mode-specific "placeholders" were cut, leading
to a cleaner look overall -- that invites Mutation-specific fixes.
Examples of future Mutation-specific fixes:
1. Add a "anv_mapfixes.nut" line of code for RocketDude that
exempts clips from that mode -- instead of requiring ReneTM
to add a 10-15 second delay to Kill them all.
2. Versus Survival is no longer a "Mutation", it's an official
mode, so it's better placed in "\anv_mapfixes\" anyway, and
for consistency Taaannnk! Mutation should simply follow suit.
3. Confogl Mutation would, in the future, be worked on to officialize
as an "Advanced or End-Game Versus Mode", which would justify
more aggressive clipping, which would be ideal for "\anv_mapfixes\".
4. Charger Racing would also require additional map props, which
could be placed in "\anv_mapfixes\".
It'd be easy to go over-board with the extent of entities being placed into
"\anv_mapfixes\", but one thing is for sure: Versus Survival is NOT a Mutation,
and belongs near other Survival-specific script, and for consistency Taaannnk!
should be in the same place as it.
** I mean, technically Versus Survival is a Mutation, but so is "Realism",
and "\anv_mapfixes\" is already accounting for "Realism"! They are
Mutations that have been given main mode status.
Conclusion: place fixes into map-specific *.nuts, NOT mutation15.nut/mutation19.nut.
These "band-aid" fixes form the "hitlist" of a future Versus ladder rework and
are potentially temporary.
Bug Reports Spreadsheet Mark-Offs :: Once all these mutation15, mutation19 and anv_ file
changes are committed and in, all these are considered fixed:
42 Navmesh Low "c8m3 Versus Survival
43 Navmesh Low "c10m4 Versus Survival
44 Navmesh Medium "c11m4 Versus Survival
45 Navmesh Low "Part of the spawning area
46 Navmesh Medium "c1m2 versus survival spawning
47 Navmesh Medium "c1m2 versus survival spawning
48 Navmesh Medium "c1m2 versus survival spawning
49 Navmesh Medium "c1m2 versus survival spawning
51 Map Medium "Tanks sometimes spawn out of bounds
187 Mutation Medium On Taaannnkk!, players sometimes spawn out of bounds
218 Map Low "One-sided ladder on c10m4
435 Map Low "c7m2 survivors can enter this room at the end of the map
SWITCH-CASE TEMPLATE:
case "MAP_NAME":
{
// CODE_HERE
}
##############################################################################################################
##############################################################################################################
##############################################################################################################
##############################################################################################################
###################################
#### c8m3_sewers.nut -- FRED ####
###################################
// Fire once and only for Clients (Survivor+Infected). Scurries away after
// 1 second when viewed at any angle, even if only Fred sees the player
// for that long. 1 in 4 chance spawn, but realistically rarer. Fred is
// child to the func_movelinear which is Killed.
if ( RandomInt( 1, 4 ) == 4 )
{
make_prop( "dynamic", "_fred", "models/props_fairgrounds/alligator.mdl", "13103 11543 -25", "0 125 0", "shadow_no", "solid_no" );
SpawnEntityFromTable( "func_movelinear",
{
targetname = g_UpdateName + "_fred_movelinear",
spawnflags = 0,
movedistance = 100,
speed = 60,
startposition = 0,
movedir = Vector( 0, 37, 0 ),
origin = Vector( 13099, 11539, -25 )
} );
EntFire( g_UpdateName + "_fred", "SetParent", g_UpdateName + "_fred_movelinear" );
SpawnEntityFromTable( "trigger_look",
{
targetname = g_UpdateName + "_fred_triglook",
target = g_UpdateName + "_fred",
spawnflags = 129,
LookTime = 1,
FieldOfView = -1,
origin = Vector( 13072, 11520, -25 )
} );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "mins -42 -38 -480" );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "maxs 42 38 0" );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "solid 2" );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "OnTrigger anv_mapfixes_fred_movelinear:Open::0:-1" );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "OnTrigger anv_mapfixes_fred_movelinear:Kill::2:-1" );
}
##############################################################################################################
##############################################################################################################
##############################################################################################################
##############################################################################################################
#############################################
#### mutation15.nut -- VERSUS SURVIVAL ####
#############################################
// Resolve countless stuck Tank (and a couple auto-spawn SI bot) spawns for Versus Survival.
// Note: A small amount are band-aid fixes that may be replaced with major anv_mapfixes.nut future content.
switch( g_MapName )
{
case "c1m2_streets":
{
// Delete all. Extremely problematic map with countless stuck
// spawns, but Skybox stops most opportunities to get under
// the map and the only way to get out of bounds is limited.
EntFire( "func_playerinfected_clip", "Kill" );
EntFire( g_UpdateName + "_yeswayturnpike_clipb", "Kill" );
}
case "c3m1_plankcountry":
{
// Delete all, terrible for stuck spawns. Likely won't allow
// players under the map, and this makes dozens of unused
// perimeter ladders accessible preventing tons of permstucks.
EntFire( "func_playerinfected_clip", "Kill" );
EntFire( g_UpdateName + "_meticulous_funcinfclip01", "Kill" );
// Warp players through one-side invisible solid treeline.
make_axiswarp( "_axiswarp_semitrailer", "y-", 96, "-550 -8 0", "740 8 256", "-9505 10720 155" );
}
case "c5m4_quarter":
{
// Worst map for stuck spawns. Delete all, Skybox and clipping
// bounds the player in and unused perimeter ladders will be put
// to use. There's not even any walkable void under this map.
EntFire( "func_playerinfected_clip", "Kill" );
}
case "c8m2_subway":
{
// Multiple stuck spawns are only relevant to Taaannnk! Mutation,
// except for this: copy the invisible vending machine so players
// have a visible "step" to get back in bounds. (Not actually stuck)
make_prop( "dynamic", "_cosmetic_oobstep", "models/props/cs_office/vending_machine.mdl", "7366 3801 270", "90 0 0", "shadow_no", "solid_no" );
}
case "c9m2_lots":
{
// Delete 1 *.LMP roadsidefence model to facilitate Infected player travel.
kill_entity( Entities.FindByClassnameNearest( "prop_dynamic", Vector( 8521, 5815, 348 ), 1 ) );
}
case "c10m2_drainage":
{
// Excessively problematic map for Taaannnk! Mutation, but not so much
// for Versus Survival. In the Survival area, there's 3 sewer tunnels
// with excess nav players could spawn behind -- this deletes all of them,
// and there's no way to get under the limited Survival arena.
EntFire( "func_playerinfected_clip", "Kill" );
// Delete 1 *.LMP roadsidefence model to facilitate Infected player travel.
kill_entity( Entities.FindByClassnameNearest( "prop_dynamic", Vector( -8972, -7890, -320 ), 1 ) );
// Add 3 Infected ladders to complement the "stacked blockers" meant
// for AI, which players cannot reasonably know the presence of.
make_ladder( "_ladder_versussurvivalfence1_cloned_tunnelmid", "-9478.5 -7280 -384", "155 45 -410" );
make_ladder( "_ladder_versussurvivalfence2_cloned_tunnelmid", "-9478.5 -7280 -384", "155 0 -410" );
make_ladder( "_ladder_versussurvivalfence3_cloned_tunnelmid", "-9478.5 -7280 -384", "155 -45 -410" );
}
case "c10m4_mainstreet":
{
// In Versus Survival's event area, block an inaccessible ladder
// (to be restored in the future) behind a barricade, and then
// also clip off excessive navmesh in far dark corner of the map.
make_clip( "_tankstuck_endbarricade", "SI Players", 1, "-400 -900 0", "400 900 1700", "3822 -3970 0" );
make_clip( "_tankstuck_excesscorner", "SI Players", 1, "-200 -100 0", "200 100 1700", "-2520 -5048 -64" );
}
case "c11m2_offices":
{
// Final street wrongway barricades -- only left Versus Survival relevant.
kill_funcinfclip( 1043.94 ); // Final street left barricade
}
case "c12m3_bridge":
{
// Delete 1 wrongway clip. May not be necessary for Survival
// but too close to call; delete for it and Taaannnk! to be safe.
kill_funcinfclip( 311.003 ); // Wrongway at end of train tunnel
}
}
##############################################################################################################
##############################################################################################################
##############################################################################################################
##############################################################################################################
################################################
#### mutation19.nut -- TAAANNNK! MUTATION ####
################################################
// Resolve countless stuck Tank spawns for Taaannnk! Mutation.
// Note: A small amount are band-aid fixes that may be replaced with major anv_mapfixes.nut future content.
switch( g_MapName )
{
case "c1m2_streets":
{
// Delete all. Extremely problematic map with countless stuck
// spawns, but Skybox stops most opportunities to get under
// the map and the only way to get out of bounds is limited.
EntFire( "func_playerinfected_clip", "Kill" );
EntFire( g_UpdateName + "_yeswayturnpike_clipb", "Kill" );
}
case "c2m2_fairgrounds":
{
// Delete all. Extremely problematic map with countless stuck
// spawns, but Skybox stops all methods of getting under the map.
// No Survival on this map, so we can assume they'll always be Tank.
EntFire( "func_playerinfected_clip", "Kill" );
}
case "c3m1_plankcountry":
{
// Delete all, terrible for stuck spawns. Likely won't allow
// players under the map, and this makes dozens of unused
// perimeter ladders accessible preventing tons of permstucks.
EntFire( "func_playerinfected_clip", "Kill" );
EntFire( g_UpdateName + "_meticulous_funcinfclip01", "Kill" );
// Warp players through one-side invisible solid treeline.
make_axiswarp( "_axiswarp_semitrailer", "y-", 96, "-550 -8 0", "740 8 256", "-9505 10720 155" );
}
case "c5m2_park":
{
// Starting rooftop with a wrongway sign has excess nav behind
// it -- block access to it, which also blocks a permstuck.
make_clip( "_tankstuck_startroof", "SI Players", 1, "-106 -240 0", "86 240 196", "-2936 -816 -58" );
}
case "c5m4_quarter":
{
// Worst map for stuck spawns. Delete all, Skybox and clipping
// bounds the player in and unused perimeter ladders will be put
// to use. There's not even any walkable void under this map.
EntFire( "func_playerinfected_clip", "Kill" );
}
case "c6m1_riverbank":
{
// At the start area, extend a func_playerinfected_clip back a
// bit more to prevent a stuck spawn if Survivors stand back to fence.
make_clip( "_tankstuck_startfence", "SI Players", 1, "-251 -760 0", "173 216 1513", "-261 2872 87" );
}
case "c8m1_apartment":
{
// No Survival on this map, and no Tanks in Scavenge, so extend
// a few func_playerinfected_clip with these.
make_clip( "_tankstuck_alleystart", "SI Players", 1, "-105 -711 0", "823 57 4132", "2473 455 16" );
make_clip( "_tankstuck_alleymiddle", "SI Players", 1, "-127 -257 0", "209 256 4468", "-129 3584 16" );
// And preserve an actually cool Tank spawn by deleting 1 clip.
kill_funcinfclip( 1060.85 ); // Delete clip that blocks the rubble and a cool unique spawn
}
case "c8m2_subway":
{
// Multiple tunnel stuck spawns that aren't accessible in Survival,
// that need to only be fixed for Taaannnk! Mutation. Navmesh is
// excessive and extends too far behind these rubbles/wrongways.
make_clip( "_tankstuck_rubblestart", "SI Players", 1, "-139 -107 0", "119 99 177", "1621 3617 -337", "0 42 0" );
make_clip( "_tankstuck_rubblemiddle", "SI Players", 1, "-189 -145 0", "300 179 240", "6766 5299 -336", "0 -68 0" );
make_clip( "_tankstuck_rubblefinal", "SI Players", 1, "-189 -253 0", "140 320 176", "8249 3222 -336", "0 -53 0" );
// Multiple difficult-but-possible to spawn stuck areas in end area.
make_clip( "_tankstuck_endalley1", "SI Players", 1, "-480 -855 0", "65 293 1400", "10303 3479 16" );
make_clip( "_tankstuck_endalley2", "SI Players", 1, "-373 -96 0", "395 99 1400", "11637 5342 16" );
make_clip( "_tankstuck_widestreet", "SI Players", 1, "-842 0 0", "386 555 1400", "10110 6784 8" );
}
case "c8m3_sewers":
{
// Only problems at beginning (due to func_playerinfected_clip,
// which note bot SI can also spawn behind but at least move
// through that), and several end clips -- nothing in Survival area,
// also supplemented with anv_ file make_clip() thickenings.
make_clip( "_tankstuck_startrooftops", "SI Players", 1, "-1749 -380 0", "219 332 750", "12261 4212 464" );
kill_funcinfclip( 606.217 ); // Delete clip behind a fence and inaccessible ladder
kill_funcinfclip( 733.138 ); // Delete clip for end area backstreet wrongway sign left
kill_funcinfclip( 762.564 ); // Delete clip for end area backstreet wrongway sign right
}
case "c9m2_lots":
{
// Slightly extend a func_playerinfected_clip back further behind
// starting safe room to fully block all navmesh behind there.
make_clip( "_tankstuck_startback", "SI Players", 1, "-120 -900 0", "120 900 1370", "-835 -110 -223" );
}
case "c10m1_caves":
{
// Delete several specific clips along left side of map. Deleting
// all of them wouldn't be so bad since it's just Tanks, but let's
// not do that anyway in case more Infected ladders are added later.
kill_funcinfclip( 1145.18 ); // Spawn left 1st
kill_funcinfclip( 1127.68 ); // Spawn left 2nd
kill_funcinfclip( 1110.42 ); // Spawn left 3rd
kill_funcinfclip( 1059.74 ); // Spawn left 4th
kill_funcinfclip( 1054.83 ); // Spawn left 5th
kill_funcinfclip( 1216.59 ); // Tunnelside
kill_funcinfclip( 1000.2 ); // Cliffside
kill_funcinfclip( 597.979 ); // End cave connection to map 2 (easter egg spot)
// Prevent falling into a permstuck spot, opened up from above deletions.
make_clip( "_tankstuck_tunnelside", "SI Players", 1, "-1700 -200 -1337", "1700 1024 610", "-13902 -10396 656", "0 45 0" );
}
case "c10m2_drainage":
{
// Excessively problematic map, most specifically the end area, so just
// delete all of these -- Tanks can get out of the map and venture to
// its far extents, but only in end area, and the alternatives messier.
// Also 3 sewer tunnels in the event area that have clips but excess nav.
EntFire( "func_playerinfected_clip", "Kill" );
}
case "c10m3_ranchhouse":
{
// Deleting all func_playerinfected_clip would create new exploits
// in the Survival/finale arena, so instead only delete specific ones.
// Luckily, the Survival arena itself is fine, so doesn't need any
// work, and all spawns fixed below are far away from Survival arena.
kill_funcinfclip( 668.433 ); // Wrongway in beginning area
kill_funcinfclip( 2248.58 ); // Treeline after bus/shed
// New clips to extend behind some func_playerinfected_clips.
make_clip( "_tankstuck_cornerpath", "SI Players", 1, "-700 -800 -145", "800 790 1360", "-13598 -9362 68" );
make_clip( "_tankstuck_mountainwedge", "SI Players", 1, "-100 -100 0", "100 100 1300", "-8388 -3525 300" );
}
case "c10m4_mainstreet":
{
// Tons of possibilities to spawn behind the long row of houses
// so just block them all off, tons of NODRAW and hostile clips.
// Players would only materialize back here in Taaannnk! Mutation.
make_clip( "_tankstuck_houserow", "SI Players", 1, "-2260 -440 0", "3450 900 1850", "68 158 -100" );
// In Versus Survival's event area, block an inaccessible ladder
// (to be restored in the future) behind a barricade, and then
// also clip off excessive navmesh in far dark corner of the map.
make_clip( "_tankstuck_endbarricade", "SI Players", 1, "-400 -900 0", "400 900 1700", "3822 -3970 0" );
make_clip( "_tankstuck_excesscorner", "SI Players", 1, "-200 -100 0", "200 100 1700", "-2520 -5048 -64" );
}
case "c11m1_greenhouse":
{
// Delete 1 clip, opens up a lot to explore but no exploits.
kill_funcinfclip( 1154.43 ); // End area fence barricade
}
case "c11m2_offices":
{
// Block an excess nav area that's quite far behind a fence.
make_clip( "_tankstuck_fencenavarea", "SI Players", 1, "-64 -64 0", "64 64 1400", "10314 3862 16" );
// Final street wrongway barricades.
kill_funcinfclip( 1043.94 ); // Final street left barricade
kill_funcinfclip( 1493.36 ); // Final street right barricade
}
case "c11m3_garage":
{
// When Survivors leave the safe room, Tanks can immediately spawn
// stuck behind the fence. Block it off until future ladder rework.
make_clip( "_tankstuck_startfence", "SI Players", 1, "-1200 -80 0", "720 58 1800", "-4947 -3786 16" );
}
case "c12m1_hilltop":
{
// Thicken 2 wrongway's func_playerinfected_clip. Note this
// works for Taaannnk! Mutation but is a bad ladder to add
// to the vanilla game since it blocks climbability of a
// ladder that'd be climbable for custom servers that delete
// all func_playerinfected_clip.
make_clip( "_tankstuck_wrongwayone", "SI Players", 1, "-320 -800 0", "0 750 1740", "-11967 -10090 450" );
make_clip( "_tankstuck_wrongwaytwo", "SI Players", 1, "-610 0 0", "180 460 1740", "-11604 -9345 450" );
}
case "c12m2_traintunnel":
{
// No issues in the Survival arena, but the end for Taaannnk! can
// result in stuck spawns here. Note this blocks "map 3 easter egg"
// accessible area, and is NOT ideal for vanilla Versus.
make_clip( "_tankstuck_tunnelend", "SI Players", 1, "-320 -800 -120", "450 258 240", "-1551 -10785 50" );
}
case "c12m3_bridge":
{
// Delete 1 wrongway clip. May not be necessary for Survival
// but too close to call; delete for it and Taaannnk! to be safe.
kill_funcinfclip( 311.003 ); // Wrongway at end of train tunnel
}
case "c12m4_barn":
{
// There's 60 func_playerinfected_clip on this map but most smooth
// perimeter fences and all are thick enough to block excess nav.
// Only exception appears to be behind the starting safe room.
make_clip( "_tankstuck_safeback", "SI Players", 1, "-170 -640 -100", "170 225 1700", "7704 -11710 425" );
}
}
##############################################################################################################
##############################################################################################################
##############################################################################################################
##############################################################################################################
######################################
#### MAP-SPECIFIC SCRIPT SPLITS ####
######################################
== c1m2_streets
================
// Resolve stuck Tank spawns for Versus Survival & Taaannnk! Mutation.
if ( g_MutaMode == "mutation15" || g_MutaMode == "mutation19" )
{
// Delete all. Extremely problematic map with countless stuck
// spawns, but Skybox stops most opportunities to get under
// the map and the only way to get out of bounds is limited.
EntFire( "func_playerinfected_clip", "Kill" );
EntFire( g_UpdateName + "_yeswayturnpike_clipb", "Kill" );
}
== c2m2_fairgrounds
====================
// Resolve stuck Tank spawns for Taaannnk! Mutation.
if ( g_MutaMode == "mutation19" )
{
// Delete all. Extremely problematic map with countless stuck
// spawns, but Skybox stops all methods of getting under the map.
// No Survival on this map, so we can assume they'll always be Tank.
EntFire( "func_playerinfected_clip", "Kill" );
}
== c3m1_plankcountry
=====================
// Resolve stuck Tank spawns for Versus Survival & Taaannnk! Mutation.
if ( g_MutaMode == "mutation15" || g_MutaMode == "mutation19" )
{
// Delete all, terrible for stuck spawns. Likely won't allow
// players under the map, and this makes dozens of unused
// perimeter ladders accessible preventing tons of permstucks.
EntFire( "func_playerinfected_clip", "Kill" );
EntFire( g_UpdateName + "_meticulous_funcinfclip01", "Kill" );
// Warp players through one-side invisible solid treeline.
make_axiswarp( "_axiswarp_semitrailer", "y-", 96, "-550 -8 0", "740 8 256", "-9505 10720 155" );
}
== c5m2_park
=============
// Resolve stuck Tank spawns for Taaannnk! Mutation.
if ( g_MutaMode == "mutation19" )
{
// Starting rooftop with a wrongway sign has excess nav behind
// it -- block access to it, which also blocks a permstuck.
make_clip( "_tankstuck_startroof", "SI Players", 1, "-106 -240 0", "86 240 196", "-2936 -816 -58" );
}
== c5m4_quarter
================
// Resolve stuck Tank spawns for Versus Survival & Taaannnk! Mutation.
if ( g_MutaMode == "mutation15" || g_MutaMode == "mutation19" )
{
// Worst map for stuck spawns. Delete all, Skybox and clipping
// bounds the player in and unused perimeter ladders will be put
// to use. There's not even any walkable void under this map.
EntFire( "func_playerinfected_clip", "Kill" );
}
== c6m1_riverbank
==================
// Resolve stuck Tank spawns for Taaannnk! Mutation.
if ( g_MutaMode == "mutation19" )
{
// At the start area, extend a func_playerinfected_clip back a
// bit more to prevent a stuck spawn if Survivors stand back to fence.
make_clip( "_tankstuck_startfence", "SI Players", 1, "-251 -760 0", "173 216 1513", "-261 2872 87" );
}
== c8m1_apartment
==================
// Resolve stuck Tank spawns for Taaannnk! Mutation.
if ( g_MutaMode == "mutation19" )
{
// No Survival on this map, and no Tanks in Scavenge, so extend
// a few func_playerinfected_clip with these.
make_clip( "_tankstuck_alleystart", "SI Players", 1, "-105 -711 0", "823 57 4132", "2473 455 16" );
make_clip( "_tankstuck_alleymiddle", "SI Players", 1, "-127 -257 0", "209 256 4468", "-129 3584 16" );
// And preserve an actually cool Tank spawn by deleting 1 clip.
kill_funcinfclip( 1060.85 ); // Delete clip that blocks the rubble and a cool unique spawn
}
== c8m2_subway
===============
// Resolve stuck Tank spawns for Versus Survival & Taaannnk! Mutation.
if ( g_MutaMode == "mutation15" )
{
// Multiple stuck spawns are only relevant to Taaannnk! Mutation,
// except for this: copy the invisible vending machine so players
// have a visible "step" to get back in bounds. (Not actually stuck)
make_prop( "dynamic", "_cosmetic_oobstep", "models/props/cs_office/vending_machine.mdl", "7366 3801 270", "90 0 0", "shadow_no", "solid_no" );
}
if ( g_MutaMode == "mutation19" )
{
// Multiple tunnel stuck spawns that aren't accessible in Survival,
// that need to only be fixed for Taaannnk! Mutation. Navmesh is
// excessive and extends too far behind these rubbles/wrongways.
make_clip( "_tankstuck_rubblestart", "SI Players", 1, "-139 -107 0", "119 99 177", "1621 3617 -337", "0 42 0" );
make_clip( "_tankstuck_rubblemiddle", "SI Players", 1, "-189 -145 0", "300 179 240", "6766 5299 -336", "0 -68 0" );
make_clip( "_tankstuck_rubblefinal", "SI Players", 1, "-189 -253 0", "140 320 176", "8249 3222 -336", "0 -53 0" );
// Multiple difficult-but-possible to spawn stuck areas in end area.
make_clip( "_tankstuck_endalley1", "SI Players", 1, "-480 -855 0", "65 293 1400", "10303 3479 16" );
make_clip( "_tankstuck_endalley2", "SI Players", 1, "-373 -96 0", "395 99 1400", "11637 5342 16" );
make_clip( "_tankstuck_widestreet", "SI Players", 1, "-842 0 0", "386 555 1400", "10110 6784 8" );
}
== c8m3_sewers
===============
// Resolve stuck Tank spawns for Taaannnk! Mutation.
if ( g_MutaMode == "mutation19" )
{
// Only problems at beginning (due to func_playerinfected_clip,
// which note bot SI can also spawn behind but at least move
// through that), and several end clips -- nothing in Survival area,
// also supplemented with anv_ file make_clip() thickenings.
make_clip( "_tankstuck_startrooftops", "SI Players", 1, "-1749 -380 0", "219 332 750", "12261 4212 464" );
kill_funcinfclip( 606.217 ); // Delete clip behind a fence and inaccessible ladder
kill_funcinfclip( 733.138 ); // Delete clip for end area backstreet wrongway sign left
kill_funcinfclip( 762.564 ); // Delete clip for end area backstreet wrongway sign right
}
== c9m2_lots
=============
// Resolve stuck Tank spawns for Versus Survival & Taaannnk! Mutation.
if ( g_MutaMode == "mutation15" )
{
// Delete 1 *.LMP roadsidefence model to facilitate Infected player travel.
kill_entity( Entities.FindByClassnameNearest( "prop_dynamic", Vector( 8521, 5815, 348 ), 1 ) );
}
if ( g_MutaMode == "mutation19" )
{
// Slightly extend a func_playerinfected_clip back further behind
// starting safe room to fully block all navmesh behind there.
make_clip( "_tankstuck_startback", "SI Players", 1, "-120 -900 0", "120 900 1370", "-835 -110 -223" );
}
== c10m1_caves
===============
// Resolve stuck Tank spawns for Taaannnk! Mutation.
if ( g_MutaMode == "mutation19" )
{
// Delete several specific clips along left side of map. Deleting
// all of them wouldn't be so bad since it's just Tanks, but let's
// not do that anyway in case more Infected ladders are added later.
kill_funcinfclip( 1145.18 ); // Spawn left 1st
kill_funcinfclip( 1127.68 ); // Spawn left 2nd
kill_funcinfclip( 1110.42 ); // Spawn left 3rd
kill_funcinfclip( 1059.74 ); // Spawn left 4th
kill_funcinfclip( 1054.83 ); // Spawn left 5th
kill_funcinfclip( 1216.59 ); // Tunnelside
kill_funcinfclip( 1000.2 ); // Cliffside
kill_funcinfclip( 597.979 ); // End cave connection to map 2 (easter egg spot)
// Prevent falling into a permstuck spot, opened up from above deletions.
make_clip( "_tankstuck_tunnelside", "SI Players", 1, "-1700 -200 -1337", "1700 1024 610", "-13902 -10396 656", "0 45 0" );
}
== c10m2_drainage
==================
// Resolve stuck Tank spawns for Versus Survival & Taaannnk! Mutation.
if ( g_MutaMode == "mutation15" )
{
// Excessively problematic map for Taaannnk! Mutation, but not so much
// for Versus Survival. In the Survival area, there's 3 sewer tunnels
// with excess nav players could spawn behind -- this deletes all of them,
// and there's no way to get under the limited Survival arena.
EntFire( "func_playerinfected_clip", "Kill" );
// Delete 1 *.LMP roadsidefence model to facilitate Infected player travel.
kill_entity( Entities.FindByClassnameNearest( "prop_dynamic", Vector( -8972, -7890, -320 ), 1 ) );
// Add 3 Infected ladders to complement the "stacked blockers" meant
// for AI, which players cannot reasonably know the presence of.
make_ladder( "_ladder_versussurvivalfence1_cloned_tunnelmid", "-9478.5 -7280 -384", "155 45 -410" );
make_ladder( "_ladder_versussurvivalfence2_cloned_tunnelmid", "-9478.5 -7280 -384", "155 0 -410" );
make_ladder( "_ladder_versussurvivalfence3_cloned_tunnelmid", "-9478.5 -7280 -384", "155 -45 -410" );
}
if ( g_MutaMode == "mutation19" )
{
// Excessively problematic map, most specifically the end area, so just
// delete all of these -- Tanks can get out of the map and venture to
// its far extents, but only in end area, and the alternatives messier.
// Also 3 sewer tunnels in the event area that have clips but excess nav.
EntFire( "func_playerinfected_clip", "Kill" );
}
== c10m3_ranchhouse
====================
// Resolve stuck Tank spawns for Taaannnk! Mutation.
if ( g_MutaMode == "mutation19" )
{
// Deleting all func_playerinfected_clip would create new exploits
// in the Survival/finale arena, so instead only delete specific ones.
// Luckily, the Survival arena itself is fine, so doesn't need any
// work, and all spawns fixed below are far away from Survival arena.
kill_funcinfclip( 668.433 ); // Wrongway in beginning area
kill_funcinfclip( 2248.58 ); // Treeline after bus/shed
// New clips to extend behind some func_playerinfected_clips.
make_clip( "_tankstuck_cornerpath", "SI Players", 1, "-700 -800 -145", "800 790 1360", "-13598 -9362 68" );
make_clip( "_tankstuck_mountainwedge", "SI Players", 1, "-100 -100 0", "100 100 1300", "-8388 -3525 300" );
}
== c10m4_mainstreet
====================
// Resolve stuck Tank spawns for Versus Survival & Taaannnk! Mutation.
if ( g_MutaMode == "mutation15" )
{
// In Versus Survival's event area, block an inaccessible ladder
// (to be restored in the future) behind a barricade, and then
// also clip off excessive navmesh in far dark corner of the map.
make_clip( "_tankstuck_endbarricade", "SI Players", 1, "-400 -900 0", "400 900 1700", "3822 -3970 0" );
make_clip( "_tankstuck_excesscorner", "SI Players", 1, "-200 -100 0", "200 100 1700", "-2520 -5048 -64" );
}
if ( g_MutaMode == "mutation19" )
{
// Tons of possibilities to spawn behind the long row of houses
// so just block them all off, tons of NODRAW and hostile clips.
// Players would only materialize back here in Taaannnk! Mutation.
make_clip( "_tankstuck_houserow", "SI Players", 1, "-2260 -440 0", "3450 900 1850", "68 158 -100" );
// In Versus Survival's event area, block an inaccessible ladder
// (to be restored in the future) behind a barricade, and then
// also clip off excessive navmesh in far dark corner of the map.
make_clip( "_tankstuck_endbarricade", "SI Players", 1, "-400 -900 0", "400 900 1700", "3822 -3970 0" );
make_clip( "_tankstuck_excesscorner", "SI Players", 1, "-200 -100 0", "200 100 1700", "-2520 -5048 -64" );
}
== c11m1_greenhouse
====================
// Resolve stuck Tank spawns for Taaannnk! Mutation.
if ( g_MutaMode == "mutation19" )
{
// Delete 1 clip, opens up a lot to explore but no exploits.
kill_funcinfclip( 1154.43 ); // End area fence barricade
}
== c11m2_offices
=================
// Resolve stuck Tank spawns for Versus Survival & Taaannnk! Mutation.
if ( g_MutaMode == "mutation15" )
{
// Final street wrongway barricades -- only left Versus Survival relevant.
kill_funcinfclip( 1043.94 ); // Final street left barricade
}
if ( g_MutaMode == "mutation19" )
{
// Block an excess nav area that's quite far behind a fence.
make_clip( "_tankstuck_fencenavarea", "SI Players", 1, "-64 -64 0", "64 64 1400", "10314 3862 16" );
// Final street wrongway barricades.
kill_funcinfclip( 1043.94 ); // Final street left barricade
kill_funcinfclip( 1493.36 ); // Final street right barricade
}
== c11m3_garage
================
// Resolve stuck Tank spawns for Taaannnk! Mutation.
if ( g_MutaMode == "mutation19" )
{
// When Survivors leave the safe room, Tanks can immediately spawn
// stuck behind the fence. Block it off until future ladder rework.
make_clip( "_tankstuck_startfence", "SI Players", 1, "-1200 -80 0", "720 58 1800", "-4947 -3786 16" );
}
== c12m1_hilltop
=================
// Resolve stuck Tank spawns for Taaannnk! Mutation.
if ( g_MutaMode == "mutation19" )
{
// Thicken 2 wrongway's func_playerinfected_clip. Note this
// works for Taaannnk! Mutation but is a bad ladder to add
// to the vanilla game since it blocks climbability of a
// ladder that'd be climbable for custom servers that delete
// all func_playerinfected_clip.
make_clip( "_tankstuck_wrongwayone", "SI Players", 1, "-320 -800 0", "0 750 1740", "-11967 -10090 450" );
make_clip( "_tankstuck_wrongwaytwo", "SI Players", 1, "-610 0 0", "180 460 1740", "-11604 -9345 450" );
}
== c12m2_traintunnel
=====================
// Resolve stuck Tank spawns for Taaannnk! Mutation.
if ( g_MutaMode == "mutation19" )
{
// No issues in the Survival arena, but the end for Taaannnk! can
// result in stuck spawns here. Note this blocks "map 3 easter egg"
// accessible area, and is NOT ideal for vanilla Versus.
make_clip( "_tankstuck_tunnelend", "SI Players", 1, "-320 -800 -120", "450 258 240", "-1551 -10785 50" );
}
== c12m3_bridge
================
// Resolve stuck Tank spawns for Versus Survival & Taaannnk! Mutation.
if ( g_MutaMode == "mutation15" || g_MutaMode == "mutation19" )
{
// Delete 1 wrongway clip. May not be necessary for Survival
// but too close to call; delete for it and Taaannnk! to be safe.
kill_funcinfclip( 311.003 ); // Wrongway at end of train tunnel
}
== c12m4_barn
==============
// Resolve stuck Tank spawns for Taaannnk! Mutation.
if ( g_MutaMode == "mutation19" )
{
// There's 60 func_playerinfected_clip on this map but most smooth
// perimeter fences and all are thick enough to block excess nav.
// Only exception appears to be behind the starting safe room.
make_clip( "_tankstuck_safeback", "SI Players", 1, "-170 -640 -100", "170 225 1700", "7704 -11710 425" );
}
##############################################################################################################
##############################################################################################################
##############################################################################################################
##############################################################################################################
#####################################################
#### anv_versus.nut -- MAKE_CLIP() THICKENINGS ####
#####################################################
c2m2_fairgrounds:
Find:
make_clip( "_yeswayfairback_funcinfclip", "SI Players", 1, "-1824 -8 -384", "1824 17 384", "-2272 1824 384" );
Replace:
make_clip( "_yeswayfairback_funcinfclip", "SI Players", 1, "-1824 -8 -384", "1824 452 384", "-2272 1824 384" );
c2m3_coaster:
Find:
make_clip( "_trailerfence_clip", "SI Players", 1, "-114 -39 3", "126 761 963", "-1150 2887 -3" );
Replace:
make_clip( "_trailerfence_clip", "SI Players", 1, "-114 -39 3", "702 761 963", "-1150 2887 -3" );
c2m4_barns:
Find:
make_clip( "_eventfence_wrongway", "SI Players", 1, "-210 -20 -608", "200 20 672", "-200 2652 352" );
Replace:
make_clip( "_eventfence_wrongway", "SI Players", 1, "-800 -20 -608", "200 676 672", "-200 2652 352" );
c3m1_plankcountry
Find:
make_clip( "_meticulous_funcinfclip02", "SI Players", 1, "-733 -8 0", "640 8 768", "-2668 416 256" );
make_clip( "_meticulous_funcinfclip03", "SI Players", 1, "-198 -16 0", "198 16 961", "-3516 543 61", "0 -50 0" );
make_clip( "_meticulous_funcinfclip04", "SI Players", 1, "-198 -16 0", "1375 16 961", "-1846 433 61", "0 10 0" );
Replace:
make_clip( "_meticulous_funcinfclip02", "SI Players", 1, "-733 -100 0", "640 8 768", "-2668 416 256" );
make_clip( "_meticulous_funcinfclip03", "SI Players", 1, "-198 -100 0", "320 16 961", "-3516 543 61", "0 -50 0" );
make_clip( "_meticulous_funcinfclip04", "SI Players", 1, "-198 -360 0", "1375 16 961", "-1846 433 61", "0 10 0" );
c6m1_riverbank:
Find:
make_clip( "_infected_mapescape", "SI Players", 1, "-40 -350 -20", "40 440 245", "-1997 1497 192" );
Replace:
make_clip( "_infected_mapescape", "SI Players", 1, "-1000 -350 -20", "40 808 245", "-1997 1497 192" );
c8m1_apartment:
Find:
make_clip( "_meticulous_funcinfclip03", "SI Players", 1, "-153 -812 0", "293 308 4132", "153 2988 352" );
Replace:
make_clip( "_meticulous_funcinfclip03", "SI Players", 1, "-153 -812 -336", "293 308 4132", "153 2988 352" );
c8m2_subway:
Find:
make_clip( "_ladder_generatorwindow_clipa", "SI Players", 1, "-4 -40 -56", "4 128 231", "7944 2512 425" );
make_clip( "_ladder_generatorwindow_clipb", "SI Players", 1, "-4 -40 -56", "4 128 231", "7568 2512 425" );
make_clip( "_ladder_generatorwindow_clipc", "SI Players", 1, "-170 -10 -56", "214 10 231", "7734 2462 425" );
Replace:
make_clip( "_ladder_generatorwindow_clipa", "SI Players", 1, "-4 -40 -56", "376 128 231", "7944 2512 425" );
make_clip( "_ladder_generatorwindow_clipb", "SI Players", 1, "-400 -40 -56", "4 128 231", "7568 2512 425" );
make_clip( "_ladder_generatorwindow_clipc", "SI Players", 1, "-566 -216 -56", "586 10 231", "7734 2462 425" );
c8m3_sewers:
Find:
make_clip( "_burgerfence_blocker1", "SI Players", 1, "-419 -675 0", "-409 615 1202", "10137 6395 8" );
make_clip( "_burgerfence_blocker3", "SI Players", 1, "-419 605 0", "384 615 1202", "10137 6395 8" );
Replace:
make_clip( "_burgerfence_blocker1", "SI Players", 1, "-537 -675 0", "-409 615 1202", "10137 6395 8" );
make_clip( "_burgerfence_blocker3", "SI Players", 1, "-880 605 0", "384 2372 1202", "10137 6395 8" );
c12m1_hilltop:
Find:
make_clip( "_meticulous_funcinfclip08", "SI Players", 1, "-777 -8 0", "1000 8 1372", "-5988 -6941 820" );
make_clip( "_meticulous_funcinfclip09", "SI Players", 1, "-205 -8 0", "1000 8 885", "-5988 -6941 -65" );
Replace:
make_clip( "_meticulous_funcinfclip08", "SI Players", 1, "-777 -8 0", "1000 960 1372", "-5988 -6941 820" );
make_clip( "_meticulous_funcinfclip09", "SI Players", 1, "-205 -8 0", "1000 960 885", "-5988 -6941 -65" );
c12m3_bridge:
Find:
make_clip( "_meticulous_funcinfclip02", "SI Players", 1, "-1000 -17 -170", "1150 17 1408", "262 -11524 321", "0 -21 0" );
make_clip( "_meticulous_funcinfclip03", "SI Players", 1, "-34 -238 0", "57 260 1408", "1323 -12178 321" );
make_clip( "_meticulous_funcinfclip04", "SI Players", 1, "-310 -17 159", "724 17 1408", "1616 -12255 321" );
make_clip( "_meticulous_funcinfclip07", "SI Players", 1, "-48 -555 -216", "17 1414 1408", "3276 -11409 321", "0 -24 0" );
make_clip( "_meticulous_funcinfclip08", "SI Players", 1, "-34 -120 -216", "17 700 1408", "3821 -10047 321", "0 24 0" );
make_clip( "_meticulous_funcinfclip09", "SI Players", 1, "-1600 -30 -216", "1600 17 1408", "1980 -9420 321" );
make_clip( "_meticulous_funcinfclip10", "SI Players", 1, "-600 -70 -216", "600 17 1408", "-132 -9696 321", "0 27 0" );
make_clip( "_meticulous_funcinfclip12", "SI Players", 1, "-3000 -17 -216", "3000 17 1408", "5344 -14507 321" );
make_clip( "_meticulous_funcinfclip13", "SI Players", 1, "-800 -17 -216", "500 17 1408", "9070 -14172 321", "0 25 0" );
Replace:
make_clip( "_meticulous_funcinfclip02", "SI Players", 1, "-1000 -120 -170", "1150 17 1408", "262 -11524 321", "0 -21 0" );
make_clip( "_meticulous_funcinfclip03", "SI Players", 1, "-340 -238 0", "57 260 1408", "1323 -12178 321" );
make_clip( "_meticulous_funcinfclip04", "SI Players", 1, "-310 -420 159", "724 17 1408", "1616 -12255 321" );
make_clip( "_meticulous_funcinfclip07", "SI Players", 1, "-48 -555 -216", "180 1414 1408", "3276 -11409 321", "0 -24 0" );
make_clip( "_meticulous_funcinfclip08", "SI Players", 1, "-34 -120 -216", "260 700 1408", "3821 -10047 321", "0 24 0" );
make_clip( "_meticulous_funcinfclip09", "SI Players", 1, "-1600 -30 -216", "1600 70 1408", "1980 -9420 321" );
make_clip( "_meticulous_funcinfclip10", "SI Players", 1, "-600 -70 -216", "600 170 1408", "-132 -9696 321", "0 27 0" );
make_clip( "_meticulous_funcinfclip12", "SI Players", 1, "-3000 -410 -216", "3000 17 1408", "5344 -14507 321" );
make_clip( "_meticulous_funcinfclip13", "SI Players", 1, "-800 -170 -216", "500 17 1408", "9070 -14172 321", "0 25 0" );
That should be all of them... and to think func_playerinfected_clips are still worse!!
Not all the above were verified Tank stuck spawns, but all thickened where theoretically useful.
At least they're player-only and won't add new SI bot AI stuck spawns.
##############################################################################################################
##############################################################################################################
##############################################################################################################
##############################################################################################################
#########################################################
#### MISC -- UNRELATED / RANDOM BUGS FIXED AS SEEN ####
#########################################################
c5m3_cemetery:
anv_versus.nut -- permstuck spot in far corner of manhole drop area:
make_ladder( "_ladder_permstuckmanhole_cloned_manholeblownwall", "3778 656 100", "3769 2954 -42", "0 -90 0", "0 -1 0" );
c7m2_barge:
anv_versus.nut -- delete clip that blocks SI access into closet at end:
kill_funcinfclip( 196.497 ); // Allow SI access into end closet (the only funcinfclip in entire map)
c8m3_sewers:
anv_versus.nut -- QoL clip that Tanks could also potentially spawn behind:
make_clip( "_tankqol_warehousestrip", "SI Players", 1, "-16 -813 0", "48 731 666", "10488 7589 540" );
anv_mapfixes.nut -- mitigator for getting stuck in scissor lift:
// Mitigator for getting stuck in scissor lift
make_axiswarp( "_axiswarp_scissorlift", "y-", 50, "-53 0 -183", "7 7 42", "12687 7171 16" );
EntFire( "washer_lift_button2", "AddOutput", "OnPressed anv_mapfixes_axiswarp_scissorlift_trigmult:AddOutput:origin 12687 7171 62:4:-1" );
EntFire( "washer_lift_button2", "AddOutput", "OnPressed anv_mapfixes_axiswarp_scissorlift_trigmult:Kill::6:-1" );
c10m1_caves:
anv_mapfixes.nut -- far end of the tunnel beyond a 2nd barricade:
** NOTE: Not related to func_playerinfected_clip, and bot AI confirmed
to also spawn behind here -- while in theory the navmesh could be
updated and a new Infected ladder connected for it, it's really
quite excess, so let's just band-aid fix this for now, Commons can
still spawn behind the (imo redundant) 2nd barricade anyway.
make_clip( "_spawnstuck_tunnelend", "SI Players and AI", 1, "-240 -550 0", "240 600 216", "-12998 -4435 -64" );
c11m4_terminal:
anv_mapfixes.nut -- both Tank players (Versus Survival + Taaannnk! Mutation)
can spawn stuck behind here, as well as bot AI (see above "_spawnstuck" for
the other example of that). This attack cannot be officially restored yet due
to the undeletable wrongway sign (b/c standards), so instead of clipping it
off entirely (gotta keep the cool and definitely-balanced spawns), and to
support this happening in non-Mutations, make it a one-way warp like Dark Carnival 5
was given lots of with TLS to fix its problems. With new QoL clipping. Modded
servers should find this more tolerable than just clipping off the entire area.
make_axiswarp( "_spawnstuck_rubble", "x+", 64, "-8 -88 0", "7 120 192", "-604 5248 296" );
make_clip( "_spawnstuck_rubble_qol", "SI Players and AI", 1, "-95 -128 0", "60 128 4", "-720 5248 360", "-45 0 0" );
make_clip( "_spawnstuck_rubble_oob", "SI Players", 1, "-2 -56 -32", "2 56 56", "-906 5256 344" );
c12m2_traintunnel:
anv_mapfixes.nut -- new permstuck (others like it are for all modes not just Versus btw):
make_clip( "_permstuck_tunnelend", "SI Players", 1, "-16 -16 -16", "16 16 32", "-1445 -10327 -4" );
c12m3_bridge:
anv_mapfixes.nut -- new permstuck, accessible to Survivors if RocketDude/low-gravity:
make_clip( "_permstuck_shedtree", "Everyone", 1, "-14 -14 -164", "14 14 1640", "3085 -14120 88" );
c13m2_southpinestream:
anv_mapfixes.nut -- new shortcut fix... and a new permstuck fix:
make_clip( "_shortcut_eventfence", "Survivors", 1, "-32 -80 0", "32 2 345", "928 5775 415" );
make_clip( "_permstuck_eventfence", "Everyone", 1, "-8 -40 0", "8 40 32", "905 5829 341" );
z_developer_showupdate.nut:
Add support for "trigger_look" -- simply add it in then confirm Fred's 1 in 4 spawn.
Tell Derpduck that it has been updated -- ensure there's no pending changes from his file.
##############################################################################################################
##############################################################################################################
##############################################################################################################
##############################################################################################################
####################################################
#### VERBOSE STUDY OF ALL MAPS (& FRED TESTS) ####
####################################################
/****************************************************************************************************
CREATE GITHUB GIST OF THESE OBSERVATIONS
Background info:
Versus Survival (mutation15) and Taaannnk! (mutation19) have different
gameplay and spawn habits than Versus/Scavenge. All cases where players
begin as Ghost Infected are safe, since they start on top of a Survivor.
When it comes to Survivors spending a long time in one area such as the
case with Versus Survival, this yields to greater likelihood of Tanks
spawning stuck behind func_playerinfected_clip unable to get out. It can
still happen with Versus spawns, though much more rarely and in some spots
it'd be impossible given the linearity of Survivor progression in Versus
and the Tank's spawn reliance on flow, instead of "ghost" merely getting
instantly converted to Tanks as with the case of Taaannnk!! Mutation.
When it comes to Scavenge, there are no Tanks that automatically spawn.
When it comes to Taaannnk! Mutation, Survivors run through the map and
player Tanks spawn constantly, yielding to the highest likelihood of
getting stuck, plus every map supports this Mutation.
When it comes to non-PlayerControlledZombie modes, func_playerinfected_clip
do not block bots, and will not lead to stuck situations.
Problem:
With TLS, a lot of func_playerinfected_clip were deleted and attacks were
restored. This was generally a good thing, except for cases where new clips
with make_clip() calls patched up overly-accessible outskirts of maps and
were too thin to block the space behind them.
The bigger problem is the countless func_playerinfected_clip that were not
deleted, either because restoring those attacks wasn't seen as being worth
the effort or the had undeletable prop_static wrongway signs that would've
confused newer players as they emerge through them.
Vulnerability:
Any spot with a make_clip() "SI Players" call or a func_playerinfected_clip
that also has navmesh behind it is vulnerable.
Solutions:
NOTHREAT is not one of them, see below.
Thicken make_clip()'s so players can't spawn behind them anymore.
Add axiswarps (i.e. c11m4_terminal) for maps that are otherwise OK but
just have a single issue or so.
Delete all func_playerinfected_clips for maps where it's unusually bad,
provided it doesn't introduce any exploits. Deleting all of them on a
handful of specific maps is safer than blanket-deleting them for all.
What's the "cutoff point" for this, where things are so bad
that they warrant this?
It's warranted if there's 6+ stuck spawn spots and at least one
of them would require several clips. Or if they're attacks that
should be properly restored in the future, but will take a lot
of work to do so (i.e. new Propper models, editing BSP prop_static).
Regarding NOTHREAT:
For c11m4_terminal I was going to try something like this at first:
script SpawnEntityFromTable( "func_nav_attribute_region", { targetname = g_UpdateName + "_tankstuck_rubble", origin = Vector( x, y, z ), spawnflags = 524288 } );
https://developer.valvesoftware.com/wiki/Func_nav_attribute_region
https://developer.valvesoftware.com/wiki/L4D_Level_Design/Nav_Meshes#All_Attributes
NOTHREAT is defined as:
Navigation meshes with this attribute will not allow THREAT to
perform its action when it is applied on itself.
THREAT is defined as:
Acts as spawn area suggestions for Boss Infected (Tank & wWtch).
Only nav areas along theESCAPE_ROUTEpath are candidates for
THREAT attribute. If the respective portion of the escape route
path has already been reached,THREATwill be removed automatically.
Requiresnav_analyzeto appear naturally.
So, if it's only Tank/Witch, turns out this might actually be viable. For
this map specifically (c11m4_terminal) a clip blocker is non-ideal since
server configs which delete all "func_playerinfected_clip" would expect to
have access to this area.
Preventing Witch spawns behind the rubble should be harmless, and Tank spawns
very acceptable compared to the alternative of inaccessibility.
c11m4_terminal:
Test-only clip for blocking out the nav region:
script make_clip( "_test", "SI Players", 1, "-360 -626 -100", "128 340 216", "-724 5745 384" );
New func_nav_attribute_region:
SpawnEntityFromTable( "func_nav_attribute_region", { targetname = g_UpdateName + "_tankstuck_rubble", origin = Vector( -724, 5745, 384 ), spawnflags = 524288 } );
EntFire( g_UpdateName + "_tankstuck_rubble", "AddOutput", "mins -360 -626 -100" );
EntFire( g_UpdateName + "_tankstuck_rubble", "AddOutput", "maxs 128 340 216" );
EntFire( g_UpdateName + "_tankstuck_rubble", "AddOutput", "solid 2" );
EntFire( g_UpdateName + "_tankstuck_rubble", "ApplyNavAttributes" );
Result:
NOTHREAT does appear on all the desired nav.
But spawning with "ghost" or running out the timer, if the Survivor bots
are on the escalator, Tank will occasionally spawn outside here.
NOTHREAT is NOT a solution.
Perfect bind, just be sure Survivors are a bit ahead of the area you actually want to spawn:
warp_far_survivor_here
nav_edit 1; z_debug 1
bind v "kill; host_timescale 10; wait 200; host_timescale 0; ghost"
For finding func_playerinfected_clip values:
script printl(NetProps.GetPropFloat( Entities.FindByClassname(null,"func_playerinfected_clip"), "m_Collision.m_flRadius" ))
ent_remove func_playerinfected_clip
find_ent func_playerinfected_clip
Easier func_playerinfected_clip values:
script_execute z_developer_scouteditor
script AssessBadClips()
c1m2_streets:
CONCLUSION
----------
Update the mutation15 (Versus Survival) and mutation19 (Taaannnk!!)
scripts to delete all func_playerinfected_clip and only on this map.
Skyboxes:
Tanks and Hunters will be able to venture to the bounds
of the map, but skybox will stop them.
Under map:
It's possible to get under the map under the overpass if
all of them are deleted, but at worst Tanks will be able
to throw rocks through a displacement, and Hunters/Smokers
won't be able to actually get under the map.
The only way out is also not in the Survival area.
Simplest solution by far.
SKIPPED
-------
Extremely problematic and known solutions would be excessively messy,
as in ZoneMod configs would be almost absolutely obligated to delete
the fixes since they allow access behind undeletable wrongways.
Overpass / back area / bus:
setpos_exact -1249 407 411; setang_exact 2 -138 0
The SI-only clip I added for TLS is the least of our problems when
Valve's func_playerinfected_clip block exit off most of the overpass,
going over the back fence, and the bus.
If NOTHREAT actually worked, this would be viable -- but nope.
Undeletable wrongway to left of staircase chokepoint building:
Could add an axiswarp here, but it'd only solve a tiny spot.
Raised platform behind floodlight generator:
Can also spawn stuck behind func_playerinfected_clip here.
Back of all the hedges after one-way drop:
Tried to re-work this for TLS but it was sub-optimal and cut.
The Tanks spawning behind the hedges here aren't surprising,
and given the curvature of the hedges, unrealistic to axiswarp
and sloppy to clip off entirely.
End area next to safe room:
The func_playerinfected_clip are much farther back than I expected.
I can only reproduce stuck spawns if Survivors are standing in
the event area with the hedge -- not if they're near end safe room.
c2m2_fairgrounds:
There is 1 make_clip() that causes issues here.
Before:
make_clip( "_yeswayfairback_funcinfclip", "SI Players", 1, "-1824 -8 -384", "1824 17 384", "-2272 1824 384" );
After:
make_clip( "_yeswayfairback_funcinfclip", "SI Players", 1, "-1824 -8 -384", "1824 452 384", "-2272 1824 384" );
func_playerinfected_clip confirmed stuck spawns, all of these would
require axiswarps each (some multiple) to fix them:
Behind the fence at the ticket booths besides the RIDES building
Behind the RIDES building with the shipping container
Behind the hedges in starting tent area before first interior
Train tunnel high-up rooftop
Train tunnel behind the wrongway signs
Undeletable wrongway behind electrical box and wall in the final area
Various rooftop outskirts in final area (unconfirmed, too many, just
assume, even though for most Survivors would need to almost deliberate
position themselves to make Tanks spawn stuck)
CONCLUSION:
Like c1m2_streets... delete all func_playerinfected_clip on this map, too,
for mutation15 and mutation19.
Skybox bounds are pretty blocky this map, there's no way to get out
and under the map, there's no Versus Survival on this map so we can
assume the players are always Tanks,
c2m3_coaster:
This map natively gives SI a lot of (unnecessary) out of bounds access,
and the only spot that would have warranted an axiswarp has a properly
thick func_playerinfected_clip that would block spawns there anyway.
The hedge outskirts of the coaster area is a bad place to spawn, but
there is one ladder to get out. Valve also has a wrongway with a dead
ladder out here that won't be restored, or fixed here, as it's no stuck.
Before:
make_clip( "_trailerfence_clip", "SI Players", 1, "-114 -39 3", "126 761 963", "-1150 2887 -3" );
After:
make_clip( "_trailerfence_clip", "SI Players", 1, "-114 -39 3", "702 761 963", "-1150 2887 -3" );
c2m4_barns:
Immediate start behind the fence would be a problem space but with
TLS funcinfclip() were killed there to allow access.
The only confirmed issue is the make_clip() at the end.
Before:
make_clip( "_eventfence_wrongway", "SI Players", 1, "-210 -20 -608", "200 20 672", "-200 2652 352" );
After:
make_clip( "_eventfence_wrongway", "SI Players", 1, "-800 -20 -608", "200 676 672", "-200 2652 352" );
c2m5_concert:
Already solved several Tank stuck spawns that happened in Versus by
using axiswarps -- nothing to worry about here.
This is a good example of the epitome of how bad Tank stuck spots can
get, though.
c3m1_plankcountry:
Another example of an axiswarp, where Tanks pre-TLS could spawn stuck
behind the trains. This was the first time axiswarp was used, and it
also doubles as an invisible wall for Survivors attempting to exploit
out the map to space SI Players cannot access b/c the func_playerinfected_clip.
Needs a 2nd (new) axiswarp though...
Semitrailer to the right of the garage at the start has navmesh behind it.
If Survivors wedge themselves into the corner next to the wooden fence,
Tanks actually can spawn far behind it enough to get stuck. Add axiswarp:
make_axiswarp( "_axiswarp_semitrailer", "y-", 96, "-550 -8 0", "740 8 256", "-9505 10720 155" );
PROBLEM:
Use "r_drawclipbrushes 2" and look at the Survivor-only clips along
the right perimeter of the map. All are also func_playerinfected_clip.
The entire right perimeter is space Tanks can automatically spawn
behind and be permanently stuck.
For mutation15+mutation19, delete this new clip:
EntFire( g_UpdateName + "_meticulous_funcinfclip01", "Kill" );
And then for mutation15+mutation19, delete ALL func_playerinfected_clip.
There's an unrealistic amount of spawn issues to solve on this map, RED
clips and Skybox do a well enough job of preventing too far out of bounds
or under-map access.
make_clip() calls at the end safe room -- thicken those back to prevent
spawns back there, these clips are needed anyway to prevent a Tank player
from potentially going too far out of bounds, on top of the safe room,
and standing on the trigger to prevent Survivors from finishing.
Before:
make_clip( "_meticulous_funcinfclip02", "SI Players", 1, "-733 -8 0", "640 8 768", "-2668 416 256" );
make_clip( "_meticulous_funcinfclip03", "SI Players", 1, "-198 -16 0", "198 16 961", "-3516 543 61", "0 -50 0" );
make_clip( "_meticulous_funcinfclip04", "SI Players", 1, "-198 -16 0", "1375 16 961", "-1846 433 61", "0 10 0" );
After:
make_clip( "_meticulous_funcinfclip02", "SI Players", 1, "-733 -100 0", "640 8 768", "-2668 416 256" );
make_clip( "_meticulous_funcinfclip03", "SI Players", 1, "-198 -100 0", "320 16 961", "-3516 543 61", "0 -50 0" );
make_clip( "_meticulous_funcinfclip04", "SI Players", 1, "-198 -360 0", "1375 16 961", "-1846 433 61", "0 10 0" );
Being the map with the most ladders, most of them on the perimeter
and useless, at least killing all func_playerinfected_clips won't
make them all permstuck spots... they'll actually see some use now lol.
c3m3_shantytown:
Seems fine, cleaning up start area for TLS fixed a lot.
Navmesh doesn't go far out the map, unlike map 1. At the area with
the generator, there's also a distant corner with wrongways and
func_playerinfected_clip -- but they're thick and block spawns
over the slightly over-extended navmesh.
Hard Rain:
All fine.
c5m2_park:
Concrete barricade at the start has an unusable Infected ladder behind
it, but the func_playerinfected_clip extends far back blocking spawns.
One exception is a starting rooftop, with a wrongway, and 1 exposed nav
area behind it, I could repro getting Tank to spawn back there. There's
also a spot to permanently fall into if you spawn back there. Instead of
using an axiswarp, just block the nav area behind it with a clip -- no
one is going to be inconvenienced by the existence of this clip and it
avoids needing to patch the permstuck since it'll be impossible to reach:
make_clip( "_tankstuck_startroof", "SI Players", 1, "-106 -240 0", "86 240 196", "-2936 -816 -58" );
c5m3_cemetery:
UNRELATED:
New ladder to fix permstuck spot far back in manhole one-way area:
make_ladder( "_ladder_permstuckmanhole_cloned_manholeblownwall", "3778 656 100", "3769 2954 -42", "0 -90 0", "0 -1 0" );
c5m4_quarter:
CONCLUSION:
Delete all func_playerinfected_clip.
The map Skybox/clipping is tight enough and there's not even
any walkable space under the entirety of this map.
Countless problems, where navmesh extends far beyond wrongway signs
which have func_playerinfected_clip:
Both ends and the side of the first mainstreet have wrongway
signs with extensive navmesh and even unusable ladders behind
them (that weren't worth restoring with TLS / undeletable wrongways)
Both ends of second mainstreet.
The entire wide road leading to the end area's overpass has
unusable ladders, inaccessible areas, and excessive navmesh
3 sections of fence in the end area cannot be climbed, have
undeletable wrongway signs, but at least have ladders behind
them allowing escape once func_playerinfected_clip are deleted
Contender for worst map. Need a future BSP/LMP edit to restore that
end overpass attack, as well -- it's all awful.
Passing:
Navmesh extends very far beyond wrongway signs, BUT func_playerinfected_clip
were made thick enough (thanks Valve) to eliminate any and all issues.
There's lots of navmesh to spawn on, but it's all thickly blocked off.
c6m1_riverbank:
Spoke too soon -- the fence at the start has its func_playerinfected_clip
extend far back, but not back enough to cover all navmesh and not off to
the side, where Tanks can spawn stuck if Survivor's backs are to the fence:
make_clip( "_tankstuck_startfence", "SI Players", 1, "-251 -760 0", "173 216 1513", "-261 2872 87" );
And extend the yellow block added with TLS clip back...
Before:
make_clip( "_infected_mapescape", "SI Players", 1, "-40 -350 -20", "40 440 245", "-1997 1497 192" );
After:
make_clip( "_infected_mapescape", "SI Players", 1, "-1000 -350 -20", "40 808 245", "-1997 1497 192" );
c7m2_barge:
Delete func_playerinfected_clip that blocks SI access from a closet at the end:
kill_funcinfclip( 196.497 ); // Allow SI access into end closet (the only funcinfclip in entire map)
c8m1_apartment:
Could've been hell but for TLS extensive clip rework, func_playerinfected_clip
were deleted and the replacement clips replicated their thickness. No issues.
Nevermind -- there's a few problematic back alleys... and axiswarps on this map
would be bad practice since they'd be used at inclines where the axis offset
would result in the player getting stuck -- so use make_clip() for all.
One clip just needs lengthening so it reaches the ground...
Before:
make_clip( "_meticulous_funcinfclip03", "SI Players", 1, "-153 -812 0", "293 308 4132", "153 2988 352" );
After:
make_clip( "_meticulous_funcinfclip03", "SI Players", 1, "-153 -812 -336", "293 308 4132", "153 2988 352" );
NEW:
make_clip( "_tankstuck_alleystart", "SI Players", 1, "-105 -711 0", "823 57 4132", "2473 455 16" );
make_clip( "_tankstuck_alleymiddle", "SI Players", 1, "-127 -257 0", "209 256 4468", "-129 3584 16" );
Delete specific func_playerinfected_clip... the spawn was too unique to block:
kill_funcinfclip( 1060.85 ); // Delete clip that blocks the rubble and a cool unique spawn
c8m2_subway:
New, multiple places to spawn stuck behind rubble where navmesh is excessive:
make_clip( "_tankstuck_rubblestart", "SI Players", 1, "-139 -107 0", "119 99 177", "1621 3617 -337", "0 42 0" );
make_clip( "_tankstuck_rubblemiddle", "SI Players", 1, "-189 -145 0", "300 179 240", "6766 5299 -336", "0 -68 0" );
make_clip( "_tankstuck_rubblefinal", "SI Players", 1, "-189 -253 0", "140 320 176", "8249 3222 -336", "0 -53 0" );
All Generator Room Window clips introduced with TLS need thickening...
Before:
make_clip( "_ladder_generatorwindow_clipa", "SI Players", 1, "-4 -40 -56", "4 128 231", "7944 2512 425" );
make_clip( "_ladder_generatorwindow_clipb", "SI Players", 1, "-4 -40 -56", "4 128 231", "7568 2512 425" );
make_clip( "_ladder_generatorwindow_clipc", "SI Players", 1, "-170 -10 -56", "214 10 231", "7734 2462 425" );
After:
make_clip( "_ladder_generatorwindow_clipa", "SI Players", 1, "-4 -40 -56", "376 128 231", "7944 2512 425" );
make_clip( "_ladder_generatorwindow_clipb", "SI Players", 1, "-400 -40 -56", "4 128 231", "7568 2512 425" );
make_clip( "_ladder_generatorwindow_clipc", "SI Players", 1, "-566 -216 -56", "586 10 231", "7734 2462 425" );
NEW:
make_clip( "_tankstuck_endalley1", "SI Players", 1, "-480 -855 0", "65 293 1400", "10303 3479 16" );
make_clip( "_tankstuck_endalley2", "SI Players", 1, "-373 -96 0", "395 99 1400", "11637 5342 16" );
make_clip( "_tankstuck_widestreet", "SI Players", 1, "-842 0 0", "386 555 1400", "10110 6784 8" );
c8m3_sewers (blocker2 doesn't have nav behind it):
Before:
make_clip( "_burgerfence_blocker1", "SI Players", 1, "-419 -675 0", "-409 615 1202", "10137 6395 8" );
make_clip( "_burgerfence_blocker3", "SI Players", 1, "-419 605 0", "384 615 1202", "10137 6395 8" );
After:
make_clip( "_burgerfence_blocker1", "SI Players", 1, "-537 -675 0", "-409 615 1202", "10137 6395 8" );
make_clip( "_burgerfence_blocker3", "SI Players", 1, "-880 605 0", "384 2372 1202", "10137 6395 8" );
NEW TANKSTUCK FIXES:
make_clip( "_tankstuck_startrooftops", "SI Players", 1, "-1749 -380 0", "219 332 750", "12261 4212 464" );
make_clip( "_tankstuck_warehousestrip", "SI Players", 1, "-16 -813 0", "48 731 666", "10488 7589 540" );
Lots of places in the final area after exiting from manhole. Instead of making
massive clips everywhere (at least 3 very large clips required), and given the
likelihood of Tanks spawning BEHIND Survivors not even falling victim to most
of this stuck potential, simply delete their specific func_playerinfected_clip...
even axiswarps would be overkill:
kill_funcinfclip( 606.217 ); // Delete clip behind a fence and inaccessible ladder
kill_funcinfclip( 733.138 ); // Delete clip for end area backstreet wrongway sign left
kill_funcinfclip( 762.564 ); // Delete clip for end area backstreet wrongway sign right
NEW FRED:
Sample trigger_look:
1 in 5 chance on c3m2_swamp:
{
"origin" "-4730.83 3734.91 58.878"
"targetname" "case_bucket"
"Case05" "5"
"Case04" "4"
"Case03" "3"
"Case02" "2"
"Case01" "1"
"classname" "logic_case"
"hammerid" "1876333"
"OnCase01" "template_bucketForceSpawn0-1"
"OnCase02" "nullTrigger0-1"
"OnCase03" "nullTrigger0-1"
"OnCase04" "nullTrigger0-1"
"OnCase05" "nullTrigger0-1"
}
{
"model" "*40"
"Timeout" "0"
"targetname" "looktrigger_bucket"
"target" "bucket_pills"
"StartDisabled" "0"
"spawnflags" "129"
"origin" "-4698 3692 52"
"LookTime" "0.5"
"filtername" "filter_survivor"
"FieldOfView" "0.5"
"classname" "trigger_look"
"hammerid" "1876233"
"OnTrigger" "!activatorSpeakResponseConceptc3m2disgust01"
}
{
"origin" "-4711 3686.9 20.7482"
"Template02" "looktrigger_bucket"
"Template01" "bucket_pills"
"targetname" "template_bucket"
"spawnflags" "2"
"classname" "point_template"
"hammerid" "1876270"
}
{
"origin" "-4692 3678 22"
"targetname" "bucket_pills"
"spawnflags" "2"
"solid" "6"
"angles" "30 330 -180"
"classname" "weapon_pain_pills_spawn"
"hammerid" "1797433"
}
https://developer.valvesoftware.com/wiki/Trigger_look
Oklol
FINAL FRED (note player must be standing inside this trigger while looking at Fred):
// Fire once and only for Clients, both Survivor and Infected players.
// Scurries away after 1 second when viewed at any angle (-1).
make_prop( "dynamic", "_fred", "models/props_fairgrounds/alligator.mdl", "13099 11539 -25", "0 120 0", "shadow_no", "solid_no" );
SpawnEntityFromTable( "func_movelinear",
{
targetname = g_UpdateName + "_fred_movelinear",
spawnflags = 0,
movedistance = 200,
speed = 80,
startposition = 0,
movedir = Vector( 0, -148, 0 ),
origin = Vector( 13099, 11539, -25 )
} );
EntFire( g_UpdateName + "_fred", "SetParent", g_UpdateName + "_fred_movelinear" );
SpawnEntityFromTable( "trigger_look",
{
targetname = g_UpdateName + "_fred_triglook",
target = g_UpdateName + "_fred",
spawnflags = 129,
LookTime = 1,
FieldOfView = -1,
origin = Vector( 13072, 11520, -25 )
} );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "mins -42 -38 -480" );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "maxs 42 38 0" );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "solid 2" );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "OnTrigger anv_mapfixes_fred_movelinear:Open::0:-1" );
c8m4_interior:
Other side of window glass in lobby has no navmesh, whew.
No navmesh on top of elevator either, else they'd be stuck between wrongways.
Crash Course:
EXTREMELY EXCESSIVE navmesh that allows players to potentially spawn far
outside the map, but ladders exist to get back in bounds, and there's no
func_playerinfected_clip or wrongways that hinder getting back in bounds.
Lots of space to move around, all traversible, no problems.
Behind map 1 safe room is ALMOST a problem but Valve's func_playerinfected_clip
are thick and block un-noclipping in all areas behind there.
Map 2 -- some potential problem areas, but Valve's clips are thick for most.
Extremely well-made, thick, and thorough func_playerinfected_clips.
c9m2_lots:
One exception is behind starting safe room, the func_playerinfected_clip is
not thick enough to fully block all navmesh behind there:
make_clip( "_tankstuck_startback", "SI Players", 1, "-120 -900 0", "120 900 1370", "-835 -110 -223" );
c10m1_caves:
Along the entire left side of the map is a bad place for stuck spawns
as the navmesh extends far beyond the func_playerinfected_clip. Also,
deleting all func_playerinfected_clip on this map would open up several
ways to get under the map, permstuck'd, or players getting plain lost.
To solve stuck spots while minimizing damage, delete only specific ones,
and patching them up flawlessly isn't critical, since Versus Survival is
not on this map, so Smokers aren't getting under it:
kill_funcinfclip( 1145.18 ); // Spawn left 1st
kill_funcinfclip( 1127.68 ); // Spawn left 2nd
kill_funcinfclip( 1110.42 ); // Spawn left 3rd
kill_funcinfclip( 1059.74 ); // Spawn left 4th
kill_funcinfclip( 1054.83 ); // Spawn left 5th
kill_funcinfclip( 1216.59 ); // Tunnelside
kill_funcinfclip( 1000.2 ); // Cliffside
kill_funcinfclip( 597.979 ); // End cave connection to map 2
That last funcinfclip "End cave connection to map 2" has an inaccessible
ladder in what would've been a permstuck spot -- cool easter egg to keep,
definitely don't thickly clip that off. Note that I'm leaving the flat
tree line, which is actually a deletable func_illusionary... player can
still walk through it (after kill_funcinfclip) to reach easter egg.
Tanks will be able to go out of bounds, but Skybox stop mostly all efforts,
and the most harm this could possibly cause is them throwing rocks.
Semi-sloppy all-encompassing Taaannnk-only clip -- to prevent easily falling
into a permstuck spot:
make_clip( "_tankstuck_tunnelside", "SI Players", 1, "-1700 -200 -1337", "1700 1024 610", "-13902 -10396 656", "0 45 0" );
If Survivors stand at the tunnel's end barricade Tank will almost always spawn
far behind it stuck with no ladders -- once blocked off, Tank doesn't spawn
back here at all anymore, not even the part that isn't func_playerinfected_clipped,
which is OK, since it's better than spawning stuck exposed to world void:
make_clip( "_tankstuck_tunnelend", "SI Players", 1, "-240 -550 0", "240 600 216", "-12998 -4435 -64" );
c10m2_drainage:
I've never seen a Versus Tank spawn stuck inside the 3 event area tunnels.
In Versus Survival / Taaannnk that would be possible, though.
There's also lots of func_playerinfected_clip in the end area that navmesh
extends far beyond, as well... axiswarps are dumb, deleting func_playerinfected_clip
would allow players to go to the far extents of the map, they can walk far
enough and fall into the map, emerge through displacement walls, etc.
Clips would need to be far too huge to solve this.
One axiswarp would need to be angled, and is dumb since it doesn't stop a
bad Tank spawn from still traveling to map extents.
Killing all func_playerinfected_clip on this map... sounds like the best option?
And that's concerning when it introduces potential exploits.
Those "exploits" would only impact the end area, NOT the small Versus Survival area.
To let this map slide, and for just a Mutation, deleting all these clips on
some maps (instead of just specific ones) will be the minimalist code solution.
ALTERNATIVE PLAN ??:
1. Fix make_clip() calls by thickening them, the ones that create real issues
2. Delete all func_playerinfected_clip for all maps, in both Mutations ??
3. AssessBadClips() to assess what was deleted, and patch created exploits
4. Profit ?? Avoid MASSIVE_CODE_BLOAT just for 2 Mutations.
c10m3_ranchhouse:
Lots of ways to get under the Versus Survival area if all funcinfclip are deleted.
Fortunately the navmesh/funcinfclip at the Survival area behave, it's just
earlier deadends and mountaintops in the map that would be problematic.
Deleting all func_playerinfected_clip on this map would be objectively bad.
Delete specific ones, more so near the beginning, and call it a day:
kill_funcinfclip( 668.433 ); // Wrongway in beginning area
There's a far corner where deleting the func_playerinfected_clip would allow
a player to unknowingly get themselves stuck behind another funcinfclip, so
here it's actually best to just use a new thick make_clip() since a clip
would've been needed to resolve a stuck spot anyway:
make_clip( "_tankstuck_cornerpath", "SI Players", 1, "-700 -800 -145", "800 790 1360", "-13598 -9362 68" );
The mountaintop's func_playerinfected_clip are thick enough to cover MOST
excessive navmesh, except this small wedge:
make_clip( "_tankstuck_mountainwedge", "SI Players", 1, "-100 -100 0", "100 100 1300", "-8388 -3525 300" );
Delete func_playerinfected_clip along treeline, to solve at least 2 stuck spots:
kill_funcinfclip( 2248.58 ); // Treeline
c10m4_mainstreet:
Lots of possibilities to spawn behind the long row of houses, which
have thick func_playerinfected_clip but they're not thick enough. Block
all of these with a mutation15/19-exclusive long clip:
make_clip( "_tankstuck_houserow", "SI Players", 1, "-2260 -440 0", "3450 900 1850", "68 158 -100" );
In Versus Survival's event area, the end of the street is a popular camp.
It's also easy to spawn as Tank stuck behind the func_playerinfected_clip
there. With TLS, given the undeletable wrongway sign, reviving the Infected
ladder back there was done, but cut to maximize quality -- what resulted is
the stuck spot. As it's only an issue in mutation15/19, and for arguable
balance reasons to allow Survivors to have their back safely against the
barricade, just create a large clip to block off the navmesh behind the
barricade... hurts, but in the future we may re-restore it:
make_clip( "_tankstuck_endbarricade", "SI Players", 1, "-400 -900 0", "400 900 1700", "3822 -3970 0" );
Can't reproduce a spawn here, but it's the last uncovered excessive navmesh:
make_clip( "_tankstuck_excesscorner", "SI Players", 1, "-200 -100 0", "200 100 1700", "-2520 -5048 -64" );
c10m5_houseboat:
This map is the definition of excessive navmesh, but at least apparently
all the func_playerinfected_clip are extremely thick and cover all of it.
Doesn't seem to be any issues here.
c11m1_greenhouse:
The low ground has minimalist navmesh. At the Smoker ladder setup there is
a part of a large navarea sticking through a func_playerinfected_clip, but
I can't reproduce a spawn behind it, and it's only a small bit of nav.
In the end area, there's a lot of navmesh behind the fence barricade and
the wrongway signs behind it -- there's a lot of area to explore back there,
but it's harmless, so just delete that clip:
kill_funcinfclip( 1154.43 ); // End area fence barricade
c11m2_offices:
Tight interconnected map, one issue behind this fence though, clip it
because killing the clip would expose the player to getting stuck
behind another clip:
make_clip( "_tankstuck_fencenavarea", "SI Players", 1, "-64 -64 0", "64 64 1400", "10314 3862 16" );
Final street has wrongway barricades at both ends, both of which Tanks
can spawn behind -- delete those func_playerinfected_clip as the most
minimalist solution, it'd just expose the player to NODRAW ugly but
only if they knowingly venture away from critical path:
kill_funcinfclip( 1043.94 ); // Final street left barricade
kill_funcinfclip( 1493.36 ); // Final street right barricade
At some point, exposing players to ugly NODRAW space in niche Mutations
could put them on a track of game development in life by sparking their
curiosity... this isn't so bad tbh.
c11m3_garage:
It's extremely common to spawn stuck on the opposite side of the
fence at the start. Instead of deleting the func_playerinfected_clip
and adding Infected ladders (should be done optionally in the future
anyway), which would still expose the player to map 2's eerie space,
just block it off entirely with a clip. Roof spawns better anyway:
make_clip( "_tankstuck_startfence", "SI Players", 1, "-1200 -80 0", "720 58 1800", "-4947 -3786 16" );
Above clip will only be mutation15/19, so doesn't hurt custom Versus configs.
At the transformer yard / Versus Propper brick wall, "_yeswayfence_funcinfclip1"
is thick enough to cover most of the navmesh to bother thickening it more,
I cannot reproduce a Tank spawn on the tiny sliver behind it.
Overall, TLS construction area rework prevented a few would-have-been issues,
and Valve's wrongway func_playerinfected_clip are thick where they need to be.
No more apparent issues.
c11m4_terminal:
Add an axiswarp -- instead of deleting the func_playerinfected_clip (which
has an undeletable prop_static wrongway sign), just warp the player through
it. Servers are free to delete this and would notice the least difference
from solving this with a clip.
make_axiswarp( "_tankstuck_rubble", "x+", 64, "-8 -88 0", "7 120 192", "-604 5248 296" );
Extra slanted clip to assist with climbing OUT of the rubble:
make_clip( "_tankstuck_rubble_clip", "SI Players and AI", 1, "-95 -128 0", "60 128 4", "-720 5248 360", "-45 0 0" );
Blocker from falling out of bounds:
make_clip( "_tankstuck_rubble_oob", "SI Players", 1, "-2 -56 -32", "2 56 56", "-906 5256 344" );
After the Atlas statue beyond the rubble, the very distant wrongway sign
has a thin func_playerinfected_clip... can't reproduce a spawn behind
there, and it is very far away, so I think ignore that one.
c11m5_runway:
Unprecedented walkable space for a map, and the func_playerinfected_clip
are extremely thick, so there's no issues here.
c12m1_hilltop:
After the bridge there's a house with 2 wrongways behind it and lots of
navmesh behind them -- thicken those func_playerinfected_clips (note that
eventually these clips could be used to REPLACE them entirely):
make_clip( "_tankstuck_wrongwayone", "SI Players", 1, "-320 -800 0", "0 750 1740", "-11967 -10090 450" );
make_clip( "_tankstuck_wrongwaytwo", "SI Players", 1, "-610 0 0", "180 460 1740", "-11604 -9345 450" );
CAUTION:
For servers that delete ALL func_playerinfected_clip, there is
a ladder up the cliff that the new "_tankstuck_wrongwayone" clip
would immediately block.
At this point, with all these stuck fixes, there's very little
reason for these clips to appear in Versus mode anyway... there's
no way a Tank will spawn behind there in Versus, and Ghost Infected
appear on top of Survivors... there's no reason to have them.
So, really should be mutation15/19-only at this point... MOST of them.
What's 100% fine for vanilla Versus can and might result in fringe
conditions depending on how competitive servers allow access behind
undeletable wrongway signs (or deletable ones).
Two make_clip()'s at end rooftop have navmesh behind them, so thicken them...
Before:
make_clip( "_meticulous_funcinfclip08", "SI Players", 1, "-777 -8 0", "1000 8 1372", "-5988 -6941 820" );
make_clip( "_meticulous_funcinfclip09", "SI Players", 1, "-205 -8 0", "1000 8 885", "-5988 -6941 -65" );
After:
make_clip( "_meticulous_funcinfclip08", "SI Players", 1, "-777 -8 0", "1000 960 1372", "-5988 -6941 820" );
make_clip( "_meticulous_funcinfclip09", "SI Players", 1, "-205 -8 0", "1000 960 885", "-5988 -6941 -65" );
c12m2_traintunnel:
The end of the tracks outside has navmesh respect the func_playerinfected_clip,
the top map 1 area has no navmesh, everything is good... except the end.
Add a clip that extends further down the tracks at the end to block excess nav:
make_clip( "_tankstuck_tunnelend", "SI Players", 1, "-320 -800 -120", "450 258 240", "-1551 -10785 50" );
Another (smaller reason this time) for making this mutation15/19-only: above
clip is a little bit too thick toward the safe room and blocks exploration of
the map 3 section that's considered a small easter egg since it can be accessed
from map 2... so, yeah, don't add this to Versus... there's no reason for it.
NEW PERMSTUCK:
make_clip( "_permstuck_tunnelend", "SI Players", 1, "-16 -16 -16", "16 16 32", "-1445 -10327 -4" );
c12m3_bridge:
After redoing the huge grouped func_playerinfected_clip for TLS, there's
only 2 left: one that's OK for the bridge ("bridge_pz_clip") and then
at the end of the train tunnel, a wrongway, remove for mutation15/19:
kill_funcinfclip( 311.003 ); // Wrongway at end of train tunnel
Other than that, the replacement make_clip()'s for TLS should be thickened...
an overwhelming several of them, but it must be done to be 100% thorough...
Total list for reference == 2 + 3 + 4 + 7 + 8 + 9 + 10 + 12 + 13
Total of 12 don't need thickening
Before:
make_clip( "_meticulous_funcinfclip02", "SI Players", 1, "-1000 -17 -170", "1150 17 1408", "262 -11524 321", "0 -21 0" );
make_clip( "_meticulous_funcinfclip03", "SI Players", 1, "-34 -238 0", "57 260 1408", "1323 -12178 321" );
make_clip( "_meticulous_funcinfclip04", "SI Players", 1, "-310 -17 159", "724 17 1408", "1616 -12255 321" );
make_clip( "_meticulous_funcinfclip07", "SI Players", 1, "-48 -555 -216", "17 1414 1408", "3276 -11409 321", "0 -24 0" );
make_clip( "_meticulous_funcinfclip08", "SI Players", 1, "-34 -120 -216", "17 700 1408", "3821 -10047 321", "0 24 0" );
make_clip( "_meticulous_funcinfclip09", "SI Players", 1, "-1600 -30 -216", "1600 17 1408", "1980 -9420 321" );
make_clip( "_meticulous_funcinfclip10", "SI Players", 1, "-600 -70 -216", "600 17 1408", "-132 -9696 321", "0 27 0" );
make_clip( "_meticulous_funcinfclip12", "SI Players", 1, "-3000 -17 -216", "3000 17 1408", "5344 -14507 321" );
make_clip( "_meticulous_funcinfclip13", "SI Players", 1, "-800 -17 -216", "500 17 1408", "9070 -14172 321", "0 25 0" );
After:
make_clip( "_meticulous_funcinfclip02", "SI Players", 1, "-1000 -120 -170", "1150 17 1408", "262 -11524 321", "0 -21 0" );
make_clip( "_meticulous_funcinfclip03", "SI Players", 1, "-340 -238 0", "57 260 1408", "1323 -12178 321" );
make_clip( "_meticulous_funcinfclip04", "SI Players", 1, "-310 -420 159", "724 17 1408", "1616 -12255 321" );
make_clip( "_meticulous_funcinfclip07", "SI Players", 1, "-48 -555 -216", "180 1414 1408", "3276 -11409 321", "0 -24 0" );
make_clip( "_meticulous_funcinfclip08", "SI Players", 1, "-34 -120 -216", "260 700 1408", "3821 -10047 321", "0 24 0" );
make_clip( "_meticulous_funcinfclip09", "SI Players", 1, "-1600 -30 -216", "1600 70 1408", "1980 -9420 321" );
make_clip( "_meticulous_funcinfclip10", "SI Players", 1, "-600 -70 -216", "600 170 1408", "-132 -9696 321", "0 27 0" );
make_clip( "_meticulous_funcinfclip12", "SI Players", 1, "-3000 -410 -216", "3000 17 1408", "5344 -14507 321" );
make_clip( "_meticulous_funcinfclip13", "SI Players", 1, "-800 -170 -216", "500 17 1408", "9070 -14172 321", "0 25 0" );
NEW PERMSTUCK:
make_clip( "_permstuck_shedtree", "Everyone", 1, "-14 -14 -164", "14 14 1640", "3085 -14120 88" );
c12m4_barn:
60 func_playerinfected_clip -- :(
Most func_playerinfected_clip smooth the perimeter's wire fences.
There's a gap in those clips behind the safe room, cannot reproduce it,
but it'd be a really annoying place to ever spawn stuck:
make_clip( "_tankstuck_safeback", "SI Players", 1, "-170 -640 -100", "170 225 1700", "7704 -11710 425" );
No other problems -- the first far end of the traintracks has a wrongway
and func_playerinfected_clip that's very far away, and behind the end
safe room the clip is extremely thick.
c12m5_cornfield:
Already re-did the hard func_playerinfected_clip for TLS.
Doesn't appear to be any issues.
Cold Stream:
No apparent issues. Each map's environment is pretty similar, and problems
instead usually come with maps that are heavy on architecture or streets,
or areas on the map's perimeter only player Infected can access... this
campaign is on short supply of all that.
Entire campaign also has 0 func_playerinfected_clip.
c13m2_southpinestream:
NEW SHORTCUT:
make_clip( "_shortcut_eventfence", "Survivors", 1, "-32 -80 0", "32 2 345", "928 5775 415" );
NEW PERMSTUCK:
make_clip( "_permstuck_eventfence", "Everyone", 1, "-8 -40 0", "8 40 32", "905 5829 341" );
Last Stand:
Good.
Map 1 has 3 func_playerinfected_clip (3/3 for the campaign) behind the start
area to block off the wrongway -- they're thick, and how it's done.
Curling/Tutorial/Sndscape/Credits:
Sndscape: no nav, no problem. Only Tutorial is important and it looks good.
z_developer_showupdate.nut:
Add support for "trigger_look" -- easy.
END
##############################################################################################################
##############################################################################################################
SCRIPT FOR VIEWING FUNC_PLAYERINFECTED_CLIP:
script_execute "z_developer_scouteditor -- IGNORE BC CLIPS ONLY NO LADDERS.nut"
printl( "Ran NUT" );
// FOR PORTING COMPLETED SURVIVAL-ONLY NEW CLIPPING TO ANV_ FILES / OTHER MODES.
function DumpPreExistingBlockers()
{
local play = null;
while( ( play = Entities.FindByClassname( play, "env_player_blocker" ) ) != null )
{
if ( play.GetName().find( "anv_mapfixes" ) != 0 )
{
local origin = VectorToString_Valve( NetProps.GetPropVector( play, "m_vecOrigin" ) );
local mins = VectorToString_Valve( NetProps.GetPropVector( play, "m_Collision.m_vecMins" ) );
local maxs = VectorToString_Valve( NetProps.GetPropVector( play, "m_Collision.m_vecMaxs" ) );
printl( "make_clip( \"_test\", \"Survivors\", 1, \"" + mins + "\", \"" + maxs + "\", \"" + origin + "\" );" );
}
}
local phys = null;
while( ( phys = Entities.FindByClassname( phys, "env_physics_blocker" ) ) != null )
{
if ( phys.GetName().find( "anv_mapfixes" ) != 0 )
{
local origin = VectorToString_Valve( NetProps.GetPropVector( phys, "m_vecOrigin" ) );
local mins = VectorToString_Valve( NetProps.GetPropVector( phys, "m_Collision.m_vecMins" ) );
local maxs = VectorToString_Valve( NetProps.GetPropVector( phys, "m_Collision.m_vecMaxs" ) );
printl( "make_clip( \"_test\", \"Survivors\", 1, \"" + mins + "\", \"" + maxs + "\", \"" + origin + "\" );" );
}
}
}
// FUNC_PLAYERINFECTED_CLIP :: Function for finding desired invisible clip to delete.
function AssessBadClips()
{
// FUNC_PLAYERINFECTED_CLIP
// UPDATE:
//
// DebugDrawText() was fixed to work with BOTH "types":
//
// Type A Blood Harvest 1 where GetOrigin() is non-0's (VERY RARE)
// Type B Dead Center 2 where vecMins is better (MAJORITY OF MAPS)
//
// If vecMins is used but Origin is all-non-0, then it will bug like Blood Harvest 1
// showing all text outside the map. Without reconciling the discrepancy there was
// for the longest time no way to get the "best of both worlds".
//
// While vecMins only pinpoints a "corner" it's still far better than all 0's, but
// the bigger problem was DebugDrawText() never overlaying correctly on the all-0
// maps which caused me to resort to MASSIVE_TRIAL_AND_ERROR for the vast majority.
//
// Note "vecMins - vecMaxs" was far outside of map, and other efforts. The problem
// was that while Dead Center 2's mins/maxs work to DebugDrawBox(), with DebugDrawText()
// it can't "infer location" from mins/maxs because they're not possible parameters,
// but using either-or is just fine!! This isn't 100% flawless on Blood Harvest 1,
// IDK why there's exceptions, but for 99% of cases... it would've saved me HOURS!!
/////////////////////////////////////////////////////////////////////////////////////////////
local hndClip = null;
while( ( hndClip = Entities.FindByClassname( hndClip, "func_playerinfected_clip" ) ) != null )
{
local flRadius = NetProps.GetPropFloat( hndClip, "m_Collision.m_flRadius" );
local vecMins = NetProps.GetPropVector( hndClip, "m_Collision.m_vecMins" );
local vecMaxs = NetProps.GetPropVector( hndClip, "m_Collision.m_vecMaxs" );
// Print origin just in case it exists and is unique... BUT NEVER KILL BY ORIGIN
// because it's too inconsistent... NO MERCY 1's two windows at the start would
// have identical Radius though, but still not useful Origin anyway.
local vecLocation = hndClip.GetOrigin();
DebugDrawBoxDirection( vecLocation, vecMins, vecMaxs,
hndClip.GetForwardVector(), Vector( 255, 0, 0 ),
64, 99999999 );
// Solved the inability for Radius to DebugDrawText() because its Origin was at
// the map's center erroneously... all the ones that work have non-0 Origins.
if ( vecLocation.x == 0 && vecLocation.y == 0 && vecLocation.z == 0 )
{
vecLocation = NetProps.GetPropVector( hndClip, "m_Collision.m_vecMins" );
}
DebugDrawText( vecLocation, flRadius.tostring(), false, 99999999 );
printl( "func_playerinfected_clip\t\t" + flRadius + "\t\t" + "setpos_exact " + VectorToString_Valve( vecLocation ) );
}
// FUNC_ILLUSIONARY
local hndIllus = null;
while( ( hndIllus = Entities.FindByClassname( hndIllus, "func_illusionary") ) != null )
{
local flRadius = NetProps.GetPropFloat( hndIllus, "m_Collision.m_flRadius" );
printl( "func_illusionary\t\t" + flRadius + "\t\t" + hndIllus.GetOrigin() );
// Overlay both Radius and Origin... because I've yet to confirm if Radius is
// 100% useless for unique identification like it is for func_brush.
DebugDrawText( hndIllus.GetOrigin(), flRadius.tostring() + " + " + VectorToString_Valve( hndIllus.GetOrigin() ), false, 99999999 );
local vecMins = NetProps.GetPropVector( hndIllus, "m_Collision.m_vecMins" );
local vecMaxs = NetProps.GetPropVector( hndIllus, "m_Collision.m_vecMaxs" );
DebugDrawBoxDirection( hndIllus.GetOrigin(), vecMins, vecMaxs,
hndIllus.GetForwardVector(), Vector( 0, 255, 0 ),
64, 99999999 );
}
// FUNC_BRUSH
local hndBrush = null;
while( ( hndBrush = Entities.FindByClassname( hndBrush, "func_brush") ) != null )
{
local flRadius = NetProps.GetPropFloat( hndBrush, "m_Collision.m_flRadius" );
printl( "func_brush\t\t" + flRadius + "\t\t" + hndBrush.GetOrigin() );
// In the case of "func_brush-implemented wrongways", flRadius.tostring() is
// useless for identification (but printed to console anyway), so it's not
// used for the overlay text, use origin instead. This is because wrongways
// are basically unanimously the same size and it's not a unique identifier
// when the Length() of multiple wrongway's mins/maxs is identical.
DebugDrawText( hndBrush.GetOrigin(), VectorToString_Valve( hndBrush.GetOrigin() ), false, 99999999 );
local vecMins = NetProps.GetPropVector( hndBrush, "m_Collision.m_vecMins" );
local vecMaxs = NetProps.GetPropVector( hndBrush, "m_Collision.m_vecMaxs" );
DebugDrawBoxDirection( hndBrush.GetOrigin(), vecMins, vecMaxs,
hndBrush.GetForwardVector(), Vector( 0, 0, 255 ),
64, 99999999 );
}
}
##############################################################################################################
##############################################################################################################
BUG REPORTS SPREADSHEET :: PROSPECTIVE MARK-OFFS
Will be fixed in the next anv_ commit (also w/ mutation15/19 updates):
42 Navmesh Low "c8m3 Versus Survival
43 Navmesh Low "c10m4 Versus Survival
44 Navmesh Medium "c11m4 Versus Survival
45 Navmesh Low "Part of the spawning area
46 Navmesh Medium "c1m2 versus survival spawning
47 Navmesh Medium "c1m2 versus survival spawning
48 Navmesh Medium "c1m2 versus survival spawning
49 Navmesh Medium "c1m2 versus survival spawning
51 Map Medium "Tanks sometimes spawn out of bounds
187 Mutation Medium On Taaannnkk!, players sometimes spawn out of bounds
218 Map Low "One-sided ladder on c10m4
435 Map Low "c7m2 survivors can enter this room at the end of the map
Known issue:
c2m5_concert cases needed shadows so they don't vanish.
One cast shadow is on the entrance gate and ugly.
Tried "light_dynamic" (both spot+omni) but neither remotely "cancel out"
the prop's shadow. There's also these, "shadowcastdist" sounds useful
but doesn't change anything (likely meant for "prop_static"0:
Disable Receiving Shadows (disablereceiveshadows) <boolean>
Prevent the entity from receiving shadows on itself.
Shadow Cast Distance (shadowcastdist) <integer>
Sets how far the entity casts dynamic shadows. 0 means
default distance from the shadow_control entity.
Which don't help. Future options to try:
1. Script to toggle EnableShadow + DisableShadow whenever a
client joins the server? Yeah, right...
2. Spawn as a prop_physics_override and immediately DisableMotion,
then also DisableShadow -- surely physics props are immune to
the vanishing absurdity ??
3. Remove the props -- can still get stuck by chopper on them anyway.
But they are unique, and reference Earl's Gator Village.
##############################################################################################################
##############################################################################################################
BUG REPORTS SPREADSHEET :: FUTURE TARGETS IN SIGHT
40 Navmesh Low "c14m1 infected stuckspot:
https://cdn.discordapp.com/attachments/759144970916986890/759201730280947712/VpJrLm0.png" Yes Unknown FALSE Public jcb 26/09/2020 https://discord.com/channels/675053405751738390/759144970916986890/759201730428141590
84 Scripting Low Smokers can grab you through the truck on gunshop (truck is non-solid for S.I.) No Unknown FALSE Public Gents 27/09/2020 https://discord.com/channels/675053405751738390/758781098871226388/759845151605653554
91 Navmesh Medium "In Dead Center survival gun shop. If you stay in the booth in the store, Tanks will get stuck
trying to get into the front of the booth." No Unknown FALSE Public NF 27/09/2020 https://discord.com/channels/675053405751738390/759144970916986890/759521280424149003
94 Navmesh Low "Survivor bots get stuck on this spot on c8m5:
https://i.gyazo.com/39b22d1e59d51fa6f4c6bd4a95a3fccc.jpg" No Unknown FALSE Public jcb 27/09/2020 https://discord.com/channels/675053405751738390/759144970916986890/759559746038136852
95 Navmesh Low "c8m3 Tank gets stuck on the gas station rubble:
https://cdn.discordapp.com/attachments/759144970916986890/759870417857937428/20200927161301_1.jpg" Yes Unknown FALSE Public Failzz 27/09/2020 https://discord.com/channels/675053405751738390/759144970916986890/759870418042748958
97 Scripting Low "This area on c11m1 lacks a kill-trigger:
https://cdn.discordapp.com/attachments/759530480969580584/759539438400438282/unknown.png" Yes No FALSE Public jcb 27/09/2020 https://discord.com/channels/675053405751738390/759530480969580584/759539438908342312
114 Map Low "In Dead Center, there is one infected ladder that bumps into the map and prevents the player from
climbing said ladder. Note: this screenshot was taken at the bottommost level of the Alarm
sequence at the Mall level of Dead Center:
https://cdn.discordapp.com/attachments/758757870615003186/760124227927539722/image0.png" Yes Unknown
119 Navmesh Low "c12m2 survival safespot:
https://cdn.discordapp.com/attachments/758757870615003186/759968963483402270/20200927213034_1.jpg" Yes Unknown FALSE Public Failzz 28/09/2020 https://discord.com/channels/675053405751738390/758757870615003186/759968936892039198
145 Map Low "This c13m4 ladder is very janky:
https://cdn.discordapp.com/attachments/758757870615003186/760942950862684240/unknown.png" Yes Unknown FALSE Public Rene 30/09/2020 https://discord.com/channels/675053405751738390/758757870615003186/760942951077118013
147 Survival Low "You can grab ammo through the wall on c5m4 Float Survival:
https://cdn.discordapp.com/attachments/758781098871226388/760769364747616286/20200929064501_1.jpg" Yes Unknown FALSE Public Gents 30/09/2020 https://discord.com/channels/675053405751738390/758781098871226388/760769365648867394
148 Navmesh Low "c2m3 versus safespot:
https://cdn.discordapp.com/attachments/758757870615003186/760837643448614923/unknown.png" Yes Unknown FALSE Public VladFRY 30/09/2020 https://discord.com/channels/675053405751738390/758757870615003186/760837644040142859
153 Navmesh Medium "c1m2 survival Godspot:
https://youtu.be/ZGhSstcymfM" Yes Unknown FALSE Public Husky 01/10/2020 https://discord.com/channels/675053405751738390/758757870615003186/761011491859202080
179 Navmesh Medium "c1m2 survival Godspot:
https://cdn.discordapp.com/attachments/758757870615003186/763106732284313650/20201006135156_1.jpg" No Unknown FALSE Public Wilson 06/10/2020 https://discord.com/channels/675053405751738390/758757870615003186/763106723103244319
191 Map Medium "Some infected ladders on c2m3 are not properly climbable:
https://cdn.discordapp.com/attachments/758757870615003186/765050146400239646/20201011175923_1.jpg
https://cdn.discordapp.com/attachments/758757870615003186/765050159578480650/20201011180001_1.jpg
https://cdn.discordapp.com/attachments/758757870615003186/765050162333876305/20201011180010_1.jpg" Yes Unknown FALSE Public Husky 12/10/2020 https://discord.com/channels/675053405751738390/758757870615003186/765050146831466526
225 Scripting Low "To be confirmed: Tanks can climb up this vending machine blocking the door on c1m2 and take
5000 damage upon touching the trigger:
https://i.gyazo.com/4dd3c3d54955a584bface656d0fcca31.jpg" No Unknown FALSE Public Tsuey 11/11/2020 https://discord.com/channels/675053405751738390/759530480969580584/775858676845641748
236 Scripting Low "c10m4 safespot:
https://i.imgur.com/j2uE6D3.jpg" Yes No FALSE Public NF 02/12/2020 https://discord.com/channels/675053405751738390/759530480969580584/783518040464687144
241 Scripting Low "c11m3 railing issue (fix available, see Discord message):
https://i.gyazo.com/7988cad4a2bf82fb4feb6b0fa06148b7.png" Yes Unknown FALSE Public Tsuey 10/12/2020 https://discord.com/channels/675053405751738390/759530480969580584/786716322553004032
247 Scripting Medium "c1m4 survival Godspot:
https://www.youtube.com/watch?v=OG7AwrzUEsc" Yes Unknown FALSE Public NF 20/12/2020 https://discord.com/channels/675053405751738390/759530480969580584/790144584893202472
248 Navmesh Low "c14m2 survival Godspot:
https://gyazo.com/227f619503099e6d777c198c977118bb.jog" Yes Unknown FALSE Public Wilson 23/12/2020 https://discord.com/channels/675053405751738390/758757870615003186/791088792508563496
249 Scripting Medium "c4m2 survival Godspot:
https://i.gyazo.com/1722727d2e26997fe4e085a469c7f4ba.png" Yes Unknown FALSE Public Wilson 23/12/2020 https://discord.com/channels/675053405751738390/759530480969580584/791418638191558706
257 Scripting Medium "Running through the elevator door on c8m4 as a ghost infected before the elevator arrives
can cause the infected player to sink into the ground:
https://www.youtube.com/watch?v=Bg-y_ClAnCM" Yes Unknown FALSE Public Rene 16/01/2021 https://discord.com/channels/675053405751738390/758757870615003186/800059518028873789
287 Exploit Medium "Troll spot on The Parish finale on Tank run:
https://cdn.discordapp.com/attachments/758781069276348436/818625394931793950/20210308201753_1.jpg" Yes Unknown FALSE Public Skessler 09/03/2021 https://discord.com/channels/675053405751738390/758781069276348436/818625394986057790
288 Scripting Low "c13m4 Cold Stream stuckspot; accessible through getting hit by a Tank:
" No Unknown FALSE Public Tsuey 15/03/2021 https://discord.com/channels/675053405751738390/759530480969580584/820901665351401512
289 Scripting Low "c13m4 displacement has not been fully fixed yet:
https://i.gyazo.com/e756cad44f37730c5af6e778df920a10.jpg" Yes Unknown FALSE Public Tsuey 15/03/2021 https://discord.com/channels/675053405751738390/759530480969580584/820944455631765525
298 Navmesh Medium "c10m1 Special Infected stuckspot:
https://gyazo.com/68b58831541373abbba825c4cf660266.jpg" Yes Unknown FALSE Public Tsuey 21/03/2021 https://discord.com/channels/675053405751738390/759144970916986890/823237853299081216
311 Scripting Low "This breakable wall didnt get a breakwall texture added like others did in the update
(c12m2_traintunnel):
https://i.imgur.com/ZvO48s5.jpg" No Unknown FALSE Public Derpduck 14/04/2021 https://discord.com/channels/675053405751738390/758781098871226388/831987779100475414
327 Scripting Low "Explosion force entities on the c9m1 event still target the l4d1 entity names for the cars they
are supposed to launch, so instead in l4d2 the cars just get nudged slightly" Yes No FALSE Public Derpduck 29/04/2021 https://discord.com/channels/675053405751738390/759530480969580584/837271466017947708
337 Navmesh Medium "c12m2 survival safespot:
https://cdn.discordapp.com/attachments/758757870615003186/842937109794783262/20210514195445_1.jpg" Yes Unknown FALSE Public Lleage 15/05/2021 https://discord.com/channels/675053405751738390/758757870615003186/842937110058893362
344 Scripting Low "The ladder on c5m2 at -9260 -5130 -152 that got moved slightly in the update now creates a perma
stuck spot:
https://i.imgur.com/NGqB1m8.jpg" Yes No FALSE Public Derpduck 10/06/2021 https://discord.com/channels/675053405751738390/759530480969580584/852323208161263616
345 Navmesh Low "Commons tend to climb into the air on this balcony on c5m4:
https://i.gyazo.com/a7b051abf2990135014fe52f5ae72886.jpg" Yes No FALSE Public Niels 11/06/2021 https://discord.com/channels/675053405751738390/759144970916986890/852730862041563196
347 Navmesh Low "Special Infected get stuck fairly often in this spot (c11m4):
https://i.imgur.com/DjKQnzC.png" Yes No FALSE Public Niels 11/06/2021 https://discord.com/channels/675053405751738390/759144970916986890/852731562055172160
359 Scripting Low On c8m1 you can see and grab a melee weapon through a wall near the start saferoom: https://cdn.discordapp.com/attachments/354608543812419596/854450568277917737/unknown.png Yes No FALSE Public Tsuey 15/06/2021 https://discord.com/channels/675053405751738390/759530480969580584/854451053998112829
361 Scripting Low Perm stuck spot on c2m3: setpos_exact -2943.968750 -2.144094 166.096588;setang_exact 61.129417 18.613209 0.000000 https://i.imgur.com/ALQXTfH.jpg Yes No FALSE Public Failzz 16/06/2021 https://discord.com/channels/675053405751738390/759530480969580584/854732076053430314
362 Scripting Low Perm stuck spot on c11m4 (survival mode): setpos_exact 128.662277 4377.625000 40.301613;setang_exact 55.169212 -154.449280 0.000000 https://i.imgur.com/fIarCtT.jpg Yes No FALSE Public Failzz 16/06/2021 https://discord.com/channels/675053405751738390/759530480969580584/854732076053430314
363 Modding Low Perm stuck spot c10m3: setpos_exact -10141.968750 -2983.987061 145.107010;setang_exact 22.341049 12.080043 0.000000 NOTE: This model always has perm stuck spots. Better to be fixed in the model collision https://i.imgur.com/YH1ERjn.jpg Yes No FALSE Public Failzz 16/06/2021 https://discord.com/channels/675053405751738390/759530480969580584/854732076053430314
364 Scripting Low c10m3: smoker tongue targets survivors through the floor but can't actually connect. If you pull from another angle the tongue can clip through the floor https://imgur.com/a/f4U6lqW Yes No FALSE Public Failzz 16/06/2021 https://discord.com/channels/675053405751738390/759530480969580584/854733151523569674
365 Scripting Low c11m2 no kill trigger if people get death charged oob here. https://i.imgur.com/5kXpk7b.jpeg Yes No FALSE Public Failzz 16/06/2021 https://discord.com/channels/675053405751738390/759530480969580584/854733595930001458
398 Scripting Medium On c7m1 tanks can be lit on fire before exiting the train car Yes No FALSE Public Rene 25/06/2021 https://discord.com/channels/675053405751738390/758781038502740009/858065173288583199
399 Scripting Low On c1m3 there is a poorly placed nav blocker in the event area which causes pathing issues https://cdn.discordapp.com/attachments/758781098871226388/858336531202179072/unknown.png Yes No FALSE Public Nescius 26/06/2021 https://discord.com/channels/675053405751738390/758781098871226388/858336531579273226
402 Scripting Low On c8m3 the filter for a trigger to play helicopter sounds after exiting the sewer is missing from the map completely, "filter_helicopter" Yes No FALSE Public Derpduck 28/06/2021 https://discord.com/channels/675053405751738390/759530480969580584/859122310735724574
413 Scripting Low "This building compartment does not appear to block line of sight:
https://www.youtube.com/watch?v=2drQhybTOXg" Yes No FALSE Public Niels 03/07/2021 https://discord.com/channels/675053405751738390/758757870615003186/860949623245242369
418 Scripting Low "These 2 ladders after the alarm car on c14m1 can be hard to climb sometimes:
https://i.imgur.com/WsITuAP.jpeg
https://i.imgur.com/RGPkbGM.jpeg" Yes No FALSE Public Derpduck 06/07/2021 https://discord.com/channels/675053405751738390/758757870615003186/861971878439944232
428 Scripting Low "Valve forgot to update this ""Tank"" filter in the l4d2 port of death toll, the value for tank in
l4d1 is the value for Jockey in l4d2.
Not really sure why they wanted this one specific window in the tower to only be broken by Tanks,
but hey. The window has breakable type set to Tank only also, so it isn't breakable by either of
them:
https://i.imgur.com/Jm6QbR5.png" Yes No FALSE Public Derpduck 09/07/2021 https://discord.com/channels/675053405751738390/862009673581592576/863049043164790805
429 Scripting Low "c14m2 permastuck (versus specific)
setpos_exact -2548.628906 4572.107910 505.589264:
https://i.imgur.com/dNtoHz3.png" Yes No FALSE Public Failzz 09/07/2021 https://discord.com/channels/675053405751738390/862009673581592576/863086793010970674
436 Map Low "c10m3 falling between the barricades is a perma-stuck (infected only):
https://i.imgur.com/kZtp7ai.jpeg" Yes No FALSE Public Derpduck 10/07/2021 https://discord.com/channels/675053405751738390/862009673581592576/863390930971131914
END
****************************************************************************************************/
##############################################################################################################
##############################################################################################################
// FRED VERSION 1 -- RUNS ACROSS, LEGS DON'T MOVE, ANGLE MAY BE WRONG, I'M NOT 100% SOLD
function fred_version1()
{
// Fire once and only for Clients, both Survivor and Infected players.
// Scurries away after 1 second when viewed at any angle (-1).
make_prop( "dynamic", "_fred", "models/props_fairgrounds/alligator.mdl", "13099 11539 -25", "0 120 0", "shadow_no", "solid_no" );
SpawnEntityFromTable( "func_movelinear",
{
targetname = g_UpdateName + "_fred_movelinear",
spawnflags = 0,
movedistance = 200,
speed = 80,
startposition = 0,
movedir = Vector( 0, -148, 0 ),
origin = Vector( 13099, 11539, -25 )
} );
EntFire( g_UpdateName + "_fred", "SetParent", g_UpdateName + "_fred_movelinear" );
SpawnEntityFromTable( "trigger_look",
{
targetname = g_UpdateName + "_fred_triglook",
target = g_UpdateName + "_fred",
spawnflags = 129,
LookTime = 1,
FieldOfView = -1,
origin = Vector( 13072, 11520, -25 )
} );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "mins -42 -38 -480" );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "maxs 42 38 0" );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "solid 2" );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "OnTrigger anv_mapfixes_fred_movelinear:Open::0:-1" );
}
// FRED VERSION 2 -- HE BACKS AWAY AND HIDES, QUICKER THIS TIME, MORE SUBTLE
function fred_version2()
{
// Fire once and only for Clients, both Survivor and Infected players.
// Scurries away after 1 second when viewed at any angle (-1).
make_prop( "dynamic", "_fred", "models/props_fairgrounds/alligator.mdl", "13103 11543 -25", "0 125 0", "shadow_no", "solid_no" );
SpawnEntityFromTable( "func_movelinear",
{
targetname = g_UpdateName + "_fred_movelinear",
spawnflags = 0,
movedistance = 100,
speed = 100,
startposition = 0,
movedir = Vector( 0, 37, 0 ),
origin = Vector( 13099, 11539, -25 )
} );
EntFire( g_UpdateName + "_fred", "SetParent", g_UpdateName + "_fred_movelinear" );
// Turns out if FieldOfView is -1 then it's triggered even if staring
// at the ground while walking into the trigger. If 0.1, it's then only
// triggered when looking up, but if you walk into the trigger looking
// down and THEN look up, Fred will still be there and this will not work
// until the player steps out and back in. At value of 1 it NEVER works.
// At 0 it works if constantly looking down or up. At 0.01 it's the same.
// Suddenly, at 0.1 is when it doesn't work if looking down constantly
// which is desired, but does work if you enter while looking up at it.
// Bottom-line: At 0.1 it's too easy to "glitch" it to get a constant
// easy view on him. At FieldOfView -1 it at least 100% guarantees it
// will always fire, but also makes this equivalent to a trigger_once
// sort of defeating half the purpose -- regardless of LookTime of 1 or
// even 4 seconds, constantly staring at the ground with FieldOfView -1
// will have it trigger.
// TopHATTwaffle Hammer Tutorial #64 "Trigger_look" Sep 12, 2010
// https://www.youtube.com/watch?v=uBsi-MEAP-Q
// https://old.reddit.com/user/TopHATTwaffle/
// Right now I'm working in whatever engine CSGO is on, as
// that's my favorite game. I have little reason to move to
// Source 2 unless it does.
// https://www.reddit.com/r/SourceEngine/comments/35gcl2/portal_2_making_a_trigger_look_work_when_the/
// https://developer.valvesoftware.com/wiki/Trigger_look
// 1.0 = straight ahead, 0.0 = +/- 90 degrees, -1.0 = all directions
// Where 0.5 would imply +/- 45 degrees.
// That's all she wrote. 1 for "straight ahead" does NOT work for Fred.
// Even noclipping into it and looking at it from any angle while still
// inside the trigger, NOTHING works for 1.
SpawnEntityFromTable( "info_target",
{
targetname = g_UpdateName + "_fred_target",
origin = Vector( 13072, 11520, -256 )
} );
// Added an info_target to essentially alter Fred's own "origin" just
// in case it being outside of the map was messing with visibility.
// Even with the info_target the result appears to be exactly the same.
// It's extremely quirkly how it works, it doesn't feel like +/- 90
// but rather if it's 0.1 then it almost REQUIRES being off by ~80,
// and if 1 it's absolutely unachievable even if I setpos_exact right
// into its exact origin above -- 1 for "straight ahead" NEVER works.
SpawnEntityFromTable( "trigger_look",
{
targetname = g_UpdateName + "_fred_triglook",
target = g_UpdateName + "_fred_target",
spawnflags = 129,
LookTime = 1,
FieldOfView = 1,
origin = Vector( 13072, 11520, -25 )
} );
// Fred is a child so gets Killed with the movelinear.
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "mins -42 -38 -480" );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "maxs 42 38 0" );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "solid 2" );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "OnTrigger anv_mapfixes_fred_movelinear:Open::0:-1" );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "OnTrigger anv_mapfixes_fred_movelinear:Kill::2:-1" );
}
// FRED VERSION 3 -- TBH, NO CHOICE BUT TO USE IT LIKE A TRIGGER_ONCE... SINCE
// HE WILL NOT SPAWN 100% OF THE TIME ANYWAY, IT'LL BE TRULY DIFFICULT TO SEE
// HIM, ANYWAY... ONLY THOSE "IN THE KNOW" LOOKING FOR HIM WILL, BUT THAT'S ALSO
// SORT OF THE POINT... HE HAS BEEN SHY AND ELUSIVE ALL THIS TIME. SINCE HE DOES
// MORE AGGRESSIVELY VANISH EVEN IF NOT LOOKED DIRECTLY AT, INCREASE LOOKTIME TO 1.
// NOTE :: On the bright side, a trigger_once isn't exactly the same -- that would
// possibly require a logic_timer and other "reset logic" to "count" the time the
// player actually spends standing in the trigger. If it was a trigger_once then
// just passively running through it would fall -- as it's a trigger_look, the player
// absolutely must be standing inside it for 1 entire second to trigger, and they
// have that entire 1 second to potentially look up. It's still better, so don't feel bad.
function fred_version3()
{
// Fire once and only for Clients, both Survivor and Infected players.
// Scurries away after 1 second when viewed at any angle (-1). Fred
// is a child so gets Killed with the movelinear. 1 in 4 chance spawn,
// but Ghost Infected, Spawned Infected, and Survivors can all trigger
// it (all "Clients") and it's deleted after first fire, so compoundingly
// it'll be much more rarely-seen than this and that's OK tbh.
if ( RandomInt( 1, 4 ) == 4 )
{
make_prop( "dynamic", "_fred", "models/props_fairgrounds/alligator.mdl", "13103 11543 -25", "0 125 0", "shadow_no", "solid_no" );
SpawnEntityFromTable( "func_movelinear",
{
targetname = g_UpdateName + "_fred_movelinear",
spawnflags = 0,
movedistance = 100,
speed = 60,
startposition = 0,
movedir = Vector( 0, 37, 0 ),
origin = Vector( 13099, 11539, -25 )
} );
EntFire( g_UpdateName + "_fred", "SetParent", g_UpdateName + "_fred_movelinear" );
SpawnEntityFromTable( "trigger_look",
{
targetname = g_UpdateName + "_fred_triglook",
target = g_UpdateName + "_fred",
spawnflags = 129,
LookTime = 1,
FieldOfView = -1,
origin = Vector( 13072, 11520, -25 )
} );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "mins -42 -38 -480" );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "maxs 42 38 0" );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "solid 2" );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "OnTrigger anv_mapfixes_fred_movelinear:Open::0:-1" );
EntFire( g_UpdateName + "_fred_triglook", "AddOutput", "OnTrigger anv_mapfixes_fred_movelinear:Kill::2:-1" );
}
}
/***************************************************************************************************/
##############################################################################################################
##############################################################################################################
Original filename before GITHUB GIST:
\Program Files (x86)\Steam\steamapps\common\Left 4 Dead 2\left4dead2\scripts\vscripts\
z_tankstuck_spots.nut
##############################################################################################################
##############################################################################################################
##############################################################################################################
##############################################################################################################
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment