diff --git a/src/k_kart.c b/src/k_kart.c index e5e8ac4cd..e4459385b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -11388,7 +11388,11 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } break; case KITEM_GARDENTOP: - if (ATTACK_IS_DOWN && NO_HYUDORO) + if (player->curshield == KSHIELD_TOP && K_GetGardenTop(player) == NULL) + { + Obj_GardenTopDeploy(player->mo); + } + else if (ATTACK_IS_DOWN && NO_HYUDORO) { if (player->curshield != KSHIELD_TOP) { diff --git a/src/objects/gardentop.c b/src/objects/gardentop.c index 2e31f6a04..71283a73e 100644 --- a/src/objects/gardentop.c +++ b/src/objects/gardentop.c @@ -411,6 +411,13 @@ anchor_top (mobj_t *top) return; } + /* Rider lost track of this object. */ + if (rider_top(rider) != top) + { + P_RemoveMobj(top); + return; + } + tilt(top); anchor(top, rider, rider->angle, 0); @@ -578,18 +585,18 @@ Obj_GardenTopThrow (player_t *player) should fall off. */ P_SetOrigin(player->mo, player->mo->x, player->mo->y, player->mo->z + height * P_MobjFlip(player->mo)); - - if (player->itemamount > 0) - player->itemamount--; - - if (player->itemamount <= 0) - player->itemtype = KITEM_NONE; - - player->curshield = KSHIELD_NONE; - - player->mo->radius = K_DefaultPlayerRadius(player); } + if (player->itemamount > 0) + player->itemamount--; + + if (player->itemamount <= 0) + player->itemtype = KITEM_NONE; + + player->curshield = KSHIELD_NONE; + + player->mo->radius = K_DefaultPlayerRadius(player); + return top; } diff --git a/src/p_mobj.c b/src/p_mobj.c index 978ca7a0a..670650848 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -11339,13 +11339,21 @@ void P_RemoveMobj(mobj_t *mobj) if (mobj->hnext && !P_MobjWasRemoved(mobj->hnext)) { - P_SetTarget(&mobj->hnext->hprev, mobj->hprev); + if (mobj->hnext->hprev == mobj) + { + P_SetTarget(&mobj->hnext->hprev, mobj->hprev); + } + P_SetTarget(&mobj->hnext, NULL); } if (mobj->hprev && !P_MobjWasRemoved(mobj->hprev)) { - P_SetTarget(&mobj->hprev->hnext, cachenext); + if (mobj->hprev->hnext == mobj) + { + P_SetTarget(&mobj->hprev->hnext, cachenext); + } + P_SetTarget(&mobj->hprev, NULL); } }