diff --git a/src/p_inter.c b/src/p_inter.c
index b5cf45c221cac8a301235aed40a894d2b6d83647..b5b192885adac3baea7c240b2af4e102571520cf 100644
--- a/src/p_inter.c
+++ b/src/p_inter.c
@@ -393,16 +393,42 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
 	}
 
 	player = toucher->player;
-	I_Assert(player != NULL); // Only players can touch stuff!
 
-	if (player->spectator)
-		return;
+	if (player)
+	{
+		if (player->spectator)
+			return;
 
-	// Ignore multihits in "ouchie" mode
-	if (special->flags & (MF_ENEMY|MF_BOSS) && special->flags2 & MF2_FRET)
-		return;
+		// Ignore multihits in "ouchie" mode
+		if (special->flags & (MF_ENEMY | MF_BOSS) && special->flags2 & MF2_FRET)
+			return;
+
+		if (LUA_HookTouchSpecial(special, toucher) || P_MobjWasRemoved(special))
+			return;
+	}
+
+	if (special->type == MT_STEAM && (player || (toucher->flags & MF_PUSHABLE)))
+	{
+		fixed_t speed = special->info->mass; // conveniently, both fans and gas jets use this for the vertical thrust
+		SINT8 flipval = P_MobjFlip(special); // virtually everything here centers around the thruster's gravity, not the object's!
 
-	if (LUA_HookTouchSpecial(special, toucher) || P_MobjWasRemoved(special))
+		if (special->state != &states[S_STEAM1]) // Only when it bursts
+			return;
+
+		toucher->eflags |= MFE_SPRUNG;
+		toucher->momz = flipval * FixedMul(speed, FixedSqrt(FixedMul(special->scale, toucher->scale))); // scale the speed with both objects' scales, just like with springs!
+
+		if (player)
+		{
+			P_ResetPlayer(player);
+			if (player->panim != PA_FALL)
+				P_SetMobjState(toucher, S_PLAY_FALL);
+		}
+
+		return; // Don't collect it!
+	}
+
+	if (!player) // Only players can touch stuff!
 		return;
 
 	// 0 = none, 1 = elemental pierce, 2 = bubble bounce
@@ -1879,20 +1905,6 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
 			}
 			return;
 
-		case MT_STEAM: // Steam
-			fixed_t speed = special->info->mass; // conveniently, both fans and gas jets use this for the vertical thrust
-			SINT8 flipval = P_MobjFlip(special); // virtually everything here centers around the thruster's gravity, not the object's!
-
-			if (special->state != &states[S_STEAM1]) // Only when it bursts
-				break;
-
-			toucher->eflags |= MFE_SPRUNG;
-			toucher->momz = flipval * FixedMul(speed, FixedSqrt(FixedMul(special->scale, toucher->scale))); // scale the speed with both objects' scales, just like with springs!
-
-			P_ResetPlayer(player);
-			if (player->panim != PA_FALL)
-				P_SetMobjState(toucher, S_PLAY_FALL);
-			return;
 		default: // SOC or script pickup
 			if (player->bot && player->bot != BOT_MPAI)
 				return;
diff --git a/src/p_map.c b/src/p_map.c
index 820fadbef50a4205fa6501e9ff20e31f4d0e677e..08cade4e60cfdee994e45aa2a9a93a946cf1e32b 100644
--- a/src/p_map.c
+++ b/src/p_map.c
@@ -1468,13 +1468,13 @@ static unsigned PIT_DoCheckThing(mobj_t *thing)
 	}
 
 	// check for special pickup
-	if (thing->flags & MF_SPECIAL && tmthing->player)
+	if (thing->flags & MF_SPECIAL)
 	{
 		P_TouchSpecialThing(thing, tmthing, true); // can remove thing
 		return CHECKTHING_COLLIDE;
 	}
 	// check again for special pickup
-	if (tmthing->flags & MF_SPECIAL && thing->player)
+	if (tmthing->flags & MF_SPECIAL)
 	{
 		P_TouchSpecialThing(tmthing, thing, true); // can remove thing
 		return CHECKTHING_COLLIDE;
@@ -4212,81 +4212,6 @@ void P_RadiusAttack(mobj_t *spot, mobj_t *source, fixed_t damagedist, UINT8 dama
 	P_DoBlockThingsIterate(xl, yl, xh, yh, PIT_RadiusAttack);
 }
 
-//
-// PIT_SteamBurst
-// Scan nearby players and MF2_PUSHABLEs for bursting with steam
-// 'bombsource' is the steam object
-//
-static boolean PIT_SteamBurst(mobj_t *thing)
-{
-	fixed_t dx, dy, dist;
-
-	if (thing == bombsource) // ignore the self
-		return true;
-
-	if (!((thing->player && thing->player->playerstate == PST_LIVE) || (thing->flags & MF_PUSHABLE)))
-		return true;
-
-	dx = abs(thing->x - bombspot->x);
-	dy = abs(thing->y - bombspot->y);
-
-	dist = P_AproxDistance(dx, dy);
-
-	if (dist > thing->radius + bombsource->radius)
-		return true; // out of XY range
-
-	fixed_t zdist;
-	if (bombsource->eflags & MFE_VERTICALFLIP)
-	{
-		if (thing->z > bombsource->z + bombsource->height)
-			return;
-		zdist = (bombsource->z + bombsource->height) - (thing->z + thing->height);
-	}
-	else
-	{
-		if (thing->z + thing->height < bombsource->z)
-			return;
-		zdist = thing->z - bombsource->z;
-	}
-
-	dist -= thing->radius;
-
-	if (dist < 0)
-		dist = 0;
-
-	if (dist >= bombdamage)
-		return true; // out of range
-
-	if (thing->floorz > bombspot->z && bombspot->ceilingz < thing->z)
-		return true;
-
-	if (thing->ceilingz < bombspot->z && bombspot->floorz > thing->z)
-		return true;
-
-	if (!bombsightcheck || P_CheckSight(thing, bombspot))
-	{	// must be in direct path
-		P_DamageMobj(thing, bombspot, bombsource, 1, bombdamagetype); // Tails 01-11-2001
-	}
-
-	return true;
-}
-
-void P_SteamBurst(mobj_t *source, fixed_t checkDist)
-{
-	INT32 xl, xh, yl, yh;
-	fixed_t dist;
-
-	dist = FixedMul(source->radius, source->scale) + MAXRADIUS;
-	yh = (unsigned)(source->y + dist - bmaporgy) >> MAPBLOCKSHIFT;
-	yl = (unsigned)(source->y - dist - bmaporgy) >> MAPBLOCKSHIFT;
-	xh = (unsigned)(source->x + dist - bmaporgx) >> MAPBLOCKSHIFT;
-	xl = (unsigned)(source->x - dist - bmaporgx) >> MAPBLOCKSHIFT;
-
-	BMBOUNDFIX(xl, xh, yl, yh);
-
-	P_DoBlockThingsIterate(xl, yl, xh, yh, PIT_SteamBurst);
-}
-
 //
 // SECTOR HEIGHT CHANGING
 // After modifying a sectors floor or ceiling height,