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)