diff --git a/src/lua_hook.h b/src/lua_hook.h
index 55f3bb81763d43d0d283548493af7b67be06dcd4..0c79863d62ee63261b204bc004e702a03121c954 100644
--- a/src/lua_hook.h
+++ b/src/lua_hook.h
@@ -116,6 +116,7 @@ int  LUA_HookTouchSpecial(mobj_t *special, mobj_t *toucher);
 int  LUA_HookShouldDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype);
 int  LUA_HookMobjDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype);
 int  LUA_HookMobjDeath(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damagetype);
+int  LUA_HookMobjMoveBlocked(mobj_t *, mobj_t *, line_t *);
 int  LUA_HookBotAI(mobj_t *sonic, mobj_t *tails, ticcmd_t *cmd);
 void LUA_HookLinedefExecute(line_t *, mobj_t *, sector_t *);
 int  LUA_HookPlayerMsg(int source, int target, int flags, char *msg);
diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c
index 1e04621264097ff10bbc9467f501d712bc941067..de5702209523c97728e65ab5deb939aef3c794d3 100644
--- a/src/lua_hooklib.c
+++ b/src/lua_hooklib.c
@@ -713,6 +713,19 @@ int LUA_HookMobjDeath(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 d
 			MOBJ_HOOK(MobjDeath), 4, res_true);
 }
 
+int LUA_HookMobjMoveBlocked(mobj_t *t1, mobj_t *t2, line_t *line)
+{
+	Hook_State hook;
+	if (prepare_mobj_hook(&hook, 0, MOBJ_HOOK(MobjMoveBlocked), t1->type))
+	{
+		LUA_PushUserdata(gL, t1, META_MOBJ);
+		LUA_PushUserdata(gL, t2, META_MOBJ);
+		LUA_PushUserdata(gL, line, META_LINE);
+		call_hooks(&hook, 3, 1, res_true);
+	}
+	return hook.status;
+}
+
 typedef struct {
 	mobj_t   * tails;
 	ticcmd_t * cmd;
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 6e5ccdea4dbeae9a16b1fc1a9cbced5875333955..a1bb2d6ffc617ff4712b2f1cae732fdd6dba42e3 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -1842,7 +1842,7 @@ void P_XYMovement(mobj_t *mo)
 		if (player) 
 			B_MoveBlocked(player);
 
-		if (LUA_HookMobj(mo, MOBJ_HOOK(MobjMoveBlocked)))
+		if (LUA_HookMobjMoveBlocked(mo, tmhitthing, blockingline))
 		{
 			if (P_MobjWasRemoved(mo))
 				return;