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 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 } }