From 1e2b0cdb181530760437a3baf10619da34ecc2ce Mon Sep 17 00:00:00 2001
From: Spoike <acceptthis@users.sourceforge.net>
Date: Thu, 27 May 2021 11:34:01 +0000
Subject: [PATCH] Some ktx fixups.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5870 fc73d0e0-1445-4013-8a0c-d673dee63da5
---
 engine/server/pr_cmds.c  | 41 ++++++++++++++++++++++++----------------
 engine/server/pr_q1qvm.c | 20 ++++++++++++++------
 engine/server/sv_ccmds.c |  8 +++++++-
 engine/server/sv_send.c  |  2 +-
 4 files changed, 47 insertions(+), 24 deletions(-)

diff --git a/engine/server/pr_cmds.c b/engine/server/pr_cmds.c
index bda96e2aa..3e364d0d2 100644
--- a/engine/server/pr_cmds.c
+++ b/engine/server/pr_cmds.c
@@ -10293,27 +10293,36 @@ void SV_SetEntityButtons(edict_t *ent, unsigned int buttonbits)
 
 static void SV_SetSSQCInputs(usercmd_t *ucmd)
 {
-	pr_global_struct->input_timelength = ucmd->msec/1000.0f * sv.gamespeed;
-	pr_global_struct->input_impulse = ucmd->impulse;
+	if (pr_global_ptrs->input_timelength)
+		pr_global_struct->input_timelength = ucmd->msec/1000.0f * sv.gamespeed;
+	if (pr_global_ptrs->input_impulse)
+		pr_global_struct->input_impulse = ucmd->impulse;
 //precision inaccuracies. :(
 #define ANGLE2SHORT(x) (x) * (65536/360.0)
-	if (sv_player->v->fixangle)
+	if (pr_global_ptrs->input_angles)
 	{
-		(pr_global_struct->input_angles)[0] = sv_player->v->v_angle[0];
-		(pr_global_struct->input_angles)[1] = sv_player->v->v_angle[1];
-		(pr_global_struct->input_angles)[2] = sv_player->v->v_angle[2];
-	}
-	else
-	{
-		(pr_global_struct->input_angles)[0] = SHORT2ANGLE(ucmd->angles[0]);
-		(pr_global_struct->input_angles)[1] = SHORT2ANGLE(ucmd->angles[1]);
-		(pr_global_struct->input_angles)[2] = SHORT2ANGLE(ucmd->angles[2]);
+		if (sv_player->v->fixangle)
+		{
+			(pr_global_struct->input_angles)[0] = sv_player->v->v_angle[0];
+			(pr_global_struct->input_angles)[1] = sv_player->v->v_angle[1];
+			(pr_global_struct->input_angles)[2] = sv_player->v->v_angle[2];
+		}
+		else
+		{
+			(pr_global_struct->input_angles)[0] = SHORT2ANGLE(ucmd->angles[0]);
+			(pr_global_struct->input_angles)[1] = SHORT2ANGLE(ucmd->angles[1]);
+			(pr_global_struct->input_angles)[2] = SHORT2ANGLE(ucmd->angles[2]);
+		}
 	}
 
-	(pr_global_struct->input_movevalues)[0] = ucmd->forwardmove;
-	(pr_global_struct->input_movevalues)[1] = ucmd->sidemove;
-	(pr_global_struct->input_movevalues)[2] = ucmd->upmove;
-	pr_global_struct->input_buttons = ucmd->buttons;
+	if (pr_global_ptrs->input_movevalues)
+	{
+		(pr_global_struct->input_movevalues)[0] = ucmd->forwardmove;
+		(pr_global_struct->input_movevalues)[1] = ucmd->sidemove;
+		(pr_global_struct->input_movevalues)[2] = ucmd->upmove;
+	}
+	if (pr_global_ptrs->input_buttons)
+		pr_global_struct->input_buttons = ucmd->buttons;
 	if (pr_global_ptrs->input_weapon)
 		pr_global_struct->input_weapon = ucmd->weapon;
 	if (pr_global_ptrs->input_lightlevel)
diff --git a/engine/server/pr_q1qvm.c b/engine/server/pr_q1qvm.c
index b8372b16b..6cf27fe69 100755
--- a/engine/server/pr_q1qvm.c
+++ b/engine/server/pr_q1qvm.c
@@ -429,11 +429,12 @@ static unsigned int QDECL Q1QVMPF_NumForEdict(pubprogfuncs_t *pf, edict_t *e)
 }
 
 static int QDECL Q1QVMPF_EdictToProgs(pubprogfuncs_t *pf, edict_t *e)
-{
+{	//sadly ktx still uses byte-offset-from-world :(
 	return e->entnum*sv.world.edict_size;
 }
 static edict_t *QDECL Q1QVMPF_ProgsToEdict(pubprogfuncs_t *pf, int num)
 {
+	//sadly ktx still uses byte-offset-from-world :(
 	if (num % sv.world.edict_size)
 		Con_Printf("Edict To Progs with remainder\n");
 	num /= sv.world.edict_size;
@@ -1062,23 +1063,30 @@ static qintptr_t QVM_SetSpawnParams (void *offset, quintptr_t mask, const qintpt
 }
 static qintptr_t QVM_ChangeLevel (void *offset, quintptr_t mask, const qintptr_t *arg)
 {
+	const char *arg_mapname = VM_POINTER(arg[0]);
+//	const char *arg_entfilename = VM_POINTER(arg[1]);
+
 	char newmap[MAX_QPATH];
 	if (sv.mapchangelocked)
 		return 0;
 	sv.mapchangelocked = true;
-	COM_QuotedString(VM_POINTER(arg[0]), newmap, sizeof(newmap), false);
+	COM_QuotedString(arg_mapname, newmap, sizeof(newmap), false);
 	Cbuf_AddText (va("\nchangelevel %s\n", newmap), RESTRICT_LOCAL);
 	return 1;
 }
-static qintptr_t QVM_ChangeLevel2 (void *offset, quintptr_t mask, const qintptr_t *arg)
+static qintptr_t QVM_ChangeLevelHub (void *offset, quintptr_t mask, const qintptr_t *arg)
 {
+	const char *arg_mapname = VM_POINTER(arg[0]);
+//	const char *arg_entfile = VM_POINTER(arg[1]);
+	const char *arg_startspot = VM_POINTER(arg[2]);
+
 	char newmap[MAX_QPATH];
 	char startspot[MAX_QPATH];
 	if (sv.mapchangelocked)
 		return 0;
 	sv.mapchangelocked = true;
-	COM_QuotedString(VM_POINTER(arg[0]), newmap, sizeof(newmap), false);
-	COM_QuotedString(VM_POINTER(arg[1]), startspot, sizeof(startspot), false);
+	COM_QuotedString(arg_mapname, newmap, sizeof(newmap), false);
+	COM_QuotedString(arg_startspot, startspot, sizeof(startspot), false);
 	Cbuf_AddText (va("\nchangelevel %s %s\n", newmap, startspot), RESTRICT_LOCAL);
 	return 1;
 }
@@ -1990,7 +1998,7 @@ struct
 {
 	{"SetExtField",			QVM_SetExtField},
 	{"GetExtField",			QVM_GetExtField},
-	{"ChangeLevel2",		QVM_ChangeLevel2},	//with start spot
+	{"ChangeLevelHub",		QVM_ChangeLevelHub},	//with start spot
 #ifdef WEBCLIENT
 	{"URI_Query",			QVM_uri_query},
 #endif
diff --git a/engine/server/sv_ccmds.c b/engine/server/sv_ccmds.c
index 04d44aac6..869a12a26 100644
--- a/engine/server/sv_ccmds.c
+++ b/engine/server/sv_ccmds.c
@@ -449,6 +449,7 @@ static int QDECL ShowMapList (const char *name, qofs_t flags, time_t mtime, void
 }
 static void SV_MapList_f(void)
 {
+	//FIXME: maps/mapname#modifier.ent
 	COM_EnumerateFiles("maps/*.bsp", ShowMapList, "");
 	COM_EnumerateFiles("maps/*.bsp.gz", ShowMapList, ".bsp.gz");
 	COM_EnumerateFiles("maps/*.map", ShowMapList, ".map");
@@ -481,6 +482,7 @@ static void SV_Map_c(int argn, const char *partial, struct xcommandargcompletion
 {
 	if (argn == 1)
 	{
+		//FIXME: maps/mapname#modifier.ent
 		COM_EnumerateFiles(va("maps/%s*.bsp", partial), CompleteMapList, ctx);
 		COM_EnumerateFiles(va("maps/%s*.bsp.gz", partial), CompleteMapListExt, ctx);
 		COM_EnumerateFiles(va("maps/%s*.map", partial), CompleteMapListExt, ctx);
@@ -529,6 +531,10 @@ quake2:
 
 quake:
 + is used in certain map names. * cannot be, but $ potentially could be.
+
+mvdsv:
+basemap#modifier.ent files
+
 ======================
 */
 void SV_Map_f (void)
@@ -628,7 +634,7 @@ void SV_Map_f (void)
 	sv.mapchangelocked = false;
 
 	if (!strcmp(level, "."))
-		;//restart current
+		;//restart current - deprecated.
 	else
 	{
 		snprintf (expanded, sizeof(expanded), "maps/%s.bsp", level); // this function and the if statement below, is a quake bugfix which stopped a map called "dm6++.bsp" from loading because of the + sign, quake2 map syntax interprets + character as "intro.cin+base1.bsp", to play a cinematic then load a map after
diff --git a/engine/server/sv_send.c b/engine/server/sv_send.c
index 082bd4c2e..d5ad439a4 100644
--- a/engine/server/sv_send.c
+++ b/engine/server/sv_send.c
@@ -3521,7 +3521,7 @@ void SV_SendClientMessages (void)
 				host_client = c;
 				sv_player = c->edict;
 				SV_PreRunCmd();
-				stepmsec = 12;
+				stepmsec = 13;
 				cmd.msec = stepmsec;
 
 				if (sv_showpredloss.ival)