diff --git a/src/d_player.h b/src/d_player.h
index 3ea48e244007d06e16e0e252f2379db287a266aa..6a2d04129e4eb50163529eea9eabbdc6eb4c33c1 100644
--- a/src/d_player.h
+++ b/src/d_player.h
@@ -278,6 +278,7 @@ typedef enum
 	pw_nights_linkfreeze,
 
 	pw_nocontrol, //for linedef exec 427
+	pw_justlaunched, // Launched off a slope this tic (0=none, 1=standard launch, 2=half-pipe launch)
 
 	NUMPOWERS
 } powertype_t;
diff --git a/src/dehacked.c b/src/dehacked.c
index 5884bdd02da583bb1b02e246b6a3bee9dd7bf254..57d5b2241114de545d773f264a74df4018fc7f9b 100644
--- a/src/dehacked.c
+++ b/src/dehacked.c
@@ -9134,7 +9134,8 @@ static const char *const POWERS_LIST[] = {
 	"NIGHTS_LINKFREEZE",
 
 	//for linedef exec 427
-	"NOCONTROL"
+	"NOCONTROL",
+	"JUSTLAUNCHED",
 };
 
 static const char *const HUDITEMS_LIST[] = {
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 10898f70e79a0bfae8ad69ca2d1e6f9d129c93ad..03ca56aa81e5c4616db73c83d02451b3d12ed168 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -1997,8 +1997,12 @@ void P_XYMovement(mobj_t *mo)
 				{
 					mo->momz = transfermomz;
 					mo->standingslope = NULL;
-					if (player && (player->pflags & PF_SPINNING))
-						player->pflags |= PF_THOKKED;
+					if (player)
+					{
+						player->powers[pw_justlaunched] = 2;
+						if (player->pflags & PF_SPINNING)
+							player->pflags |= PF_THOKKED;
+					}
 				}
 			}
 #endif
@@ -3922,6 +3926,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
 	// Needed for gravity boots
 	P_CheckGravity(mobj, false);
 
+	mobj->player->powers[pw_justlaunched] = 0;
 	if (mobj->momx || mobj->momy)
 	{
 		P_XYMovement(mobj);
diff --git a/src/p_slopes.c b/src/p_slopes.c
index d584bb92d0d27740b5ed140e3333bf1d615d5267..6d5930882652641a9afe08dc255d90449ad2f635 100644
--- a/src/p_slopes.c
+++ b/src/p_slopes.c
@@ -726,6 +726,9 @@ void P_SlopeLaunch(mobj_t *mo)
 
 	//CONS_Printf("Launched off of slope.\n");
 	mo->standingslope = NULL;
+
+	if (mo->player)
+		mo->player->powers[pw_justlaunched] = 1;
 }
 
 //