--- src/p_doors.cpp~bak	2019-10-14 06:38:53.000000000 +1100
+++ src/p_doors.cpp	2019-12-12 13:02:46.467483934 +1100
@@ -642,7 +642,7 @@ bool EV_DoDoor (DDoor::EVlDoor type, lin
 					{
 						// [BC] Added !thing, because sometimes thing can be NULL when this function
 						// is called by client_DoDoor.
-						if (!thing || !thing->player)
+						if ( !thing || !thing->player || zadmflags & ZADF_UNBLOCK_DOORS )
 							return false;	// JDC: bad guys never close doors
 
 						door->m_Direction = -1;	// start going down immediately
--- src/doomdef.h~bak	2019-10-14 06:38:53.000000000 +1100
+++ src/doomdef.h	2019-12-12 12:14:45.583238191 +1100
@@ -372,6 +372,11 @@ enum
 	// If unset, players who lose all lives will lose entire inventory
 	// regardless of the DF_COOP_* flags.
 	ZADF_DEAD_PLAYERS_CAN_KEEP_INVENTORY = 1 << 17,
+
+	// If set, stops doors from being manually closed.
+	// This prevents players intentionally (or unintentionally) griefing
+	// by closing doors that other players (or the same player) have opened.
+	ZADF_UNBLOCK_DOORS = 1 << 18,
 };
 
 // [RH] Compatibility flags.
--- src/d_main.cpp~bak	2019-10-14 06:38:53.000000000 +1100
+++ src/d_main.cpp	2019-12-12 12:08:44.356637938 +1100
@@ -625,6 +625,7 @@ CVAR (Flag, sv_unblockallies,		zadmflags
 CVAR (Flag, sv_nodrop,				zadmflags, ZADF_NODROP);
 CVAR (Flag, sv_survival_nomapresetondeath, zadmflags, ZADF_SURVIVAL_NO_MAP_RESET_ON_DEATH);
 CVAR (Flag, sv_deadplayerscankeepinventory, zadmflags, ZADF_DEAD_PLAYERS_CAN_KEEP_INVENTORY);
+CVAR (Flag, sv_unblockdoors, zadmflags, ZADF_UNBLOCK_DOORS);
 
 //==========================================================================
 //
