diff --git a/src/d_player.h b/src/d_player.h
index 05facd9fe..e09db38a3 100644
--- a/src/d_player.h
+++ b/src/d_player.h
@@ -150,6 +150,7 @@ public:
 	int			MugShotMaxHealth;
 	int			RunHealth;
 	int			PlayerFlags;
+	double		FullHeight;
 	TObjPtr<AInventory> InvFirst;		// first inventory item displayed on inventory bar
 	TObjPtr<AInventory> InvSel;			// selected inventory item
 
diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp
index 5f7185a07..f89a560ab 100644
--- a/src/p_actionfunctions.cpp
+++ b/src/p_actionfunctions.cpp
@@ -6906,6 +6906,10 @@ DEFINE_ACTION_FUNCTION(AActor, A_SetSize)
 		self->LinkToWorld(&ctx);
 		ACTION_RETURN_BOOL(false);
 	}
+	if (self->player && self->player->mo == self)
+	{
+		self->player->mo->FullHeight = newheight;
+	}
 
 	ACTION_RETURN_BOOL(true);
 }
diff --git a/src/p_user.cpp b/src/p_user.cpp
index af1fbbf2d..c6b0a7d58 100644
--- a/src/p_user.cpp
+++ b/src/p_user.cpp
@@ -689,7 +689,8 @@ void APlayerPawn::Serialize(FSerializer &arc)
 		("userange", UseRange, def->UseRange)
 		("aircapacity", AirCapacity, def->AirCapacity)
 		("viewheight", ViewHeight, def->ViewHeight)
-		("viewbob", ViewBob, def->ViewBob);
+		("viewbob", ViewBob, def->ViewBob)
+		("fullheight", FullHeight, def->FullHeight);
 }
 
 //===========================================================================
@@ -714,7 +715,7 @@ void APlayerPawn::BeginPlay ()
 {
 	Super::BeginPlay ();
 	ChangeStatNum (STAT_PLAYER);
-
+	FullHeight = Height;
 	// Check whether a PWADs normal sprite is to be combined with the base WADs
 	// crouch sprite. In such a case the sprites normally don't match and it is
 	// best to disable the crouch sprite.
@@ -766,11 +767,11 @@ void APlayerPawn::Tick()
 {
 	if (player != NULL && player->mo == this && player->CanCrouch() && player->playerstate != PST_DEAD)
 	{
-		Height = GetDefault()->Height * player->crouchfactor;
+		Height = FullHeight * player->crouchfactor;
 	}
 	else
 	{
-		if (health > 0) Height = GetDefault()->Height;
+		if (health > 0) Height = FullHeight;
 	}
 	Super::Tick();
 }
@@ -2309,7 +2310,7 @@ void P_DeathThink (player_t *player)
 
 void P_CrouchMove(player_t * player, int direction)
 {
-	double defaultheight = player->mo->GetDefault()->Height;
+	double defaultheight = player->mo->FullHeight;
 	double savedheight = player->mo->Height;
 	double crouchspeed = direction * CROUCHSPEED;
 	double oldheight = player->viewheight;
@@ -3245,6 +3246,7 @@ DEFINE_FIELD(APlayerPawn, AirCapacity)
 DEFINE_FIELD(APlayerPawn, FlechetteType)
 DEFINE_FIELD(APlayerPawn, DamageFade)
 DEFINE_FIELD(APlayerPawn, ViewBob)
+DEFINE_FIELD(APlayerPawn, FullHeight)
 
 DEFINE_FIELD(PClassPlayerPawn, HealingRadiusType)
 DEFINE_FIELD(PClassPlayerPawn, DisplayName)
diff --git a/wadsrc/static/zscript/shared/player.txt b/wadsrc/static/zscript/shared/player.txt
index 73b00a269..d4992e97f 100644
--- a/wadsrc/static/zscript/shared/player.txt
+++ b/wadsrc/static/zscript/shared/player.txt
@@ -37,6 +37,7 @@ class PlayerPawn : Actor native
 	native Class<Actor> FlechetteType;
 	native color 		DamageFade;				// [CW] Fades for when you are being damaged.
 	native double		ViewBob;				// [SP] ViewBob Multiplier
+	native double		FullHeight;
 	
 	Default
 	{