diff -r 4f775318d2ec src/cl_main.cpp
--- a/src/cl_main.cpp	Wed Dec 20 22:00:46 2023 -0500
+++ b/src/cl_main.cpp	Fri Jan 05 06:43:08 2024 -0800
@@ -7252,7 +7252,8 @@
 	}
 */
 	// [BB] Prevent the client from trying to switch to a different weapon while morphed.
-	if ( players[ulPlayer].morphTics )
+	// [geNia] unless +NOMORPHLIMITATIONS is used
+	if ( player->morphTics && !( player->mo && (player->mo->PlayerFlags & PPF_NOMORPHLIMITATIONS) ) )
 		players[ulPlayer].PendingWeapon = WP_NOCHANGE;
 
 	// Since an item displayed on the HUD may have been given, refresh the HUD.
diff -r 4f775318d2ec src/d_player.h
--- a/src/d_player.h	Wed Dec 20 22:00:46 2023 -0500
+++ b/src/d_player.h	Fri Jan 05 06:43:08 2024 -0800
@@ -192,6 +192,8 @@
 	PPF_NOTHRUSTWHENINVUL = 1,	// Attacks do not thrust the player if they are invulnerable.
 	PPF_CANSUPERMORPH = 2,		// Being remorphed into this class can give you a Tome of Power
 	PPF_CROUCHABLEMORPH = 4,	// This morphed player can crouch
+	// [geNia] Removes morph limitations, like not playing land sounds, or not switching weapons, or not being affected by speed powerups
+	PPF_NOMORPHLIMITATIONS = 8,
 };
 
 //
diff -r 4f775318d2ec src/g_shared/a_morph.cpp
--- a/src/g_shared/a_morph.cpp	Wed Dec 20 22:00:46 2023 -0500
+++ b/src/g_shared/a_morph.cpp	Fri Jan 05 06:43:08 2024 -0800
@@ -97,6 +97,13 @@
 	p->PremorphWeapon = p->ReadyWeapon;
 	morphed->special2 = actor->flags & ~MF_JUSTHIT;
 	morphed->player = p;
+	if (morphed->PlayerFlags & PPF_NOMORPHLIMITATIONS)
+	{
+		morphed->velx = actor->velx;
+		morphed->vely = actor->vely;
+		morphed->velz = actor->velz;
+		morphed->pitch = actor->pitch;
+	}
 	if (actor->renderflags & RF_INVISIBLE)
 	{
 		morphed->special2 |= MF_JUSTHIT;
@@ -127,7 +134,10 @@
 	p->MorphExitFlash = (exit_flash) ? exit_flash : RUNTIME_CLASS(ATeleportFog);
 	p->health = morphed->health;
 	p->mo = morphed;
-	p->velx = p->vely = 0;
+	if (!(morphed->PlayerFlags & PPF_NOMORPHLIMITATIONS))
+	{
+		p->velx = p->vely = 0;
+	}
 	morphed->ObtainInventory (actor);
 	// Remove all armor
 	for (item = morphed->Inventory; item != NULL; )
@@ -178,6 +188,11 @@
 		SERVERCOMMANDS_SetThingFlags( morphed, FLAGSET_FLAGS3 );
 		if ( morphed->tid != 0 )
 			SERVERCOMMANDS_SetThingTID( morphed );
+		if ( morphed->PlayerFlags & PPF_NOMORPHLIMITATIONS )
+		{
+			SERVERCOMMANDS_MoveLocalPlayer( ulPlayer );
+			SERVERCOMMANDS_MovePlayer( ulPlayer, ulPlayer, SVCF_SKIPTHISCLIENT );
+		}
 	}
 
 	return true;
@@ -253,10 +268,20 @@
 	mo->player = player;
 	mo->reactiontime = 18;
 	mo->flags = pmo->special2 & ~MF_JUSTHIT;
-	mo->velx = 0;
-	mo->vely = 0;
-	player->velx = 0;
-	player->vely = 0;
+	if (pmo->PlayerFlags & PPF_NOMORPHLIMITATIONS)
+	{
+		mo->velx = pmo->velx;
+		mo->vely = pmo->vely;
+		mo->velz = pmo->velz;
+		mo->pitch = pmo->pitch;
+	}
+	else
+	{
+		mo->velx = 0;
+		mo->vely = 0;
+		player->velx = 0;
+		player->vely = 0;
+	}
 	mo->velz = pmo->velz;
 	if (!(pmo->special2 & MF_JUSTHIT))
 	{
diff -r 4f775318d2ec src/p_mobj.cpp
--- a/src/p_mobj.cpp	Wed Dec 20 22:00:46 2023 -0500
+++ b/src/p_mobj.cpp	Fri Jan 05 06:43:08 2024 -0800
@@ -3354,7 +3354,8 @@
 
 	// [RH] only make noise if alive
 	// [WS/BB] As client only play the sound for the consoleplayer.
-	if (!mo->player->morphTics && mo->health > 0 && NETWORK_IsConsolePlayerOrNotInClientMode( mo->player ))
+	bool canPlayLandSound = ( !mo->player->morphTics || (mo->player->mo && mo->player->mo->PlayerFlags & PPF_NOMORPHLIMITATIONS) );
+	if ( canPlayLandSound && mo->health > 0 && NETWORK_IsConsolePlayerOrNotInClientMode( mo->player ))
 	{
 		grunted = false;
 		// Why should this number vary by gravity?
diff -r 4f775318d2ec src/p_pspr.cpp
--- a/src/p_pspr.cpp	Wed Dec 20 22:00:46 2023 -0500
+++ b/src/p_pspr.cpp	Fri Jan 05 06:43:08 2024 -0800
@@ -858,8 +858,9 @@
 		return;
 	}
 	if ((player->WeaponState & WF_DISABLESWITCH) || // Weapon changing has been disabled.
-		player->morphTics != 0)					// Morphed classes cannot change weapons.
+		( player->morphTics != 0 && !( player->mo && (player->mo->PlayerFlags & PPF_NOMORPHLIMITATIONS) ) )) // Morphed classes cannot change weapons.
 	{ // ...so throw away any pending weapon requests.
+		// [geNia] unless +NOMORPHLIMITATIONS is used
 		player->PendingWeapon = WP_NOCHANGE;
 	}
 
@@ -1016,7 +1017,7 @@
 		return;
 	}
 
-	if (player->morphTics || player->cheats & CF_INSTANTWEAPSWITCH)
+	if ( ( player->morphTics && !( player->mo && (player->mo->PlayerFlags & PPF_NOMORPHLIMITATIONS) ) ) || player->cheats & CF_INSTANTWEAPSWITCH)
 	{
 		psp->sy = WEAPONBOTTOM;
 	}
diff -r 4f775318d2ec src/p_user.cpp
--- a/src/p_user.cpp	Wed Dec 20 22:00:46 2023 -0500
+++ b/src/p_user.cpp	Fri Jan 05 06:43:08 2024 -0800
@@ -2266,7 +2266,7 @@
 	}
 
 	// [BC] This comes out to 50%, so we can use this for the turbosphere.
-	if (!player->morphTics && Inventory != NULL)
+	if (( !player->morphTics || ( PlayerFlags & PPF_NOMORPHLIMITATIONS ) ) && Inventory != NULL)
 	{
 		fixed_t factor = Inventory->GetSpeedFactor ();
 		forward = FixedMul(forward, factor);
diff -r 4f775318d2ec src/sv_main.cpp
--- a/src/sv_main.cpp	Wed Dec 20 22:00:46 2023 -0500
+++ b/src/sv_main.cpp	Fri Jan 05 06:43:08 2024 -0800
@@ -6278,7 +6278,7 @@
 	}
 
 	// [BB] Morph workaround: If the player is morphed, he can't change his weapon.
-	if ( players[ulClient].morphTics )
+	if ( players[ulClient].morphTics && !( players[ulClient].mo && (players[ulClient].mo->PlayerFlags & PPF_NOMORPHLIMITATIONS) ) )
 		return false;
 
 	// [BB] Since the server is not giving the player a weapon while spawning, P_BringUpWeapon doesn't call A_Raise for
diff -r 4f775318d2ec src/thingdef/thingdef_data.cpp
--- a/src/thingdef/thingdef_data.cpp	Wed Dec 20 22:00:46 2023 -0500
+++ b/src/thingdef/thingdef_data.cpp	Fri Jan 05 06:43:08 2024 -0800
@@ -393,6 +393,7 @@
 	DEFINE_FLAG(PPF, NOTHRUSTWHENINVUL, APlayerPawn, PlayerFlags),
 	DEFINE_FLAG(PPF, CANSUPERMORPH, APlayerPawn, PlayerFlags),
 	DEFINE_FLAG(PPF, CROUCHABLEMORPH, APlayerPawn, PlayerFlags),
+	DEFINE_FLAG(PPF, NOMORPHLIMITATIONS, APlayerPawn, PlayerFlags),
 };
 
 static FFlagDef PowerSpeedFlags[] =
