diff --git a/src/doomtype.h b/src/doomtype.h
index 0aa3e23e05b74613b690993450e87b5dad6e800d..4e13ba96d3795bb9992369a48b7aacd27500ea1a 100644
--- a/src/doomtype.h
+++ b/src/doomtype.h
@@ -371,4 +371,12 @@ typedef UINT32 tic_t;
 #define WSTRING2(s) L ## s
 #define WSTRING(s) WSTRING2 (s)
 
+/*
+A hack by Monster Iestyn: Return a pointer to a field of
+a struct from a pointer to another field in the struct.
+Needed for some lua shenanigans.
+*/
+#define FIELDFROM( type, field, have, want ) \
+	(void *)((intptr_t)(field) - offsetof (type, have) + offsetof (type, want))
+
 #endif //__DOOMTYPE__
diff --git a/src/lua_maplib.c b/src/lua_maplib.c
index 12a0be27d0f9e728264816599f232238ea206a06..132c81e484e362b37be4b0a2f278b4ca0278ab3f 100644
--- a/src/lua_maplib.c
+++ b/src/lua_maplib.c
@@ -447,7 +447,7 @@ static int sectorlines_get(lua_State *L)
 	// get the "linecount" by shifting our retrieved memory address of "lines" to where "linecount" is in the sector_t, then dereferencing the result
 	// we need this to determine the array's actual size, and therefore also the maximum value allowed as an index
 	// this only works if seclines is actually a pointer to a sector's lines member in memory, oh boy
-	numoflines = (size_t)(*(size_t *)(((size_t)seclines) - (offsetof(sector_t, lines) - offsetof(sector_t, linecount))));
+	numoflines = *(size_t *)FIELDFROM (sector_t, seclines, lines,/* -> */linecount);
 
 /* OLD HACK
 	// check first linedef to figure which of its sectors owns this sector->lines pointer