diff --git a/src/k_kart.c b/src/k_kart.c index b9fff95ba..9b7fde1fe 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3811,7 +3811,7 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I y = source->y + source->momy + FixedMul(finalspeed, FINESINE(an>>ANGLETOFINESHIFT)); z = source->z; // spawn on the ground please - th = P_SpawnMobj(x, y, z, type); + th = P_SpawnMobj(x, y, z, type); // this will never return null because collision isn't processed here K_FlipFromObject(th, source); @@ -3830,7 +3830,10 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I { // floorz and ceilingz aren't properly set to account for FOFs and Polyobjects on spawn // This should set it for FOFs - P_SetOrigin(th, th->x, th->y, th->z); + P_SetOrigin(th, th->x, th->y, th->z); // however, THIS can fuck up your day. just absolutely ruin you. + if (P_MobjWasRemoved(th)) + return NULL; + // spawn on the ground if the player is on the ground if (P_MobjFlip(source) < 0) { @@ -3898,7 +3901,7 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I P_SetTarget(&throwmo->target, source); } - return NULL; + return th; } UINT16 K_DriftSparkColor(player_t *player, INT32 charge) @@ -4705,10 +4708,11 @@ mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, { if (mapthing == MT_BALLHOG) // Messy { + mo = NULL; // can't return multiple projectiles if (dir == -1) { // Shoot backward - mo = K_SpawnKartMissile(player->mo, mapthing, (player->mo->angle + ANGLE_180) - 0x06000000, 0, PROJSPEED/8); + K_SpawnKartMissile(player->mo, mapthing, (player->mo->angle + ANGLE_180) - 0x06000000, 0, PROJSPEED/8); K_SpawnKartMissile(player->mo, mapthing, (player->mo->angle + ANGLE_180) - 0x03000000, 0, PROJSPEED/8); K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180, 0, PROJSPEED/8); K_SpawnKartMissile(player->mo, mapthing, (player->mo->angle + ANGLE_180) + 0x03000000, 0, PROJSPEED/8); @@ -4717,7 +4721,7 @@ mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, else { // Shoot forward - mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle - 0x06000000, 0, PROJSPEED); + K_SpawnKartMissile(player->mo, mapthing, player->mo->angle - 0x06000000, 0, PROJSPEED); K_SpawnKartMissile(player->mo, mapthing, player->mo->angle - 0x03000000, 0, PROJSPEED); K_SpawnKartMissile(player->mo, mapthing, player->mo->angle, 0, PROJSPEED); K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + 0x03000000, 0, PROJSPEED); @@ -5329,6 +5333,9 @@ void K_KillBananaChain(mobj_t *banana, mobj_t *inflictor, mobj_t *source) mobj_t *cachenext; killnext: + if (P_MobjWasRemoved(banana)) + return; + cachenext = banana->hnext; if (banana->health) diff --git a/src/p_map.c b/src/p_map.c index fb79b6677..a0f4e3cfe 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3496,6 +3496,9 @@ void P_SlideMove(mobj_t *mo) vertex_t v1, v2; // fake vertexes line_t junk; // fake linedef + if (P_MobjWasRemoved(mo)) + return; + if (tmhitthing && mo->z + mo->height > tmhitthing->z && mo->z < tmhitthing->z + tmhitthing->height) { // Don't mess with your momentum if it's a pushable object. Pushables do their own crazy things already. diff --git a/src/p_mobj.c b/src/p_mobj.c index 33de100be..ab6b30655 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1689,6 +1689,8 @@ void P_XYMovement(mobj_t *mo) if (mo->flags & MF_SLIDEME) { P_SlideMove(mo); + if (P_MobjWasRemoved(mo)) + return; xmove = ymove = 0; } else