diff --git a/source/core/thingdef_data.cpp b/source/core/thingdef_data.cpp
index 41c77eb33..7d26e952a 100644
--- a/source/core/thingdef_data.cpp
+++ b/source/core/thingdef_data.cpp
@@ -107,7 +107,7 @@ static FFlagDef DukeActorFlagDefs[] =
 	DEFINE_FLAG(SFLAG, BOSS, DDukeActor, flags1),
 	DEFINE_FLAG(SFLAG, BADGUYSTAYPUT, DDukeActor, flags1),
 	DEFINE_FLAG(SFLAG, GREENSLIMEFOOD, DDukeActor, flags1),
-	//DEFINE_FLAG(SFLAG, NODAMAGEPUSH, DDukeActor, flags1),
+	DEFINE_FLAG(SFLAG, SKILLFILTER, DDukeActor, flags1),
 	DEFINE_FLAG(SFLAG, NOWATERDIP, DDukeActor, flags1),
 	DEFINE_FLAG(SFLAG, INTERNAL_BADGUY, DDukeActor, flags1),
 	DEFINE_FLAG(SFLAG, KILLCOUNT, DDukeActor, flags1),
diff --git a/source/games/duke/src/constants.h b/source/games/duke/src/constants.h
index 7ce7fb71f..5772a79cc 100644
--- a/source/games/duke/src/constants.h
+++ b/source/games/duke/src/constants.h
@@ -327,7 +327,7 @@ enum sflags_t
 	SFLAG_BOSS					= 0x00000010,
 	SFLAG_BADGUYSTAYPUT			= 0x00000020,
 	SFLAG_GREENSLIMEFOOD		= 0x00000040,
-	//SFLAG_NODAMAGEPUSH			= 0x00000080,
+	SFLAG_SKILLFILTER			= 0x00000080,
 	SFLAG_NOWATERDIP			= 0x00000100,
 	SFLAG_INTERNAL_BADGUY		= 0x00000200, // a separate flag is needed for the internal ones because SFLAG_BADGUY has additional semantics.
 	SFLAG_KILLCOUNT				= 0x00000400,
diff --git a/source/games/duke/src/spawn.cpp b/source/games/duke/src/spawn.cpp
index 3b2439560..4fa8622bd 100644
--- a/source/games/duke/src/spawn.cpp
+++ b/source/games/duke/src/spawn.cpp
@@ -314,7 +314,7 @@ bool commonEnemySetup(DDukeActor* self, DDukeActor* owner)
 		}
 	}
 
-	if ((self->spr.lotag > ud.player_skill) || ud.monsters_off == 1)
+	if (ud.monsters_off == 1)
 	{
 		self->spr.scale.Zero();
 		ChangeActorStat(self, STAT_MISC);
@@ -842,6 +842,16 @@ DDukeActor* spawninit(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>* ac
 	}
 	else if (!act->isPlayer())
 	{
+		if (act->flags1 & (SFLAG_INTERNAL_BADGUY | SFLAG_SKILLFILTER))
+		{
+			if (act->spr.lotag > ud.player_skill)
+			{
+				act->spr.scale.Zero();
+				ChangeActorStat(act, STAT_MISC);
+				return nullptr;
+			}
+		}
+
 		if (!badguy(act) || commonEnemySetup(act, actj))
 			CallInitialize(act);
 	}
diff --git a/wadsrc/static/zscript/games/duke/actors/greenslime.zs b/wadsrc/static/zscript/games/duke/actors/greenslime.zs
index d678abef4..7bb9db330 100644
--- a/wadsrc/static/zscript/games/duke/actors/greenslime.zs
+++ b/wadsrc/static/zscript/games/duke/actors/greenslime.zs
@@ -422,7 +422,7 @@ class DukeEgg : DukeActor
 	default
 	{
 		pic "EGG";
-		+INTERNAL_BADGUY;
+		+BADGUY;
 	}
 	
 	override void Initialize()
@@ -434,6 +434,7 @@ class DukeEgg : DukeActor
 		}
 		else
 		{
+			self.scale = (0.625, 0.625);
 			self.clipdist = 6;
 			self.cstat = CSTAT_SPRITE_BLOCK_ALL | randomXFlip();
 			self.ChangeStat(STAT_ZOMBIEACTOR);