diff --git a/src/p_maputl.cpp b/src/p_maputl.cpp
index ec8ae181b..7f97adeac 100644
--- a/src/p_maputl.cpp
+++ b/src/p_maputl.cpp
@@ -896,6 +896,74 @@ void FMultiBlockLinesIterator::Reset()
 	startIteratorForGroup(basegroup);
 }
 
+//===========================================================================
+//
+// and the scriptable version
+//
+//===========================================================================
+
+class DBlockLinesIterator : public DObject, public FMultiBlockLinesIterator
+{
+	DECLARE_ABSTRACT_CLASS(DBlockLinesIterator, DObject);
+	FPortalGroupArray check;
+
+public:
+	FMultiBlockLinesIterator::CheckResult cres;
+
+	bool Next()
+	{
+		return FMultiBlockLinesIterator::Next(&cres);
+	}
+
+	DBlockLinesIterator(AActor *actor, double checkradius)
+		: FMultiBlockLinesIterator(check, actor, checkradius)
+	{
+		cres.line = nullptr;
+		cres.Position.Zero();
+		cres.portalflags = 0;
+	}
+
+	DBlockLinesIterator(double x, double y, double z, double height, double radius, sector_t *sec)
+		:FMultiBlockLinesIterator(check, x, y, z, height, radius, sec)
+	{
+		cres.line = nullptr;
+		cres.Position.Zero();
+		cres.portalflags = 0;
+	}
+};
+
+IMPLEMENT_CLASS(DBlockLinesIterator, true, false);
+
+DEFINE_ACTION_FUNCTION(DBlockLinesIterator, Create)
+{
+	PARAM_PROLOGUE;
+	PARAM_OBJECT_NOT_NULL(origin, AActor);
+	PARAM_FLOAT_DEF(radius);
+	ACTION_RETURN_OBJECT(new DBlockLinesIterator(origin, radius));
+}
+
+DEFINE_ACTION_FUNCTION(DBlockLinesIterator, CreateFromPos)
+{
+	PARAM_PROLOGUE;
+	PARAM_FLOAT(x);
+	PARAM_FLOAT(y);
+	PARAM_FLOAT(z);
+	PARAM_FLOAT(h);
+	PARAM_FLOAT(radius);
+	PARAM_POINTER_DEF(sec, sector_t);
+	ACTION_RETURN_OBJECT(new DBlockLinesIterator(x, y, z, h, radius, sec));
+}
+
+DEFINE_ACTION_FUNCTION(DBlockThingsIterator, Next)
+{
+	PARAM_SELF_PROLOGUE(DBlockLinesIterator);
+	ACTION_RETURN_BOOL(self->Next());
+}
+
+DEFINE_FIELD_NAMED(DBlockLinesIterator, cres.line, curline);
+DEFINE_FIELD_NAMED(DBlockLinesIterator, cres.Position, position);
+DEFINE_FIELD_NAMED(DBlockLinesIterator, cres.portalflags, portalflags);
+
 //===========================================================================
 //
 // FBlockThingsIterator :: FBlockThingsIterator
@@ -1231,9 +1299,9 @@ DEFINE_ACTION_FUNCTION(DBlockThingsIterator, CreateFromPos)
 	ACTION_RETURN_OBJECT(new DBlockThingsIterator(x, y, z, h, radius, ignore, nullptr));
 }
 
-DEFINE_ACTION_FUNCTION(DBlockThingsIterator, Next)
+DEFINE_ACTION_FUNCTION(DBlockLinesIterator, Next)
 {
-	PARAM_SELF_PROLOGUE(DBlockThingsIterator);
+	PARAM_SELF_PROLOGUE(DBlockLinesIterator);
 	ACTION_RETURN_BOOL(self->Next());
 }
 
diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt
index ab0760e12..d8cae2ec9 100644
--- a/wadsrc/static/zscript/base.txt
+++ b/wadsrc/static/zscript/base.txt
@@ -357,6 +357,18 @@ class BlockThingsIterator : Object native
 	native bool Next();
 }
 
+class BlockLinesIterator : Object native
+{
+	native Line CurLine;
+	native Vector3 position;
+	native int portalflags;
+	
+	native static BlockThingsIterator Create(Actor origin, double checkradius = -1);
+	native static BlockThingsIterator CreateFromPos(Vector3 pos, double checkh, double checkradius, Sector sec = nullptr;
+	native bool Next();
+}
+
+
 struct DropItem native
 {
 	native readonly DropItem Next;