[HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL features - #465

Merged
Blixibon merged 14 commits into
mapbase-source:mapbase-mp-2025from
Blixibon:mapbase/mp-2025/expanded-npc-and-mapbase-support
Mar 10, 2026
Merged

[HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL features#465
Blixibon merged 14 commits into
mapbase-source:mapbase-mp-2025from
Blixibon:mapbase/mp-2025/expanded-npc-and-mapbase-support

Conversation

@Blixibon

@BlixibonBlixibon commented Aug 27, 2025

Copy link
Copy Markdown
Member

This PR contains assorted overlapping changes under the general categories of more stable and consistent NPC support in HL2DM, the integration of Mapbase's SP features into HL2DM, and general QOL features for HL2DM.

This is built off of and supersedes #459. Recommend reviewing individual commits rather than the entire diff.


What each commit does

This list describes each commit in this PR:

  • Add NPC, clientside activity, and Mapbase param support to HL2MP weapons — Adds NPC support, clientside activity lists, and Mapbase weapon parameters to HL2MP weapons. This was mainly a copy-paste job from their singleplayer HL2 counterparts, and any code that wasn't specific to Mapbase is not gated within #ifdef MAPBASE (e.g. general existing NPC support), while Mapbase-specific code within this PR or within the singleplayer weapons do use the #ifdef.
  • Add support for Mapbase anim state to HL2MP — Replaces HL2MP's anim state with Mapbase's anim state originally designed for singleplayer. Note that the #ifdef preprocessor is still named SP_ANIM_STATE.
  • Add automatic protagonist support to HL2MP player — Adds code to automatically set each player's protagonist based on their model name, as well as optional support for direct protagonist selection via sv_hl2mp_protagonist_select (thus allowing players to select any model defined by the scripts, including characters like Gordon). Assigning each player to a protagonist allows the use of c_arms and other parameters.
  • Allow HL2MP player to use response system for death sound instead of hardcoded soundscripts — Uses a response for the death sound rather than predefined soundscript arrays. This allows more flexibility in death sounds and makes it easier to integrate additional playermodels (such as those provided by direct protagonist selection).
  • Add HL2MP player resource override with NPC net names and idle bots in scoreboard — Adds a HL2MP-specific player resource override. For context, the "player resource" is a global entity that networks important player data for the scoreboard and beyond. MP games are capable of overriding the default player resource to add their own data, but HL2MP does not do this. Its only game-specific change (team colors) is done through an #ifdef in the base player resource (by contrast, TF2 assigns team colors in its own override). This commit adds a HL2MP-specific player resource for both general utility in derived mods as well as for two features:
    • Reflecting players controlled by idle bots, building off of the previous PR for bot possession.
    • Keeping track of and optimizing NPC net names so that every NPC isn't independently networking the same strings. In this case, it effectively doubles as an NPC resource.
  • Add NPC team-based relationships — Automatically assigns HL2 NPCs to teams that correspond to them in HL2MP, and then factors teams into their relationships. This means rebels and Combine forces will attack or support players on their respective teams in Team Deathmatch. Affiliation can be overridden by simply changing each NPC's team number via keyvalue or input.
  • Add HL2MP bullet FX fixes for NPCs and other entities — Fixes bullet FX inconsistencies in HL2MP due to HL2MP doing bullet FX on the client. To do this, bullet FX is done serverside when fired by NPCs (with a new mp_use_server_bulletfx cvar to extend this) and NPCs themselves network blood and limited relationship data.
  • Allow HL2MP gamerules to derive from HL2 gamerules + add basic integrated HL2MP co-op support — Allows HL2MP gamerules to fall back to SP HL2 gamerules functions and use SP ammo type data (which is identical except SP has more ammo types and allows configuration via cvars). Also adds support for integrated co-op mode via the mp_coop cvar, which influences player spawn positions and whether items respawn. The previously unused hl2mp_gamerules proxy is also now connected to hl2_gamerules and controls whether to allow the default suit or weapons (the functionality of this was added in a previous PR).
  • Add support for NPC death notices and target IDs — Adds optional death notices for when NPCs die or when NPCs kill players, controlled by sv_hl2mp_npc_deathnotice_as_victim and sv_hl2mp_npc_deathnotice_as_killer respectively. Enabled by default.
  • Add SP changes to HL2MP gravity gun + clientside +USE prediction — Adds Mapbase params, limited support for ragdoll pickup/mega physcannon, etc. to the gravity gun as well as clientside +USE prediction for player pickup and entities like func_tank.
  • Add npc_citizen MP squad support — Adds support for multiplayer squads to npc_citizen. If player_squad_mp_shared is enabled, then citizen squadmates will be shared between all players. If it is disabled, then each player will have their own commandable squad, with citizens joining the first one that approaches them. The cvar is disabled by default.
  • Add HL2MP player collision avoidance + ally blood decal fix — Adds TF2-style player teammate avoidance (i.e. walking through teammates and being pushed away, rather than just colliding with them) controlled via hl2mp_avoidteammates, and fixes player teammates showing blood decals when attacking them.
  • Fix NPC footstep sounds in HL2MP — Fixes NPCs not emitting footstep sounds in HL2MP.
  • Nextbots sense weapon sounds from traditional NPCs — Allows nextbots to sense NPC weapon firing in the same way they sense it from players.

PR Checklist

  • My PR follows all guidelines in the CONTRIBUTING.md file
  • My PR targets a develop branch OR targets another branch with a specific goal in mind

@BlixibonBlixibon changed the title [HL2MP] [HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL featuresAug 27, 2025
@Blixibon
Blixibonforce-pushed the mapbase/mp-2025/expanded-npc-and-mapbase-support branch from 5a54a04 to 3d5212cCompareAugust 27, 2025 20:20
@Blixibon
Blixibonforce-pushed the mapbase/mp-2025/expanded-npc-and-mapbase-support branch from 3d5212c to 06fa2daCompareAugust 27, 2025 20:47
@Blixibon
Blixibon marked this pull request as ready for review August 28, 2025 03:08
@Blixibon
Blixibon requested a review from arbabfAugust 28, 2025 03:08

@arbabfarbabf left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Took a look at these, they all look good to me.

@Blixibon
Blixibon merged commit 5745fd1 into mapbase-source:mapbase-mp-2025Mar 10, 2026
4 checks passed
@Blixibon
Blixibon deleted the mapbase/mp-2025/expanded-npc-and-mapbase-support branch March 10, 2026 14:47
Bitl added a commit to BitlDevelopmentStudios/source-sdk-2013 that referenced this pull request May 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Blixibon@arbabf
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL features - #465

Merged
Blixibon merged 14 commits into
mapbase-source:mapbase-mp-2025from
Blixibon:mapbase/mp-2025/expanded-npc-and-mapbase-support
Mar 10, 2026
Merged

[HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL features#465
Blixibon merged 14 commits into
mapbase-source:mapbase-mp-2025from
Blixibon:mapbase/mp-2025/expanded-npc-and-mapbase-support

Conversation

@Blixibon

@BlixibonBlixibon commented Aug 27, 2025

Copy link
Copy Markdown
Member

This PR contains assorted overlapping changes under the general categories of more stable and consistent NPC support in HL2DM, the integration of Mapbase's SP features into HL2DM, and general QOL features for HL2DM.

This is built off of and supersedes #459. Recommend reviewing individual commits rather than the entire diff.


What each commit does

This list describes each commit in this PR:

  • Add NPC, clientside activity, and Mapbase param support to HL2MP weapons — Adds NPC support, clientside activity lists, and Mapbase weapon parameters to HL2MP weapons. This was mainly a copy-paste job from their singleplayer HL2 counterparts, and any code that wasn't specific to Mapbase is not gated within #ifdef MAPBASE (e.g. general existing NPC support), while Mapbase-specific code within this PR or within the singleplayer weapons do use the #ifdef.
  • Add support for Mapbase anim state to HL2MP — Replaces HL2MP's anim state with Mapbase's anim state originally designed for singleplayer. Note that the #ifdef preprocessor is still named SP_ANIM_STATE.
  • Add automatic protagonist support to HL2MP player — Adds code to automatically set each player's protagonist based on their model name, as well as optional support for direct protagonist selection via sv_hl2mp_protagonist_select (thus allowing players to select any model defined by the scripts, including characters like Gordon). Assigning each player to a protagonist allows the use of c_arms and other parameters.
  • Allow HL2MP player to use response system for death sound instead of hardcoded soundscripts — Uses a response for the death sound rather than predefined soundscript arrays. This allows more flexibility in death sounds and makes it easier to integrate additional playermodels (such as those provided by direct protagonist selection).
  • Add HL2MP player resource override with NPC net names and idle bots in scoreboard — Adds a HL2MP-specific player resource override. For context, the "player resource" is a global entity that networks important player data for the scoreboard and beyond. MP games are capable of overriding the default player resource to add their own data, but HL2MP does not do this. Its only game-specific change (team colors) is done through an #ifdef in the base player resource (by contrast, TF2 assigns team colors in its own override). This commit adds a HL2MP-specific player resource for both general utility in derived mods as well as for two features:
    • Reflecting players controlled by idle bots, building off of the previous PR for bot possession.
    • Keeping track of and optimizing NPC net names so that every NPC isn't independently networking the same strings. In this case, it effectively doubles as an NPC resource.
  • Add NPC team-based relationships — Automatically assigns HL2 NPCs to teams that correspond to them in HL2MP, and then factors teams into their relationships. This means rebels and Combine forces will attack or support players on their respective teams in Team Deathmatch. Affiliation can be overridden by simply changing each NPC's team number via keyvalue or input.
  • Add HL2MP bullet FX fixes for NPCs and other entities — Fixes bullet FX inconsistencies in HL2MP due to HL2MP doing bullet FX on the client. To do this, bullet FX is done serverside when fired by NPCs (with a new mp_use_server_bulletfx cvar to extend this) and NPCs themselves network blood and limited relationship data.
  • Allow HL2MP gamerules to derive from HL2 gamerules + add basic integrated HL2MP co-op support — Allows HL2MP gamerules to fall back to SP HL2 gamerules functions and use SP ammo type data (which is identical except SP has more ammo types and allows configuration via cvars). Also adds support for integrated co-op mode via the mp_coop cvar, which influences player spawn positions and whether items respawn. The previously unused hl2mp_gamerules proxy is also now connected to hl2_gamerules and controls whether to allow the default suit or weapons (the functionality of this was added in a previous PR).
  • Add support for NPC death notices and target IDs — Adds optional death notices for when NPCs die or when NPCs kill players, controlled by sv_hl2mp_npc_deathnotice_as_victim and sv_hl2mp_npc_deathnotice_as_killer respectively. Enabled by default.
  • Add SP changes to HL2MP gravity gun + clientside +USE prediction — Adds Mapbase params, limited support for ragdoll pickup/mega physcannon, etc. to the gravity gun as well as clientside +USE prediction for player pickup and entities like func_tank.
  • Add npc_citizen MP squad support — Adds support for multiplayer squads to npc_citizen. If player_squad_mp_shared is enabled, then citizen squadmates will be shared between all players. If it is disabled, then each player will have their own commandable squad, with citizens joining the first one that approaches them. The cvar is disabled by default.
  • Add HL2MP player collision avoidance + ally blood decal fix — Adds TF2-style player teammate avoidance (i.e. walking through teammates and being pushed away, rather than just colliding with them) controlled via hl2mp_avoidteammates, and fixes player teammates showing blood decals when attacking them.
  • Fix NPC footstep sounds in HL2MP — Fixes NPCs not emitting footstep sounds in HL2MP.
  • Nextbots sense weapon sounds from traditional NPCs — Allows nextbots to sense NPC weapon firing in the same way they sense it from players.

PR Checklist

  • My PR follows all guidelines in the CONTRIBUTING.md file
  • My PR targets a develop branch OR targets another branch with a specific goal in mind

@BlixibonBlixibon changed the title [HL2MP] [HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL featuresAug 27, 2025
@Blixibon
Blixibonforce-pushed the mapbase/mp-2025/expanded-npc-and-mapbase-support branch from 5a54a04 to 3d5212cCompareAugust 27, 2025 20:20
@Blixibon
Blixibonforce-pushed the mapbase/mp-2025/expanded-npc-and-mapbase-support branch from 3d5212c to 06fa2daCompareAugust 27, 2025 20:47
@Blixibon
Blixibon marked this pull request as ready for review August 28, 2025 03:08
@Blixibon
Blixibon requested a review from arbabfAugust 28, 2025 03:08

@arbabfarbabf left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Took a look at these, they all look good to me.

@Blixibon
Blixibon merged commit 5745fd1 into mapbase-source:mapbase-mp-2025Mar 10, 2026
4 checks passed
@Blixibon
Blixibon deleted the mapbase/mp-2025/expanded-npc-and-mapbase-support branch March 10, 2026 14:47
Bitl added a commit to BitlDevelopmentStudios/source-sdk-2013 that referenced this pull request May 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Blixibon@arbabf
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL features - #465

Merged
Blixibon merged 14 commits into
mapbase-source:mapbase-mp-2025from
Blixibon:mapbase/mp-2025/expanded-npc-and-mapbase-support
Mar 10, 2026
Merged

[HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL features#465
Blixibon merged 14 commits into
mapbase-source:mapbase-mp-2025from
Blixibon:mapbase/mp-2025/expanded-npc-and-mapbase-support

Conversation

@Blixibon

@BlixibonBlixibon commented Aug 27, 2025

Copy link
Copy Markdown
Member

This PR contains assorted overlapping changes under the general categories of more stable and consistent NPC support in HL2DM, the integration of Mapbase's SP features into HL2DM, and general QOL features for HL2DM.

This is built off of and supersedes #459. Recommend reviewing individual commits rather than the entire diff.


What each commit does

This list describes each commit in this PR:

  • Add NPC, clientside activity, and Mapbase param support to HL2MP weapons — Adds NPC support, clientside activity lists, and Mapbase weapon parameters to HL2MP weapons. This was mainly a copy-paste job from their singleplayer HL2 counterparts, and any code that wasn't specific to Mapbase is not gated within #ifdef MAPBASE (e.g. general existing NPC support), while Mapbase-specific code within this PR or within the singleplayer weapons do use the #ifdef.
  • Add support for Mapbase anim state to HL2MP — Replaces HL2MP's anim state with Mapbase's anim state originally designed for singleplayer. Note that the #ifdef preprocessor is still named SP_ANIM_STATE.
  • Add automatic protagonist support to HL2MP player — Adds code to automatically set each player's protagonist based on their model name, as well as optional support for direct protagonist selection via sv_hl2mp_protagonist_select (thus allowing players to select any model defined by the scripts, including characters like Gordon). Assigning each player to a protagonist allows the use of c_arms and other parameters.
  • Allow HL2MP player to use response system for death sound instead of hardcoded soundscripts — Uses a response for the death sound rather than predefined soundscript arrays. This allows more flexibility in death sounds and makes it easier to integrate additional playermodels (such as those provided by direct protagonist selection).
  • Add HL2MP player resource override with NPC net names and idle bots in scoreboard — Adds a HL2MP-specific player resource override. For context, the "player resource" is a global entity that networks important player data for the scoreboard and beyond. MP games are capable of overriding the default player resource to add their own data, but HL2MP does not do this. Its only game-specific change (team colors) is done through an #ifdef in the base player resource (by contrast, TF2 assigns team colors in its own override). This commit adds a HL2MP-specific player resource for both general utility in derived mods as well as for two features:
    • Reflecting players controlled by idle bots, building off of the previous PR for bot possession.
    • Keeping track of and optimizing NPC net names so that every NPC isn't independently networking the same strings. In this case, it effectively doubles as an NPC resource.
  • Add NPC team-based relationships — Automatically assigns HL2 NPCs to teams that correspond to them in HL2MP, and then factors teams into their relationships. This means rebels and Combine forces will attack or support players on their respective teams in Team Deathmatch. Affiliation can be overridden by simply changing each NPC's team number via keyvalue or input.
  • Add HL2MP bullet FX fixes for NPCs and other entities — Fixes bullet FX inconsistencies in HL2MP due to HL2MP doing bullet FX on the client. To do this, bullet FX is done serverside when fired by NPCs (with a new mp_use_server_bulletfx cvar to extend this) and NPCs themselves network blood and limited relationship data.
  • Allow HL2MP gamerules to derive from HL2 gamerules + add basic integrated HL2MP co-op support — Allows HL2MP gamerules to fall back to SP HL2 gamerules functions and use SP ammo type data (which is identical except SP has more ammo types and allows configuration via cvars). Also adds support for integrated co-op mode via the mp_coop cvar, which influences player spawn positions and whether items respawn. The previously unused hl2mp_gamerules proxy is also now connected to hl2_gamerules and controls whether to allow the default suit or weapons (the functionality of this was added in a previous PR).
  • Add support for NPC death notices and target IDs — Adds optional death notices for when NPCs die or when NPCs kill players, controlled by sv_hl2mp_npc_deathnotice_as_victim and sv_hl2mp_npc_deathnotice_as_killer respectively. Enabled by default.
  • Add SP changes to HL2MP gravity gun + clientside +USE prediction — Adds Mapbase params, limited support for ragdoll pickup/mega physcannon, etc. to the gravity gun as well as clientside +USE prediction for player pickup and entities like func_tank.
  • Add npc_citizen MP squad support — Adds support for multiplayer squads to npc_citizen. If player_squad_mp_shared is enabled, then citizen squadmates will be shared between all players. If it is disabled, then each player will have their own commandable squad, with citizens joining the first one that approaches them. The cvar is disabled by default.
  • Add HL2MP player collision avoidance + ally blood decal fix — Adds TF2-style player teammate avoidance (i.e. walking through teammates and being pushed away, rather than just colliding with them) controlled via hl2mp_avoidteammates, and fixes player teammates showing blood decals when attacking them.
  • Fix NPC footstep sounds in HL2MP — Fixes NPCs not emitting footstep sounds in HL2MP.
  • Nextbots sense weapon sounds from traditional NPCs — Allows nextbots to sense NPC weapon firing in the same way they sense it from players.

PR Checklist

  • My PR follows all guidelines in the CONTRIBUTING.md file
  • My PR targets a develop branch OR targets another branch with a specific goal in mind

@BlixibonBlixibon changed the title [HL2MP] [HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL featuresAug 27, 2025
@Blixibon
Blixibonforce-pushed the mapbase/mp-2025/expanded-npc-and-mapbase-support branch from 5a54a04 to 3d5212cCompareAugust 27, 2025 20:20
@Blixibon
Blixibonforce-pushed the mapbase/mp-2025/expanded-npc-and-mapbase-support branch from 3d5212c to 06fa2daCompareAugust 27, 2025 20:47
@Blixibon
Blixibon marked this pull request as ready for review August 28, 2025 03:08
@Blixibon
Blixibon requested a review from arbabfAugust 28, 2025 03:08

@arbabfarbabf left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Took a look at these, they all look good to me.

@Blixibon
Blixibon merged commit 5745fd1 into mapbase-source:mapbase-mp-2025Mar 10, 2026
4 checks passed
@Blixibon
Blixibon deleted the mapbase/mp-2025/expanded-npc-and-mapbase-support branch March 10, 2026 14:47
Bitl added a commit to BitlDevelopmentStudios/source-sdk-2013 that referenced this pull request May 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Blixibon@arbabf
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL features - #465

Merged
Blixibon merged 14 commits into
mapbase-source:mapbase-mp-2025from
Blixibon:mapbase/mp-2025/expanded-npc-and-mapbase-support
Mar 10, 2026
Merged

[HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL features#465
Blixibon merged 14 commits into
mapbase-source:mapbase-mp-2025from
Blixibon:mapbase/mp-2025/expanded-npc-and-mapbase-support

Conversation

@Blixibon

@BlixibonBlixibon commented Aug 27, 2025

Copy link
Copy Markdown
Member

This PR contains assorted overlapping changes under the general categories of more stable and consistent NPC support in HL2DM, the integration of Mapbase's SP features into HL2DM, and general QOL features for HL2DM.

This is built off of and supersedes #459. Recommend reviewing individual commits rather than the entire diff.


What each commit does

This list describes each commit in this PR:

  • Add NPC, clientside activity, and Mapbase param support to HL2MP weapons — Adds NPC support, clientside activity lists, and Mapbase weapon parameters to HL2MP weapons. This was mainly a copy-paste job from their singleplayer HL2 counterparts, and any code that wasn't specific to Mapbase is not gated within #ifdef MAPBASE (e.g. general existing NPC support), while Mapbase-specific code within this PR or within the singleplayer weapons do use the #ifdef.
  • Add support for Mapbase anim state to HL2MP — Replaces HL2MP's anim state with Mapbase's anim state originally designed for singleplayer. Note that the #ifdef preprocessor is still named SP_ANIM_STATE.
  • Add automatic protagonist support to HL2MP player — Adds code to automatically set each player's protagonist based on their model name, as well as optional support for direct protagonist selection via sv_hl2mp_protagonist_select (thus allowing players to select any model defined by the scripts, including characters like Gordon). Assigning each player to a protagonist allows the use of c_arms and other parameters.
  • Allow HL2MP player to use response system for death sound instead of hardcoded soundscripts — Uses a response for the death sound rather than predefined soundscript arrays. This allows more flexibility in death sounds and makes it easier to integrate additional playermodels (such as those provided by direct protagonist selection).
  • Add HL2MP player resource override with NPC net names and idle bots in scoreboard — Adds a HL2MP-specific player resource override. For context, the "player resource" is a global entity that networks important player data for the scoreboard and beyond. MP games are capable of overriding the default player resource to add their own data, but HL2MP does not do this. Its only game-specific change (team colors) is done through an #ifdef in the base player resource (by contrast, TF2 assigns team colors in its own override). This commit adds a HL2MP-specific player resource for both general utility in derived mods as well as for two features:
    • Reflecting players controlled by idle bots, building off of the previous PR for bot possession.
    • Keeping track of and optimizing NPC net names so that every NPC isn't independently networking the same strings. In this case, it effectively doubles as an NPC resource.
  • Add NPC team-based relationships — Automatically assigns HL2 NPCs to teams that correspond to them in HL2MP, and then factors teams into their relationships. This means rebels and Combine forces will attack or support players on their respective teams in Team Deathmatch. Affiliation can be overridden by simply changing each NPC's team number via keyvalue or input.
  • Add HL2MP bullet FX fixes for NPCs and other entities — Fixes bullet FX inconsistencies in HL2MP due to HL2MP doing bullet FX on the client. To do this, bullet FX is done serverside when fired by NPCs (with a new mp_use_server_bulletfx cvar to extend this) and NPCs themselves network blood and limited relationship data.
  • Allow HL2MP gamerules to derive from HL2 gamerules + add basic integrated HL2MP co-op support — Allows HL2MP gamerules to fall back to SP HL2 gamerules functions and use SP ammo type data (which is identical except SP has more ammo types and allows configuration via cvars). Also adds support for integrated co-op mode via the mp_coop cvar, which influences player spawn positions and whether items respawn. The previously unused hl2mp_gamerules proxy is also now connected to hl2_gamerules and controls whether to allow the default suit or weapons (the functionality of this was added in a previous PR).
  • Add support for NPC death notices and target IDs — Adds optional death notices for when NPCs die or when NPCs kill players, controlled by sv_hl2mp_npc_deathnotice_as_victim and sv_hl2mp_npc_deathnotice_as_killer respectively. Enabled by default.
  • Add SP changes to HL2MP gravity gun + clientside +USE prediction — Adds Mapbase params, limited support for ragdoll pickup/mega physcannon, etc. to the gravity gun as well as clientside +USE prediction for player pickup and entities like func_tank.
  • Add npc_citizen MP squad support — Adds support for multiplayer squads to npc_citizen. If player_squad_mp_shared is enabled, then citizen squadmates will be shared between all players. If it is disabled, then each player will have their own commandable squad, with citizens joining the first one that approaches them. The cvar is disabled by default.
  • Add HL2MP player collision avoidance + ally blood decal fix — Adds TF2-style player teammate avoidance (i.e. walking through teammates and being pushed away, rather than just colliding with them) controlled via hl2mp_avoidteammates, and fixes player teammates showing blood decals when attacking them.
  • Fix NPC footstep sounds in HL2MP — Fixes NPCs not emitting footstep sounds in HL2MP.
  • Nextbots sense weapon sounds from traditional NPCs — Allows nextbots to sense NPC weapon firing in the same way they sense it from players.

PR Checklist

  • My PR follows all guidelines in the CONTRIBUTING.md file
  • My PR targets a develop branch OR targets another branch with a specific goal in mind

@BlixibonBlixibon changed the title [HL2MP] [HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL featuresAug 27, 2025
@Blixibon
Blixibonforce-pushed the mapbase/mp-2025/expanded-npc-and-mapbase-support branch from 5a54a04 to 3d5212cCompareAugust 27, 2025 20:20
@Blixibon
Blixibonforce-pushed the mapbase/mp-2025/expanded-npc-and-mapbase-support branch from 3d5212c to 06fa2daCompareAugust 27, 2025 20:47
@Blixibon
Blixibon marked this pull request as ready for review August 28, 2025 03:08
@Blixibon
Blixibon requested a review from arbabfAugust 28, 2025 03:08

@arbabfarbabf left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Took a look at these, they all look good to me.

@Blixibon
Blixibon merged commit 5745fd1 into mapbase-source:mapbase-mp-2025Mar 10, 2026
4 checks passed
@Blixibon
Blixibon deleted the mapbase/mp-2025/expanded-npc-and-mapbase-support branch March 10, 2026 14:47
Bitl added a commit to BitlDevelopmentStudios/source-sdk-2013 that referenced this pull request May 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Blixibon@arbabf
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL features - #465

Merged
Blixibon merged 14 commits into
mapbase-source:mapbase-mp-2025from
Blixibon:mapbase/mp-2025/expanded-npc-and-mapbase-support
Mar 10, 2026
Merged

[HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL features#465
Blixibon merged 14 commits into
mapbase-source:mapbase-mp-2025from
Blixibon:mapbase/mp-2025/expanded-npc-and-mapbase-support

Conversation

@Blixibon

@BlixibonBlixibon commented Aug 27, 2025

Copy link
Copy Markdown
Member

This PR contains assorted overlapping changes under the general categories of more stable and consistent NPC support in HL2DM, the integration of Mapbase's SP features into HL2DM, and general QOL features for HL2DM.

This is built off of and supersedes #459. Recommend reviewing individual commits rather than the entire diff.


What each commit does

This list describes each commit in this PR:

  • Add NPC, clientside activity, and Mapbase param support to HL2MP weapons — Adds NPC support, clientside activity lists, and Mapbase weapon parameters to HL2MP weapons. This was mainly a copy-paste job from their singleplayer HL2 counterparts, and any code that wasn't specific to Mapbase is not gated within #ifdef MAPBASE (e.g. general existing NPC support), while Mapbase-specific code within this PR or within the singleplayer weapons do use the #ifdef.
  • Add support for Mapbase anim state to HL2MP — Replaces HL2MP's anim state with Mapbase's anim state originally designed for singleplayer. Note that the #ifdef preprocessor is still named SP_ANIM_STATE.
  • Add automatic protagonist support to HL2MP player — Adds code to automatically set each player's protagonist based on their model name, as well as optional support for direct protagonist selection via sv_hl2mp_protagonist_select (thus allowing players to select any model defined by the scripts, including characters like Gordon). Assigning each player to a protagonist allows the use of c_arms and other parameters.
  • Allow HL2MP player to use response system for death sound instead of hardcoded soundscripts — Uses a response for the death sound rather than predefined soundscript arrays. This allows more flexibility in death sounds and makes it easier to integrate additional playermodels (such as those provided by direct protagonist selection).
  • Add HL2MP player resource override with NPC net names and idle bots in scoreboard — Adds a HL2MP-specific player resource override. For context, the "player resource" is a global entity that networks important player data for the scoreboard and beyond. MP games are capable of overriding the default player resource to add their own data, but HL2MP does not do this. Its only game-specific change (team colors) is done through an #ifdef in the base player resource (by contrast, TF2 assigns team colors in its own override). This commit adds a HL2MP-specific player resource for both general utility in derived mods as well as for two features:
    • Reflecting players controlled by idle bots, building off of the previous PR for bot possession.
    • Keeping track of and optimizing NPC net names so that every NPC isn't independently networking the same strings. In this case, it effectively doubles as an NPC resource.
  • Add NPC team-based relationships — Automatically assigns HL2 NPCs to teams that correspond to them in HL2MP, and then factors teams into their relationships. This means rebels and Combine forces will attack or support players on their respective teams in Team Deathmatch. Affiliation can be overridden by simply changing each NPC's team number via keyvalue or input.
  • Add HL2MP bullet FX fixes for NPCs and other entities — Fixes bullet FX inconsistencies in HL2MP due to HL2MP doing bullet FX on the client. To do this, bullet FX is done serverside when fired by NPCs (with a new mp_use_server_bulletfx cvar to extend this) and NPCs themselves network blood and limited relationship data.
  • Allow HL2MP gamerules to derive from HL2 gamerules + add basic integrated HL2MP co-op support — Allows HL2MP gamerules to fall back to SP HL2 gamerules functions and use SP ammo type data (which is identical except SP has more ammo types and allows configuration via cvars). Also adds support for integrated co-op mode via the mp_coop cvar, which influences player spawn positions and whether items respawn. The previously unused hl2mp_gamerules proxy is also now connected to hl2_gamerules and controls whether to allow the default suit or weapons (the functionality of this was added in a previous PR).
  • Add support for NPC death notices and target IDs — Adds optional death notices for when NPCs die or when NPCs kill players, controlled by sv_hl2mp_npc_deathnotice_as_victim and sv_hl2mp_npc_deathnotice_as_killer respectively. Enabled by default.
  • Add SP changes to HL2MP gravity gun + clientside +USE prediction — Adds Mapbase params, limited support for ragdoll pickup/mega physcannon, etc. to the gravity gun as well as clientside +USE prediction for player pickup and entities like func_tank.
  • Add npc_citizen MP squad support — Adds support for multiplayer squads to npc_citizen. If player_squad_mp_shared is enabled, then citizen squadmates will be shared between all players. If it is disabled, then each player will have their own commandable squad, with citizens joining the first one that approaches them. The cvar is disabled by default.
  • Add HL2MP player collision avoidance + ally blood decal fix — Adds TF2-style player teammate avoidance (i.e. walking through teammates and being pushed away, rather than just colliding with them) controlled via hl2mp_avoidteammates, and fixes player teammates showing blood decals when attacking them.
  • Fix NPC footstep sounds in HL2MP — Fixes NPCs not emitting footstep sounds in HL2MP.
  • Nextbots sense weapon sounds from traditional NPCs — Allows nextbots to sense NPC weapon firing in the same way they sense it from players.

PR Checklist

  • My PR follows all guidelines in the CONTRIBUTING.md file
  • My PR targets a develop branch OR targets another branch with a specific goal in mind

@BlixibonBlixibon changed the title [HL2MP] [HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL featuresAug 27, 2025
@Blixibon
Blixibonforce-pushed the mapbase/mp-2025/expanded-npc-and-mapbase-support branch from 5a54a04 to 3d5212cCompareAugust 27, 2025 20:20
@Blixibon
Blixibonforce-pushed the mapbase/mp-2025/expanded-npc-and-mapbase-support branch from 3d5212c to 06fa2daCompareAugust 27, 2025 20:47
@Blixibon
Blixibon marked this pull request as ready for review August 28, 2025 03:08
@Blixibon
Blixibon requested a review from arbabfAugust 28, 2025 03:08

@arbabfarbabf left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Took a look at these, they all look good to me.

@Blixibon
Blixibon merged commit 5745fd1 into mapbase-source:mapbase-mp-2025Mar 10, 2026
4 checks passed
@Blixibon
Blixibon deleted the mapbase/mp-2025/expanded-npc-and-mapbase-support branch March 10, 2026 14:47
Bitl added a commit to BitlDevelopmentStudios/source-sdk-2013 that referenced this pull request May 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Blixibon@arbabf
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL features - #465

Merged
Blixibon merged 14 commits into
mapbase-source:mapbase-mp-2025from
Blixibon:mapbase/mp-2025/expanded-npc-and-mapbase-support
Mar 10, 2026
Merged

[HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL features#465
Blixibon merged 14 commits into
mapbase-source:mapbase-mp-2025from
Blixibon:mapbase/mp-2025/expanded-npc-and-mapbase-support

Conversation

@Blixibon

@BlixibonBlixibon commented Aug 27, 2025

Copy link
Copy Markdown
Member

This PR contains assorted overlapping changes under the general categories of more stable and consistent NPC support in HL2DM, the integration of Mapbase's SP features into HL2DM, and general QOL features for HL2DM.

This is built off of and supersedes #459. Recommend reviewing individual commits rather than the entire diff.


What each commit does

This list describes each commit in this PR:

  • Add NPC, clientside activity, and Mapbase param support to HL2MP weapons — Adds NPC support, clientside activity lists, and Mapbase weapon parameters to HL2MP weapons. This was mainly a copy-paste job from their singleplayer HL2 counterparts, and any code that wasn't specific to Mapbase is not gated within #ifdef MAPBASE (e.g. general existing NPC support), while Mapbase-specific code within this PR or within the singleplayer weapons do use the #ifdef.
  • Add support for Mapbase anim state to HL2MP — Replaces HL2MP's anim state with Mapbase's anim state originally designed for singleplayer. Note that the #ifdef preprocessor is still named SP_ANIM_STATE.
  • Add automatic protagonist support to HL2MP player — Adds code to automatically set each player's protagonist based on their model name, as well as optional support for direct protagonist selection via sv_hl2mp_protagonist_select (thus allowing players to select any model defined by the scripts, including characters like Gordon). Assigning each player to a protagonist allows the use of c_arms and other parameters.
  • Allow HL2MP player to use response system for death sound instead of hardcoded soundscripts — Uses a response for the death sound rather than predefined soundscript arrays. This allows more flexibility in death sounds and makes it easier to integrate additional playermodels (such as those provided by direct protagonist selection).
  • Add HL2MP player resource override with NPC net names and idle bots in scoreboard — Adds a HL2MP-specific player resource override. For context, the "player resource" is a global entity that networks important player data for the scoreboard and beyond. MP games are capable of overriding the default player resource to add their own data, but HL2MP does not do this. Its only game-specific change (team colors) is done through an #ifdef in the base player resource (by contrast, TF2 assigns team colors in its own override). This commit adds a HL2MP-specific player resource for both general utility in derived mods as well as for two features:
    • Reflecting players controlled by idle bots, building off of the previous PR for bot possession.
    • Keeping track of and optimizing NPC net names so that every NPC isn't independently networking the same strings. In this case, it effectively doubles as an NPC resource.
  • Add NPC team-based relationships — Automatically assigns HL2 NPCs to teams that correspond to them in HL2MP, and then factors teams into their relationships. This means rebels and Combine forces will attack or support players on their respective teams in Team Deathmatch. Affiliation can be overridden by simply changing each NPC's team number via keyvalue or input.
  • Add HL2MP bullet FX fixes for NPCs and other entities — Fixes bullet FX inconsistencies in HL2MP due to HL2MP doing bullet FX on the client. To do this, bullet FX is done serverside when fired by NPCs (with a new mp_use_server_bulletfx cvar to extend this) and NPCs themselves network blood and limited relationship data.
  • Allow HL2MP gamerules to derive from HL2 gamerules + add basic integrated HL2MP co-op support — Allows HL2MP gamerules to fall back to SP HL2 gamerules functions and use SP ammo type data (which is identical except SP has more ammo types and allows configuration via cvars). Also adds support for integrated co-op mode via the mp_coop cvar, which influences player spawn positions and whether items respawn. The previously unused hl2mp_gamerules proxy is also now connected to hl2_gamerules and controls whether to allow the default suit or weapons (the functionality of this was added in a previous PR).
  • Add support for NPC death notices and target IDs — Adds optional death notices for when NPCs die or when NPCs kill players, controlled by sv_hl2mp_npc_deathnotice_as_victim and sv_hl2mp_npc_deathnotice_as_killer respectively. Enabled by default.
  • Add SP changes to HL2MP gravity gun + clientside +USE prediction — Adds Mapbase params, limited support for ragdoll pickup/mega physcannon, etc. to the gravity gun as well as clientside +USE prediction for player pickup and entities like func_tank.
  • Add npc_citizen MP squad support — Adds support for multiplayer squads to npc_citizen. If player_squad_mp_shared is enabled, then citizen squadmates will be shared between all players. If it is disabled, then each player will have their own commandable squad, with citizens joining the first one that approaches them. The cvar is disabled by default.
  • Add HL2MP player collision avoidance + ally blood decal fix — Adds TF2-style player teammate avoidance (i.e. walking through teammates and being pushed away, rather than just colliding with them) controlled via hl2mp_avoidteammates, and fixes player teammates showing blood decals when attacking them.
  • Fix NPC footstep sounds in HL2MP — Fixes NPCs not emitting footstep sounds in HL2MP.
  • Nextbots sense weapon sounds from traditional NPCs — Allows nextbots to sense NPC weapon firing in the same way they sense it from players.

PR Checklist

  • My PR follows all guidelines in the CONTRIBUTING.md file
  • My PR targets a develop branch OR targets another branch with a specific goal in mind

@BlixibonBlixibon changed the title [HL2MP] [HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL featuresAug 27, 2025
@Blixibon
Blixibonforce-pushed the mapbase/mp-2025/expanded-npc-and-mapbase-support branch from 5a54a04 to 3d5212cCompareAugust 27, 2025 20:20
@Blixibon
Blixibonforce-pushed the mapbase/mp-2025/expanded-npc-and-mapbase-support branch from 3d5212c to 06fa2daCompareAugust 27, 2025 20:47
@Blixibon
Blixibon marked this pull request as ready for review August 28, 2025 03:08
@Blixibon
Blixibon requested a review from arbabfAugust 28, 2025 03:08

@arbabfarbabf left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Took a look at these, they all look good to me.

@Blixibon
Blixibon merged commit 5745fd1 into mapbase-source:mapbase-mp-2025Mar 10, 2026
4 checks passed
@Blixibon
Blixibon deleted the mapbase/mp-2025/expanded-npc-and-mapbase-support branch March 10, 2026 14:47
Bitl added a commit to BitlDevelopmentStudios/source-sdk-2013 that referenced this pull request May 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Blixibon@arbabf
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL features - #465

Merged
Blixibon merged 14 commits into
mapbase-source:mapbase-mp-2025from
Blixibon:mapbase/mp-2025/expanded-npc-and-mapbase-support
Mar 10, 2026
Merged

[HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL features#465
Blixibon merged 14 commits into
mapbase-source:mapbase-mp-2025from
Blixibon:mapbase/mp-2025/expanded-npc-and-mapbase-support

Conversation

@Blixibon

@BlixibonBlixibon commented Aug 27, 2025

Copy link
Copy Markdown
Member

This PR contains assorted overlapping changes under the general categories of more stable and consistent NPC support in HL2DM, the integration of Mapbase's SP features into HL2DM, and general QOL features for HL2DM.

This is built off of and supersedes #459. Recommend reviewing individual commits rather than the entire diff.


What each commit does

This list describes each commit in this PR:

  • Add NPC, clientside activity, and Mapbase param support to HL2MP weapons — Adds NPC support, clientside activity lists, and Mapbase weapon parameters to HL2MP weapons. This was mainly a copy-paste job from their singleplayer HL2 counterparts, and any code that wasn't specific to Mapbase is not gated within #ifdef MAPBASE (e.g. general existing NPC support), while Mapbase-specific code within this PR or within the singleplayer weapons do use the #ifdef.
  • Add support for Mapbase anim state to HL2MP — Replaces HL2MP's anim state with Mapbase's anim state originally designed for singleplayer. Note that the #ifdef preprocessor is still named SP_ANIM_STATE.
  • Add automatic protagonist support to HL2MP player — Adds code to automatically set each player's protagonist based on their model name, as well as optional support for direct protagonist selection via sv_hl2mp_protagonist_select (thus allowing players to select any model defined by the scripts, including characters like Gordon). Assigning each player to a protagonist allows the use of c_arms and other parameters.
  • Allow HL2MP player to use response system for death sound instead of hardcoded soundscripts — Uses a response for the death sound rather than predefined soundscript arrays. This allows more flexibility in death sounds and makes it easier to integrate additional playermodels (such as those provided by direct protagonist selection).
  • Add HL2MP player resource override with NPC net names and idle bots in scoreboard — Adds a HL2MP-specific player resource override. For context, the "player resource" is a global entity that networks important player data for the scoreboard and beyond. MP games are capable of overriding the default player resource to add their own data, but HL2MP does not do this. Its only game-specific change (team colors) is done through an #ifdef in the base player resource (by contrast, TF2 assigns team colors in its own override). This commit adds a HL2MP-specific player resource for both general utility in derived mods as well as for two features:
    • Reflecting players controlled by idle bots, building off of the previous PR for bot possession.
    • Keeping track of and optimizing NPC net names so that every NPC isn't independently networking the same strings. In this case, it effectively doubles as an NPC resource.
  • Add NPC team-based relationships — Automatically assigns HL2 NPCs to teams that correspond to them in HL2MP, and then factors teams into their relationships. This means rebels and Combine forces will attack or support players on their respective teams in Team Deathmatch. Affiliation can be overridden by simply changing each NPC's team number via keyvalue or input.
  • Add HL2MP bullet FX fixes for NPCs and other entities — Fixes bullet FX inconsistencies in HL2MP due to HL2MP doing bullet FX on the client. To do this, bullet FX is done serverside when fired by NPCs (with a new mp_use_server_bulletfx cvar to extend this) and NPCs themselves network blood and limited relationship data.
  • Allow HL2MP gamerules to derive from HL2 gamerules + add basic integrated HL2MP co-op support — Allows HL2MP gamerules to fall back to SP HL2 gamerules functions and use SP ammo type data (which is identical except SP has more ammo types and allows configuration via cvars). Also adds support for integrated co-op mode via the mp_coop cvar, which influences player spawn positions and whether items respawn. The previously unused hl2mp_gamerules proxy is also now connected to hl2_gamerules and controls whether to allow the default suit or weapons (the functionality of this was added in a previous PR).
  • Add support for NPC death notices and target IDs — Adds optional death notices for when NPCs die or when NPCs kill players, controlled by sv_hl2mp_npc_deathnotice_as_victim and sv_hl2mp_npc_deathnotice_as_killer respectively. Enabled by default.
  • Add SP changes to HL2MP gravity gun + clientside +USE prediction — Adds Mapbase params, limited support for ragdoll pickup/mega physcannon, etc. to the gravity gun as well as clientside +USE prediction for player pickup and entities like func_tank.
  • Add npc_citizen MP squad support — Adds support for multiplayer squads to npc_citizen. If player_squad_mp_shared is enabled, then citizen squadmates will be shared between all players. If it is disabled, then each player will have their own commandable squad, with citizens joining the first one that approaches them. The cvar is disabled by default.
  • Add HL2MP player collision avoidance + ally blood decal fix — Adds TF2-style player teammate avoidance (i.e. walking through teammates and being pushed away, rather than just colliding with them) controlled via hl2mp_avoidteammates, and fixes player teammates showing blood decals when attacking them.
  • Fix NPC footstep sounds in HL2MP — Fixes NPCs not emitting footstep sounds in HL2MP.
  • Nextbots sense weapon sounds from traditional NPCs — Allows nextbots to sense NPC weapon firing in the same way they sense it from players.

PR Checklist

  • My PR follows all guidelines in the CONTRIBUTING.md file
  • My PR targets a develop branch OR targets another branch with a specific goal in mind

@BlixibonBlixibon changed the title [HL2MP] [HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL featuresAug 27, 2025
@Blixibon
Blixibonforce-pushed the mapbase/mp-2025/expanded-npc-and-mapbase-support branch from 5a54a04 to 3d5212cCompareAugust 27, 2025 20:20
@Blixibon
Blixibonforce-pushed the mapbase/mp-2025/expanded-npc-and-mapbase-support branch from 3d5212c to 06fa2daCompareAugust 27, 2025 20:47
@Blixibon
Blixibon marked this pull request as ready for review August 28, 2025 03:08
@Blixibon
Blixibon requested a review from arbabfAugust 28, 2025 03:08

@arbabfarbabf left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Took a look at these, they all look good to me.

@Blixibon
Blixibon merged commit 5745fd1 into mapbase-source:mapbase-mp-2025Mar 10, 2026
4 checks passed
@Blixibon
Blixibon deleted the mapbase/mp-2025/expanded-npc-and-mapbase-support branch March 10, 2026 14:47
Bitl added a commit to BitlDevelopmentStudios/source-sdk-2013 that referenced this pull request May 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Blixibon@arbabf
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL features - #465

Merged
Blixibon merged 14 commits into
mapbase-source:mapbase-mp-2025from
Blixibon:mapbase/mp-2025/expanded-npc-and-mapbase-support
Mar 10, 2026
Merged

[HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL features#465
Blixibon merged 14 commits into
mapbase-source:mapbase-mp-2025from
Blixibon:mapbase/mp-2025/expanded-npc-and-mapbase-support

Conversation

@Blixibon

@BlixibonBlixibon commented Aug 27, 2025

Copy link
Copy Markdown
Member

This PR contains assorted overlapping changes under the general categories of more stable and consistent NPC support in HL2DM, the integration of Mapbase's SP features into HL2DM, and general QOL features for HL2DM.

This is built off of and supersedes #459. Recommend reviewing individual commits rather than the entire diff.


What each commit does

This list describes each commit in this PR:

  • Add NPC, clientside activity, and Mapbase param support to HL2MP weapons — Adds NPC support, clientside activity lists, and Mapbase weapon parameters to HL2MP weapons. This was mainly a copy-paste job from their singleplayer HL2 counterparts, and any code that wasn't specific to Mapbase is not gated within #ifdef MAPBASE (e.g. general existing NPC support), while Mapbase-specific code within this PR or within the singleplayer weapons do use the #ifdef.
  • Add support for Mapbase anim state to HL2MP — Replaces HL2MP's anim state with Mapbase's anim state originally designed for singleplayer. Note that the #ifdef preprocessor is still named SP_ANIM_STATE.
  • Add automatic protagonist support to HL2MP player — Adds code to automatically set each player's protagonist based on their model name, as well as optional support for direct protagonist selection via sv_hl2mp_protagonist_select (thus allowing players to select any model defined by the scripts, including characters like Gordon). Assigning each player to a protagonist allows the use of c_arms and other parameters.
  • Allow HL2MP player to use response system for death sound instead of hardcoded soundscripts — Uses a response for the death sound rather than predefined soundscript arrays. This allows more flexibility in death sounds and makes it easier to integrate additional playermodels (such as those provided by direct protagonist selection).
  • Add HL2MP player resource override with NPC net names and idle bots in scoreboard — Adds a HL2MP-specific player resource override. For context, the "player resource" is a global entity that networks important player data for the scoreboard and beyond. MP games are capable of overriding the default player resource to add their own data, but HL2MP does not do this. Its only game-specific change (team colors) is done through an #ifdef in the base player resource (by contrast, TF2 assigns team colors in its own override). This commit adds a HL2MP-specific player resource for both general utility in derived mods as well as for two features:
    • Reflecting players controlled by idle bots, building off of the previous PR for bot possession.
    • Keeping track of and optimizing NPC net names so that every NPC isn't independently networking the same strings. In this case, it effectively doubles as an NPC resource.
  • Add NPC team-based relationships — Automatically assigns HL2 NPCs to teams that correspond to them in HL2MP, and then factors teams into their relationships. This means rebels and Combine forces will attack or support players on their respective teams in Team Deathmatch. Affiliation can be overridden by simply changing each NPC's team number via keyvalue or input.
  • Add HL2MP bullet FX fixes for NPCs and other entities — Fixes bullet FX inconsistencies in HL2MP due to HL2MP doing bullet FX on the client. To do this, bullet FX is done serverside when fired by NPCs (with a new mp_use_server_bulletfx cvar to extend this) and NPCs themselves network blood and limited relationship data.
  • Allow HL2MP gamerules to derive from HL2 gamerules + add basic integrated HL2MP co-op support — Allows HL2MP gamerules to fall back to SP HL2 gamerules functions and use SP ammo type data (which is identical except SP has more ammo types and allows configuration via cvars). Also adds support for integrated co-op mode via the mp_coop cvar, which influences player spawn positions and whether items respawn. The previously unused hl2mp_gamerules proxy is also now connected to hl2_gamerules and controls whether to allow the default suit or weapons (the functionality of this was added in a previous PR).
  • Add support for NPC death notices and target IDs — Adds optional death notices for when NPCs die or when NPCs kill players, controlled by sv_hl2mp_npc_deathnotice_as_victim and sv_hl2mp_npc_deathnotice_as_killer respectively. Enabled by default.
  • Add SP changes to HL2MP gravity gun + clientside +USE prediction — Adds Mapbase params, limited support for ragdoll pickup/mega physcannon, etc. to the gravity gun as well as clientside +USE prediction for player pickup and entities like func_tank.
  • Add npc_citizen MP squad support — Adds support for multiplayer squads to npc_citizen. If player_squad_mp_shared is enabled, then citizen squadmates will be shared between all players. If it is disabled, then each player will have their own commandable squad, with citizens joining the first one that approaches them. The cvar is disabled by default.
  • Add HL2MP player collision avoidance + ally blood decal fix — Adds TF2-style player teammate avoidance (i.e. walking through teammates and being pushed away, rather than just colliding with them) controlled via hl2mp_avoidteammates, and fixes player teammates showing blood decals when attacking them.
  • Fix NPC footstep sounds in HL2MP — Fixes NPCs not emitting footstep sounds in HL2MP.
  • Nextbots sense weapon sounds from traditional NPCs — Allows nextbots to sense NPC weapon firing in the same way they sense it from players.

PR Checklist

  • My PR follows all guidelines in the CONTRIBUTING.md file
  • My PR targets a develop branch OR targets another branch with a specific goal in mind

@BlixibonBlixibon changed the title [HL2MP] [HL2MP] Assorted changes for NPC support, Mapbase features in HL2DM, and new QOL featuresAug 27, 2025
@Blixibon
Blixibonforce-pushed the mapbase/mp-2025/expanded-npc-and-mapbase-support branch from 5a54a04 to 3d5212cCompareAugust 27, 2025 20:20
@Blixibon
Blixibonforce-pushed the mapbase/mp-2025/expanded-npc-and-mapbase-support branch from 3d5212c to 06fa2daCompareAugust 27, 2025 20:47
@Blixibon
Blixibon marked this pull request as ready for review August 28, 2025 03:08
@Blixibon
Blixibon requested a review from arbabfAugust 28, 2025 03:08

@arbabfarbabf left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Took a look at these, they all look good to me.

@Blixibon
Blixibon merged commit 5745fd1 into mapbase-source:mapbase-mp-2025Mar 10, 2026
4 checks passed
@Blixibon
Blixibon deleted the mapbase/mp-2025/expanded-npc-and-mapbase-support branch March 10, 2026 14:47
Bitl added a commit to BitlDevelopmentStudios/source-sdk-2013 that referenced this pull request May 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Blixibon@arbabf