diff --git a/src/p_user.c b/src/p_user.c
index 38f13f8fdf4e73faacc3a80407cbcd3515ca1176..63942e0bede75212eab60cc202289dc57a67ab12 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -12949,11 +12949,18 @@ boolean P_PlayerFullbright(player_t *player)
 			&& player->mo->state < &states[S_PLAY_NIGHTS_TRANS6])))); // Note the < instead of <=
 }
 
+#define JUMPCURLED(player) ((player->pflags & PF_JUMPED)\
+	&& (!(player->charflags & SF_NOJUMPSPIN))\
+	&& (!(player->pflags & PF_NOJUMPDAMAGE)\
+		|| ((player->charflags & SF_NOJUMPDAMAGE)\
+		&& (player->panim == PA_JUMP || player->panim == PA_ROLL))))\
+
 // returns true if the player can enter a sector that they could not if standing at their skin's full height
 boolean P_PlayerCanEnterSpinGaps(player_t *player)
 {
-	return ((player->pflags & (PF_SPINNING|PF_GLIDING))
-		|| (player->charability == CA_GLIDEANDCLIMB && player->mo->state-states == S_PLAY_GLIDE_LANDING));
+	return ((player->pflags & (PF_SPINNING|PF_GLIDING)) // players who are spinning or gliding
+		|| (player->charability == CA_GLIDEANDCLIMB && player->mo->state-states == S_PLAY_GLIDE_LANDING) // players who are landing from a glide
+		|| JUMPCURLED(player)); // players who are jumpcurled, but only if they would normally jump that way
 }
 
 // returns true if the player should use their skin's spinheight instead of their skin's height
@@ -12961,7 +12968,7 @@ boolean P_PlayerShouldUseSpinHeight(player_t *player)
 {
 	return (P_PlayerCanEnterSpinGaps(player)
 		|| (player->mo->state == &states[player->mo->info->painstate])
-		|| ((player->pflags & PF_JUMPED) && !(player->pflags & PF_NOJUMPDAMAGE))
-		|| player->powers[pw_tailsfly]
-		|| (player->charability == CA_FLY && player->mo->state-states == S_PLAY_FLY_TIRED));
+		|| (player->panim == PA_ROLL)
+		|| ((player->powers[pw_tailsfly] || (player->charability == CA_FLY && player->mo->state-states == S_PLAY_FLY_TIRED))
+			&& !(player->charflags & SF_NOJUMPSPIN)));
 }