diff --git a/src/p_inter.c b/src/p_inter.c index b5b192885adac3baea7c240b2af4e102571520cf..ebb26aecc915c10244c9251d9aa679c560ea7284 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -392,6 +392,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) } } + // Ignore multihits in "ouchie" mode + if (special->flags & (MF_ENEMY | MF_BOSS) && special->flags2 & MF2_FRET) + return; + player = toucher->player; if (player) @@ -399,33 +403,33 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (player->spectator) return; - // Ignore multihits in "ouchie" mode - if (special->flags & (MF_ENEMY | MF_BOSS) && special->flags2 & MF2_FRET) - return; - + // Some hooks may assume that the toucher is a player, so we keep it in here. if (LUA_HookTouchSpecial(special, toucher) || P_MobjWasRemoved(special)) return; } - if (special->type == MT_STEAM && (player || (toucher->flags & MF_PUSHABLE))) + if (player || (toucher->flags & MF_PUSHABLE)) // Special area for objects that are interactable by both player AND 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 (special->type == MT_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 - return; + 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! + 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); - } + if (player) + { + P_ResetPlayer(player); + if (player->panim != PA_FALL) + P_SetMobjState(toucher, S_PLAY_FALL); + } - return; // Don't collect it! + return; // Don't collect it! + } } if (!player) // Only players can touch stuff!