From a7cab159a65e87a0f6dae6e093461b30f67bc2aa Mon Sep 17 00:00:00 2001 From: honey <934223+Derpduck@users.noreply.github.com> Date: Sat, 9 May 2026 05:03:53 +0100 Subject: [PATCH 01/19] Open Road 3 Fixes (#952) Fixed broken infected ladder by the end saferoom Moved boxes that previously replaced said broken ladder Opened up access to previously inaccessible side room in the holdout area and fixed navs in the area --- cfg/stripper/zonemod/maps/x1m3_city.cfg | 44 +++++++++++++++++-- .../vscripts/nav_fixes/x1m3_city_navfixes.nut | 25 +++++++++++ 2 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 scripts/vscripts/nav_fixes/x1m3_city_navfixes.nut diff --git a/cfg/stripper/zonemod/maps/x1m3_city.cfg b/cfg/stripper/zonemod/maps/x1m3_city.cfg index a330bd5e9..9752dacd9 100644 --- a/cfg/stripper/zonemod/maps/x1m3_city.cfg +++ b/cfg/stripper/zonemod/maps/x1m3_city.cfg @@ -163,7 +163,7 @@ filter: add: { "classname" "prop_dynamic" - "origin" "-3197 2819 -559" + "origin" "-3197 2869 -559" "angles" "0 0 0" "solid" "6" "rendercolor" "255 255 255" @@ -171,7 +171,7 @@ add: } { "classname" "prop_dynamic" - "origin" "-3190 2820 -520" + "origin" "-3190 2870 -520" "angles" "0 346.5 0" "solid" "6" "rendercolor" "255 255 255" @@ -179,7 +179,7 @@ add: } { "classname" "prop_dynamic" - "origin" "-3184 2820 -481" + "origin" "-3184 2870 -481" "angles" "0 270 0" "solid" "6" "rendercolor" "255 255 255" @@ -574,4 +574,42 @@ modify: { "glowstate" "0" } +} + +; ############ DIRECTOR AND EVENT CHANGES ########### +; ===================================================== +; == DIRECTOR & EVENT MODIFICATION == +; == Modify director behaviour and events == +; ===================================================== +; --- Run nav fixes script +; --- Fix 1: Fixes god spot room behind previously unbreakable door in event holdout spot +add: +{ + "classname" "logic_auto" + "OnMapSpawn" "director,RunScriptFile,nav_fixes/x1m3_city_navfixes,20,-1" +} +; --- Fix unbreakable locked door on top floor of event holdout +modify: +{ + match: + { + "hammerid" "412017" + } + replace: + { + "spawnflags" "0" + } +} +; --- Fix broken infected ladder by the end saferoom +modify: +{ + match: + { + "hammerid" "413620" + } + replace: + { + "normal.x" "-1" + "normal.y" "0" + } } \ No newline at end of file diff --git a/scripts/vscripts/nav_fixes/x1m3_city_navfixes.nut b/scripts/vscripts/nav_fixes/x1m3_city_navfixes.nut new file mode 100644 index 000000000..f8ccea7ee --- /dev/null +++ b/scripts/vscripts/nav_fixes/x1m3_city_navfixes.nut @@ -0,0 +1,25 @@ +printl("\n[NavFixes] x1m3_city_navfixes initialized\n") + +//Fix 1: Fix god spot room behind previously unbreakable door in holdout area// +//Issue: Nav area has no connections to the main room, making it impossible for common to path +function x1m3_city_navfixes_fix1() +{ + //Get nav areas: + //Problematic nav areas + local fix1_jesusNav_a = NavMesh.GetNavAreaByID(1607) + //Create two way connection on railing so commons have an alternative way to path + local fix1_jesusNav_b = NavMesh.GetNavAreaByID(10647) + //Nav areas to connect + local fix1_nav_a = NavMesh.GetNavAreaByID(12) + local fix1_nav_b = NavMesh.GetNavAreaByID(8961) + + //Create two-way connection between nav areas + fix1_nav_a.ConnectTo(fix1_jesusNav_a,-1) + fix1_jesusNav_a.ConnectTo(fix1_nav_a,-1) + fix1_nav_b.ConnectTo(fix1_jesusNav_b,-1) + + printl("\n[NavFixes] Fix 1 applied\n") +} + + +x1m3_city_navfixes_fix1() \ No newline at end of file From 09c968e7a62bf5ce61dcd3e34e9c9374e7774785 Mon Sep 17 00:00:00 2001 From: honey <934223+Derpduck@users.noreply.github.com> Date: Sat, 9 May 2026 05:04:36 +0100 Subject: [PATCH 02/19] Detour Ahead 3 Sewer drop tank ban (#953) Add ban range between 52 - 60% to block tanks on the double sewer drop that can result in different spawns between teams depending on their path and the tank spawning too close --- cfg/cfgogl/zonemod/mapinfo.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cfg/cfgogl/zonemod/mapinfo.txt b/cfg/cfgogl/zonemod/mapinfo.txt index f512e1e17..e62766c0e 100644 --- a/cfg/cfgogl/zonemod/mapinfo.txt +++ b/cfg/cfgogl/zonemod/mapinfo.txt @@ -1118,9 +1118,9 @@ "end_dist" "245.495361" "tank_ban_flow" { - "During sewers" + "During sewers + double ladder drop" { - "min" "60" + "min" "52" "max" "79" } } From aeb285fd9780b639027f57b6654cecdceafbbe72 Mon Sep 17 00:00:00 2001 From: Mart Date: Sun, 10 May 2026 07:39:20 -0300 Subject: [PATCH 03/19] Update OutSkirts.cfg (#955) missing colon --- cfg/stripper/zonemod/maps/OutSkirts.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cfg/stripper/zonemod/maps/OutSkirts.cfg b/cfg/stripper/zonemod/maps/OutSkirts.cfg index 85467ad89..78b82ceee 100644 --- a/cfg/stripper/zonemod/maps/OutSkirts.cfg +++ b/cfg/stripper/zonemod/maps/OutSkirts.cfg @@ -38,7 +38,7 @@ modify: { "solid" "6" } - delete + delete: { "OnHealthChanged" "alarmtimer1Enable01" "OnHealthChanged" "alarm_soundPlaySound01" From d8029296845ce565b77015ea178fb0218d21243f Mon Sep 17 00:00:00 2001 From: SirPlease Date: Sun, 10 May 2026 13:30:51 +0200 Subject: [PATCH 04/19] More cfg/stripper cleanup - Added missing colons. - Added missing brackets. - Removed stray brackets (or commented them out if it was part of commented change) - Removed extra spaces as per #949, including some additional ones. --- cfg/stripper/acemodrv/maps/AirCrash.cfg | 2 +- cfg/stripper/acemodrv/maps/OutSkirts.cfg | 2 +- cfg/stripper/acemodrv/maps/RiverMotel.cfg | 2 +- cfg/stripper/acemodrv/maps/c2m2_fairgrounds.cfg | 2 +- cfg/stripper/acemodrv/maps/c2m3_coaster.cfg | 2 +- cfg/stripper/acemodrv/maps/c8m1_apartment.cfg | 2 +- cfg/stripper/acemodrv/maps/damitdc1.cfg | 2 +- cfg/stripper/acemodrv/maps/daredux_map5_garage_aw.cfg | 1 - cfg/stripper/acemodrv/maps/l4d2_stadium1_apartment.cfg | 1 + cfg/stripper/acemodrv/maps/l4d_dbd2dc_undead_center.cfg | 1 + cfg/stripper/acemodrv/maps/l4d_ihm01_forest.cfg | 2 +- cfg/stripper/acemodrv/maps/versus_3.cfg | 4 ++-- cfg/stripper/apex/maps/AirCrash.cfg | 2 +- cfg/stripper/apex/maps/OutSkirts.cfg | 2 +- cfg/stripper/apex/maps/RiverMotel.cfg | 2 +- cfg/stripper/apex/maps/c14m2_lighthouse.cfg | 1 - cfg/stripper/apex/maps/c4m4_milltown_b.cfg | 2 +- cfg/stripper/apex/maps/c8m4_interior.cfg | 7 +++---- cfg/stripper/apex/maps/c8m5_rooftop.cfg | 7 +++---- cfg/stripper/apex/maps/daredux_map5_garage_aw.cfg | 1 - cfg/stripper/apex/maps/l4d2_stadium1_apartment.cfg | 1 + cfg/stripper/apex/maps/l4d_ihm01_forest.cfg | 2 +- cfg/stripper/apex/maps/versus_3.cfg | 4 ++-- cfg/stripper/deadman/maps/AirCrash.cfg | 2 +- cfg/stripper/deadman/maps/OutSkirts.cfg | 2 +- cfg/stripper/deadman/maps/RiverMotel.cfg | 2 +- cfg/stripper/deadman/maps/c4m4_milltown_b.cfg | 2 +- cfg/stripper/deadman/maps/c5m2_park.cfg | 9 +++++++++ cfg/stripper/deadman/maps/c8m4_interior.cfg | 7 +++---- cfg/stripper/deadman/maps/c8m5_rooftop.cfg | 7 +++---- cfg/stripper/deadman/maps/l4d2_stadium1_apartment.cfg | 1 + cfg/stripper/deadman/maps/l4d_ihm01_forest.cfg | 2 +- cfg/stripper/deadman/maps/versus_3.cfg | 4 ++-- cfg/stripper/eq/maps/AirCrash.cfg | 2 +- cfg/stripper/eq/maps/OutSkirts.cfg | 2 +- cfg/stripper/eq/maps/RiverMotel.cfg | 2 +- cfg/stripper/eq/maps/c14m2_lighthouse.cfg | 1 - cfg/stripper/eq/maps/c4m4_milltown_b.cfg | 2 +- cfg/stripper/eq/maps/c8m4_interior.cfg | 7 +++---- cfg/stripper/eq/maps/c8m5_rooftop.cfg | 7 +++---- cfg/stripper/eq/maps/damitdc2.cfg | 2 +- cfg/stripper/eq/maps/daredux_map5_garage_aw.cfg | 1 - cfg/stripper/eq/maps/l4d2_stadium1_apartment.cfg | 1 + cfg/stripper/eq/maps/l4d_ihm01_forest.cfg | 2 +- cfg/stripper/eq/maps/versus_3.cfg | 4 ++-- cfg/stripper/neomod/maps/AirCrash.cfg | 2 +- cfg/stripper/neomod/maps/OutSkirts.cfg | 2 +- cfg/stripper/neomod/maps/RiverMotel.cfg | 2 +- cfg/stripper/neomod/maps/c2m2_fairgrounds.cfg | 2 +- cfg/stripper/neomod/maps/c2m3_coaster.cfg | 2 +- cfg/stripper/neomod/maps/c3m4_plantation.cfg | 1 + cfg/stripper/neomod/maps/c8m1_apartment.cfg | 2 +- cfg/stripper/neomod/maps/daredux_map5_garage_aw.cfg | 1 - cfg/stripper/neomod/maps/l4d2_stadium1_apartment.cfg | 1 + cfg/stripper/neomod/maps/l4d_dbd2dc_undead_center.cfg | 1 + cfg/stripper/neomod/maps/l4d_ihm01_forest.cfg | 2 +- cfg/stripper/neomod/maps/versus_3.cfg | 4 ++-- cfg/stripper/nextmod/maps/AirCrash.cfg | 2 +- cfg/stripper/nextmod/maps/OutSkirts.cfg | 2 +- cfg/stripper/nextmod/maps/RiverMotel.cfg | 2 +- cfg/stripper/nextmod/maps/c14m2_lighthouse.cfg | 1 - cfg/stripper/nextmod/maps/c4m4_milltown_b.cfg | 2 +- cfg/stripper/nextmod/maps/c8m4_interior.cfg | 9 ++++----- cfg/stripper/nextmod/maps/c8m5_rooftop.cfg | 7 +++---- cfg/stripper/nextmod/maps/daredux_map5_garage_aw.cfg | 1 - cfg/stripper/nextmod/maps/l4d2_stadium1_apartment.cfg | 1 + cfg/stripper/nextmod/maps/l4d_ihm01_forest.cfg | 2 +- cfg/stripper/nextmod/maps/versus_3.cfg | 4 ++-- cfg/stripper/pmelite/maps/AirCrash.cfg | 2 +- cfg/stripper/pmelite/maps/OutSkirts.cfg | 2 +- cfg/stripper/pmelite/maps/RiverMotel.cfg | 2 +- cfg/stripper/pmelite/maps/c14m2_lighthouse.cfg | 1 - cfg/stripper/pmelite/maps/c4m4_milltown_b.cfg | 2 +- cfg/stripper/pmelite/maps/c8m4_interior.cfg | 7 +++---- cfg/stripper/pmelite/maps/c8m5_rooftop.cfg | 7 +++---- cfg/stripper/pmelite/maps/daredux_map5_garage_aw.cfg | 1 - cfg/stripper/pmelite/maps/l4d2_stadium1_apartment.cfg | 1 + cfg/stripper/pmelite/maps/l4d_ihm01_forest.cfg | 2 +- cfg/stripper/pmelite/maps/versus_3.cfg | 4 ++-- cfg/stripper/zonemod/maps/AirCrash.cfg | 2 +- cfg/stripper/zonemod/maps/RiverMotel.cfg | 2 +- cfg/stripper/zonemod/maps/c2m3_coaster.cfg | 2 +- cfg/stripper/zonemod/maps/c8m1_apartment.cfg | 2 +- cfg/stripper/zonemod/maps/daredux_map5_garage_aw.cfg | 1 - cfg/stripper/zonemod/maps/l4d2_city17_01.cfg | 2 +- cfg/stripper/zonemod/maps/l4d2_stadium1_apartment.cfg | 1 + cfg/stripper/zonemod/maps/l4d_dbd2dc_undead_center.cfg | 3 ++- 87 files changed, 113 insertions(+), 113 deletions(-) diff --git a/cfg/stripper/acemodrv/maps/AirCrash.cfg b/cfg/stripper/acemodrv/maps/AirCrash.cfg index 378c9a5e4..c947901b6 100644 --- a/cfg/stripper/acemodrv/maps/AirCrash.cfg +++ b/cfg/stripper/acemodrv/maps/AirCrash.cfg @@ -228,7 +228,7 @@ add: } { ; Bridge event - "origin" "3011 -2710 107" + "origin" "3011 -2710 107" "angles" "0 0 0" "classname" "weapon_item_spawn" "spawnflags" "2" diff --git a/cfg/stripper/acemodrv/maps/OutSkirts.cfg b/cfg/stripper/acemodrv/maps/OutSkirts.cfg index 85467ad89..78b82ceee 100644 --- a/cfg/stripper/acemodrv/maps/OutSkirts.cfg +++ b/cfg/stripper/acemodrv/maps/OutSkirts.cfg @@ -38,7 +38,7 @@ modify: { "solid" "6" } - delete + delete: { "OnHealthChanged" "alarmtimer1Enable01" "OnHealthChanged" "alarm_soundPlaySound01" diff --git a/cfg/stripper/acemodrv/maps/RiverMotel.cfg b/cfg/stripper/acemodrv/maps/RiverMotel.cfg index 07bd4b0be..86680bd5a 100644 --- a/cfg/stripper/acemodrv/maps/RiverMotel.cfg +++ b/cfg/stripper/acemodrv/maps/RiverMotel.cfg @@ -129,7 +129,7 @@ modify: { "OnCase03" "spark1SparkOnce01" } -{ +} ; Remove randomness from some gun spawns modify: diff --git a/cfg/stripper/acemodrv/maps/c2m2_fairgrounds.cfg b/cfg/stripper/acemodrv/maps/c2m2_fairgrounds.cfg index 817d5b978..fee02e958 100644 --- a/cfg/stripper/acemodrv/maps/c2m2_fairgrounds.cfg +++ b/cfg/stripper/acemodrv/maps/c2m2_fairgrounds.cfg @@ -551,7 +551,7 @@ add: ; "boxmaxs" "106 10 367" ; "initialstate" "1" ; "BlockType" "1" -} +;} { "classname" "env_physics_blocker" "origin" "-1408 -1025 441" diff --git a/cfg/stripper/acemodrv/maps/c2m3_coaster.cfg b/cfg/stripper/acemodrv/maps/c2m3_coaster.cfg index d9eb7ba8d..ecda82407 100644 --- a/cfg/stripper/acemodrv/maps/c2m3_coaster.cfg +++ b/cfg/stripper/acemodrv/maps/c2m3_coaster.cfg @@ -1136,7 +1136,7 @@ add: "BlockType" "0" "initialstate" "1" "maxs" "48 8 88" - "mins" "-8 -108 -8" + "mins" "-8 -108 -8" "origin" "204 4528 0" "mapupdate" "1" } diff --git a/cfg/stripper/acemodrv/maps/c8m1_apartment.cfg b/cfg/stripper/acemodrv/maps/c8m1_apartment.cfg index c03aa56c8..c83c12373 100644 --- a/cfg/stripper/acemodrv/maps/c8m1_apartment.cfg +++ b/cfg/stripper/acemodrv/maps/c8m1_apartment.cfg @@ -798,7 +798,7 @@ add: ; "BlockType" "0" ; "initialstate" "1" ; "maxs" "12 8 260" -; "mins" "-240 -8 -208" +; "mins" "-240 -8 -208" ; "origin" "2288 1424 224.35" ; "mapupdate" "1" ;} diff --git a/cfg/stripper/acemodrv/maps/damitdc1.cfg b/cfg/stripper/acemodrv/maps/damitdc1.cfg index 5c016d779..f827cfe58 100644 --- a/cfg/stripper/acemodrv/maps/damitdc1.cfg +++ b/cfg/stripper/acemodrv/maps/damitdc1.cfg @@ -70,4 +70,4 @@ modify: ;"OnCase06" "temp_p2ForceSpawn0-1" "OnCase05" "temp_p1ForceSpawn0-1" } -} +} diff --git a/cfg/stripper/acemodrv/maps/daredux_map5_garage_aw.cfg b/cfg/stripper/acemodrv/maps/daredux_map5_garage_aw.cfg index 1f5c6f24a..d6824aa5f 100644 --- a/cfg/stripper/acemodrv/maps/daredux_map5_garage_aw.cfg +++ b/cfg/stripper/acemodrv/maps/daredux_map5_garage_aw.cfg @@ -724,7 +724,6 @@ add: "initialstate" "1" "BlockType" "1" } -} ; --- Auto crouch trigger for ladders { "classname" "logic_auto" diff --git a/cfg/stripper/acemodrv/maps/l4d2_stadium1_apartment.cfg b/cfg/stripper/acemodrv/maps/l4d2_stadium1_apartment.cfg index 48b9a918d..ac1c4725f 100644 --- a/cfg/stripper/acemodrv/maps/l4d2_stadium1_apartment.cfg +++ b/cfg/stripper/acemodrv/maps/l4d2_stadium1_apartment.cfg @@ -31,6 +31,7 @@ filter: ;Path Picker 1. "hammerid" "2411730" } +{ ;Query. "hammerid" "1951907" } diff --git a/cfg/stripper/acemodrv/maps/l4d_dbd2dc_undead_center.cfg b/cfg/stripper/acemodrv/maps/l4d_dbd2dc_undead_center.cfg index c2c4fe7f3..999173811 100644 --- a/cfg/stripper/acemodrv/maps/l4d_dbd2dc_undead_center.cfg +++ b/cfg/stripper/acemodrv/maps/l4d_dbd2dc_undead_center.cfg @@ -231,6 +231,7 @@ modify: { "spawnflags" "34816" } +} { match: diff --git a/cfg/stripper/acemodrv/maps/l4d_ihm01_forest.cfg b/cfg/stripper/acemodrv/maps/l4d_ihm01_forest.cfg index 56d7793bd..481744845 100644 --- a/cfg/stripper/acemodrv/maps/l4d_ihm01_forest.cfg +++ b/cfg/stripper/acemodrv/maps/l4d_ihm01_forest.cfg @@ -1,5 +1,5 @@ ;----- Make sure it's the same path on both sides (Non-Barricaded) -modify +modify: { match: { diff --git a/cfg/stripper/acemodrv/maps/versus_3.cfg b/cfg/stripper/acemodrv/maps/versus_3.cfg index a9360633c..beb411534 100644 --- a/cfg/stripper/acemodrv/maps/versus_3.cfg +++ b/cfg/stripper/acemodrv/maps/versus_3.cfg @@ -79,7 +79,7 @@ add: } ;block exploit onto roof -add +add: { "solid" "6" "origin" "9891 5143 -1319" @@ -89,7 +89,7 @@ add } ;barrier in "labrynth" because it just leads to a dead end and a broken infected ladder -add +add: { "solid" "6" "origin" "10923 4402 -1560" diff --git a/cfg/stripper/apex/maps/AirCrash.cfg b/cfg/stripper/apex/maps/AirCrash.cfg index 378c9a5e4..c947901b6 100644 --- a/cfg/stripper/apex/maps/AirCrash.cfg +++ b/cfg/stripper/apex/maps/AirCrash.cfg @@ -228,7 +228,7 @@ add: } { ; Bridge event - "origin" "3011 -2710 107" + "origin" "3011 -2710 107" "angles" "0 0 0" "classname" "weapon_item_spawn" "spawnflags" "2" diff --git a/cfg/stripper/apex/maps/OutSkirts.cfg b/cfg/stripper/apex/maps/OutSkirts.cfg index 85467ad89..78b82ceee 100644 --- a/cfg/stripper/apex/maps/OutSkirts.cfg +++ b/cfg/stripper/apex/maps/OutSkirts.cfg @@ -38,7 +38,7 @@ modify: { "solid" "6" } - delete + delete: { "OnHealthChanged" "alarmtimer1Enable01" "OnHealthChanged" "alarm_soundPlaySound01" diff --git a/cfg/stripper/apex/maps/RiverMotel.cfg b/cfg/stripper/apex/maps/RiverMotel.cfg index 07bd4b0be..86680bd5a 100644 --- a/cfg/stripper/apex/maps/RiverMotel.cfg +++ b/cfg/stripper/apex/maps/RiverMotel.cfg @@ -129,7 +129,7 @@ modify: { "OnCase03" "spark1SparkOnce01" } -{ +} ; Remove randomness from some gun spawns modify: diff --git a/cfg/stripper/apex/maps/c14m2_lighthouse.cfg b/cfg/stripper/apex/maps/c14m2_lighthouse.cfg index d881600ec..6c24f82b3 100644 --- a/cfg/stripper/apex/maps/c14m2_lighthouse.cfg +++ b/cfg/stripper/apex/maps/c14m2_lighthouse.cfg @@ -8,7 +8,6 @@ modify: { "hammerid" "2263638" } - { delete: { "OnPressed" "case_footlockerPickRandom0.11" diff --git a/cfg/stripper/apex/maps/c4m4_milltown_b.cfg b/cfg/stripper/apex/maps/c4m4_milltown_b.cfg index 669ee3401..3fa4043de 100644 --- a/cfg/stripper/apex/maps/c4m4_milltown_b.cfg +++ b/cfg/stripper/apex/maps/c4m4_milltown_b.cfg @@ -108,7 +108,7 @@ filter: ; --- didnt remove propane/gas cans and weapon_item_spawns that can spawn propane/gas ; -- first aid kit filters -( +{ "hammerid" "1988529" } { diff --git a/cfg/stripper/apex/maps/c8m4_interior.cfg b/cfg/stripper/apex/maps/c8m4_interior.cfg index 4c9668821..0fa3531f0 100644 --- a/cfg/stripper/apex/maps/c8m4_interior.cfg +++ b/cfg/stripper/apex/maps/c8m4_interior.cfg @@ -67,12 +67,11 @@ modify: "weapon_selection" "tier2_shotgun" } } + +filter: { ; remove hr - filter: - { - "hammerid" "6567279" - } + "hammerid" "6567279" } ; ===================================================== diff --git a/cfg/stripper/apex/maps/c8m5_rooftop.cfg b/cfg/stripper/apex/maps/c8m5_rooftop.cfg index 34671d8f6..c24dc192d 100644 --- a/cfg/stripper/apex/maps/c8m5_rooftop.cfg +++ b/cfg/stripper/apex/maps/c8m5_rooftop.cfg @@ -75,12 +75,11 @@ modify: "weapon_selection" "weapon_pumpshotgun" } } + +filter: { ; remove hr - filter: - { - "hammerid" "3319419" - } + "hammerid" "3319419" } ; ===================================================== diff --git a/cfg/stripper/apex/maps/daredux_map5_garage_aw.cfg b/cfg/stripper/apex/maps/daredux_map5_garage_aw.cfg index 1f5c6f24a..d6824aa5f 100644 --- a/cfg/stripper/apex/maps/daredux_map5_garage_aw.cfg +++ b/cfg/stripper/apex/maps/daredux_map5_garage_aw.cfg @@ -724,7 +724,6 @@ add: "initialstate" "1" "BlockType" "1" } -} ; --- Auto crouch trigger for ladders { "classname" "logic_auto" diff --git a/cfg/stripper/apex/maps/l4d2_stadium1_apartment.cfg b/cfg/stripper/apex/maps/l4d2_stadium1_apartment.cfg index 48b9a918d..ac1c4725f 100644 --- a/cfg/stripper/apex/maps/l4d2_stadium1_apartment.cfg +++ b/cfg/stripper/apex/maps/l4d2_stadium1_apartment.cfg @@ -31,6 +31,7 @@ filter: ;Path Picker 1. "hammerid" "2411730" } +{ ;Query. "hammerid" "1951907" } diff --git a/cfg/stripper/apex/maps/l4d_ihm01_forest.cfg b/cfg/stripper/apex/maps/l4d_ihm01_forest.cfg index 56d7793bd..481744845 100644 --- a/cfg/stripper/apex/maps/l4d_ihm01_forest.cfg +++ b/cfg/stripper/apex/maps/l4d_ihm01_forest.cfg @@ -1,5 +1,5 @@ ;----- Make sure it's the same path on both sides (Non-Barricaded) -modify +modify: { match: { diff --git a/cfg/stripper/apex/maps/versus_3.cfg b/cfg/stripper/apex/maps/versus_3.cfg index a9360633c..beb411534 100644 --- a/cfg/stripper/apex/maps/versus_3.cfg +++ b/cfg/stripper/apex/maps/versus_3.cfg @@ -79,7 +79,7 @@ add: } ;block exploit onto roof -add +add: { "solid" "6" "origin" "9891 5143 -1319" @@ -89,7 +89,7 @@ add } ;barrier in "labrynth" because it just leads to a dead end and a broken infected ladder -add +add: { "solid" "6" "origin" "10923 4402 -1560" diff --git a/cfg/stripper/deadman/maps/AirCrash.cfg b/cfg/stripper/deadman/maps/AirCrash.cfg index 3dcf8bc4e..f9e00f543 100644 --- a/cfg/stripper/deadman/maps/AirCrash.cfg +++ b/cfg/stripper/deadman/maps/AirCrash.cfg @@ -228,7 +228,7 @@ add: } { ; Bridge event - "origin" "3011 -2710 107" + "origin" "3011 -2710 107" "angles" "0 0 0" "classname" "weapon_item_spawn" "spawnflags" "2" diff --git a/cfg/stripper/deadman/maps/OutSkirts.cfg b/cfg/stripper/deadman/maps/OutSkirts.cfg index 6bfb47dcc..5a2a3a3fd 100644 --- a/cfg/stripper/deadman/maps/OutSkirts.cfg +++ b/cfg/stripper/deadman/maps/OutSkirts.cfg @@ -38,7 +38,7 @@ modify: { "solid" "6" } - delete + delete: { "OnHealthChanged" "alarmtimer1Enable01" "OnHealthChanged" "alarm_soundPlaySound01" diff --git a/cfg/stripper/deadman/maps/RiverMotel.cfg b/cfg/stripper/deadman/maps/RiverMotel.cfg index b49df78c5..a0f6c2af6 100644 --- a/cfg/stripper/deadman/maps/RiverMotel.cfg +++ b/cfg/stripper/deadman/maps/RiverMotel.cfg @@ -129,7 +129,7 @@ modify: { "OnCase03" "spark1SparkOnce01" } -{ +} ; Remove randomness from some gun spawns modify: diff --git a/cfg/stripper/deadman/maps/c4m4_milltown_b.cfg b/cfg/stripper/deadman/maps/c4m4_milltown_b.cfg index 16debbaf2..28e9a6bd0 100644 --- a/cfg/stripper/deadman/maps/c4m4_milltown_b.cfg +++ b/cfg/stripper/deadman/maps/c4m4_milltown_b.cfg @@ -108,7 +108,7 @@ filter: ; --- didnt remove propane/gas cans and weapon_item_spawns that can spawn propane/gas ; -- first aid kit filters -( +{ "hammerid" "1988529" } { diff --git a/cfg/stripper/deadman/maps/c5m2_park.cfg b/cfg/stripper/deadman/maps/c5m2_park.cfg index 8c9ca9b78..2c52cec74 100644 --- a/cfg/stripper/deadman/maps/c5m2_park.cfg +++ b/cfg/stripper/deadman/maps/c5m2_park.cfg @@ -25,6 +25,15 @@ modify: "hammerid" "1867428" } replace: + { + "classname" "weapon_ammo_spawn" + "spawnflags" "2" + "solid" "6" + "model" "models/props/terror/ammo_stack.mdl" + "disableshadows" "1" + "count" "5" + "angles" "0 0 0" + } } ; ===================================================== diff --git a/cfg/stripper/deadman/maps/c8m4_interior.cfg b/cfg/stripper/deadman/maps/c8m4_interior.cfg index 63b0bf629..868cb72d8 100644 --- a/cfg/stripper/deadman/maps/c8m4_interior.cfg +++ b/cfg/stripper/deadman/maps/c8m4_interior.cfg @@ -49,12 +49,11 @@ modify: "weapon_selection" "tier2_shotgun" } } + +filter: { ; remove hr - filter: - { - "hammerid" "6567279" - } + "hammerid" "6567279" } ; ===================================================== diff --git a/cfg/stripper/deadman/maps/c8m5_rooftop.cfg b/cfg/stripper/deadman/maps/c8m5_rooftop.cfg index 34785b86f..38f3763d6 100644 --- a/cfg/stripper/deadman/maps/c8m5_rooftop.cfg +++ b/cfg/stripper/deadman/maps/c8m5_rooftop.cfg @@ -75,12 +75,11 @@ modify: "weapon_selection" "weapon_shotgun_chrome" } } + +filter: { ; remove hr - filter: - { - "hammerid" "3319419" - } + "hammerid" "3319419" } ; ===================================================== diff --git a/cfg/stripper/deadman/maps/l4d2_stadium1_apartment.cfg b/cfg/stripper/deadman/maps/l4d2_stadium1_apartment.cfg index ffed6cc39..c9afb903a 100644 --- a/cfg/stripper/deadman/maps/l4d2_stadium1_apartment.cfg +++ b/cfg/stripper/deadman/maps/l4d2_stadium1_apartment.cfg @@ -31,6 +31,7 @@ filter: ;Path Picker 1. "hammerid" "2411730" } +{ ;Query. "hammerid" "1951907" } diff --git a/cfg/stripper/deadman/maps/l4d_ihm01_forest.cfg b/cfg/stripper/deadman/maps/l4d_ihm01_forest.cfg index 845820e58..aa0875058 100644 --- a/cfg/stripper/deadman/maps/l4d_ihm01_forest.cfg +++ b/cfg/stripper/deadman/maps/l4d_ihm01_forest.cfg @@ -1,5 +1,5 @@ ;----- Make sure it's the same path on both sides (Non-Barricaded) -modify +modify: { match: { diff --git a/cfg/stripper/deadman/maps/versus_3.cfg b/cfg/stripper/deadman/maps/versus_3.cfg index 2a6cc6d7a..4525a6c5b 100644 --- a/cfg/stripper/deadman/maps/versus_3.cfg +++ b/cfg/stripper/deadman/maps/versus_3.cfg @@ -79,7 +79,7 @@ add: } ;block exploit onto roof -add +add: { "solid" "6" "origin" "9891 5143 -1319" @@ -89,7 +89,7 @@ add } ;barrier in "labrynth" because it just leads to a dead end and a broken infected ladder -add +add: { "solid" "6" "origin" "10923 4402 -1560" diff --git a/cfg/stripper/eq/maps/AirCrash.cfg b/cfg/stripper/eq/maps/AirCrash.cfg index 378c9a5e4..c947901b6 100644 --- a/cfg/stripper/eq/maps/AirCrash.cfg +++ b/cfg/stripper/eq/maps/AirCrash.cfg @@ -228,7 +228,7 @@ add: } { ; Bridge event - "origin" "3011 -2710 107" + "origin" "3011 -2710 107" "angles" "0 0 0" "classname" "weapon_item_spawn" "spawnflags" "2" diff --git a/cfg/stripper/eq/maps/OutSkirts.cfg b/cfg/stripper/eq/maps/OutSkirts.cfg index 85467ad89..78b82ceee 100644 --- a/cfg/stripper/eq/maps/OutSkirts.cfg +++ b/cfg/stripper/eq/maps/OutSkirts.cfg @@ -38,7 +38,7 @@ modify: { "solid" "6" } - delete + delete: { "OnHealthChanged" "alarmtimer1Enable01" "OnHealthChanged" "alarm_soundPlaySound01" diff --git a/cfg/stripper/eq/maps/RiverMotel.cfg b/cfg/stripper/eq/maps/RiverMotel.cfg index 07bd4b0be..86680bd5a 100644 --- a/cfg/stripper/eq/maps/RiverMotel.cfg +++ b/cfg/stripper/eq/maps/RiverMotel.cfg @@ -129,7 +129,7 @@ modify: { "OnCase03" "spark1SparkOnce01" } -{ +} ; Remove randomness from some gun spawns modify: diff --git a/cfg/stripper/eq/maps/c14m2_lighthouse.cfg b/cfg/stripper/eq/maps/c14m2_lighthouse.cfg index d881600ec..6c24f82b3 100644 --- a/cfg/stripper/eq/maps/c14m2_lighthouse.cfg +++ b/cfg/stripper/eq/maps/c14m2_lighthouse.cfg @@ -8,7 +8,6 @@ modify: { "hammerid" "2263638" } - { delete: { "OnPressed" "case_footlockerPickRandom0.11" diff --git a/cfg/stripper/eq/maps/c4m4_milltown_b.cfg b/cfg/stripper/eq/maps/c4m4_milltown_b.cfg index 43c26991f..bee448b6d 100644 --- a/cfg/stripper/eq/maps/c4m4_milltown_b.cfg +++ b/cfg/stripper/eq/maps/c4m4_milltown_b.cfg @@ -88,7 +88,7 @@ filter: ; --- didnt remove propane/gas cans and weapon_item_spawns that can spawn propane/gas ; -- first aid kit filters -( +{ "hammerid" "1988529" } { diff --git a/cfg/stripper/eq/maps/c8m4_interior.cfg b/cfg/stripper/eq/maps/c8m4_interior.cfg index e7593d435..5fd8eeb1e 100644 --- a/cfg/stripper/eq/maps/c8m4_interior.cfg +++ b/cfg/stripper/eq/maps/c8m4_interior.cfg @@ -25,12 +25,11 @@ modify: "weapon_selection" "tier2_shotgun" } } + +filter: { ; remove hr - filter: - { - "hammerid" "6567279" - } + "hammerid" "6567279" } ; ===================================================== diff --git a/cfg/stripper/eq/maps/c8m5_rooftop.cfg b/cfg/stripper/eq/maps/c8m5_rooftop.cfg index 79aaceba9..cc7d508ea 100644 --- a/cfg/stripper/eq/maps/c8m5_rooftop.cfg +++ b/cfg/stripper/eq/maps/c8m5_rooftop.cfg @@ -51,12 +51,11 @@ modify: "weapon_selection" "weapon_shotgun_chrome" } } + +filter: { ; remove hr - filter: - { - "hammerid" "3319419" - } + "hammerid" "3319419" } ; ===================================================== diff --git a/cfg/stripper/eq/maps/damitdc2.cfg b/cfg/stripper/eq/maps/damitdc2.cfg index cfb1c2e4c..1b8ce655c 100644 --- a/cfg/stripper/eq/maps/damitdc2.cfg +++ b/cfg/stripper/eq/maps/damitdc2.cfg @@ -102,4 +102,4 @@ modify: "OnCase06" "molo2_tForceSpawn0-1" ;"OnCase05" "molo1_tForceSpawn0-1" } -} +} diff --git a/cfg/stripper/eq/maps/daredux_map5_garage_aw.cfg b/cfg/stripper/eq/maps/daredux_map5_garage_aw.cfg index 1f5c6f24a..d6824aa5f 100644 --- a/cfg/stripper/eq/maps/daredux_map5_garage_aw.cfg +++ b/cfg/stripper/eq/maps/daredux_map5_garage_aw.cfg @@ -724,7 +724,6 @@ add: "initialstate" "1" "BlockType" "1" } -} ; --- Auto crouch trigger for ladders { "classname" "logic_auto" diff --git a/cfg/stripper/eq/maps/l4d2_stadium1_apartment.cfg b/cfg/stripper/eq/maps/l4d2_stadium1_apartment.cfg index 48b9a918d..ac1c4725f 100644 --- a/cfg/stripper/eq/maps/l4d2_stadium1_apartment.cfg +++ b/cfg/stripper/eq/maps/l4d2_stadium1_apartment.cfg @@ -31,6 +31,7 @@ filter: ;Path Picker 1. "hammerid" "2411730" } +{ ;Query. "hammerid" "1951907" } diff --git a/cfg/stripper/eq/maps/l4d_ihm01_forest.cfg b/cfg/stripper/eq/maps/l4d_ihm01_forest.cfg index 56d7793bd..481744845 100644 --- a/cfg/stripper/eq/maps/l4d_ihm01_forest.cfg +++ b/cfg/stripper/eq/maps/l4d_ihm01_forest.cfg @@ -1,5 +1,5 @@ ;----- Make sure it's the same path on both sides (Non-Barricaded) -modify +modify: { match: { diff --git a/cfg/stripper/eq/maps/versus_3.cfg b/cfg/stripper/eq/maps/versus_3.cfg index a9360633c..beb411534 100644 --- a/cfg/stripper/eq/maps/versus_3.cfg +++ b/cfg/stripper/eq/maps/versus_3.cfg @@ -79,7 +79,7 @@ add: } ;block exploit onto roof -add +add: { "solid" "6" "origin" "9891 5143 -1319" @@ -89,7 +89,7 @@ add } ;barrier in "labrynth" because it just leads to a dead end and a broken infected ladder -add +add: { "solid" "6" "origin" "10923 4402 -1560" diff --git a/cfg/stripper/neomod/maps/AirCrash.cfg b/cfg/stripper/neomod/maps/AirCrash.cfg index 378c9a5e4..c947901b6 100644 --- a/cfg/stripper/neomod/maps/AirCrash.cfg +++ b/cfg/stripper/neomod/maps/AirCrash.cfg @@ -228,7 +228,7 @@ add: } { ; Bridge event - "origin" "3011 -2710 107" + "origin" "3011 -2710 107" "angles" "0 0 0" "classname" "weapon_item_spawn" "spawnflags" "2" diff --git a/cfg/stripper/neomod/maps/OutSkirts.cfg b/cfg/stripper/neomod/maps/OutSkirts.cfg index 85467ad89..78b82ceee 100644 --- a/cfg/stripper/neomod/maps/OutSkirts.cfg +++ b/cfg/stripper/neomod/maps/OutSkirts.cfg @@ -38,7 +38,7 @@ modify: { "solid" "6" } - delete + delete: { "OnHealthChanged" "alarmtimer1Enable01" "OnHealthChanged" "alarm_soundPlaySound01" diff --git a/cfg/stripper/neomod/maps/RiverMotel.cfg b/cfg/stripper/neomod/maps/RiverMotel.cfg index 07bd4b0be..86680bd5a 100644 --- a/cfg/stripper/neomod/maps/RiverMotel.cfg +++ b/cfg/stripper/neomod/maps/RiverMotel.cfg @@ -129,7 +129,7 @@ modify: { "OnCase03" "spark1SparkOnce01" } -{ +} ; Remove randomness from some gun spawns modify: diff --git a/cfg/stripper/neomod/maps/c2m2_fairgrounds.cfg b/cfg/stripper/neomod/maps/c2m2_fairgrounds.cfg index b4496d18c..1539b8493 100644 --- a/cfg/stripper/neomod/maps/c2m2_fairgrounds.cfg +++ b/cfg/stripper/neomod/maps/c2m2_fairgrounds.cfg @@ -551,7 +551,7 @@ add: ; "boxmaxs" "106 10 367" ; "initialstate" "1" ; "BlockType" "1" -} +;} { "classname" "env_physics_blocker" "origin" "-1408 -1025 441" diff --git a/cfg/stripper/neomod/maps/c2m3_coaster.cfg b/cfg/stripper/neomod/maps/c2m3_coaster.cfg index 3b01a9bea..24db616fc 100644 --- a/cfg/stripper/neomod/maps/c2m3_coaster.cfg +++ b/cfg/stripper/neomod/maps/c2m3_coaster.cfg @@ -1129,7 +1129,7 @@ add: "BlockType" "0" "initialstate" "1" "maxs" "48 8 88" - "mins" "-8 -108 -8" + "mins" "-8 -108 -8" "origin" "204 4528 0" "mapupdate" "1" } diff --git a/cfg/stripper/neomod/maps/c3m4_plantation.cfg b/cfg/stripper/neomod/maps/c3m4_plantation.cfg index f414cf4f5..8ff069e89 100644 --- a/cfg/stripper/neomod/maps/c3m4_plantation.cfg +++ b/cfg/stripper/neomod/maps/c3m4_plantation.cfg @@ -192,6 +192,7 @@ filter: { "targetname" "navblock_coop" } +{ "targetname" "navblock_scavenge" } ; --- Additional clipping around tall mansion ladders to stop players from falling off diff --git a/cfg/stripper/neomod/maps/c8m1_apartment.cfg b/cfg/stripper/neomod/maps/c8m1_apartment.cfg index f95f922e4..e7724f4d0 100644 --- a/cfg/stripper/neomod/maps/c8m1_apartment.cfg +++ b/cfg/stripper/neomod/maps/c8m1_apartment.cfg @@ -890,7 +890,7 @@ add: ; "BlockType" "0" ; "initialstate" "1" ; "maxs" "12 8 260" -; "mins" "-240 -8 -208" +; "mins" "-240 -8 -208" ; "origin" "2288 1424 224.35" ; "mapupdate" "1" ;} diff --git a/cfg/stripper/neomod/maps/daredux_map5_garage_aw.cfg b/cfg/stripper/neomod/maps/daredux_map5_garage_aw.cfg index 1f5c6f24a..d6824aa5f 100644 --- a/cfg/stripper/neomod/maps/daredux_map5_garage_aw.cfg +++ b/cfg/stripper/neomod/maps/daredux_map5_garage_aw.cfg @@ -724,7 +724,6 @@ add: "initialstate" "1" "BlockType" "1" } -} ; --- Auto crouch trigger for ladders { "classname" "logic_auto" diff --git a/cfg/stripper/neomod/maps/l4d2_stadium1_apartment.cfg b/cfg/stripper/neomod/maps/l4d2_stadium1_apartment.cfg index 48b9a918d..ac1c4725f 100644 --- a/cfg/stripper/neomod/maps/l4d2_stadium1_apartment.cfg +++ b/cfg/stripper/neomod/maps/l4d2_stadium1_apartment.cfg @@ -31,6 +31,7 @@ filter: ;Path Picker 1. "hammerid" "2411730" } +{ ;Query. "hammerid" "1951907" } diff --git a/cfg/stripper/neomod/maps/l4d_dbd2dc_undead_center.cfg b/cfg/stripper/neomod/maps/l4d_dbd2dc_undead_center.cfg index c2c4fe7f3..999173811 100644 --- a/cfg/stripper/neomod/maps/l4d_dbd2dc_undead_center.cfg +++ b/cfg/stripper/neomod/maps/l4d_dbd2dc_undead_center.cfg @@ -231,6 +231,7 @@ modify: { "spawnflags" "34816" } +} { match: diff --git a/cfg/stripper/neomod/maps/l4d_ihm01_forest.cfg b/cfg/stripper/neomod/maps/l4d_ihm01_forest.cfg index 56d7793bd..481744845 100644 --- a/cfg/stripper/neomod/maps/l4d_ihm01_forest.cfg +++ b/cfg/stripper/neomod/maps/l4d_ihm01_forest.cfg @@ -1,5 +1,5 @@ ;----- Make sure it's the same path on both sides (Non-Barricaded) -modify +modify: { match: { diff --git a/cfg/stripper/neomod/maps/versus_3.cfg b/cfg/stripper/neomod/maps/versus_3.cfg index a9360633c..beb411534 100644 --- a/cfg/stripper/neomod/maps/versus_3.cfg +++ b/cfg/stripper/neomod/maps/versus_3.cfg @@ -79,7 +79,7 @@ add: } ;block exploit onto roof -add +add: { "solid" "6" "origin" "9891 5143 -1319" @@ -89,7 +89,7 @@ add } ;barrier in "labrynth" because it just leads to a dead end and a broken infected ladder -add +add: { "solid" "6" "origin" "10923 4402 -1560" diff --git a/cfg/stripper/nextmod/maps/AirCrash.cfg b/cfg/stripper/nextmod/maps/AirCrash.cfg index 3dcf8bc4e..f9e00f543 100644 --- a/cfg/stripper/nextmod/maps/AirCrash.cfg +++ b/cfg/stripper/nextmod/maps/AirCrash.cfg @@ -228,7 +228,7 @@ add: } { ; Bridge event - "origin" "3011 -2710 107" + "origin" "3011 -2710 107" "angles" "0 0 0" "classname" "weapon_item_spawn" "spawnflags" "2" diff --git a/cfg/stripper/nextmod/maps/OutSkirts.cfg b/cfg/stripper/nextmod/maps/OutSkirts.cfg index 6bfb47dcc..5a2a3a3fd 100644 --- a/cfg/stripper/nextmod/maps/OutSkirts.cfg +++ b/cfg/stripper/nextmod/maps/OutSkirts.cfg @@ -38,7 +38,7 @@ modify: { "solid" "6" } - delete + delete: { "OnHealthChanged" "alarmtimer1Enable01" "OnHealthChanged" "alarm_soundPlaySound01" diff --git a/cfg/stripper/nextmod/maps/RiverMotel.cfg b/cfg/stripper/nextmod/maps/RiverMotel.cfg index b49df78c5..a0f6c2af6 100644 --- a/cfg/stripper/nextmod/maps/RiverMotel.cfg +++ b/cfg/stripper/nextmod/maps/RiverMotel.cfg @@ -129,7 +129,7 @@ modify: { "OnCase03" "spark1SparkOnce01" } -{ +} ; Remove randomness from some gun spawns modify: diff --git a/cfg/stripper/nextmod/maps/c14m2_lighthouse.cfg b/cfg/stripper/nextmod/maps/c14m2_lighthouse.cfg index d881600ec..6c24f82b3 100644 --- a/cfg/stripper/nextmod/maps/c14m2_lighthouse.cfg +++ b/cfg/stripper/nextmod/maps/c14m2_lighthouse.cfg @@ -8,7 +8,6 @@ modify: { "hammerid" "2263638" } - { delete: { "OnPressed" "case_footlockerPickRandom0.11" diff --git a/cfg/stripper/nextmod/maps/c4m4_milltown_b.cfg b/cfg/stripper/nextmod/maps/c4m4_milltown_b.cfg index 87fab90aa..842305e44 100644 --- a/cfg/stripper/nextmod/maps/c4m4_milltown_b.cfg +++ b/cfg/stripper/nextmod/maps/c4m4_milltown_b.cfg @@ -108,7 +108,7 @@ filter: ; --- didnt remove propane/gas cans and weapon_item_spawns that can spawn propane/gas ; -- first aid kit filters -( +{ "hammerid" "1988529" } { diff --git a/cfg/stripper/nextmod/maps/c8m4_interior.cfg b/cfg/stripper/nextmod/maps/c8m4_interior.cfg index 172d74fa8..6222c2ebd 100644 --- a/cfg/stripper/nextmod/maps/c8m4_interior.cfg +++ b/cfg/stripper/nextmod/maps/c8m4_interior.cfg @@ -68,12 +68,11 @@ modify: "weapon_selection" "tier2_shotgun" } } + +filter: { ; remove hr - filter: - { - "hammerid" "6567279" - } + "hammerid" "6567279" } ; ===================================================== @@ -119,7 +118,7 @@ filter: { "model" "models/props_equipment/light_floodlight.mdl" -] +} ; ===================================================== ; =================== GLITCH FIX ==================== diff --git a/cfg/stripper/nextmod/maps/c8m5_rooftop.cfg b/cfg/stripper/nextmod/maps/c8m5_rooftop.cfg index 3dde4b929..f612a2601 100644 --- a/cfg/stripper/nextmod/maps/c8m5_rooftop.cfg +++ b/cfg/stripper/nextmod/maps/c8m5_rooftop.cfg @@ -49,12 +49,11 @@ modify: "weapon_selection" "weapon_shotgun_chrome" } } + +filter: { ; remove hr - filter: - { - "hammerid" "3319419" - } + "hammerid" "3319419" } ; ===================================================== diff --git a/cfg/stripper/nextmod/maps/daredux_map5_garage_aw.cfg b/cfg/stripper/nextmod/maps/daredux_map5_garage_aw.cfg index 1f5c6f24a..d6824aa5f 100644 --- a/cfg/stripper/nextmod/maps/daredux_map5_garage_aw.cfg +++ b/cfg/stripper/nextmod/maps/daredux_map5_garage_aw.cfg @@ -724,7 +724,6 @@ add: "initialstate" "1" "BlockType" "1" } -} ; --- Auto crouch trigger for ladders { "classname" "logic_auto" diff --git a/cfg/stripper/nextmod/maps/l4d2_stadium1_apartment.cfg b/cfg/stripper/nextmod/maps/l4d2_stadium1_apartment.cfg index ffed6cc39..c9afb903a 100644 --- a/cfg/stripper/nextmod/maps/l4d2_stadium1_apartment.cfg +++ b/cfg/stripper/nextmod/maps/l4d2_stadium1_apartment.cfg @@ -31,6 +31,7 @@ filter: ;Path Picker 1. "hammerid" "2411730" } +{ ;Query. "hammerid" "1951907" } diff --git a/cfg/stripper/nextmod/maps/l4d_ihm01_forest.cfg b/cfg/stripper/nextmod/maps/l4d_ihm01_forest.cfg index 845820e58..aa0875058 100644 --- a/cfg/stripper/nextmod/maps/l4d_ihm01_forest.cfg +++ b/cfg/stripper/nextmod/maps/l4d_ihm01_forest.cfg @@ -1,5 +1,5 @@ ;----- Make sure it's the same path on both sides (Non-Barricaded) -modify +modify: { match: { diff --git a/cfg/stripper/nextmod/maps/versus_3.cfg b/cfg/stripper/nextmod/maps/versus_3.cfg index 2a6cc6d7a..4525a6c5b 100644 --- a/cfg/stripper/nextmod/maps/versus_3.cfg +++ b/cfg/stripper/nextmod/maps/versus_3.cfg @@ -79,7 +79,7 @@ add: } ;block exploit onto roof -add +add: { "solid" "6" "origin" "9891 5143 -1319" @@ -89,7 +89,7 @@ add } ;barrier in "labrynth" because it just leads to a dead end and a broken infected ladder -add +add: { "solid" "6" "origin" "10923 4402 -1560" diff --git a/cfg/stripper/pmelite/maps/AirCrash.cfg b/cfg/stripper/pmelite/maps/AirCrash.cfg index 378c9a5e4..c947901b6 100644 --- a/cfg/stripper/pmelite/maps/AirCrash.cfg +++ b/cfg/stripper/pmelite/maps/AirCrash.cfg @@ -228,7 +228,7 @@ add: } { ; Bridge event - "origin" "3011 -2710 107" + "origin" "3011 -2710 107" "angles" "0 0 0" "classname" "weapon_item_spawn" "spawnflags" "2" diff --git a/cfg/stripper/pmelite/maps/OutSkirts.cfg b/cfg/stripper/pmelite/maps/OutSkirts.cfg index 85467ad89..78b82ceee 100644 --- a/cfg/stripper/pmelite/maps/OutSkirts.cfg +++ b/cfg/stripper/pmelite/maps/OutSkirts.cfg @@ -38,7 +38,7 @@ modify: { "solid" "6" } - delete + delete: { "OnHealthChanged" "alarmtimer1Enable01" "OnHealthChanged" "alarm_soundPlaySound01" diff --git a/cfg/stripper/pmelite/maps/RiverMotel.cfg b/cfg/stripper/pmelite/maps/RiverMotel.cfg index 07bd4b0be..86680bd5a 100644 --- a/cfg/stripper/pmelite/maps/RiverMotel.cfg +++ b/cfg/stripper/pmelite/maps/RiverMotel.cfg @@ -129,7 +129,7 @@ modify: { "OnCase03" "spark1SparkOnce01" } -{ +} ; Remove randomness from some gun spawns modify: diff --git a/cfg/stripper/pmelite/maps/c14m2_lighthouse.cfg b/cfg/stripper/pmelite/maps/c14m2_lighthouse.cfg index d881600ec..6c24f82b3 100644 --- a/cfg/stripper/pmelite/maps/c14m2_lighthouse.cfg +++ b/cfg/stripper/pmelite/maps/c14m2_lighthouse.cfg @@ -8,7 +8,6 @@ modify: { "hammerid" "2263638" } - { delete: { "OnPressed" "case_footlockerPickRandom0.11" diff --git a/cfg/stripper/pmelite/maps/c4m4_milltown_b.cfg b/cfg/stripper/pmelite/maps/c4m4_milltown_b.cfg index 2fc0f0c96..cbd2db34e 100644 --- a/cfg/stripper/pmelite/maps/c4m4_milltown_b.cfg +++ b/cfg/stripper/pmelite/maps/c4m4_milltown_b.cfg @@ -108,7 +108,7 @@ filter: ; --- didnt remove propane/gas cans and weapon_item_spawns that can spawn propane/gas ; -- first aid kit filters -( +{ "hammerid" "1988529" } { diff --git a/cfg/stripper/pmelite/maps/c8m4_interior.cfg b/cfg/stripper/pmelite/maps/c8m4_interior.cfg index 4c9668821..0fa3531f0 100644 --- a/cfg/stripper/pmelite/maps/c8m4_interior.cfg +++ b/cfg/stripper/pmelite/maps/c8m4_interior.cfg @@ -67,12 +67,11 @@ modify: "weapon_selection" "tier2_shotgun" } } + +filter: { ; remove hr - filter: - { - "hammerid" "6567279" - } + "hammerid" "6567279" } ; ===================================================== diff --git a/cfg/stripper/pmelite/maps/c8m5_rooftop.cfg b/cfg/stripper/pmelite/maps/c8m5_rooftop.cfg index 003e2a684..f6470b692 100644 --- a/cfg/stripper/pmelite/maps/c8m5_rooftop.cfg +++ b/cfg/stripper/pmelite/maps/c8m5_rooftop.cfg @@ -75,12 +75,11 @@ modify: "weapon_selection" "weapon_shotgun_chrome" } } + +filter: { ; remove hr - filter: - { - "hammerid" "3319419" - } + "hammerid" "3319419" } ; ===================================================== diff --git a/cfg/stripper/pmelite/maps/daredux_map5_garage_aw.cfg b/cfg/stripper/pmelite/maps/daredux_map5_garage_aw.cfg index 1f5c6f24a..d6824aa5f 100644 --- a/cfg/stripper/pmelite/maps/daredux_map5_garage_aw.cfg +++ b/cfg/stripper/pmelite/maps/daredux_map5_garage_aw.cfg @@ -724,7 +724,6 @@ add: "initialstate" "1" "BlockType" "1" } -} ; --- Auto crouch trigger for ladders { "classname" "logic_auto" diff --git a/cfg/stripper/pmelite/maps/l4d2_stadium1_apartment.cfg b/cfg/stripper/pmelite/maps/l4d2_stadium1_apartment.cfg index 48b9a918d..ac1c4725f 100644 --- a/cfg/stripper/pmelite/maps/l4d2_stadium1_apartment.cfg +++ b/cfg/stripper/pmelite/maps/l4d2_stadium1_apartment.cfg @@ -31,6 +31,7 @@ filter: ;Path Picker 1. "hammerid" "2411730" } +{ ;Query. "hammerid" "1951907" } diff --git a/cfg/stripper/pmelite/maps/l4d_ihm01_forest.cfg b/cfg/stripper/pmelite/maps/l4d_ihm01_forest.cfg index 56d7793bd..481744845 100644 --- a/cfg/stripper/pmelite/maps/l4d_ihm01_forest.cfg +++ b/cfg/stripper/pmelite/maps/l4d_ihm01_forest.cfg @@ -1,5 +1,5 @@ ;----- Make sure it's the same path on both sides (Non-Barricaded) -modify +modify: { match: { diff --git a/cfg/stripper/pmelite/maps/versus_3.cfg b/cfg/stripper/pmelite/maps/versus_3.cfg index a9360633c..beb411534 100644 --- a/cfg/stripper/pmelite/maps/versus_3.cfg +++ b/cfg/stripper/pmelite/maps/versus_3.cfg @@ -79,7 +79,7 @@ add: } ;block exploit onto roof -add +add: { "solid" "6" "origin" "9891 5143 -1319" @@ -89,7 +89,7 @@ add } ;barrier in "labrynth" because it just leads to a dead end and a broken infected ladder -add +add: { "solid" "6" "origin" "10923 4402 -1560" diff --git a/cfg/stripper/zonemod/maps/AirCrash.cfg b/cfg/stripper/zonemod/maps/AirCrash.cfg index 378c9a5e4..c947901b6 100644 --- a/cfg/stripper/zonemod/maps/AirCrash.cfg +++ b/cfg/stripper/zonemod/maps/AirCrash.cfg @@ -228,7 +228,7 @@ add: } { ; Bridge event - "origin" "3011 -2710 107" + "origin" "3011 -2710 107" "angles" "0 0 0" "classname" "weapon_item_spawn" "spawnflags" "2" diff --git a/cfg/stripper/zonemod/maps/RiverMotel.cfg b/cfg/stripper/zonemod/maps/RiverMotel.cfg index 07bd4b0be..86680bd5a 100644 --- a/cfg/stripper/zonemod/maps/RiverMotel.cfg +++ b/cfg/stripper/zonemod/maps/RiverMotel.cfg @@ -129,7 +129,7 @@ modify: { "OnCase03" "spark1SparkOnce01" } -{ +} ; Remove randomness from some gun spawns modify: diff --git a/cfg/stripper/zonemod/maps/c2m3_coaster.cfg b/cfg/stripper/zonemod/maps/c2m3_coaster.cfg index a4c64eaaa..6602be03c 100644 --- a/cfg/stripper/zonemod/maps/c2m3_coaster.cfg +++ b/cfg/stripper/zonemod/maps/c2m3_coaster.cfg @@ -1163,7 +1163,7 @@ add: "BlockType" "0" "initialstate" "1" "maxs" "48 8 88" - "mins" "-8 -108 -8" + "mins" "-8 -108 -8" "origin" "204 4528 0" "mapupdate" "1" } diff --git a/cfg/stripper/zonemod/maps/c8m1_apartment.cfg b/cfg/stripper/zonemod/maps/c8m1_apartment.cfg index c03aa56c8..c83c12373 100644 --- a/cfg/stripper/zonemod/maps/c8m1_apartment.cfg +++ b/cfg/stripper/zonemod/maps/c8m1_apartment.cfg @@ -798,7 +798,7 @@ add: ; "BlockType" "0" ; "initialstate" "1" ; "maxs" "12 8 260" -; "mins" "-240 -8 -208" +; "mins" "-240 -8 -208" ; "origin" "2288 1424 224.35" ; "mapupdate" "1" ;} diff --git a/cfg/stripper/zonemod/maps/daredux_map5_garage_aw.cfg b/cfg/stripper/zonemod/maps/daredux_map5_garage_aw.cfg index 1f5c6f24a..d6824aa5f 100644 --- a/cfg/stripper/zonemod/maps/daredux_map5_garage_aw.cfg +++ b/cfg/stripper/zonemod/maps/daredux_map5_garage_aw.cfg @@ -724,7 +724,6 @@ add: "initialstate" "1" "BlockType" "1" } -} ; --- Auto crouch trigger for ladders { "classname" "logic_auto" diff --git a/cfg/stripper/zonemod/maps/l4d2_city17_01.cfg b/cfg/stripper/zonemod/maps/l4d2_city17_01.cfg index 55900f52c..62e57fd94 100644 --- a/cfg/stripper/zonemod/maps/l4d2_city17_01.cfg +++ b/cfg/stripper/zonemod/maps/l4d2_city17_01.cfg @@ -186,7 +186,7 @@ add: "BlockType" "1" "initialstate" "1" "maxs" "220 80 80" - "mins" "-8 -12 -80" + "mins" "-8 -12 -80" "targetname" "eb_van01" "origin" "4060 -5128 -44" } diff --git a/cfg/stripper/zonemod/maps/l4d2_stadium1_apartment.cfg b/cfg/stripper/zonemod/maps/l4d2_stadium1_apartment.cfg index 29f758783..4ae7deb27 100644 --- a/cfg/stripper/zonemod/maps/l4d2_stadium1_apartment.cfg +++ b/cfg/stripper/zonemod/maps/l4d2_stadium1_apartment.cfg @@ -153,6 +153,7 @@ filter: ;Path Picker 1. "hammerid" "2411730" } +{ ;Query. "hammerid" "1951907" } diff --git a/cfg/stripper/zonemod/maps/l4d_dbd2dc_undead_center.cfg b/cfg/stripper/zonemod/maps/l4d_dbd2dc_undead_center.cfg index dbb041787..a5382eebd 100644 --- a/cfg/stripper/zonemod/maps/l4d_dbd2dc_undead_center.cfg +++ b/cfg/stripper/zonemod/maps/l4d_dbd2dc_undead_center.cfg @@ -231,6 +231,7 @@ modify: { "spawnflags" "34816" } +} { match: @@ -493,7 +494,7 @@ modify: ; ################ JUNK/PROP CHANGES ############### ; ===================================================== ; == JUNK/PROPs == -; == Remove or change Junk/Props == +; == Remove or change Junk/Props == ; ===================================================== filter: { From e7f72380991eefe58abc132d9fd18ce2e5595dea Mon Sep 17 00:00:00 2001 From: SirPlease Date: Sun, 10 May 2026 23:16:46 +0200 Subject: [PATCH 05/19] Patch Aim Assist While this significantly nerfs controller players (I'm sorry), there's been a longstanding exploit that some M&K players were abusing in order to get the same aim assist. All this plugin does is disable the functionality entirely. I've placed the plugin in the optional folder, just in case server owners don't want to autoload it in non-competitive modes, but I did place loading of it in generalfixes.cfg so that it'll get loaded by every matchmode. --- .../sourcemod/gamedata/l4d2_block_autoaim.txt | 27 ++++++ .../plugins/optional/l4d2_block_autoaim.smx | Bin 0 -> 3867 bytes .../sourcemod/scripting/l4d2_block_autoaim.sp | 81 ++++++++++++++++++ cfg/generalfixes.cfg | 1 + 4 files changed, 109 insertions(+) create mode 100644 addons/sourcemod/gamedata/l4d2_block_autoaim.txt create mode 100644 addons/sourcemod/plugins/optional/l4d2_block_autoaim.smx create mode 100644 addons/sourcemod/scripting/l4d2_block_autoaim.sp diff --git a/addons/sourcemod/gamedata/l4d2_block_autoaim.txt b/addons/sourcemod/gamedata/l4d2_block_autoaim.txt new file mode 100644 index 000000000..377a9d7aa --- /dev/null +++ b/addons/sourcemod/gamedata/l4d2_block_autoaim.txt @@ -0,0 +1,27 @@ +"Games" +{ + "left4dead2" + { + "Functions" + { + "CBasePlayer::ShouldAutoaim" + { + "signature" "CBasePlayer::ShouldAutoaim" + "callconv" "thiscall" + "return" "bool" + "this" "entity" + } + } + + "Signatures" + { + "CBasePlayer::ShouldAutoaim" + { + "library" "server" + "linux" "@_ZN11CBasePlayer13ShouldAutoaimEv" + "windows" "\x56\x8B\xF1\x8B\x06\x8B\x90\x74\x07\x00\x00\xFF\xD2\x84\xC0\x74\x2A\x32\xC0" + /* 56 8B F1 8B 06 8B 90 74 07 00 00 FF D2 84 C0 74 ?? 32 C0 */ + } + } + } +} diff --git a/addons/sourcemod/plugins/optional/l4d2_block_autoaim.smx b/addons/sourcemod/plugins/optional/l4d2_block_autoaim.smx new file mode 100644 index 0000000000000000000000000000000000000000..dae0616f469848b42fffe857444b14d4dd40ffd1 GIT binary patch literal 3867 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 +#include + +#define PLUGIN_VERSION "1.0" +#define GAMEDATA_FILE "l4d2_block_autoaim" +#define FUNCTION_NAME "CBasePlayer::ShouldAutoaim" + +public Plugin myinfo = +{ + name = "[L4D2] Block Autoaim", + author = "Sir", + description = "Strips Auto-Aim from the game entirely (disables controller aim-assist + patches an exploit)", + version = PLUGIN_VERSION, + url = "" +}; + +ConVar g_cvEnabled; +DynamicDetour g_hDetour; +bool g_bDetourEnabled; + +public void OnPluginStart() +{ + GameData gd = new GameData(GAMEDATA_FILE); + if (!gd) { + SetFailState("Missing gamedata \"" ... GAMEDATA_FILE ... ".txt\""); + } + + g_hDetour = DynamicDetour.FromConf(gd, FUNCTION_NAME); + delete gd; + + if (!g_hDetour) { + SetFailState("Failed to set up detour for \"" ... FUNCTION_NAME ... "\""); + } + + g_cvEnabled = CreateConVar( + "l4d2_block_autoaim", + "1", + "Disable Auto-Aim", + FCVAR_NOTIFY, + true, 0.0, true, 1.0 + ); + g_cvEnabled.AddChangeHook(OnEnabledChanged); + + ApplyDetourState(g_cvEnabled.BoolValue); +} + +public void OnPluginEnd() +{ + ApplyDetourState(false); +} + +void OnEnabledChanged(ConVar convar, const char[] oldValue, const char[] newValue) +{ + ApplyDetourState(convar.BoolValue); +} + +void ApplyDetourState(bool enable) +{ + if (enable == g_bDetourEnabled) { + return; + } + + if (enable) { + if (!g_hDetour.Enable(Hook_Pre, Detour_ShouldAutoaim)) { + SetFailState("Failed to enable detour on \"" ... FUNCTION_NAME ... "\""); + } + g_bDetourEnabled = true; + } else { + g_hDetour.Disable(Hook_Pre, Detour_ShouldAutoaim); + g_bDetourEnabled = false; + } +} + +MRESReturn Detour_ShouldAutoaim(int pPlayer, DHookReturn hReturn) +{ + hReturn.Value = 0; + return MRES_Supercede; +} diff --git a/cfg/generalfixes.cfg b/cfg/generalfixes.cfg index e9562a990..0ec6027a3 100644 --- a/cfg/generalfixes.cfg +++ b/cfg/generalfixes.cfg @@ -72,4 +72,5 @@ sm plugins load optional/l4d_return_thrown_items.smx sm plugins load fixes/l4d_prop_touching_rules.smx // Anti-Cheat. +sm plugins load optional/l4d2_block_autoaim.smx // Sort of a cheat..? sm plugins load anticheat/l4d2_noghostcheat.smx From 0b825c1114716ee5c4b57da8a106e06e194384a0 Mon Sep 17 00:00:00 2001 From: SirPlease Date: Mon, 11 May 2026 22:33:55 +0200 Subject: [PATCH 06/19] [l4d2_fix_changelevel] Resolve partial map names Resolve partial map names before the engine sees them without needing to modify SourceMod's basecommands/maps.sp every time we update. --- .../plugins/fixes/l4d2_fix_changelevel.smx | Bin 7911 -> 8077 bytes .../scripting/l4d2_fix_changelevel.sp | 40 ++++++++++++------ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/addons/sourcemod/plugins/fixes/l4d2_fix_changelevel.smx b/addons/sourcemod/plugins/fixes/l4d2_fix_changelevel.smx index 06576165b5f9e2582d6a4be8f91ca7af59e9bd67..947fdb1c0785fcac81b273a583d30061ab314c9e 100644 GIT binary patch delta 7897 zcmXYv1yoc~*M?_k32Bs&lptUiaR!C7mD(C@X90VSvF23?NX!I}nJH0t^D-VSxVo{D)XfAP^3E zMaTjIdDEeZ_AprxC>u>mbe_Hhf#7J;qce+k8#LL`k&**}F7ZJiKC}y~gFwOPb0yGT zr-9x>yAs;>G(iAp3N5!6#_3`8dm?bT?0L`NLm^c2l3 zbhOYeg=Q@}acCz&vlX3OwEw{cfqKyHWc%ZXw|6dd&S`JW4dgNQZ+hO6Jtd>2cz#OGZKe!mIWUGo z_VSIAgBPPNNOHfs?uwO_^Byv7xf`ecnNrJ-s(4<`>*DZ=T)dq3p!ku7g92GjYG%dr zVvkP9<;ZaE+!DJpd(i08Eu#HstK;$zdbITUauYB%owV{|p}C(2pMvyg{*i@UVs3(j z!ZO0Pu=tseD=1)*_y|($BU|jF?-72QUC<(=nGUL!+n?fVzmpzn72jO9YoQ29#OWVI zA!X79DMGdvA)o1>61n~Px&13CVP5zMZ0w`h2tS3cI3>!pT4XOJtSsWETo2^V?kY?Jb zS}uR%YMDB-E|YSkblHFA8(|+&V;?0)_~~~+ijn#Hs8KHeElSvHe1s^rR_>d^pKrTN zz9LyEVbK(@5qw0i3{BbE^3it>e?4zjv4k$&ommtk_QLbG6H3_jEhN!^* zc6^C2)I~k!@QevAv5#O8es8**Ty(1?|ML}SwNbvD{sGu-oe_SjU65L2z5&Wy z2gS$jFHQlQw(B*2)wQRC665wS#V@EqK0|NnqRhVn-9egBqNK|jH<(vu1N=@!4=KTE zUw${~t}X|k|23SMDDbAAlwsRQJB0*YK<*o96a(1hZGBF}iYjhCaeMGP7j;n*|HZnCu5m?l}dl& zn3Hn-h^{N2@*8R`${2H=UB*wjRZ)aAz8XioiEXaNACOc@U6V}FQpX)L=W!`C>O6Vo zHk{bnrg4hY#@(Bkrg7Z3mQrc-ICo|$m*&aX8k8`6e|czCukMO>E@IwdFte|+dPOrKG5GJ|S4k$flOwsUQ2 zV&DD3ceHH^gg`B(0C8mLx{6;teZR=RE$OjsyjqKof@7qdW8A{)I}`zluL5e9tO~4k>5b!ES;vkOk$Dv`zgH_4 zFE)A^ZPoqjm#E#khGUE>5`?c=Uh3S4-Tfwi}>m{OUiK#~PLP_WW7t5{$F1EUtN=sZ=N>2a01ze1t@1*1*et2Cza(DEL-W@Ee{yCk^a&7}{X8b~| zXz~LV_^dX=&s)w%+7rshQ*}6#HWYCm_}<8;vu%akXH&ao3q)#Jx)Gv$COUk-#6(AW zQ9CVDgFtAF2Hg>DW?YWAeb3vRY1m4?|JCbLFcuY}V8}Kx#xy`2M0*fv0APh&81I-t zYfg@0_;3AiSI_%}U{45d)lEJC`a`uXJ9`H+PS<){hFJHU8KEEc+P;3NY8v%V$w#1E z`6{``|K_W*P5acTy&pjQH8ZP%rY*g-X@fGTvoY+O)qUC`%=zNiU~s=DK7_OK9gZ0$ z_vzmkOE)2JsIJ&Y7sfb;1t6i4tF@77JLf``ZPJYjKTuFOyUDrKA)QmBYtczRJoY;{twc}_bntAgZ3VhPtEkT$V?*pS`L2luO#VaZ;J4% zuG!%@TAg8txcVmdjSx@t#NZ6A9pe2_%))Z8@{T-dy=NM~bNyBVEj2T%WxWwtA!?(u zm%dn)&uVWe8>4rrlm%QLX;GK8lr4lxc7z6rsP#+dlx=mWchsVN**2&8v`Z+YUCaMl zTDAb4WOQFlN4Z0gr7K3XQL)7So_PQ52+WAek}AKOq*rVx^hKf{u{PZebcv(uG4*E+ zNtPrbE~Rfyv-L(;kK@d}f5}(o*OPQT@;axZlHQ6^I@itq1}M`Rj8$P;);*4De?fAw z>t0><<^NZ(`Y(|+4n?0JXTiPhx2uBPjc1R#_h`k-)m1)+>eF)NHcJ{%Yh88gE14{i zm$bU1Il9u?<}4U|-fT9iXm!bQbY;+=Y~eQzJYc%Kw%S(kc&{6_smb%1Er+70)tGBi zF%3h+4`>_^G4!f()JzL*(=OMR;%KU~0vl%xcMM`Xyb-$PdRp{mfKFd6Ab9tyojc*) zj`@#oIJ@b;=TUHo@*j2kkw&33u@B^Z>7`J^`tf$ea1dXF`m_i;?-Q?Y7jrqy-pz$L z8!nsrngP16u54As8OuX(R#?LH!s5bm^{K>?4S=pZZ!r;{Q0odK?c=6D#*~1?sHXj1 zlc)*5Cf96^4qxuZRCa+H(FLJ*`w&n3M*IWJ)re)1b@#8dLw6`#2kr6m_rCJFI9B)=0E{4e*pqwRheMxh#xx;8{ zyy zJPlq4JA?MY>fpy1i6C=~Jg{l@7;xk_0CvKy#*o5#ieUrN3%d`C40{5K2CIPk!TexN zj8V`i<^^@&08d4%-MD)zITwoM+v8`kE*~8?7A1~8Ddy=@ zpl^iA94B{{c&sDK+IUN~{tJ_j2&XO~J?d_u`gX5LDlgX3Jg)TDhIjIFK$_T;42(e-l$99f#&Ro`Zhx%rM z97$1WONw4B_dVg0kBhk3=B*{=N2i0lv`W&}Wha5<*`rp7)_YTqY?9~FoEv|I(10R zA6Rt6?P!^kA;#@1;AZKf%T=h%o-t|-inxh|sh{_M8fGNNPSEfY0G{QZk|b!jGxFyy zy=#jo7_}0}|5_%AxjB0TYhvKEB*;`w+6Z?X;Cpit&^-2qq{X?>HNA1tfX`(hu=LZY zR#!Jyi|^%>OTBE^P}uB2PBWPRRy|k+R0+xg*Z85J4?6HrxFFmJF8b05TEPltL0=3` zbio789hQ4`=L3NE8Qu}2Z^~1o6k{{V1%&_}2lz2q6U+zV!{7t+Vb+3bF>1lJn64mK zzIEI-!I#2Clz(s>aCvZeuzQ|(Kn#z%>BgQ0IEh~3)mJ%Nf0Adj;3wiV-`L4ZD`P86 zP&eyvdaCz#Uc5sGRoqC%{!d(w{gQec^etmu!vWc%ZWzXAvyW z`abmOO%LH|Poy%W-agp;xc>BT($})YlBd9#SC6k}%)Wno zqqGWpjPii1p??B4oDxpdxD{vF4Xy(1fpfu70AvKGKr$i);0s^cLNzU!8RLG=d0!v0 z{Y`+}Z&c#*bclvp9bSiK$u$kuH97B(9Aw}jl*cYh{Y#(lj4f=H``}sIs4hr`Ahce~ zI%2-j>tO#K66hDK=gNgB{M(@Pn>L8(Z0wyaSI7HBp8li3OPjWV!4?=4F+sg-V`XR! z&}P=?^yS&UA>=Oj`qX0~o`qa&(}PpxuET$>e)!Iu#e8DOS97eNAdu61ir}}X9V4cY zT|$da-b=$iUQC-Ff=64@gEYKO3#@xxf2-I%eVc_cRdYZ5W%*vy7z7PWt6~uLGt})? z4&a~ipRG-=H)I$z)J{DmT#@Lz!$*qj06qB*PmqFm@q9^IFT>(p_l}{5&4&}gZ3W@y zO*~oq<0Ho&L-n8cCxkw_7z`#;i$bZzcIv&UcjI*DS}e-GY<|vsX5+dY79U0mn!yek z(xB+AqSN@j@i*iriJ-Oxr>ia7WT4E^C&0-oSvf#ToHgk?TfSV)P6Uwkz&fo#NQxQ~O;C5$&Iahy;tc}-g zUH_Ja!-W#k-c(Iw2*_)7Vs?#BruEjR8h?I)?biK**T+ngE|&ii6M)2zO^qepWp-EAZ^fL49fmVfs#gr~Z3j}kNExDo zXtNGj^L-#xE2q+4CBZnK4&P5m=4&Zk!=@ZC3mvyV9S2~wL6z+fbL@|eVt$UTHevD) zuL?h1&hFhJ$rL^L{B1cLmr?);RmV3bR?6~fpVc%8Yx<15Df?l`!G z9Bs#=EAYF=HWq~2SW<+u!1%DA1OnHe6t!d50UV3MiMIpTZ90fZaPQ*%?OJIC9@T?z z!3-Et1rI6GQ}S9(bo16X`hZOINKv^wXD{&io|o<&a2 z8f%c~l`Acw=_}D^_ablf=IycVcN7O#W4Dpi3Vpv$p=8Kk#_6q-y-dD{rE>!pMBdv~8m%86%b9m2f|a z*l(%A*>=L;F-xDvjI!88iCYp+yHWK=Glk5ry|6MlR9#@MNds_Ys+Cfhko|-ZC%fhZ&Y*jLq4*PpE1nyhxu^i>> z+OK}F>K*spp<;km%H|9n-IAZ;+UuFgqTj~U&T0=*aRam2O5ApLh4A(F=FbNTdf>k= z^toELUYa(}2(vw{ThA8?(8^wU^w}1BhHP*80!8R0X8%<`fl_WnquNBJZ8JV*#+OBy zgVtVDyg}x(IvYL1T!a#7h-G~CFHr1E^|@p~=@%DnnTQ==u;W+JBYsXyvi@in39jtA zsR>aGKLQ@!dK6^8h6U1`p(-Ywl#zqg2X`|0dnNM=|Xny*Y z1J`^Mx!I$9LR6L!5vWYaC$GH_PA833=u6StIONzQ!pnY1OycYj|1P$lj#EwihJh|* z@t1qTVMwe)^okx@f_7*)Tnz`%;9ucP_3&xW_K=B!BWY4`l&O%ucr9A&0|n3 zHuJah=J*gtHkX$et$u1IlTy>bO+`X*N0{e?XB_UZ_Xm0f!0k`Sk(csHT8@%adai+haH%|Mwa0-sOUSY-EB4IMUE&ysjt^-tgH9eOKC=S_M3p%5(*gwz)8u!rBNUGOvAEj~6{kHTJ zl~pTbB{}45tteEw+xw-#`s7^eH>LBcKr8Ugep@xl-K4Hp^nkzDp6GW-xlqhMxs^WO z*ekV_QC)`ol-f5FKGdGXUmtstc9u2ds-nll{wr#LUh&gF^kiRP+1KTZtv6|9{#CoNMC!|b6jvXoR(Q=Up0>+s*d+eza1&Ty z-uHBktzT$G_iT;gK?}7MTQq8Af+1&lThYZ=?jlchFv%aM1z=7DKj_`? zU?9i71nWO+*%&fA6K|6T0&+91%+6XBVVy6N^1{X@{^}z;$qLhNORf|bE#kB~^2rO` zZ)qEybefry3{3XfCd4UfDNUJsLxf(Ztq~DmVdTA|Ja1+3niwzl?TKI`U|Dvy+lg;($!T+hv zq-{5_mUUm0(rtZ=S?sC#ykK&&fZz#J1;CMjGiRsm+hfafwz zUTJ*{SO0q0Jww&kmV3mmKC>D0bi+xJS>dIm4}?T>n^kZ@q#egB&rLdmI|~X2S%C-a ze(<)&_ZLGkAv5uSTHD7cNz2I{iRU3qY4nbx17|3>~qR7yW2dBJ4$Yi;osFAib40R@KGG+=|b!n$pfiIpllsX-k!p}-JaHVEO}MfIupC_9GY=V6D6p9Acuu~aFz_xdT1d*Y^~Kzlk2tbXJn# zfrrwwAr9X;AK?&aA6g(bEj~8;T^L(l`a&zt5K~s=0`IDwrjzUeI~AAU1l-sUKPn9j zFD&=v+1xW7fLu2XjGj6z4@;h)+C;l z`y)wYQd|`RV5~ivkhx+)%2LeO$tvw+owWHqzIr|<+aPP+89&qBWeYo;gBO-Q81?NT zdTn8&X2yMciyLU+H6PtG1-3lRms5uV%!YWjd=9of&1Y)S!rK}#^CO%RR^VdZwfEKz zyUtq05cNXYki_vBgdIf`?pBNRIk=Xnv(H+E6^sY|>!!J_6ARGdno#Pke7qPUr*68O z%Q_(*yO*G0b+o`!D>q6tlV#GAA$1uTTy>RBkkKG-s*)5ZbVvpSw{acJ((04kN6f~M zC{i_g#G4b6UXmX}$d2yefZ$T!dYw9X{?I$FI<+%2&nz;^zQW^@krTQSgZ%Rd;* z?6Vj53!Bx-(|#BTfb`dGVI6l91cXA!$F=4TVOw6lw0wez<+0{sFS@tMSmN%)Q|NUp zdg`9!U&e)g=Fay^N@Pv{^xYWZ#%RmjKH}}%sgj2@%pQfPTeWcxBtxbVEMiL@0}VIC zuN7TJ9JfX)PTx3! z^P|yG>u2sV_8GA!R{p*Posw>bT=E-gqqX*Fe7LYMc1~= z?K$OIw z|2_Zt0uKm8P8gx?f5f05;uxT9vHV zHNFVIsN1;J9M9PTgh?zK+>~LA?RSPm~Lfi>FPO%o%^%~{$2v;W@KF_3@D)%>3 zB%F#&vKr-UfzxAzlTcT{P-@jEwNI#WbDSp=9L)q*Cc~1EVXNXGy1kumPy=sM18s4) zsKJK4OI0WjMmRj~1b7#B@;MG-*sJpPf9Wl8bzZ+afKHDW!5DFum)t<_y5cO0ab2;8y5~oGr|cQ7*Vg9 zkkvQoO7BsxLgU(;dO56cqSUKa)T@DH*yjIE!^s?1CmLQ3OO@B}H4+Kere0MitACH; zvcP4Egf~&Imc^YAD!2cy^3Yb1W6S@a$A=8t9(O`me{vgGo#FkQavC$ugLui`Bd&MJ zcP40&{j{aO=L|n8>Hkh`>q$+t&UYa+WMgV2#$MWDb<5n|JAz}|t@O7Hh?3nd96ooTFMn&)UvH+R}$5hPBQ%ay?8Y=pNXd z7zA70EByXEcjJqA=W^xmecwX&o?AK5#WqL^ZM9w*I+`;irQN;n!86R-yXgkIAxoOg z995DcW%M3h1ux7RYayq*Tlv2tds0aNO6LHF|3!X4Ib&-6C2bgdj< z=5y8R$1}fnm>i%U(P5^?$-UOk;O32iV?KAQ%k#endpzcEiMo~;4sp0UqfZL{sgZQ9 zs|Fzg1AO_A$J_M-Zw+$z?k!vsD)09Iw;6)1KlFyG_OjUD-@?HO^#C@8KZ zsIn-F-x2G(>@PQ-v4#O(^^HQDa{Q0*wn9iCMG$|Zi~6k20Pj&U%+jfQW_tYa>K}eE zqN*-NVnem|ovM(Z^u*^p^s>Z;vc&pVIkSou-icsKZU;L*fr$gliaN(1!8JlkwIbLR z%ka?Lpg&b*-){j|ki=slJooqY-NL!_mbkh``9^hB3A|ncOj*o5D_IJrX=V`JP(2S! zKsxzLzb6fQj2)5AbpGqnoxUyxJ7YVw{`FMH?j@n2aNAC82k*zq-&%eAMCz}1wBb{%<} zy@k6OVKCWCp&f03Jzsy%m>gDR`*Q#cVftW|xAhv8CocnZe*D&p%JMvCQ^pqC7Td1U zbpHza6_XsDw}TP)#s9dwgKd||zRGymJy1GQQ&0QvO~!O*>%;XXdgo*NW7u=`g5Q@W z3v>%2#}^qs(9-Tj?&j<)sZNkLOKvoxDraSr$82A%V)#Bi&c-qF+A%Jw0Yd zzIKHUJ#`Oe>G~Gie#dqn(H$One}l~Fbd5IuL%z0`r!=EfC1ou*rQAWBDdR+EKW_vJZA3om_UC9><3d=Yb zaDB(`DY$)${DTQ_Q%P{2inl-(&<%UG9n@jb=^$)&wh!~@bm2MvOP61pnv@qa`7ZAA zl-n)NAm&A_y~LKT#G|D3eh5e8xK}1e%|>#=3@5|JM!!f0t*n zlA`uczP0KGp>7_QKSpQb_bA?`Z5urCUMOn5JQldLpq?q)AoE)OamOSb3_u6RZcewK zX_l}~xkM~;5tVG_fK1Z;%+=c-@RuM>LPH?Un9&v;9>Ffn!oQz~z>hZ@Sqcvq-|ij_ zNo*pRW7mmz_61dYiH&orOrvAjhEHuX|i4Q%jGzH1?mHc6X zk`iNl8GX5N`r2OZ6Yme8Dwwru!E@GZX#eVNsx|=OU|P7#*9LQ8w9tbYhi0%Vq#<0V z(oF3(n{PAoD!JBG^i`qD8s3Act!9(^wj)CC?99eC*iw80b7kf;{=d;n7Us|frWVrXe$J}T?F!UA!lVDz3U`&NTpvwx0nU6k2j^zA|IJZ;gYOL}!*2 zM&;UeWyW^nBiT<9jr>*D)SYRgg-uPUCzn$MW^{6iLL52q2&V5z`+7qhj}CV59mGqHsd3s}kQPJ6}Z zO*-16u0HV$mh|2#Kl|c7rtMjhXMGF^0|Y0^lENPV--b#+Noarz-)2!V$9$A@@RMIk z%c|F;%nKsAS3F)k$MYw@sSc+^5W!Go1PwF|Dh9P|mD0+k5C6I1$XBMBUrb!$;b{7T zGWd?aGCW7UX=O4kjQh8CCz7{x52&{JXcsY4@iAYm1OPXUNx>Y7*3`0-b5oxbZEp&zcr&HyMSL5Mkh>?Q zl3lNbZE-1HEOTXBSpDiXnwV-aRzN)v2eYN~{w?!4)$eQbh}LXlQ{>&k@_P$8v;svw zORAe~47#2}ZxSs_Qo(ohrld3D6sjF>N7@@&$%{oUy7;ol1#jT;ESPU2V8Dbhdk~LH zB-8hTm|?ND=XpnE*%I3=cpdJ8@m;j#NWz`lGnQaA{gkxC#-C=&ZjDml#LpcI6IA~+ zn;tdr%zWy-`dLe%VBjknTo~0@tjiVcy41{ZbUvlzZc{7tu|uL3W?l2~RVn`uW~tZf zk9*m2^j^5tSjxe^X(~U!aBTqSN5#=h2Kt8iH}0x6)F}9D&TB=!=K1){wM5=^ZpUSH zdNA*idWLCORWcFfwisS!mPbe?-k4ENVXQaAXIxuOp*I%p6BfT^_)mvBe#=;3j7@4N zhNb-SA(>+X)uA0jQNfNO%+CEhojUfDAVyCBSP(U~Yg~O+bzUR3gRRpCWJI0S{GpiHG+;3Zt5qfHxvWqfR;k=G~G(CZ%k5c5{Hl! z5JeKDbhejcZn^@Q==7?V%qY?Y>(+gD5nG>vB*yw{wzK8fcx0myHK$d}fakI(*IKEJ4Rx#7XB#RhFYo8}b+D-E zLHs-^Z<-XwPk)3fj&D8|J{pizFM2HhfHwMh#aS3p1a#e|x#`E>Fq%44v-wKw>~D1TN6-N{N<;&Os4`wi8AvA(q~E#F%=C-brg)3_05qoXt?VT(6}T@4gZ9WbZ7d zP_yZKebaMJan3x-RlSLmx8ZMD#3z=}CY$twz;JeJ@V~0cf|zOYk8fUJ`A@c-QhXDO z`(408%x|7?%1u7#Ybow8F=#4juT^@55fb~0-;22X)vs{7lYObdCqsr={FA3$%Hy$z z3!cQq4bo;0m2Y`d8}Jn`cnL1ZIHYJP$09UIMCN#jg+4zwUPuY#tLG7aZ5b>RI8lf1 ziv&gx3L7|K8_M&Fd7<)?@{t$`|0O0&Y$&FNI;>lvqD;yNBhx(AsCel65Ek`w*?BaR zeKy`4W6^2TyBht@u2f6X^2&aba5S7-Ln{lFAZ}d}DbiOrjgtK^DN%bZds8nuD&pmv z#S3?)#zqWA8;Wx&z{~lTC)-SM+lO5 zUF~{L+O9RFMVn}_$ZlQGF9f~E$H~k%C#g~VxwK^T;Ql`YiLiOp)($n05bT5o$6apHO+e(gCoOa+lCjt1CLu9 zeiZ}@blvZ=s%^YDP2Oq^2$-0YF_g2jpK`U7y^#LQuHbp9$(KFC;a6>5K&;G>V$j}6 zwHPxUQD?=V-q$Gg9qqHJ&Rec~W(VX=kY)^=()MYTP4G-!ir=@LYlTjz!$XNGnZm<} zDnFe5BUXnrRFQeTNjrBu{fxl2;TGflTX1a6=h80Ty_MwLz2Nf|nCb=(>3GWltNKDO zwp6lhU)eD7sWJBXR>Zbr|JOwQ%^$a2B+FZL)Pp|CA_Ti2WHE{>LeQ~mU0~nuSh1h& z3th4-1rN*9Mlk=C(~F6saluQCGH(aA-@*F+#N*KGR?13|s`HMJ!Pm^cAxCB;JTIfe zAK+>ylO$X4<*8VrC$FyWAvi#EM2%2tLPwB5&4|^P26y4q?NoM@i_R2wLKSY^H|QgY z?F2oj)TV--Wo^sG4-hLP00pfFyM29&Q$O~&RCqRU6|neXr%ri;2hHMP0%3Cz?E{)` zxH$uPKL4{of0d}pf5I&LAd6luM=(JlpDSUXa>AoVp(utZNv^!M@vLjyGpt0d{0)?NLY#engB1yje83t@?7c38R2d;>~(p;&e#_Ndg#q@R;3vftuSep#>F z(i<*T0nHF@Sw8rU^9Ic(Rb}ceA=Ns**7eM0iRt?hs38YNHlmoH4F{g4qinYW(rU!V zgwr&L&b2<-G`DPhwstlM(ni)~82FPJ&Q07zXJFw}VUxFl%mGP!0zT*M#nsiL*B3Ri za$bp|mbE_WGr1gdCv>FSw8oeY^4VaEZ-Zl&RIa(RWmXC|Z)^*+A6j|j$>&QV z^yFZ(TDZS&)1qAaEU(3B{iT%bA``2^Z^m_vKka{AU7lMS&C@JPHZ&J}gEc@rk9R)4 z@`+?flcDnLI|7FB$x*c7FJEr$%yEB7=$IRj)n)HmOEP%_xH%^EAB#so2bq9+SiOdRJeY7|rvc8RClbv4*8)j$*9&gr;rIF2JULTc>aaahRIPlIXj2RC6W7eN8w~4f9j_VnxG#LE-kpB<4gdyn{UZ#X*!_RS# zqSGAB_3mrI!pkH4rGWSOQVWm#3zN_~x$1hEH8kR}FZ`i@t)ljWV*n)M} zP%=e_2W!|Cc9&I`l&MXtEX0=c4VlDyx30Ul_di|JCAg^!jARBvO^zE7tnT3C0avHlvGEGx{(ywIPjkDae!k0ydP;^RW95_U@I%Z^iMH@Xv{TYbsYnXE73-f=Jxk5L@tR zF0f`4L%csh)syq$`-9pjS{PvoCSV)|`ea%{_fUcBaS$<`0F;Z){RPbm_w4WdI# zJ23k7vBQ;b?+@3W!`sEou6WPFfch`MiFHOa9GF>{IBy;7UOkaJJ^{}ypwo00u$c4) ztbWl&&mQGD6r#I8_n67m8MjJ#9uN4ZH<&#{R`B+`+7>_tXeV6uDe5oi8|&MJL6&>i zB0&f7<}c*f)AgV9p5~atg&2Dj8LtC`uZG^7)@tqhC;UOu3{<95{C&WaiuIxy?75YC z(oFHUl4=0EM>(icjkbxFR`*^J*?ZSv4YYKf$-?X?kYwJ6QN9#~E1PX!`hXr9_JZ2J z&f85ax2pI4-QRNQ3>eU0;Dvo z6cJr{|Kp~>MRb^vUnu^G@~mV+3Y|OdcYR^$Kj~A~KNkDm`h*a>nQobfslkRtXYaLw zfRyeBq!%9BEGU{k)BVU4f43=4B<%&=p|RK?a_AEXAUkD40q=mP)(FY$%Zx8KI!G_% zJ90r6W+Aqq=m>+qXvnpA_u`@C;Sc7b!98J|N8}vYMg33xz*bjDqHC3vtmFgPFMh&D ziv4X#-3AaEXpb&dm^r{%o$P|=Pn4?r`8e^l&OJ$Br6vOj$J-9E*Y^L})}_1k@a565$NF|j{^ zC`z?YB$;}r9K!DL^~6K5ORrsMHdTTU5(r1ABi}_i!*m84Dh%a@;9|J48P-CvB<$7% zryWMyNC&5q~-)8u(Y^QNdad6efHvMg3x&*Wu*z6 zBV0CsPA!TQeDg8U9$5@|I2q1|;=xV4h`7jd=gG zN2vp-G{hxhK6ai2;>t~@b6Um$b6Sd3Bt}CObx+|OYTnVzr$jm449KHOr+$S~P8@Z{ zL@$gUX<}~>`LzhEH)F5Vk*h{->@Vd>T7xZ|?Bcsmqkpn}57d*nG4iCl{%2=`bhLJY zPij{J_Se*zQe<(+t#GczY=IXqUyct=sR2s&S>`3XVVV;)6OjD_uMT?M6PnwIkSnhv z-;0Y#37q!36NFcZA|n1z=`HuZI%@b%n8}jix*G#h?|}K#b-yca*Ig0{N%kj$=TCxi4i{&fDJ8JYqK2>wc%;-lW zn>SrtBGfN?UdbCpdNIS^(|O63LqUVLa?gqd3bx5&=vv&^ke!ArV@SENl`%-&X7Poj zc?|05`<}>CCk^V;LIYa^I1AK+ zs;fN$93TL#urG!4&7TlFZ-Z=b9jwm1m_Hj#@O!_+!ktt*ylrUPCQJHZqfd3xO=q?&YA7OAaP~JQ3 z;QK?tX$(I)I>-1O#5D76ND4)Nn#fb8yp+R&@Aky*ydP@c(t(Q=Fm+8-*(vW9GG8*^ zv25#hZco=S-px>{?< zCGV}DK*niQdw$H0kE#t-jp#UpmfOCN$zB#3N{Z?iiP7JL^Yhn~=Fm2}wWvM8a20Z5 zE}2u_!zzQpT=%gzFLz8k_QFG^BAxznj1($pg`_-R?j zxU?U7y8WY-RWep*`4)OVZI_y%JoVVHUqhFhfoaNjX}CP_ihlxX_p$7kS7nC{y#dMA zxxtimAXq7d)ocDjrrbKyG-(wQ>wO(oR@iZ{0v`iTEIV`zx7xT8FhOCzx~AXnI(~=k z6Xqn>(JVNJaD}pI0dmnQ>-~>qm%9>hx#{em8j=w@??Ub;SWZ6)iVIWwGFpZwkx)&0 zs%h-5vzwPwkjT;XxMqGNr1tDk^h0i~!{X!w6>qc>Ki*iZzRt;=a!-lAw!U0v^B{gn dpo+>r_>{s!u8%Yk1AGo#}c0e*i3o1}Ojl diff --git a/addons/sourcemod/scripting/l4d2_fix_changelevel.sp b/addons/sourcemod/scripting/l4d2_fix_changelevel.sp index 01a2b852a..95d1e9d69 100644 --- a/addons/sourcemod/scripting/l4d2_fix_changelevel.sp +++ b/addons/sourcemod/scripting/l4d2_fix_changelevel.sp @@ -6,13 +6,13 @@ #include #include -#define PLUGIN_VERSION "1.2" +#define PLUGIN_VERSION "1.3" public Plugin myinfo = { name = "[L4D2] Fix Changelevel", author = "Lux (for \"l4d2_changelevel\"), Forgetest", - description = "Fix issues due to forced changelevel (i.e. No gascans in scavenge, incorrect behavior of \"OnGameplayStart\").", + description = "Fix issues due to forced changelevel + resolve partial map names before the engine sees them.", version = PLUGIN_VERSION, url = "https://github.com/Target5150/MoYu_Server_Stupid_Plugins" } @@ -119,17 +119,17 @@ public void OnPluginStart() {SDKType_Bool, SDKPass_Plain} }; g_CallClearTeamScores = gd.CreateSDKCallOrFail(SDKCall_Raw, SDKConf_Signature, "CDirector::ClearTeamScores", params, sizeof(params), false); - + SDKCallParamsWrapper params2[] = { {SDKType_Bool, SDKPass_Plain} }; g_CallOnBeginTransition = gd.CreateSDKCallOrFail(SDKCall_Raw, SDKConf_Signature, "CDirector::OnBeginTransition", params2, sizeof(params2), false); - + SDKCallParamsWrapper params3[] = { {SDKType_String, SDKPass_Pointer} }; g_CallOnBeginChangeLevel = gd.CreateSDKCallOrFail(SDKCall_GameRules, SDKConf_Signature, "CTerrorGameRules::OnBeginChangeLevel", params3, sizeof(params3), false); - + g_iOffs_m_mapDurationTimer = gd.GetOffsetOrFail("CDirector::m_mapDurationTimer"); g_iOffs_m_flTotalMissionElaspedTime = gd.GetOffsetOrFail("CDirector::m_flTotalMissionElaspedTime"); g_iOffs_m_szOriginalMap = gd.GetOffsetOrFail("CDirector::m_szOriginalMap"); @@ -154,17 +154,33 @@ MRESReturn DTR__CVEngineServer__ChangeLevel(DHookParam hParams) { if (!TheDirector) return MRES_Ignored; - + char map[64]/*, reason[64]*/; hParams.GetString(1, map, sizeof(map)); // if (!hParams.IsNull(2)) // hParams.GetString(2, reason, sizeof(reason)); - + + /* + sm_map (and possible other callers) accept partial names like "c4m1" for "c4m1_milltown_a" + these get resolved for display via FindMap() but pass the original "c4m1" back to the + engine, which then gets stuck trying to load a non-existent map. + This way we don't have to modify official SourceMod files with every update. + */ + bool changedParam = false; + char fullMap[64]; + + if (GetMapDisplayName(map, fullMap, sizeof(fullMap))) + { + strcopy(map, sizeof(map), fullMap); + hParams.SetString(1, fullMap); + changedParam = true; + } + if (TheDirector.IsTransitioning()) - return MRES_Ignored; - + return changedParam ? MRES_ChangedHandled : MRES_Ignored; + TheDirector.ClearTeamScores(true); - + ITimer_Start(TheDirector.m_mapDurationTimer); TheDirector.m_flTotalMissionElaspedTime = 0.0; @@ -173,7 +189,7 @@ MRESReturn DTR__CVEngineServer__ChangeLevel(DHookParam hParams) TheDirector.OnBeginTransition(false); GameRules__OnBeginChangeLevel(map); - return MRES_Ignored; + return changedParam ? MRES_ChangedHandled : MRES_Ignored; } void GameRules__OnBeginChangeLevel(const char[] map) @@ -198,4 +214,4 @@ void UTIL_StoreToAddressString(Address dest, const char[] src, int maxlength) StoreToAddress(dest + view_as
(i), src[i], NumberType_Int8); } StoreToAddress(dest + view_as
(len), 0, NumberType_Int8); -} \ No newline at end of file +} From fb710cb55fbd0c38c4f3cfcc1b99065dbdae2eaa Mon Sep 17 00:00:00 2001 From: SirPlease Date: Mon, 11 May 2026 22:38:48 +0200 Subject: [PATCH 07/19] Bump to ZoneMod 2.9.1a Visual indicator. --- README.md | 2 +- addons/sourcemod/configs/matchmodes.txt | 6 +++--- cfg/cfgogl/zh1v1/confogl.cfg | 2 +- cfg/cfgogl/zh2v2/confogl.cfg | 2 +- cfg/cfgogl/zh3v3/confogl.cfg | 2 +- cfg/cfgogl/zm1v1/confogl.cfg | 2 +- cfg/cfgogl/zm2v2/confogl.cfg | 2 +- cfg/cfgogl/zm3v3/confogl.cfg | 2 +- cfg/cfgogl/zonehunters/confogl.cfg | 2 +- cfg/cfgogl/zonemod/confogl.cfg | 2 +- cfg/cfgogl/zoneretro/confogl.cfg | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 4f5ff739b..f9fba30d7 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ In its current state it allows anyone to host their own up to date competitive L > **Included Matchmodes:** -* **Zonemod 2.9e** +* **Zonemod 2.9.1a** * **Zonemod Hunters** * **Zonemod Retro** * **NeoMod 0.4a** diff --git a/addons/sourcemod/configs/matchmodes.txt b/addons/sourcemod/configs/matchmodes.txt index efe552109..8744be87f 100644 --- a/addons/sourcemod/configs/matchmodes.txt +++ b/addons/sourcemod/configs/matchmodes.txt @@ -4,11 +4,11 @@ { "zonemod" { - "name" "ZoneMod 2.9.1" + "name" "ZoneMod 2.9.1a" } "zoneretro" { - "name" "ZoneMod Retro 2.9.1" + "name" "ZoneMod Retro 2.9.1a" } "zm3v3" { @@ -109,7 +109,7 @@ { "zonehunters" { - "name" "ZoneHunters 2.9.1" + "name" "ZoneHunters 2.9.1a" } "zh3v3" { diff --git a/cfg/cfgogl/zh1v1/confogl.cfg b/cfg/cfgogl/zh1v1/confogl.cfg index 50b2ab73c..67a829cbe 100644 --- a/cfg/cfgogl/zh1v1/confogl.cfg +++ b/cfg/cfgogl/zh1v1/confogl.cfg @@ -7,7 +7,7 @@ // ======================================================================================= // ReadyUp Cvars -l4d_ready_cfg_name "1v1 [Zone]Hunters v2.9.1" +l4d_ready_cfg_name "1v1 [Zone]Hunters v2.9.1a" // Confogl Cvars confogl_addcvar mp_gamemode "versus" // Force Versus for the config. diff --git a/cfg/cfgogl/zh2v2/confogl.cfg b/cfg/cfgogl/zh2v2/confogl.cfg index 0b5689156..ab8ef7c93 100644 --- a/cfg/cfgogl/zh2v2/confogl.cfg +++ b/cfg/cfgogl/zh2v2/confogl.cfg @@ -7,7 +7,7 @@ // ======================================================================================= // ReadyUp Cvars -l4d_ready_cfg_name "2v2 [Zone]Hunters v2.9.1" +l4d_ready_cfg_name "2v2 [Zone]Hunters v2.9.1a" // Confogl Cvars confogl_addcvar mp_gamemode "versus" // Force Versus for the config. diff --git a/cfg/cfgogl/zh3v3/confogl.cfg b/cfg/cfgogl/zh3v3/confogl.cfg index fa5f91178..1f36009ee 100644 --- a/cfg/cfgogl/zh3v3/confogl.cfg +++ b/cfg/cfgogl/zh3v3/confogl.cfg @@ -7,7 +7,7 @@ // ======================================================================================= // ReadyUp Cvars -l4d_ready_cfg_name "3v3 [Zone]Hunters v2.9.1" +l4d_ready_cfg_name "3v3 [Zone]Hunters v2.9.1a" // Confogl Cvars confogl_addcvar mp_gamemode "versus" // Force Versus for the config. diff --git a/cfg/cfgogl/zm1v1/confogl.cfg b/cfg/cfgogl/zm1v1/confogl.cfg index 84ef2955b..7d7fc907b 100644 --- a/cfg/cfgogl/zm1v1/confogl.cfg +++ b/cfg/cfgogl/zm1v1/confogl.cfg @@ -8,7 +8,7 @@ // ======================================================================================= // ReadyUp Cvars -l4d_ready_cfg_name "1v1 Zonemod v2.9.1" +l4d_ready_cfg_name "1v1 Zonemod v2.9.1a" // Confogl Cvars confogl_addcvar mp_gamemode "versus" // Force Versus for the config. diff --git a/cfg/cfgogl/zm2v2/confogl.cfg b/cfg/cfgogl/zm2v2/confogl.cfg index 42187de65..774724bd4 100644 --- a/cfg/cfgogl/zm2v2/confogl.cfg +++ b/cfg/cfgogl/zm2v2/confogl.cfg @@ -8,7 +8,7 @@ // ======================================================================================= // ReadyUp Cvars -l4d_ready_cfg_name "2v2 Zonemod v2.9.1" +l4d_ready_cfg_name "2v2 Zonemod v2.9.1a" // Confogl Cvars confogl_addcvar mp_gamemode "versus" // Force Versus for the config. diff --git a/cfg/cfgogl/zm3v3/confogl.cfg b/cfg/cfgogl/zm3v3/confogl.cfg index b60db3ecf..8b509dedd 100644 --- a/cfg/cfgogl/zm3v3/confogl.cfg +++ b/cfg/cfgogl/zm3v3/confogl.cfg @@ -8,7 +8,7 @@ // ======================================================================================= // ReadyUp Cvars -l4d_ready_cfg_name "3v3 Zonemod v2.9.1" +l4d_ready_cfg_name "3v3 Zonemod v2.9.1a" // Confogl Cvars confogl_addcvar mp_gamemode "versus" // Force Versus for the config. diff --git a/cfg/cfgogl/zonehunters/confogl.cfg b/cfg/cfgogl/zonehunters/confogl.cfg index 5351869bb..6fddffed1 100644 --- a/cfg/cfgogl/zonehunters/confogl.cfg +++ b/cfg/cfgogl/zonehunters/confogl.cfg @@ -7,7 +7,7 @@ // ======================================================================================= // ReadyUp Cvars -l4d_ready_cfg_name "[Zone]Hunters v2.9.1" +l4d_ready_cfg_name "[Zone]Hunters v2.9.1a" // Confogl Cvars confogl_addcvar mp_gamemode "versus" // Force Versus for the config. diff --git a/cfg/cfgogl/zonemod/confogl.cfg b/cfg/cfgogl/zonemod/confogl.cfg index ac637a63b..f3ddeadeb 100644 --- a/cfg/cfgogl/zonemod/confogl.cfg +++ b/cfg/cfgogl/zonemod/confogl.cfg @@ -8,7 +8,7 @@ // ======================================================================================= // ReadyUp Cvars -l4d_ready_cfg_name "ZoneMod v2.9.1" +l4d_ready_cfg_name "ZoneMod v2.9.1a" // Confogl Cvars confogl_addcvar mp_gamemode "versus" // Force Versus for the config. diff --git a/cfg/cfgogl/zoneretro/confogl.cfg b/cfg/cfgogl/zoneretro/confogl.cfg index 800343202..c3487ad52 100644 --- a/cfg/cfgogl/zoneretro/confogl.cfg +++ b/cfg/cfgogl/zoneretro/confogl.cfg @@ -8,7 +8,7 @@ // ======================================================================================= // ReadyUp Cvars -l4d_ready_cfg_name "ZoneMod Retro v2.9.1" +l4d_ready_cfg_name "ZoneMod Retro v2.9.1a" // Confogl Cvars confogl_addcvar mp_gamemode "versus" // Force Versus for the config. From 87a8c70b57c8a3d67e01d10b457bf24cb1bfafc2 Mon Sep 17 00:00:00 2001 From: Aiden <48006618+AidenVii@users.noreply.github.com> Date: Wed, 13 May 2026 21:54:44 +0800 Subject: [PATCH 08/19] [detour ahead] m3 navigation fix (#956) fix the navigation atrribute [obscured] make Si spawn IN Svv sight --- .../zonemod/maps/cdta_03warehouse.cfg | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/cfg/stripper/zonemod/maps/cdta_03warehouse.cfg b/cfg/stripper/zonemod/maps/cdta_03warehouse.cfg index f8f3b804d..1fd0c5177 100644 --- a/cfg/stripper/zonemod/maps/cdta_03warehouse.cfg +++ b/cfg/stripper/zonemod/maps/cdta_03warehouse.cfg @@ -1085,6 +1085,48 @@ add: "team" "2" } +; ###### NAVIGATIONS ATTRIBUTE / BLOCK CHANGES ###### +; ===================================================== +; == NAVIGATIONS == +; == Navigation fix , Flow block changes == +; ===================================================== + + +; --- fix the navigation atrribute [obscured] make Si spawn IN Svv sight +; --- 修复[obscured](强制复活)属性导致的特感可以在人类视线内复活的区域 + +; --- the wirehouse 出门仓库 +add: +{ + "classname" "point_nav_attribute_region" + "crouch" "0" + "maxs" "600 400 180" + "mins" "-600 -200 -20" + "mob_only" "0" + "precise" "0" + "remove_attributes" "1" + "spawnflags" "4096" + "stairs" "0" + "tank_only" "0" + "targetname" "nav_fix_obscured_remove01" + "origin" "-4880 -6248 348" +} + +; --- hotel entrance 公寓入口 +{ + "classname" "point_nav_attribute_region" + "crouch" "0" + "maxs" "200 128 80" + "mins" "-200 -128 -20" + "mob_only" "0" + "precise" "0" + "remove_attributes" "1" + "spawnflags" "4096" + "stairs" "0" + "tank_only" "0" + "targetname" "nav_fix_obscured_remove02" + "origin" "-400 -7296 340" +} ; ####### MISCELLANEOUS / MAP SPECIFIC CHANGES ###### ; ===================================================== From 82eec75f2944f1be6b4ceb1ff6a65fbf606459de Mon Sep 17 00:00:00 2001 From: honey <934223+Derpduck@users.noreply.github.com> Date: Thu, 14 May 2026 16:30:46 +0100 Subject: [PATCH 09/19] Detour Ahead 3 Fire Escape Pathing (#957) * Detour Ahead 3 Fix AI pathing issues on fire escape Fixed navs and collisions to prevent AIs getting themselves stuck under the fire escape windows Fixes broken apartment window frames being solid and getting pushed when AIs climb through them * Apply tank ban range from #953 to all ZM configs --- cfg/cfgogl/zh1v1/mapinfo.txt | 4 +- cfg/cfgogl/zh2v2/mapinfo.txt | 4 +- cfg/cfgogl/zh3v3/mapinfo.txt | 4 +- cfg/cfgogl/zm1v1/mapinfo.txt | 4 +- cfg/cfgogl/zm2v2/mapinfo.txt | 4 +- cfg/cfgogl/zm3v3/mapinfo.txt | 4 +- cfg/cfgogl/zonehunters/mapinfo.txt | 4 +- cfg/cfgogl/zoneretro/mapinfo.txt | 4 +- .../zonemod/maps/cdta_03warehouse.cfg | 46 +++++++++++++++++++ .../nav_fixes/cdta_03warehouse_navfixes.nut | 25 ++++++++++ 10 files changed, 87 insertions(+), 16 deletions(-) create mode 100644 scripts/vscripts/nav_fixes/cdta_03warehouse_navfixes.nut diff --git a/cfg/cfgogl/zh1v1/mapinfo.txt b/cfg/cfgogl/zh1v1/mapinfo.txt index b1f234080..9e90051e3 100644 --- a/cfg/cfgogl/zh1v1/mapinfo.txt +++ b/cfg/cfgogl/zh1v1/mapinfo.txt @@ -1113,9 +1113,9 @@ "end_dist" "245.495361" "tank_ban_flow" { - "During sewers" + "During sewers + double ladder drop" { - "min" "60" + "min" "52" "max" "79" } } diff --git a/cfg/cfgogl/zh2v2/mapinfo.txt b/cfg/cfgogl/zh2v2/mapinfo.txt index b1f234080..9e90051e3 100644 --- a/cfg/cfgogl/zh2v2/mapinfo.txt +++ b/cfg/cfgogl/zh2v2/mapinfo.txt @@ -1113,9 +1113,9 @@ "end_dist" "245.495361" "tank_ban_flow" { - "During sewers" + "During sewers + double ladder drop" { - "min" "60" + "min" "52" "max" "79" } } diff --git a/cfg/cfgogl/zh3v3/mapinfo.txt b/cfg/cfgogl/zh3v3/mapinfo.txt index b1f234080..9e90051e3 100644 --- a/cfg/cfgogl/zh3v3/mapinfo.txt +++ b/cfg/cfgogl/zh3v3/mapinfo.txt @@ -1113,9 +1113,9 @@ "end_dist" "245.495361" "tank_ban_flow" { - "During sewers" + "During sewers + double ladder drop" { - "min" "60" + "min" "52" "max" "79" } } diff --git a/cfg/cfgogl/zm1v1/mapinfo.txt b/cfg/cfgogl/zm1v1/mapinfo.txt index b1f234080..9e90051e3 100644 --- a/cfg/cfgogl/zm1v1/mapinfo.txt +++ b/cfg/cfgogl/zm1v1/mapinfo.txt @@ -1113,9 +1113,9 @@ "end_dist" "245.495361" "tank_ban_flow" { - "During sewers" + "During sewers + double ladder drop" { - "min" "60" + "min" "52" "max" "79" } } diff --git a/cfg/cfgogl/zm2v2/mapinfo.txt b/cfg/cfgogl/zm2v2/mapinfo.txt index b1f234080..9e90051e3 100644 --- a/cfg/cfgogl/zm2v2/mapinfo.txt +++ b/cfg/cfgogl/zm2v2/mapinfo.txt @@ -1113,9 +1113,9 @@ "end_dist" "245.495361" "tank_ban_flow" { - "During sewers" + "During sewers + double ladder drop" { - "min" "60" + "min" "52" "max" "79" } } diff --git a/cfg/cfgogl/zm3v3/mapinfo.txt b/cfg/cfgogl/zm3v3/mapinfo.txt index b1f234080..9e90051e3 100644 --- a/cfg/cfgogl/zm3v3/mapinfo.txt +++ b/cfg/cfgogl/zm3v3/mapinfo.txt @@ -1113,9 +1113,9 @@ "end_dist" "245.495361" "tank_ban_flow" { - "During sewers" + "During sewers + double ladder drop" { - "min" "60" + "min" "52" "max" "79" } } diff --git a/cfg/cfgogl/zonehunters/mapinfo.txt b/cfg/cfgogl/zonehunters/mapinfo.txt index b255f393d..cc09a5651 100644 --- a/cfg/cfgogl/zonehunters/mapinfo.txt +++ b/cfg/cfgogl/zonehunters/mapinfo.txt @@ -1113,9 +1113,9 @@ "end_dist" "245.495361" "tank_ban_flow" { - "During sewers" + "During sewers + double ladder drop" { - "min" "60" + "min" "52" "max" "79" } } diff --git a/cfg/cfgogl/zoneretro/mapinfo.txt b/cfg/cfgogl/zoneretro/mapinfo.txt index 263048f98..2f0963f1e 100644 --- a/cfg/cfgogl/zoneretro/mapinfo.txt +++ b/cfg/cfgogl/zoneretro/mapinfo.txt @@ -1113,9 +1113,9 @@ "end_dist" "245.495361" "tank_ban_flow" { - "During sewers" + "During sewers + double ladder drop" { - "min" "60" + "min" "52" "max" "79" } } diff --git a/cfg/stripper/zonemod/maps/cdta_03warehouse.cfg b/cfg/stripper/zonemod/maps/cdta_03warehouse.cfg index 1fd0c5177..10073924f 100644 --- a/cfg/stripper/zonemod/maps/cdta_03warehouse.cfg +++ b/cfg/stripper/zonemod/maps/cdta_03warehouse.cfg @@ -8,6 +8,13 @@ ; == DIRECTOR & EVENT MODIFICATION == ; == Modify director behaviour and events == ; ===================================================== +; --- Run nav fixes script +; --- Fix 1: Fixes AI having issues pathing over the balcony under the fire escape and attempting to path into the fire escape from under it +add: +{ + "classname" "logic_auto" + "OnMapSpawn" "director,RunScriptFile,nav_fixes/cdta_03warehouse_navfixes,20,-1" +} ; --- Remove director script that causes the map to spawn natural hordes modify: { @@ -786,6 +793,45 @@ modify: "damagefilter" "explosion_filter_class" } } +; --- Fix the broken apartment window frames being solid +modify: +{ + match: + { + "model" "models/props_windows/window_urban_apt_frame.mdl" + } + replace: + { + "spawnflags" "268" + } +} +; --- Replace fire escape ladder with dynamic prop (physics version causes navs to be blocked automatically which prevents pathing) +; --- & Remove the nav blocker covering the ladder to prevent AI tanks getting themselves stuck / being unable to path through the building +filter: +{ + "targetname" "elblock" +} +{ + "targetname" "escapeladder" +} +add: +{ + "classname" "prop_dynamic_override" + "origin" "-896 -7943 419.7" + "angles" "0 0 -13" + "model" "models/dtafireescape/dta_fireescapeladder.mdl" + "solid" "6" + "disableshadows" "1" +} +; --- Re-add func_playerinfectedclip on fire escape that is removed by global filters +add: +{ + "classname" "func_playerinfected_clip" + "targetname" "escapeclip2" + "model" "*267" + "spawnflags" "2" + "Solidity" "2" +} ; --- Remove triggers that lower the ladder filter: { diff --git a/scripts/vscripts/nav_fixes/cdta_03warehouse_navfixes.nut b/scripts/vscripts/nav_fixes/cdta_03warehouse_navfixes.nut new file mode 100644 index 000000000..641d4b156 --- /dev/null +++ b/scripts/vscripts/nav_fixes/cdta_03warehouse_navfixes.nut @@ -0,0 +1,25 @@ +printl("\n[NavFixes] cdta_03warehouse initialized\n") + +//Fix 1: Fix AI having issues pathing over the balcony under the fire escape// +//Issue: Nav area on balcony has is only connected by the ladder which AI doesn't see as a valid path from above, and nav under the fire escape is connected to the fire escape which causes AI to attempt to path through it +function cdta_03warehouse_navfixes_fix1() +{ + //Get nav areas: + //Problematic nav areas + local fix1_balconyNav_a = NavMesh.GetNavAreaByID(162748) + local fix1_underLadderNav_b = NavMesh.GetNavAreaByID(162745) + //Nav areas to connect + local fix1_nav_a = NavMesh.GetNavAreaByID(162689) + local fix1_nav_b = NavMesh.GetNavAreaByID(136940) + + //Create one-way connection between nav areas + fix1_balconyNav_a.ConnectTo(fix1_nav_a,-1) + //Disconnect invalid navs on fire escape + fix1_underLadderNav_b.Disconnect(fix1_nav_b) + fix1_nav_b.Disconnect(fix1_underLadderNav_b) + + printl("\n[NavFixes] Fix 1 applied\n") +} + + +cdta_03warehouse_navfixes_fix1() \ No newline at end of file From 1297ce181b628cbda97d52d260df08d68a0b99b7 Mon Sep 17 00:00:00 2001 From: SirPlease Date: Thu, 14 May 2026 21:13:16 +0200 Subject: [PATCH 10/19] Fix #817 - Tank Rocks on control pass --- .../gamedata/l4d2_fix_tank_rock_handoff.txt | 15 +++ .../fixes/l4d2_fix_tank_rock_handoff.smx | Bin 0 -> 5686 bytes .../scripting/l4d2_fix_tank_rock_handoff.sp | 88 ++++++++++++++++++ cfg/generalfixes.cfg | 1 + 4 files changed, 104 insertions(+) create mode 100644 addons/sourcemod/gamedata/l4d2_fix_tank_rock_handoff.txt create mode 100644 addons/sourcemod/plugins/fixes/l4d2_fix_tank_rock_handoff.smx create mode 100644 addons/sourcemod/scripting/l4d2_fix_tank_rock_handoff.sp diff --git a/addons/sourcemod/gamedata/l4d2_fix_tank_rock_handoff.txt b/addons/sourcemod/gamedata/l4d2_fix_tank_rock_handoff.txt new file mode 100644 index 000000000..f983c7842 --- /dev/null +++ b/addons/sourcemod/gamedata/l4d2_fix_tank_rock_handoff.txt @@ -0,0 +1,15 @@ +"Games" +{ + "left4dead2" + { + "Signatures" + { + "CThrow::OnStunned" + { + "library" "server" + "linux" "@_ZN6CThrow9OnStunnedEf" + "windows" "\x55\x8B\xEC\xF3\x0F\x10\x05\x2A\x2A\x2A\x2A\x56" + } + } + } +} diff --git a/addons/sourcemod/plugins/fixes/l4d2_fix_tank_rock_handoff.smx b/addons/sourcemod/plugins/fixes/l4d2_fix_tank_rock_handoff.smx new file mode 100644 index 0000000000000000000000000000000000000000..b2907819da4e1a2b8db0d0702fa161c6706b8634 GIT binary patch literal 5686 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 literal 0 HcmV?d00001 diff --git a/addons/sourcemod/scripting/l4d2_fix_tank_rock_handoff.sp b/addons/sourcemod/scripting/l4d2_fix_tank_rock_handoff.sp new file mode 100644 index 000000000..6cfecce77 --- /dev/null +++ b/addons/sourcemod/scripting/l4d2_fix_tank_rock_handoff.sp @@ -0,0 +1,88 @@ +#pragma semicolon 1 +#pragma newdecls required + +#include +#include + +#define PLUGIN_VERSION "1.0" +#define GAMEDATA_FILE "l4d2_fix_tank_rock_handoff" + +Handle g_hCThrow_OnStunned = null; + +public Plugin myinfo = +{ + name = "[L4D2] Fix Tank Rock Stuck", + author = "Sir", + description = "Cancels tank rocks that are in the middle of a throw when passing to another player/AI.", + version = PLUGIN_VERSION, + url = "https://github.com/SirPlease/L4D2-Competitive-Rework" +}; + +public void OnPluginStart() +{ + GameData gd = new GameData(GAMEDATA_FILE); + if (!gd) SetFailState("Missing gamedata \"" ... GAMEDATA_FILE ... ".txt\""); + + StartPrepSDKCall(SDKCall_Entity); + if (!PrepSDKCall_SetFromConf(gd, SDKConf_Signature, "CThrow::OnStunned")) + { + delete gd; + SetFailState("Failed to find signature \"CThrow::OnStunned\""); + } + PrepSDKCall_AddParameter(SDKType_Float, SDKPass_Plain); + g_hCThrow_OnStunned = EndPrepSDKCall(); + delete gd; + + if (g_hCThrow_OnStunned == null) + SetFailState("Failed to prep SDKCall for CThrow::OnStunned"); + + HookEvent("player_bot_replace", Event_PlayerBotReplace, EventHookMode_Post); + HookEvent("bot_player_replace", Event_BotPlayerReplace, EventHookMode_Post); +} + +/* Covers Player to Player passes (including forced) */ +public void L4D_OnReplaceTank(int oldTank, int newTank) +{ + CancelTankThrow(newTank); +} + +/* Covers Player to Bot passes */ +void Event_PlayerBotReplace(Event event, const char[] name, bool dontBroadcast) +{ + int bot = GetClientOfUserId(event.GetInt("bot")); + + if (bot > 0 && IsTank(bot)) + CancelTankThrow(bot); +} + +/* Covers Bot to Player passes (as we do in some plugins) */ +void Event_BotPlayerReplace(Event event, const char[] name, bool dontBroadcast) +{ + int player = GetClientOfUserId(event.GetInt("player")); + + if (player > 0 && IsTank(player)) + CancelTankThrow(player); +} + +void CancelTankThrow(int tank) +{ + if (!IsTank(tank)) + return; + + int ability = GetEntPropEnt(tank, Prop_Send, "m_customAbility"); + if (ability == -1) + return; + + SDKCall(g_hCThrow_OnStunned, ability, 0.0); +} + +bool IsTank(int client) +{ + if (client <= 0 || client > MaxClients || IsClientInGame(client)) + return false; + + if (GetClientTeam(client) != L4D_TEAM_INFECTED) + return false; + + return GetEntProp(client, Prop_Send, "m_zombieClass") == L4D2_ZOMBIE_CLASS_TANK; +} \ No newline at end of file diff --git a/cfg/generalfixes.cfg b/cfg/generalfixes.cfg index 0ec6027a3..93ae3f08a 100644 --- a/cfg/generalfixes.cfg +++ b/cfg/generalfixes.cfg @@ -70,6 +70,7 @@ sm plugins load fixes/l4d_fix_stagger_dir.smx sm plugins load fixes/l4d2_fix_rocket_pull.smx sm plugins load optional/l4d_return_thrown_items.smx sm plugins load fixes/l4d_prop_touching_rules.smx +sm plugins load fixes/l4d2_fix_tank_rock_handoff.smx // Anti-Cheat. sm plugins load optional/l4d2_block_autoaim.smx // Sort of a cheat..? From 9669960b04b8c4dcb00eb370450b8bff64e604b1 Mon Sep 17 00:00:00 2001 From: SirPlease Date: Thu, 14 May 2026 22:33:00 +0200 Subject: [PATCH 11/19] Fixed an oopsie (l4d2_fix_tank_rock_handoff) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks to Alan for reminding me to double check what I ship 😅 --- .../fixes/l4d2_fix_tank_rock_handoff.smx | Bin 5686 -> 5643 bytes .../scripting/l4d2_fix_tank_rock_handoff.sp | 16 ++++++---------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/addons/sourcemod/plugins/fixes/l4d2_fix_tank_rock_handoff.smx b/addons/sourcemod/plugins/fixes/l4d2_fix_tank_rock_handoff.smx index b2907819da4e1a2b8db0d0702fa161c6706b8634..9c84881c2258420dcc3c264f3d1a3eeb457d28ac 100644 GIT binary patch delta 5489 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 delta 5533 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 Ul)n&uZ=P;G-E+05O5Lgd0&3>PfB*mh diff --git a/addons/sourcemod/scripting/l4d2_fix_tank_rock_handoff.sp b/addons/sourcemod/scripting/l4d2_fix_tank_rock_handoff.sp index 6cfecce77..603fd99ff 100644 --- a/addons/sourcemod/scripting/l4d2_fix_tank_rock_handoff.sp +++ b/addons/sourcemod/scripting/l4d2_fix_tank_rock_handoff.sp @@ -43,33 +43,29 @@ public void OnPluginStart() /* Covers Player to Player passes (including forced) */ public void L4D_OnReplaceTank(int oldTank, int newTank) { - CancelTankThrow(newTank); + CancelPossibleTankThrow(newTank); } /* Covers Player to Bot passes */ void Event_PlayerBotReplace(Event event, const char[] name, bool dontBroadcast) { int bot = GetClientOfUserId(event.GetInt("bot")); - - if (bot > 0 && IsTank(bot)) - CancelTankThrow(bot); + CancelPossibleTankThrow(bot); } /* Covers Bot to Player passes (as we do in some plugins) */ void Event_BotPlayerReplace(Event event, const char[] name, bool dontBroadcast) { int player = GetClientOfUserId(event.GetInt("player")); - - if (player > 0 && IsTank(player)) - CancelTankThrow(player); + CancelPossibleTankThrow(player); } -void CancelTankThrow(int tank) +void CancelPossibleTankThrow(int client) { - if (!IsTank(tank)) + if (!IsTank(client)) return; - int ability = GetEntPropEnt(tank, Prop_Send, "m_customAbility"); + int ability = GetEntPropEnt(client, Prop_Send, "m_customAbility"); if (ability == -1) return; From b34e80236dd8377dac7b3dccfff1bfc976301753 Mon Sep 17 00:00:00 2001 From: Forgetest <33988868+jensewe@users.noreply.github.com> Date: Fri, 15 May 2026 04:39:13 +0800 Subject: [PATCH 12/19] Add a fallback for breakable hittables (#959) * Add a fallback for breakable hittables Fix: - Hittable pieces will now make a new entry if the breakable parent doesn't have one, to resolve potential overhit issues. * Fallback to classname check and remove `OnEntityDestroyed` Change: - Added back the classname check in `OnTakeDamage`, and remove unnecessary resetting in `OnEntityDestroyed`. - Minor debug message changes. --- .../optional/l4d2_hittable_control.smx | Bin 13831 -> 13869 bytes .../scripting/l4d2_hittable_control.sp | 30 ++++++++++-------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/addons/sourcemod/plugins/optional/l4d2_hittable_control.smx b/addons/sourcemod/plugins/optional/l4d2_hittable_control.smx index 3475ef674a30d6bb12f77428a211c3dcf5c1f6c4..a0e3cbb29a2123f8440c48ff77fa256e0252f4c2 100644 GIT binary patch literal 13869 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 U&klK&A$}-H$fGzTd*Jl{0U)ZZCjbBd diff --git a/addons/sourcemod/scripting/l4d2_hittable_control.sp b/addons/sourcemod/scripting/l4d2_hittable_control.sp index 299c97d8b..2dcb3c659 100644 --- a/addons/sourcemod/scripting/l4d2_hittable_control.sp +++ b/addons/sourcemod/scripting/l4d2_hittable_control.sp @@ -140,7 +140,7 @@ public Plugin myinfo = { name = "L4D2 Hittable Control", author = "Stabby, Visor, Sir, Derpduck, Forgetest", - version = "0.9.1", + version = "0.9.2", description = "Allows for customisation of hittable damage values (and debugging)" }; @@ -360,19 +360,20 @@ public void OnEntityCreated(int entity, const char[] classname) } } -public void OnEntityDestroyed(int entity) -{ - if (entity > 0 && entity < MAX_EDICTS) - { - g_nPhysicsHitInfoEntry[entity] = -1; - } -} - void Physics_OnSpawnPost(int entity) { + g_nPhysicsHitInfoEntry[entity] = -1; + int parent = GetEntPropEnt(entity, Prop_Send, "m_hOwnerEntity"); if (parent != -1) { + // In case the breakable parent was forced to + if (g_nPhysicsHitInfoEntry[parent] == -1) + { + g_nPhysicsHitInfoEntry[parent] = NewPhysicsHitInfo(); + DebugMsg("Physics_OnSpawnPost (missing info from breakable parent#%d) [#%d]", parent, g_nPhysicsHitInfoEntry[parent]); + } + g_nPhysicsHitInfoEntry[entity] = g_nPhysicsHitInfoEntry[parent]; } g_iPhysicsDamage[entity] = -1; @@ -394,10 +395,10 @@ Action Physics_OnTakeDamage(int victim, int &attacker, int &inflictor, float &da if (!IsValidEdict(attacker)) return Plugin_Continue; - DebugMsg("(#%d) Physics_OnTakeDamage (attacker %d)", victim, attacker); - if (attacker > 0 && attacker <= MaxClients && IsTank(attacker)) { + DebugMsg("(#%d) Physics_OnTakeDamage tank (%N #%d)", victim, attacker, attacker); + // A tank punches me, create a new entry if not if (g_nPhysicsHitInfoEntry[victim] == -1) { @@ -416,6 +417,8 @@ Action Physics_OnTakeDamage(int victim, int &attacker, int &inflictor, float &da } else if (IsEntityClassname(attacker, "prop_physics*")) { + DebugMsg("(#%d) Physics_OnTakeDamage prop_physics (#%d)", victim, attacker); + // Collides with other physics, clone their hit info if (g_nPhysicsHitInfoEntry[attacker] != -1) { @@ -438,7 +441,7 @@ Action Physics_OnTakeDamage(int victim, int &attacker, int &inflictor, float &da selfinfo.lastAttackerTime = GetGameTime(); g_PhysicsHitInfos.SetArray(g_nPhysicsHitInfoEntry[victim], selfinfo); - DebugMsg("(#%d) Physics_OnTakeDamage prop_physics (#%d) [%d]", victim, g_nPhysicsHitInfoEntry[attacker], selfinfo.lastAttackerId); + DebugMsg("(#%d) Physics_OnTakeDamage prop_physics (#%d) [lastAttackerId %d]", victim, g_nPhysicsHitInfoEntry[attacker], selfinfo.lastAttackerId); } } else @@ -597,7 +600,8 @@ Action OnTakeDamage(int victim, int &attacker, int &inflictor, float &damage, in // Hey, we don't care. if (!IsValidEdict(attacker) || !IsValidEdict(inflictor) - || g_nPhysicsHitInfoEntry[inflictor] == -1) + || g_nPhysicsHitInfoEntry[inflictor] == -1 + || !IsEntityClassname(inflictor, "prop_physics*")) return Plugin_Continue; if (IsTank(victim) && hTankSelfDamage.BoolValue) From 1e50d27e1ea46276016b868866be9f6781a7de98 Mon Sep 17 00:00:00 2001 From: Forgetest <33988868+jensewe@users.noreply.github.com> Date: Fri, 15 May 2026 22:54:48 +0800 Subject: [PATCH 13/19] Add missing alarm car hittable check (#960) * Add a fallback for breakable hittables Fix: - Hittable pieces will now make a new entry if the breakable parent doesn't have one, to resolve potential overhit issues. * Fallback to classname check and remove `OnEntityDestroyed` Change: - Added back the classname check in `OnTakeDamage`, and remove unnecessary resetting in `OnEntityDestroyed`. - Minor debug message changes. * Add forgotten "prop_car_alarm" FML --- .../optional/l4d2_hittable_control.smx | Bin 13869 -> 13878 bytes .../scripting/l4d2_hittable_control.sp | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/sourcemod/plugins/optional/l4d2_hittable_control.smx b/addons/sourcemod/plugins/optional/l4d2_hittable_control.smx index a0e3cbb29a2123f8440c48ff77fa256e0252f4c2..6e7d2b2fb8608683be69ce44d8aba30a9e3db7eb 100644 GIT binary patch delta 13409 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 delta 13417 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 diff --git a/addons/sourcemod/scripting/l4d2_hittable_control.sp b/addons/sourcemod/scripting/l4d2_hittable_control.sp index 2dcb3c659..3c6ec0549 100644 --- a/addons/sourcemod/scripting/l4d2_hittable_control.sp +++ b/addons/sourcemod/scripting/l4d2_hittable_control.sp @@ -140,7 +140,7 @@ public Plugin myinfo = { name = "L4D2 Hittable Control", author = "Stabby, Visor, Sir, Derpduck, Forgetest", - version = "0.9.2", + version = "0.9.3", description = "Allows for customisation of hittable damage values (and debugging)" }; @@ -415,7 +415,7 @@ Action Physics_OnTakeDamage(int victim, int &attacker, int &inflictor, float &da g_PhysicsHitInfos.SetArray(g_nPhysicsHitInfoEntry[victim], info); DebugMsg("(#%d) Physics_OnTakeDamage [%N]", victim, attacker); } - else if (IsEntityClassname(attacker, "prop_physics*")) + else if (IsEntityClassname(attacker, "prop_physics*") || IsEntityClassname(attacker, "prop_car_alarm")) { DebugMsg("(#%d) Physics_OnTakeDamage prop_physics (#%d)", victim, attacker); @@ -601,7 +601,7 @@ Action OnTakeDamage(int victim, int &attacker, int &inflictor, float &damage, in if (!IsValidEdict(attacker) || !IsValidEdict(inflictor) || g_nPhysicsHitInfoEntry[inflictor] == -1 - || !IsEntityClassname(inflictor, "prop_physics*")) + || (!IsEntityClassname(inflictor, "prop_physics*") && !IsEntityClassname(inflictor, "prop_car_alarm"))) return Plugin_Continue; if (IsTank(victim) && hTankSelfDamage.BoolValue) From 3e6bb861558712b7aae3d3e4e0ddde59c399a2b8 Mon Sep 17 00:00:00 2001 From: honey <934223+Derpduck@users.noreply.github.com> Date: Sat, 16 May 2026 12:44:30 +0100 Subject: [PATCH 14/19] cwm1 truck skip + oob/stuck fixes (#963) Unblocked the precious truck skip before the warehouse Blocked infected out of bounds / under the map spots in the river Blocked a perma-stuck spot between 2 tents Added clipping on car stops by the starting saferoom to prevent getting stuck --- cfg/stripper/zonemod/maps/cwm1_intro.cfg | 196 +++++++++++++++-------- 1 file changed, 130 insertions(+), 66 deletions(-) diff --git a/cfg/stripper/zonemod/maps/cwm1_intro.cfg b/cfg/stripper/zonemod/maps/cwm1_intro.cfg index 383d68211..90eda7872 100644 --- a/cfg/stripper/zonemod/maps/cwm1_intro.cfg +++ b/cfg/stripper/zonemod/maps/cwm1_intro.cfg @@ -204,73 +204,73 @@ add: "BlockType" "1" } ; --- Block tent by the fallen semi-trailer -{ - "classname" "env_physics_blocker" - "origin" "2265.73 2542.02 760" - "angles" "0 -1 0" - "mins" "-190 -5 -520" - "maxs" "190 5 520" - "boxmins" "-190 -5 -520" - "boxmaxs" "190 5 520" - "initialstate" "1" - "BlockType" "1" -} -{ - "classname" "env_physics_blocker" - "origin" "2270.27 2801.98 760" - "angles" "0 -1 0" - "mins" "-190 -5 -520" - "maxs" "190 5 520" - "boxmins" "-190 -5 -520" - "boxmaxs" "190 5 520" - "initialstate" "1" - "BlockType" "1" -} -{ - "classname" "env_physics_blocker" - "origin" "2081.03 2675.26 760" - "angles" "0 -1 0" - "mins" "-3 -125 -520" - "maxs" "3 125 520" - "boxmins" "-3 -125 -520" - "boxmaxs" "3 125 520" - "initialstate" "1" - "BlockType" "1" -} -{ - "classname" "env_physics_blocker" - "origin" "2454.97 2668.74 760" - "angles" "0 -1 0" - "mins" "-3 -125 -520" - "maxs" "3 125 520" - "boxmins" "-3 -125 -520" - "boxmaxs" "3 125 520" - "initialstate" "1" - "BlockType" "1" -} +;{ +; "classname" "env_physics_blocker" +; "origin" "2265.73 2542.02 760" +; "angles" "0 -1 0" +; "mins" "-190 -5 -520" +; "maxs" "190 5 520" +; "boxmins" "-190 -5 -520" +; "boxmaxs" "190 5 520" +; "initialstate" "1" +; "BlockType" "1" +;} +;{ +; "classname" "env_physics_blocker" +; "origin" "2270.27 2801.98 760" +; "angles" "0 -1 0" +; "mins" "-190 -5 -520" +; "maxs" "190 5 520" +; "boxmins" "-190 -5 -520" +; "boxmaxs" "190 5 520" +; "initialstate" "1" +; "BlockType" "1" +;} +;{ +; "classname" "env_physics_blocker" +; "origin" "2081.03 2675.26 760" +; "angles" "0 -1 0" +; "mins" "-3 -125 -520" +; "maxs" "3 125 520" +; "boxmins" "-3 -125 -520" +; "boxmaxs" "3 125 520" +; "initialstate" "1" +; "BlockType" "1" +;} +;{ +; "classname" "env_physics_blocker" +; "origin" "2454.97 2668.74 760" +; "angles" "0 -1 0" +; "mins" "-3 -125 -520" +; "maxs" "3 125 520" +; "boxmins" "-3 -125 -520" +; "boxmaxs" "3 125 520" +; "initialstate" "1" +; "BlockType" "1" +;} ; --- Block standing on fallen semi-trailer before the warehouse -{ - "classname" "env_physics_blocker" - "origin" "1838.11 2506.13 748" - "angles" "0 -35 0" - "mins" "-58.5 -266.5 -532" - "maxs" "58.5 266.5 532" - "boxmins" "-58.5 -266.5 -532" - "boxmaxs" "58.5 266.5 532" - "initialstate" "1" - "BlockType" "1" -} -{ - "classname" "env_physics_blocker" - "origin" "2021.64 2621.78 748" - "angles" "0 -35 0" - "mins" "-25.5 -66.5 -532" - "maxs" "25.5 66.5 532" - "boxmins" "-25.5 -66.5 -532" - "boxmaxs" "25.5 66.5 532" - "initialstate" "1" - "BlockType" "1" -} +;{ +; "classname" "env_physics_blocker" +; "origin" "1838.11 2506.13 748" +; "angles" "0 -35 0" +; "mins" "-58.5 -266.5 -532" +; "maxs" "58.5 266.5 532" +; "boxmins" "-58.5 -266.5 -532" +; "boxmaxs" "58.5 266.5 532" +; "initialstate" "1" +; "BlockType" "1" +;} +;{ +; "classname" "env_physics_blocker" +; "origin" "2021.64 2621.78 748" +; "angles" "0 -35 0" +; "mins" "-25.5 -66.5 -532" +; "maxs" "25.5 66.5 532" +; "boxmins" "-25.5 -66.5 -532" +; "boxmaxs" "25.5 66.5 532" +; "initialstate" "1" +; "BlockType" "1" +;} ; --- Block standing on the beige truck and trailer before the warehouse { "classname" "env_physics_blocker" @@ -358,6 +358,31 @@ add: ; == OUT OF BOUNDS == ; == Block players getting outside / under the map == ; ===================================================== +; --- Block infected out of bounds / under the map spots in the river +{ + "classname" "env_physics_blocker" + "origin" "-447 480 -141" + "mins" "-2049 -96 -51" + "maxs" "2049 96 51" + "initialstate" "1" + "BlockType" "0" +} +{ + "classname" "env_physics_blocker" + "origin" "-240 -360 -160" + "mins" "-16 -1272 -32" + "maxs" "16 1272 32" + "initialstate" "1" + "BlockType" "0" +} +{ + "classname" "env_physics_blocker" + "origin" "5752 416 -156" + "mins" "-136 -32 -36" + "maxs" "136 32 36" + "initialstate" "1" + "BlockType" "0" +} ; --- Block out of bounds areas for survivors by the starting saferoom ; --- Hedges { @@ -630,6 +655,15 @@ add: "initialstate" "1" "BlockType" "0" } +; --- Block a perma-stuck spot between 2 tents +{ + "classname" "env_physics_blocker" + "origin" "2320 1812 161.5" + "mins" "-50 -8 -49.5" + "maxs" "50 8 49.5" + "initialstate" "1" + "BlockType" "0" +} ; --- Block perma-stuck spot in some bushes to the right of the warehouse { "classname" "env_physics_blocker" @@ -640,6 +674,36 @@ add: "BlockType" "0" } +; ===================================================== +; == NUISANCE CHANGES == +; == Clipping improvements, QOL map changes == +; ===================================================== +; --- Clipping on car stops by the starting saferoom to prevent getting stuck +{ + "classname" "env_physics_blocker" + "origin" "3476 -2750 122.5" + "mins" "-6 -49 -2.5" + "maxs" "6 49 2.5" + "initialstate" "1" + "BlockType" "0" +} +{ + "classname" "env_physics_blocker" + "origin" "3476 -2596 122.5" + "mins" "-6 -49 -2.5" + "maxs" "6 49 2.5" + "initialstate" "1" + "BlockType" "0" +} +{ + "classname" "env_physics_blocker" + "origin" "3475 -2448 122.5" + "mins" "-6 -49 -2.5" + "maxs" "6 49 2.5" + "initialstate" "1" + "BlockType" "0" +} + ; ############# LADDER CHANGES AND FIXES ############ ; ===================================================== ; == LADDER ADDITIONS / FIXES == From 2857d148599d9471c5e12e81dd94f53586b1eaae Mon Sep 17 00:00:00 2001 From: Mart Date: Sat, 16 May 2026 08:44:45 -0300 Subject: [PATCH 15/19] Update uz_town.cfg (#958) * Update uz_town.cfg Infected ladder to not get stuck from the other side of barricade with two police cars * Update uz_town.cfg Infected ladder to not get stuck from the other side of barricade with two police cars (fences and houses) --- cfg/stripper/zonemod/maps/uz_town.cfg | 52 +++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/cfg/stripper/zonemod/maps/uz_town.cfg b/cfg/stripper/zonemod/maps/uz_town.cfg index a6cca296a..38949558c 100644 --- a/cfg/stripper/zonemod/maps/uz_town.cfg +++ b/cfg/stripper/zonemod/maps/uz_town.cfg @@ -143,3 +143,55 @@ add: "BlockType" "1" "classname" "env_physics_blocker" } + +; ############# LADDER CHANGES AND FIXES ############ +; ===================================================== +; == LADDER ADDITIONS / FIXES == +; == Add or change ladders == +; ===================================================== + +add: +; --- Infected ladder near the barricade with two static police cars to not get stuck at the other side (both side of the fences) +{ + "classname" "func_simpleladder" + "origin" "-1260 0 7" + "angles" "0 0 0" + "model" "*168" + "normal.x" "-1" + "normal.y" "0" + "normal.z" "0" + "team" "2" +} +{ + "classname" "func_simpleladder" + "origin" "-4762 3328 7" + "angles" "0 180 0" + "model" "*168" + "normal.x" "1" + "normal.y" "0" + "normal.z" "0" + "team" "2" +} + +; --- Infected ladder near the barricade with two static police cars to not get stuck at the other side (both houses rooftop) +add: +{ + "classname" "func_simpleladder" + "origin" "-2956 2423 39" + "angles" "0 0 0" + "model" "*176" + "normal.x" "0" + "normal.y" "-1" + "normal.z" "0" + "team" "2" +} +{ + "classname" "func_simpleladder" + "origin" "-4020 1281 39" + "angles" "0 180 0" + "model" "*176" + "normal.z" "0" + "normal.y" "1" + "normal.x" "0" + "team" "2" +} From 83464e9b44203a4e7d539a03e581de3f664ddfec Mon Sep 17 00:00:00 2001 From: Forgetest <33988868+jensewe@users.noreply.github.com> Date: Sat, 16 May 2026 20:30:02 +0800 Subject: [PATCH 16/19] [Experimental] Fix LOS through thin/small props (#962) * Add plugin `l4d_fix_prop_los` * Add compiled `l4d_fix_prop_los` * Add `l4d_fix_prop_los` to generalfixes * Fix missing definition --- .../sourcemod/gamedata/l4d_fix_prop_los.txt | 46 ++++++++++++++++ .../plugins/fixes/l4d_fix_prop_los.smx | Bin 0 -> 3636 bytes .../sourcemod/scripting/l4d_fix_prop_los.sp | 49 ++++++++++++++++++ cfg/generalfixes.cfg | 1 + 4 files changed, 96 insertions(+) create mode 100644 addons/sourcemod/gamedata/l4d_fix_prop_los.txt create mode 100644 addons/sourcemod/plugins/fixes/l4d_fix_prop_los.smx create mode 100644 addons/sourcemod/scripting/l4d_fix_prop_los.sp diff --git a/addons/sourcemod/gamedata/l4d_fix_prop_los.txt b/addons/sourcemod/gamedata/l4d_fix_prop_los.txt new file mode 100644 index 000000000..af3843f45 --- /dev/null +++ b/addons/sourcemod/gamedata/l4d_fix_prop_los.txt @@ -0,0 +1,46 @@ +"Games" +{ + "#default" + { + "Functions" + { + "l4d_fix_prop_los::CBaseProp::CalculateBlockLOS" + { + "signature" "CBaseProp::CalculateBlockLOS" + "callconv" "thiscall" + "return" "void" + "this" "entity" + } + } + } + + "left4dead" + { + "Signatures" + { + "CBaseProp::CalculateBlockLOS" + { + "library" "server" + "linux" "@_ZN9CBaseProp17CalculateBlockLOSEv" + "windows" "\x83\xEC\x0C\x53\x55\x8B\xE9\x8B\x85\x2A\x2A\x2A\x2A\x8B" + // 83 EC 0C 53 55 8B E9 8B 85 ? ? ? ? 8B + } + } + } + + "left4dead2" + { + "Signatures" + { + "CBaseProp::CalculateBlockLOS" + { + "library" "server" + "linux" "@_ZN9CBaseProp17CalculateBlockLOSEv" + "windows" "\x55\x8B\xEC\x83\xEC\x10\x53\x8B\xD9\x8B\x83\x2A\x2A\x2A\x2A\x8B" + // 55 8B EC 83 EC 10 53 8B D9 8B 83 ? ? ? ? 8B + // Search string "ai_addon_thrownprojectile" + // Called inside + } + } + } +} \ No newline at end of file diff --git a/addons/sourcemod/plugins/fixes/l4d_fix_prop_los.smx b/addons/sourcemod/plugins/fixes/l4d_fix_prop_los.smx new file mode 100644 index 0000000000000000000000000000000000000000..b3324d22ccaf9e1fb553722c2d2c5adb4e14889e GIT binary patch literal 3636 zcmXw+X&_W@8;6fQ*(=KslKNY-uY-hS8B5uBS!S3pW0|o=D1(&9nnJQ=8)eTrH7QH> zEt(l4*(EdzQSYg@KK#ygo#))=zMtoOJC`n9wx*|}Q{e=FdT9VSegFVK4;^^<%XV%6 zUgC zE+7rTSf2)fiy*DQKOnK0GSTP9Q0hq z|G&QgZVcQqPzGiPbXkz~V8o;Vpcf*0x zP#zd$DEyBEfC$E5kpHj!V*zlCFWUR>^1sqQPv9tQz~6ODL?Ao_j`@4%vEWlwy?RK6N4X0)sU7;{23?L`!ZhfF|Ni{X^RO5rRgF@PH{H+PWNcJA3eoT1#_tiBy0BX zvc!DP7G?IZf;l&MOA5QugVGiY98A##H@6Q#-I@EQ_=p&o2-z^fMctm`gKRkBw7LU* z1U9sZ9esg00&)gF40_xbdo6S*&+ei5FqAX{oOTgPEN@s$`gqaCc*_! zx&PXs;^tBnNvt@nfxsomhAQrOZ|Ms;TwBImlM+dQIG{)p!#Q7VDTi!m{O&Wx9+o;M zr$Aa`mvG8noKzx3g7ZjrI3Yxf3GTz&K<3{=#o3z)ftJdoAe`3AKzRj{Bd(1Qm;=EV zXKiT_ca%s9L|y^>o8L!~BntbqSpV+n=GBs_w)lV;2*C+?wMY|Yw#8ioQwkaF^nJ^;K4#!Hx$pZWzE92Zqj;(qa5SkNYGHn?5C=^ zwsLA+UeqN|mQbhTvuiEi@UgVz7 zfqk(StG>eD(cD>BAY?35fv#dWj8qL>Gx!{dZImSchaGshLk!P|sSa3v+dC0QsS^Lj zw;#NHj<(SAYfdK2ET@01&9<)qOEi`HZxshjHe;Ljfa}8O|K0gQekKSFoH{PF(r|J94WHG-pHLS|M)YnvO zk4@>bdB+f$;q=Mpn*-cv=waDhKZ`IqgJn^rKSN^Cte@wlYLr>kr(Uf!UUyyZT&EV& zEw8MqdcBya2`Md>n+Hv+)kTSYT)8$uX|pw!Fx#|Qq!aG|HwX4TD#m5X6t7uewkSER zYScS=QmU;CG{fG}6Sfp(gN0~i8@IfonJb59r@zFc*^{|keflG*t}2!~O-3|`#4~x} z@QN!-dHfS5%Ei!yjwFjb;R%zkppN)P2Wy;$s-EG=-$pgupoHJTyi`zK(Lt+E`Bf>J z{jlI#f}i{m!P_5m{=`rx%97gLAj)2JU9#zBWc=~isY>@`n{)yMEwQSu{4*aQm zzWI8j^21@1p;eUb+cM)DHzu~=$oNe71ryCA^aD`^jxnpc_14T0-nR|$!AgZfCE6du zTxvZ;MqvhU@&(}?=|7@-Z>ikaB;X1ZxKF~?RYnD1_Gi?i}-t2$qCYk*&UtFD?`?=ulBv!f#7L8_*0 zp$QA>+GxOPz;HxU0=D3;N4}4r!_xH0$%v*zEJZ+N?UO_JepQ<`HET_1+uQ2m64}8c zUrFl8*C#5~*8dq|CSM(P5*Vy)_(4CRrj*{wUFKPJ;UOSBMV)9F_0+6Ypbof^%mPtjTx*5#b# zyJ+?y`99Y@8fV#t@xu8uLFu9Ls~+c6>-^}aa`_NuuZv$of&`iYtvm^+L)z#fy~4 zApK^}WxF8y>`YjLiqZ|!J zIE>KeLb(h->X}WqM!p-d-zeGrO7c%qr_v}%z4eI?(>DxfQdBAjxCG#L3eJUgqP
8QVI-HwI!cGM; z^JqlL*4T~JylLMRjnI`xz&x3s-$JM@wh<-VSS0pI<=`U~E)>su}LlvQ& z(Vi#c0&Kgf3T7f>vNfj-OWzFm%q?a>!{6tQmVHlo!P+Xs$fU8tv_a2*rCE-oEmkHcm|5mBSbQS`=mW{EM zJoK>Ljq7~%SktxkatUv!?T#K>w9Na)cvmSz%Cw83bxByg{tIZpI4m;mj;T1&?dj1E z2{AWrONJkxNX*Qs;M7FWpDnMc(-PFL(sJ-TD(}6PE!H$N-`#I_Mug7E#9{k$%`HLS z9#U*E>|!$RtrW3vtkuKj@*WHEkaQ&!w`QGCTAual)1v~x5r2t**&kpx7xbhFZX0k-t$%x zZ6?pKY{kQ{DNfb6YTvsHUW8ro%(Xj9^LuJXl5;sKgbn>dJ8KLA42H7_M&sFZ=4hJa z-p#yK-$m3~r`%`~>yqXhsP*d!Q~wmgvG+r8yJO2YrdsUFv{4R6 zcS(MUb9s~M@^@1g**)jvNtG;h89%HscDE8u9)5euC%x0mj&<*GfKhFiDVHggZM8VLc4Sd*bB*@$=%!FZ z9HX|mPy+#7dGAPP>G`9(P0&xe#hjnJ3_^h}n9w%i%Lp#erO7;TVYZw@gUYo$%(ZJU zLt`#DKH8yc#WJc}cGr%YLW{NRxo35aPzV$PKQq+~VbT?qD629H8_mjm<>{oN|hb2h`=IeX{_j+$8GMfkKrQz#Lu&cGkn ze0iOImb3ktON;^rvdc+zsy>Eh`bLjtNUceGjsnmuB6Jiw?I!&}&+^zXdUyKHx)weuq#Ix4+s3&p89A(jQE_BG~Xi z(Qf61sK8#v=l#yjUa@Kp`(-_7A#%h z%$7KeV&k5Oy(RvZv;lnTsRYltadH;aJe;QSZr!A{Dl*K`vcAYB^aamSo}gXi7nZnS zJG-S$VeXZzb$*JEVnN;KRyG=RE^kSyTc?~9cI5ln(=8-h9qFdC`hC++#TsCuQ5F&F z7Iz{mVZvv1YDp%hd8_368Hy|QAqrZJZm3oXkyMk!`*pff!uKUrCCTDk;w2?eGERh5 grY*zD#62^8EEU_Am@sQu=_?|Y0R6?LxU|^$KNx7F6#xJL literal 0 HcmV?d00001 diff --git a/addons/sourcemod/scripting/l4d_fix_prop_los.sp b/addons/sourcemod/scripting/l4d_fix_prop_los.sp new file mode 100644 index 000000000..236f88aba --- /dev/null +++ b/addons/sourcemod/scripting/l4d_fix_prop_los.sp @@ -0,0 +1,49 @@ +#pragma semicolon 1 +#pragma newdecls required + +#include +#include + +#define PLUGIN_VERSION "1.0" + +public Plugin myinfo = +{ + name = "[L4D & 2] Fix Prop LOS", + author = "Forgetest", + description = "Fix thin/small 'prop_*' entity not blocking LOS.", + version = PLUGIN_VERSION, + url = "https://github.com/Target5150/MoYu_Server_Stupid_Plugins", +} + +methodmap GameDataWrapper < GameData { + public GameDataWrapper(const char[] file) { + GameData gd = new GameData(file); + if (!gd) SetFailState("Missing gamedata \"%s\"", file); + return view_as(gd); + } + public DynamicDetour CreateDetourOrFail( + const char[] name, + DHookCallback preHook = INVALID_FUNCTION, + DHookCallback postHook = INVALID_FUNCTION) { + DynamicDetour hSetup = DynamicDetour.FromConf(this, name); + if (!hSetup) + SetFailState("Missing detour setup \"%s\"", name); + if (preHook != INVALID_FUNCTION && !hSetup.Enable(Hook_Pre, preHook)) + SetFailState("Failed to pre-detour \"%s\"", name); + if (postHook != INVALID_FUNCTION && !hSetup.Enable(Hook_Post, postHook)) + SetFailState("Failed to post-detour \"%s\"", name); + return hSetup; + } +} + +public void OnPluginStart() +{ + GameDataWrapper gd = new GameDataWrapper("l4d_fix_prop_los"); + delete gd.CreateDetourOrFail("l4d_fix_prop_los::CBaseProp::CalculateBlockLOS", DTR_CalculateBlockLOS); + delete gd; +} + +MRESReturn DTR_CalculateBlockLOS(int entity) +{ + return MRES_Supercede; +} \ No newline at end of file diff --git a/cfg/generalfixes.cfg b/cfg/generalfixes.cfg index 93ae3f08a..332b3907a 100644 --- a/cfg/generalfixes.cfg +++ b/cfg/generalfixes.cfg @@ -71,6 +71,7 @@ sm plugins load fixes/l4d2_fix_rocket_pull.smx sm plugins load optional/l4d_return_thrown_items.smx sm plugins load fixes/l4d_prop_touching_rules.smx sm plugins load fixes/l4d2_fix_tank_rock_handoff.smx +sm plugins load fixes/l4d_fix_prop_los.smx // Anti-Cheat. sm plugins load optional/l4d2_block_autoaim.smx // Sort of a cheat..? From 691f1652850a826840572386250b9fa570667f1f Mon Sep 17 00:00:00 2001 From: SirPlease Date: Sat, 16 May 2026 15:18:51 +0200 Subject: [PATCH 17/19] Bump Zonemod to 2.9.1b --- addons/sourcemod/configs/matchmodes.txt | 6 +++--- cfg/cfgogl/zh1v1/confogl.cfg | 2 +- cfg/cfgogl/zh2v2/confogl.cfg | 2 +- cfg/cfgogl/zh3v3/confogl.cfg | 2 +- cfg/cfgogl/zm1v1/confogl.cfg | 2 +- cfg/cfgogl/zm2v2/confogl.cfg | 2 +- cfg/cfgogl/zm3v3/confogl.cfg | 2 +- cfg/cfgogl/zonehunters/confogl.cfg | 2 +- cfg/cfgogl/zonemod/confogl.cfg | 2 +- cfg/cfgogl/zoneretro/confogl.cfg | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/addons/sourcemod/configs/matchmodes.txt b/addons/sourcemod/configs/matchmodes.txt index 8744be87f..134ba2b0d 100644 --- a/addons/sourcemod/configs/matchmodes.txt +++ b/addons/sourcemod/configs/matchmodes.txt @@ -4,11 +4,11 @@ { "zonemod" { - "name" "ZoneMod 2.9.1a" + "name" "ZoneMod 2.9.1b" } "zoneretro" { - "name" "ZoneMod Retro 2.9.1a" + "name" "ZoneMod Retro 2.9.1b" } "zm3v3" { @@ -109,7 +109,7 @@ { "zonehunters" { - "name" "ZoneHunters 2.9.1a" + "name" "ZoneHunters 2.9.1b" } "zh3v3" { diff --git a/cfg/cfgogl/zh1v1/confogl.cfg b/cfg/cfgogl/zh1v1/confogl.cfg index 67a829cbe..1e470ab1a 100644 --- a/cfg/cfgogl/zh1v1/confogl.cfg +++ b/cfg/cfgogl/zh1v1/confogl.cfg @@ -7,7 +7,7 @@ // ======================================================================================= // ReadyUp Cvars -l4d_ready_cfg_name "1v1 [Zone]Hunters v2.9.1a" +l4d_ready_cfg_name "1v1 [Zone]Hunters v2.9.1b" // Confogl Cvars confogl_addcvar mp_gamemode "versus" // Force Versus for the config. diff --git a/cfg/cfgogl/zh2v2/confogl.cfg b/cfg/cfgogl/zh2v2/confogl.cfg index ab8ef7c93..91143818a 100644 --- a/cfg/cfgogl/zh2v2/confogl.cfg +++ b/cfg/cfgogl/zh2v2/confogl.cfg @@ -7,7 +7,7 @@ // ======================================================================================= // ReadyUp Cvars -l4d_ready_cfg_name "2v2 [Zone]Hunters v2.9.1a" +l4d_ready_cfg_name "2v2 [Zone]Hunters v2.9.1b" // Confogl Cvars confogl_addcvar mp_gamemode "versus" // Force Versus for the config. diff --git a/cfg/cfgogl/zh3v3/confogl.cfg b/cfg/cfgogl/zh3v3/confogl.cfg index 1f36009ee..9755a505f 100644 --- a/cfg/cfgogl/zh3v3/confogl.cfg +++ b/cfg/cfgogl/zh3v3/confogl.cfg @@ -7,7 +7,7 @@ // ======================================================================================= // ReadyUp Cvars -l4d_ready_cfg_name "3v3 [Zone]Hunters v2.9.1a" +l4d_ready_cfg_name "3v3 [Zone]Hunters v2.9.1b" // Confogl Cvars confogl_addcvar mp_gamemode "versus" // Force Versus for the config. diff --git a/cfg/cfgogl/zm1v1/confogl.cfg b/cfg/cfgogl/zm1v1/confogl.cfg index 7d7fc907b..c74d78c61 100644 --- a/cfg/cfgogl/zm1v1/confogl.cfg +++ b/cfg/cfgogl/zm1v1/confogl.cfg @@ -8,7 +8,7 @@ // ======================================================================================= // ReadyUp Cvars -l4d_ready_cfg_name "1v1 Zonemod v2.9.1a" +l4d_ready_cfg_name "1v1 Zonemod v2.9.1b" // Confogl Cvars confogl_addcvar mp_gamemode "versus" // Force Versus for the config. diff --git a/cfg/cfgogl/zm2v2/confogl.cfg b/cfg/cfgogl/zm2v2/confogl.cfg index 774724bd4..56699b873 100644 --- a/cfg/cfgogl/zm2v2/confogl.cfg +++ b/cfg/cfgogl/zm2v2/confogl.cfg @@ -8,7 +8,7 @@ // ======================================================================================= // ReadyUp Cvars -l4d_ready_cfg_name "2v2 Zonemod v2.9.1a" +l4d_ready_cfg_name "2v2 Zonemod v2.9.1b" // Confogl Cvars confogl_addcvar mp_gamemode "versus" // Force Versus for the config. diff --git a/cfg/cfgogl/zm3v3/confogl.cfg b/cfg/cfgogl/zm3v3/confogl.cfg index 8b509dedd..bf6bea286 100644 --- a/cfg/cfgogl/zm3v3/confogl.cfg +++ b/cfg/cfgogl/zm3v3/confogl.cfg @@ -8,7 +8,7 @@ // ======================================================================================= // ReadyUp Cvars -l4d_ready_cfg_name "3v3 Zonemod v2.9.1a" +l4d_ready_cfg_name "3v3 Zonemod v2.9.1b" // Confogl Cvars confogl_addcvar mp_gamemode "versus" // Force Versus for the config. diff --git a/cfg/cfgogl/zonehunters/confogl.cfg b/cfg/cfgogl/zonehunters/confogl.cfg index 6fddffed1..ca0c4fac6 100644 --- a/cfg/cfgogl/zonehunters/confogl.cfg +++ b/cfg/cfgogl/zonehunters/confogl.cfg @@ -7,7 +7,7 @@ // ======================================================================================= // ReadyUp Cvars -l4d_ready_cfg_name "[Zone]Hunters v2.9.1a" +l4d_ready_cfg_name "[Zone]Hunters v2.9.1b" // Confogl Cvars confogl_addcvar mp_gamemode "versus" // Force Versus for the config. diff --git a/cfg/cfgogl/zonemod/confogl.cfg b/cfg/cfgogl/zonemod/confogl.cfg index f3ddeadeb..1c3c4c5cf 100644 --- a/cfg/cfgogl/zonemod/confogl.cfg +++ b/cfg/cfgogl/zonemod/confogl.cfg @@ -8,7 +8,7 @@ // ======================================================================================= // ReadyUp Cvars -l4d_ready_cfg_name "ZoneMod v2.9.1a" +l4d_ready_cfg_name "ZoneMod v2.9.1b" // Confogl Cvars confogl_addcvar mp_gamemode "versus" // Force Versus for the config. diff --git a/cfg/cfgogl/zoneretro/confogl.cfg b/cfg/cfgogl/zoneretro/confogl.cfg index c3487ad52..23f513f30 100644 --- a/cfg/cfgogl/zoneretro/confogl.cfg +++ b/cfg/cfgogl/zoneretro/confogl.cfg @@ -8,7 +8,7 @@ // ======================================================================================= // ReadyUp Cvars -l4d_ready_cfg_name "ZoneMod Retro v2.9.1a" +l4d_ready_cfg_name "ZoneMod Retro v2.9.1b" // Confogl Cvars confogl_addcvar mp_gamemode "versus" // Force Versus for the config. From 7bce1b177fec54b2d6f45b22fdf4f488ef283b5a Mon Sep 17 00:00:00 2001 From: SirPlease Date: Sat, 16 May 2026 15:41:16 +0200 Subject: [PATCH 18/19] Add release workflow, update readme --- .github/workflows/release.yml | 174 ++++++++++++++++++++++++++++++++++ README.md | 22 ++++- 2 files changed, 194 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..138b0a3d1 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,174 @@ +name: Build release packages + +# Owner-only. workflow_dispatch already requires repo write access, and the +# job-level `if` below additionally restricts execution to the repository +# owner, so only the owner can produce a release. +on: + workflow_dispatch: + inputs: + version: + description: 'Release version / tag (e.g. v3.0)' + required: true + type: string + prerelease: + description: 'Mark the GitHub Release as a pre-release' + required: false + type: boolean + default: false + +permissions: + contents: write + +concurrency: + group: release-${{ inputs.version }} + cancel-in-progress: false + +jobs: + release: + name: Compile plugins and package ${{ inputs.version }} + runs-on: ubuntu-latest + # Hard gate: only the repository owner may run this workflow. + if: github.actor == github.repository_owner + + steps: + - uses: actions/checkout@v5 + + # Same upstream compiler our check_plugins.yml CI gates on — pinned to + # SourceMod 1.12. Putting `spcomp` on PATH for the next step. + - name: Setup SourcePawn Compiler (SourceMod 1.12) + uses: rumblefrog/setup-sp@master + with: + version: "1.12" + + - name: Compile every shipped plugin from source + run: | + set -euo pipefail + SCRIPTING="$GITHUB_WORKSPACE/addons/sourcemod/scripting" + PLUGINS="$GITHUB_WORKSPACE/addons/sourcemod/plugins" + + # Compile with the upstream SourceMod 1.12 compiler from + # rumblefrog/setup-sp (on PATH), NOT the spcomp binary committed in + # the repo — a known, reproducible toolchain. The -i include paths + # below still point at the repo's own sources/includes. + COMPILER="spcomp" + + BUILD="$(mktemp -d)" + declare -A BUILT + FAILED="" + COUNT=0 + + # Drive off the .smx files that ship in the repo: each one is + # rebuilt from its same-named .sp source and written straight back + # to its original path (root / fixes / optional / disabled / etc.). + while IFS= read -r -d '' smx; do + name="$(basename "$smx" .smx)" + + if [ -z "${BUILT[$name]:-}" ]; then + if [ -f "$SCRIPTING/$name.sp" ]; then + src="$SCRIPTING/$name.sp" + inc="$SCRIPTING/include" + elif [ -f "$SCRIPTING/sourcemod/$name.sp" ]; then + # Stock SourceMod plugins live one level down with their + # own include tree. + src="$SCRIPTING/sourcemod/$name.sp" + inc="$SCRIPTING/sourcemod/include" + else + echo "::error::No .sp source found for shipped plugin '$name' ($smx)" + FAILED="$FAILED $name" + continue + fi + + echo "Compiling $name ..." + if "$COMPILER" -E -w234 -w217 -O2 -v2 -i "$inc" "-o$BUILD/$name.smx" "$src"; then + BUILT[$name]="$BUILD/$name.smx" + else + echo "::error::Failed to compile '$name' ($src)" + FAILED="$FAILED $name" + continue + fi + fi + + cp -f "${BUILT[$name]}" "$smx" + COUNT=$((COUNT + 1)) + done < <(find "$PLUGINS" -name '*.smx' -print0) + + echo "Refreshed $COUNT plugin file(s) from ${#BUILT[@]} unique source(s)." + if [ -n "$FAILED" ]; then + echo "::error::One or more plugins failed to build:$FAILED" + exit 1 + fi + + - name: Stage the drop-in overlay + run: | + set -euo pipefail + STAGE="$GITHUB_WORKSPACE/.release" + rm -rf "$STAGE" + mkdir -p "$STAGE" + + # Lean runtime overlay: only what gets dropped over left4dead2/. + cp -a \ + addons cfg scripts \ + host.txt motd.txt myhost.txt mymotd.txt \ + README.md LICENSE \ + "$STAGE"/ + + # Exclude the SourcePawn sources and the bundled compiler from the + # shipped overlay (the compiled .smx in plugins/ are what runs). + rm -rf "$STAGE/addons/sourcemod/scripting" + + echo "STAGE=$STAGE" >> "$GITHUB_ENV" + + - name: Build Linux archive (.so natives only) + run: | + set -euo pipefail + NAME="L4D2-Competitive-Rework-${{ inputs.version }}-linux" + OUT="$GITHUB_WORKSPACE/$NAME.tar.gz" + # Drop every Windows native; keep the .so files. + tar -czf "$OUT" --exclude='*.dll' -C "$STAGE" . + echo "LINUX_ASSET=$OUT" >> "$GITHUB_ENV" + + - name: Build Windows archive (.dll natives only) + run: | + set -euo pipefail + NAME="L4D2-Competitive-Rework-${{ inputs.version }}-windows" + OUT="$GITHUB_WORKSPACE/$NAME.zip" + # Drop every Linux native; keep the .dll files. + ( cd "$STAGE" && zip -qr "$OUT" . -x '*.so' ) + echo "WIN_ASSET=$OUT" >> "$GITHUB_ENV" + + - name: Publish draft GitHub Release + env: + GH_TOKEN: ${{ github.token }} + run: | + set -euo pipefail + VER="${{ inputs.version }}" + PRE="" + if [ "${{ inputs.prerelease }}" = "true" ]; then PRE="--prerelease"; fi + + # Static platform preamble, built via printf so no YAML/shell + # indentation leaks in and gets rendered as a markdown code block. + # GitHub's auto-generated changelog (--generate-notes) is appended + # after this by gh release create. + NOTES="$RUNNER_TEMP/release-notes.md" + { + printf 'Automated build of `%s`.\n\n' "$VER" + printf -- '- **Linux** (`*-linux.tar.gz`): `.so` natives only.\n' + printf -- '- **Windows** (`*-windows.zip`): `.dll` natives only.\n\n' + printf 'Drop-in overlay for `left4dead2/`. All `.smx` plugins are recompiled ' + printf 'from source with the upstream SourceMod 1.12 compiler ' + printf '(rumblefrog/setup-sp); SourcePawn sources are not included in the ' + printf 'archives.\n' + } > "$NOTES" + + # --draft: nothing goes public (and the git tag is NOT created) + # until you review and click Publish on the Releases page. + # --generate-notes: appends a changelog built from merged PRs since + # the previous release (full history for the first one). + gh release create "$VER" \ + --draft \ + --generate-notes \ + --target "$GITHUB_SHA" \ + --title "$VER" \ + --notes-file "$NOTES" \ + $PRE \ + "$LINUX_ASSET" "$WIN_ASSET" diff --git a/README.md b/README.md index f9fba30d7..129bb3858 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ > [!IMPORTANT] > It is recommended to host servers on Linux, but Windows is supported. > When running Linux ensure that your setup is running a minimum of **`GLIBC 2.35`** (Ubuntu 22.04 or higher) or you will run into issues loading certain extensions. -> This repository only supports Sourcemod **1.12** and up (which comes with the repository for ease of use) +> This repository only supports Sourcemod **1.12** and up (which comes with the repository for ease of use) --- @@ -26,7 +26,7 @@ In its current state it allows anyone to host their own up to date competitive L > **Included Matchmodes:** -* **Zonemod 2.9.1a** +* **Zonemod 2.9.1b** * **Zonemod Hunters** * **Zonemod Retro** * **NeoMod 0.4a** @@ -38,6 +38,23 @@ In its current state it allows anyone to host their own up to date competitive L --- +## **Download & Installation:** + +> [!IMPORTANT] +> Pick the archive that matches your **Server OS**: +> * **Linux:** `L4D2-Competitive-Rework--linux.tar.gz` +> * **Windows:** `L4D2-Competitive-Rework--windows.zip` + +1. Download the latest archive from the [**Releases**](../../releases/latest) page. +2. Extract it directly into your server's **`left4dead2/`** directory. +3. For first-time server setup on dedicated servers, the [Dedicated Server Install Guide](Dedicated%20Server%20Install%20Guide/README.md) might be of use to you! + +> [!NOTE] +> Releases only include what the servers need, **no** SourcePawn sources or compiler. +> To modify or recompile plugins, clone the repository instead. + +--- + ## **Credits:** > **Foundation/Advanced Work:** @@ -103,6 +120,7 @@ In its current state it allows anyone to host their own up to date competitive L * Aiden * Derpduck +* Mart > [!NOTE] > If your work is being used and I forgot to credit you, don't hesitate to contact me on Discord (user: `sirplease`) \ No newline at end of file From 312c4b994d343a91e78037fca167db94e78801cc Mon Sep 17 00:00:00 2001 From: SirPlease Date: Sat, 16 May 2026 15:50:51 +0200 Subject: [PATCH 19/19] Update release.yml Workaround to deal with plugins like readyup's include system. --- .github/workflows/release.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 138b0a3d1..df1ab11b0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -65,12 +65,12 @@ jobs: if [ -z "${BUILT[$name]:-}" ]; then if [ -f "$SCRIPTING/$name.sp" ]; then - src="$SCRIPTING/$name.sp" + base="$SCRIPTING" inc="$SCRIPTING/include" elif [ -f "$SCRIPTING/sourcemod/$name.sp" ]; then # Stock SourceMod plugins live one level down with their # own include tree. - src="$SCRIPTING/sourcemod/$name.sp" + base="$SCRIPTING/sourcemod" inc="$SCRIPTING/sourcemod/include" else echo "::error::No .sp source found for shipped plugin '$name' ($smx)" @@ -79,10 +79,15 @@ jobs: fi echo "Compiling $name ..." - if "$COMPILER" -E -w234 -w217 -O2 -v2 -i "$inc" "-o$BUILD/$name.smx" "$src"; then + # Run with cwd = the scripting dir and a bare source filename, + # exactly like check_plugins.yml: some plugins (e.g. readyup) + # use working-directory-relative quoted #includes that only + # resolve from there. -i / -o / $BUILD are absolute, so the + # subshell cd does not affect them. + if ( cd "$base" && "$COMPILER" -E -w234 -w217 -O2 -v2 -i "$inc" "-o$BUILD/$name.smx" "$name.sp" ); then BUILT[$name]="$BUILD/$name.smx" else - echo "::error::Failed to compile '$name' ($src)" + echo "::error::Failed to compile '$name' ($base/$name.sp)" FAILED="$FAILED $name" continue fi