diff --git a/source/games/duke/src/actors.cpp b/source/games/duke/src/actors.cpp
index d740e219e..8b59c4426 100644
--- a/source/games/duke/src/actors.cpp
+++ b/source/games/duke/src/actors.cpp
@@ -458,7 +458,7 @@ void moveplayers(void)
 				}
 				else
 				{
-					p->PlayerNowPosition = act->spr.pos.plusZ(-20);
+					p->posSet(act->spr.pos.plusZ(-20));
 					p->newOwner = nullptr;
 
 					if (p->wackedbyactor != nullptr && p->wackedbyactor->spr.statnum < MAXSTATUS)
diff --git a/source/games/duke/src/actors_d.cpp b/source/games/duke/src/actors_d.cpp
index 364a5649c..99a5f94ab 100644
--- a/source/games/duke/src/actors_d.cpp
+++ b/source/games/duke/src/actors_d.cpp
@@ -1345,7 +1345,7 @@ void movetransports_d(void)
 								ps[p].transporter_hold = 13;
 							}
 
-							ps[p].PlayerNowPosition = Owner->spr.pos.plusZ(-gs.playerheight);
+							ps[p].posSet(Owner->spr.pos.plusZ(-gs.playerheight));
 							ps[p].backupxyz();
 							ps[p].setbobpos();
 
diff --git a/source/games/duke/src/actors_r.cpp b/source/games/duke/src/actors_r.cpp
index ae79ac081..934728e46 100644
--- a/source/games/duke/src/actors_r.cpp
+++ b/source/games/duke/src/actors_r.cpp
@@ -1233,7 +1233,7 @@ void movetransports_r(void)
 								ps[p].transporter_hold = 13;
 							}
 
-							ps[p].PlayerNowPosition = Owner->spr.pos.plusZ(-gs.playerheight + 4);
+							ps[p].posSet(Owner->spr.pos.plusZ(-gs.playerheight + 4));
 							ps[p].backupxyz();
 							ps[p].setbobpos();
 
@@ -2049,7 +2049,7 @@ void rr_specialstats()
 					if (act2->spr.picnum == RRTELEPORTDEST)
 					{
 						ps[p].angle.ang = act2->spr.angle;
-						ps[p].PlayerNowPosition = act2->spr.pos.plusZ(-36);
+						ps[p].posSet(act2->spr.pos.plusZ(-36));
 						ps[p].backupxyz();
 						ps[p].setbobpos();
 						auto pact = ps[p].GetActor();
diff --git a/source/games/duke/src/ccmds.cpp b/source/games/duke/src/ccmds.cpp
index fae60aec1..255ecca63 100644
--- a/source/games/duke/src/ccmds.cpp
+++ b/source/games/duke/src/ccmds.cpp
@@ -115,7 +115,7 @@ void GameInterface::WarpToCoords(double x, double y, double z, DAngle ang)
 {
 	player_struct* p = &ps[myconnectindex];
 
-	p->PlayerNowPosition = DVector3(x, y, z);
+	p->posSet(DVector3(x, y, z));
 	p->backupxyz();
 
 	if (ang != DAngle::fromDeg(INT_MIN))
diff --git a/source/games/duke/src/player_d.cpp b/source/games/duke/src/player_d.cpp
index e398b4891..e42a9c852 100644
--- a/source/games/duke/src/player_d.cpp
+++ b/source/games/duke/src/player_d.cpp
@@ -3101,7 +3101,8 @@ HORIZONLY:
 			{
 				if (!retry++)
 				{
-					p->PlayerNowPosition = p->PlayerOldPosition = oldpos;
+					p->posSet(oldpos);
+					p->backupxyz();
 					continue;
 				}
 				quickkill(p);
diff --git a/source/games/duke/src/player_r.cpp b/source/games/duke/src/player_r.cpp
index a4f079716..63eb3be2c 100644
--- a/source/games/duke/src/player_r.cpp
+++ b/source/games/duke/src/player_r.cpp
@@ -3888,7 +3888,8 @@ HORIZONLY:
 			{
 				if (!retry++)
 				{
-					p->PlayerNowPosition = p->PlayerOldPosition = oldpos;
+					p->posSet(oldpos);
+					p->backupxyz();
 					continue;
 				}
 				quickkill(p);
diff --git a/source/games/duke/src/premap.cpp b/source/games/duke/src/premap.cpp
index 17a9a1dde..e7dcab8e8 100644
--- a/source/games/duke/src/premap.cpp
+++ b/source/games/duke/src/premap.cpp
@@ -69,7 +69,7 @@ void pickrandomspot(int snum)
 		i = krand()%numplayersprites;
 	else i = snum;
 
-	p->PlayerNowPosition = po[i].opos;
+	p->posSet(po[i].opos);
 	p->backupxyz();
 	p->setbobpos();
 	p->angle.oang = p->angle.ang = po[i].oa;
@@ -622,7 +622,7 @@ void resetpspritevars(int g)
 			ps[j].frag_ps = j;
 			act->SetOwner(act);
 
-			ps[j].PlayerNowPosition = act->spr.pos;
+			ps[j].posSet(act->spr.pos);
 			ps[j].backupxyz();
 			ps[j].setbobpos();
 			act->backuppos();
@@ -976,7 +976,7 @@ static int LoadTheMap(MapRecord *mi, player_struct*p, int gamemode)
 	SpawnSpriteDef sprites;
 	DVector3 pos;
 	loadMap(mi->fileName, isShareware(), &pos, &lbang, &sect, sprites);
-	p->PlayerNowPosition = pos;
+	p->posSet(pos);
 	p->cursector = sect;
 
 	SECRET_SetMapName(mi->DisplayName(), mi->name);
diff --git a/source/games/duke/src/types.h b/source/games/duke/src/types.h
index 8b8d43288..3dceeb29e 100644
--- a/source/games/duke/src/types.h
+++ b/source/games/duke/src/types.h
@@ -383,6 +383,11 @@ struct player_struct
 	{
 		return PlayerNowPosition.Z;
 	}
+
+	void posSet(const DVector3& val)
+	{
+		PlayerNowPosition = val;
+	}
 };
 
 struct Cycler
diff --git a/source/games/duke/src/vmexports.cpp b/source/games/duke/src/vmexports.cpp
index 204d62317..5c1c75feb 100644
--- a/source/games/duke/src/vmexports.cpp
+++ b/source/games/duke/src/vmexports.cpp
@@ -703,7 +703,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(_DukePlayer, backupxyz, dukeplayer_backupxyz)
 
 void dukeplayer_setpos(player_struct* self, double x, double y, double z)
 {
-	self->PlayerNowPosition = { x, y, z };
+	self->posSet({ x, y, z });
 }
 
 DEFINE_ACTION_FUNCTION_NATIVE(_DukePlayer, setpos, dukeplayer_setpos)