From 975e6307429576df5ab974592d65bcc4bf65ccc8 Mon Sep 17 00:00:00 2001 From: Blixibon Date: Wed, 27 Aug 2025 11:52:15 -0500 Subject: [PATCH 1/2] Fix NPC-dropped items respawning in HL2MP --- src/game/server/ai_basenpc.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/game/server/ai_basenpc.cpp b/src/game/server/ai_basenpc.cpp index f607c453436..4567f7e6d99 100644 --- a/src/game/server/ai_basenpc.cpp +++ b/src/game/server/ai_basenpc.cpp @@ -12156,6 +12156,19 @@ CBaseEntity *CAI_BaseNPC::DropItem ( const char *pszItemName, Vector vecPos, QAn m_OnItemDrop.Set( pItem, pItem, this ); #endif +#ifdef MAPBASE_MP + // Fixes health vials, grenades, etc. respawning + if (pItem->IsCombatItem()) + { + pItem->AddSpawnFlags( SF_NORESPAWN ); + } + else if (pItem->IsBaseCombatWeapon()) + { + // Adding SF_NORESPAWN directly to weapons causes them to be considered level-placed, which we don't want + pItem->MyCombatWeaponPointer()->Drop( vec3_origin ); + } +#endif + return pItem; } else From d7b6f77380e5fbc95166e4bdc407ca3f2346e722 Mon Sep 17 00:00:00 2001 From: Blixibon Date: Wed, 27 Aug 2025 11:53:23 -0500 Subject: [PATCH 2/2] Fix CItem::ActivateWhenAtRest() conflicting HL2MP FallThink --- src/game/server/item_world.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/game/server/item_world.cpp b/src/game/server/item_world.cpp index 3ef4e77e9a4..969d6d9bb45 100644 --- a/src/game/server/item_world.cpp +++ b/src/game/server/item_world.cpp @@ -248,8 +248,13 @@ void CItem::ActivateWhenAtRest( float flTime /* = 0.5f */ ) { RemoveSolidFlags( FSOLID_TRIGGER ); m_bActivateWhenAtRest = true; +#if defined( HL2MP ) && defined( MAPBASE_MP ) + // HL2 entities (e.g. item_item_crate) often use ActivateWhenAtRest() before spawn, which is overridden by FallThink() in MP + SetContextThink( &CItem::ComeToRest, gpGlobals->curtime + flTime, "ComeToRestThink" ); +#else SetThink( &CItem::ComeToRest ); SetNextThink( gpGlobals->curtime + flTime ); +#endif } @@ -266,8 +271,12 @@ void CItem::OnEntityEvent( EntityEvent_t event, void *pEventData ) { // Delay rest for a sec, to avoid changing collision // properties inside a collision callback. +#if defined( HL2MP ) && defined( MAPBASE_MP ) + SetContextThink( &CItem::ComeToRest, gpGlobals->curtime + 0.1f, "ComeToRestThink" ); +#else SetThink( &CItem::ComeToRest ); SetNextThink( gpGlobals->curtime + 0.1f ); +#endif } break; } @@ -283,7 +292,11 @@ void CItem::ComeToRest( void ) { m_bActivateWhenAtRest = false; AddSolidFlags( FSOLID_TRIGGER ); +#if defined( HL2MP ) && defined( MAPBASE_MP ) + SetContextThink( NULL, TICK_NEVER_THINK, "ComeToRestThink" ); +#else SetThink( NULL ); +#endif } }