diff --git a/src/lua_baselib.c b/src/lua_baselib.c
index c81c1cd0f7af691b8d4ecc2c2261e7467a123de0..ba90912cfd5903fb7e4b8681f8988b5404962029 100644
--- a/src/lua_baselib.c
+++ b/src/lua_baselib.c
@@ -979,6 +979,17 @@ static int lib_pSceneryZMovement(lua_State *L)
 	return 1;
 }
 
+static int lib_pPlayerZMovement(lua_State *L)
+{
+	mobj_t *actor = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
+	NOHUD
+	INLEVEL
+	if (!actor)
+		return LUA_ErrInvalid(L, "mobj_t");
+	P_PlayerZMovement(actor);
+	return 0;
+}
+
 // P_USER
 ////////////
 
@@ -3343,6 +3354,7 @@ static luaL_Reg lib[] = {
 	{"P_ZMovement",lib_pZMovement},
 	{"P_RingZMovement",lib_pRingZMovement},
 	{"P_SceneryZMovement",lib_pSceneryZMovement},
+	{"P_PlayerZMovement",lib_pPlayerZMovement},
 
 	// p_user
 	{"P_GetPlayerHeight",lib_pGetPlayerHeight},
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 84ab1df399302975737ea6f051f5f2e99cf350ab..6f3f53559103b4bc16143d0cc727e53152744f35 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -2891,7 +2891,7 @@ static boolean P_PlayerPolyObjectZMovement(mobj_t *mo)
 	return stopmovecut;
 }
 
-static void P_PlayerZMovement(mobj_t *mo)
+void P_PlayerZMovement(mobj_t *mo)
 {
 	boolean onground;
 
diff --git a/src/p_mobj.h b/src/p_mobj.h
index ab1e1814f3c117366c6dd94082ab99f7287d52e0..643e3d04c0b58d440f426f40aafffbb18e078952 100644
--- a/src/p_mobj.h
+++ b/src/p_mobj.h
@@ -476,6 +476,7 @@ void P_SceneryXYMovement(mobj_t *mo);
 boolean P_ZMovement(mobj_t *mo);
 void P_RingZMovement(mobj_t *mo);
 boolean P_SceneryZMovement(mobj_t *mo);
+void P_PlayerZMovement(mobj_t *mo);
 void P_EmeraldManager(void);
 
 extern INT32 modulothing;