diff --git a/src/k_kart.c b/src/k_kart.c index 9c57c402b..24d76c43c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -17257,6 +17257,7 @@ boolean K_TryPickMeUp(mobj_t *m1, mobj_t *m2, boolean allowHostile) K_AddHitLag(victim, 3, false); + P_UpdateRemovedOrbital(inflictor, victim, victim); P_RemoveMobj(inflictor); return true; } diff --git a/src/p_inter.c b/src/p_inter.c index 01edc21ec..f1c06cc53 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1775,6 +1775,51 @@ boolean P_CheckRacers(void) return false; } +void P_UpdateRemovedOrbital(mobj_t *target, mobj_t *inflictor, mobj_t *source) +{ + // SRB2kart + // I wish I knew a better way to do this + if (!P_MobjWasRemoved(target->target) && target->target->player && !P_MobjWasRemoved(target->target->player->mo)) + { + if ((target->target->player->itemflags & IF_EGGMANOUT) && target->type == MT_EGGMANITEM_SHIELD) + target->target->player->itemflags &= ~IF_EGGMANOUT; + + if (target->target->player->itemflags & IF_ITEMOUT) + { + if ((target->type == MT_BANANA_SHIELD && target->target->player->itemtype == KITEM_BANANA) // trail items + || (target->type == MT_SSMINE_SHIELD && target->target->player->itemtype == KITEM_MINE) + || (target->type == MT_DROPTARGET_SHIELD && target->target->player->itemtype == KITEM_DROPTARGET) + || (target->type == MT_SINK_SHIELD && target->target->player->itemtype == KITEM_KITCHENSINK)) + { + if (target->movedir != 0 && target->movedir < (UINT16)target->target->player->itemamount) + { + if (target->target->hnext && !P_MobjWasRemoved(target->target->hnext)) + K_KillBananaChain(target->target->hnext, inflictor, source); + target->target->player->itemamount = 0; + } + else if (target->target->player->itemamount) + target->target->player->itemamount--; + } + else if ((target->type == MT_ORBINAUT_SHIELD && target->target->player->itemtype == KITEM_ORBINAUT) // orbit items + || (target->type == MT_JAWZ_SHIELD && target->target->player->itemtype == KITEM_JAWZ)) + { + if (target->target->player->itemamount) + target->target->player->itemamount--; + if (target->lastlook != 0) + { + K_RepairOrbitChain(target); + } + } + + if (!target->target->player->itemamount) + target->target->player->itemflags &= ~IF_ITEMOUT; + + if (target->target->hnext == target) + P_SetTarget(&target->target->hnext, NULL); + } + } +} + /** Kills an object. * * \param target The victim. @@ -1826,47 +1871,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget //K_SetHitLagForObjects(target, inflictor, source, MAXHITLAGTICS, true); - // SRB2kart - // I wish I knew a better way to do this - if (!P_MobjWasRemoved(target->target) && target->target->player && !P_MobjWasRemoved(target->target->player->mo)) - { - if ((target->target->player->itemflags & IF_EGGMANOUT) && target->type == MT_EGGMANITEM_SHIELD) - target->target->player->itemflags &= ~IF_EGGMANOUT; - - if (target->target->player->itemflags & IF_ITEMOUT) - { - if ((target->type == MT_BANANA_SHIELD && target->target->player->itemtype == KITEM_BANANA) // trail items - || (target->type == MT_SSMINE_SHIELD && target->target->player->itemtype == KITEM_MINE) - || (target->type == MT_DROPTARGET_SHIELD && target->target->player->itemtype == KITEM_DROPTARGET) - || (target->type == MT_SINK_SHIELD && target->target->player->itemtype == KITEM_KITCHENSINK)) - { - if (target->movedir != 0 && target->movedir < (UINT16)target->target->player->itemamount) - { - if (target->target->hnext && !P_MobjWasRemoved(target->target->hnext)) - K_KillBananaChain(target->target->hnext, inflictor, source); - target->target->player->itemamount = 0; - } - else if (target->target->player->itemamount) - target->target->player->itemamount--; - } - else if ((target->type == MT_ORBINAUT_SHIELD && target->target->player->itemtype == KITEM_ORBINAUT) // orbit items - || (target->type == MT_JAWZ_SHIELD && target->target->player->itemtype == KITEM_JAWZ)) - { - if (target->target->player->itemamount) - target->target->player->itemamount--; - if (target->lastlook != 0) - { - K_RepairOrbitChain(target); - } - } - - if (!target->target->player->itemamount) - target->target->player->itemflags &= ~IF_ITEMOUT; - - if (target->target->hnext == target) - P_SetTarget(&target->target->hnext, NULL); - } - } + P_UpdateRemovedOrbital(target, inflictor, source); // Above block does not clean up rocket sneakers when a player dies, so we need to do it here target->target is null when using rocket sneakers if (target->player) K_DropRocketSneaker(target->player); diff --git a/src/p_local.h b/src/p_local.h index 254529366..8723dca5c 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -69,7 +69,7 @@ typedef enum THINK_MAIN, THINK_MOBJ, // This is kept for backwards compat with old demos. - THINK_DYNSLOPEDEMO, + THINK_DYNSLOPEDEMO, // Lists after this may exist but they do not call an // action in P_RunThinkers @@ -551,6 +551,7 @@ void P_ForceConstant(const BasicFF_t *FFInfo); void P_RampConstant(const BasicFF_t *FFInfo, INT32 Start, INT32 End); void P_SpecialStageDamage(player_t *player, mobj_t *inflictor, mobj_t *source); boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype); +void P_UpdateRemovedOrbital(mobj_t *target, mobj_t *inflictor, mobj_t *source); void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damagetype); void P_FlingBurst(player_t *player, angle_t fa, mobjtype_t objType, tic_t objFuse, fixed_t objScale, INT32 i); void P_PlayerRingBurst(player_t *player, INT32 num_rings); /// \todo better fit in p_user.c