diff --git a/src/d_player.h b/src/d_player.h
index db55a99136c45581b1f7fabce385e822583724f3..7ff4ce2a23c9a90d3079f74dd4fec97927335ac6 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 6093d6fd6e92250d0103f3dbd2fa781544bd3101..aa6acdb69d3e734c574bea4af4a7fe64e27c24cf 100644
--- a/src/dehacked.c
+++ b/src/dehacked.c
@@ -9138,7 +9138,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;
 }
 
 //