diff --git a/src/lua_baselib.c b/src/lua_baselib.c
index 68455cd65e1035ca5319bbf8cc27be2ece13357a..8f6c41e107d1aa094f0b65357744c0f6866493e4 100644
--- a/src/lua_baselib.c
+++ b/src/lua_baselib.c
@@ -957,6 +957,16 @@ static int lib_pZMovement(lua_State *L)
 	return 1;
 }
 
+static int lib_pRingZMovement(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_RingZMovement(actor);
+	return 0;
+}
 
 // P_USER
 ////////////
@@ -3320,6 +3330,7 @@ static luaL_Reg lib[] = {
 	{"P_RingXYMovement",lib_pRingXYMovement},
 	{"P_SceneryXYMovement",lib_pSceneryXYMovement},
 	{"P_ZMovement",lib_pZMovement},
+	{"P_RingZMovement",lib_pRingZMovement},
 
 	// p_user
 	{"P_GetPlayerHeight",lib_pGetPlayerHeight},
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 02b9885b8b3548e3677448c02a9be5c291a476fb..e9ebf571d1c8f1bd3003353ff96489e51fb761ac 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -2270,7 +2270,7 @@ static void P_AdjustMobjFloorZ_PolyObjs(mobj_t *mo, subsector_t *subsec)
 	}
 }
 
-static void P_RingZMovement(mobj_t *mo)
+void P_RingZMovement(mobj_t *mo)
 {
 	I_Assert(mo != NULL);
 	I_Assert(!P_MobjWasRemoved(mo));
diff --git a/src/p_mobj.h b/src/p_mobj.h
index 63095e2ff8c707b0d81a4e9d799db23f73a33b1a..f5c14fde568013cc08ba9e549cdd9bdd670688a7 100644
--- a/src/p_mobj.h
+++ b/src/p_mobj.h
@@ -474,6 +474,7 @@ void P_XYMovement(mobj_t *mo);
 void P_RingXYMovement(mobj_t *mo);
 void P_SceneryXYMovement(mobj_t *mo);
 boolean P_ZMovement(mobj_t *mo);
+void P_RingZMovement(mobj_t *mo);
 void P_EmeraldManager(void);
 
 extern INT32 modulothing;