Tweak inputs some more.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@6023 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2021-08-19 06:02:03 +00:00
parent e83cfe3bb0
commit ac6605e0d7
7 changed files with 78 additions and 40 deletions

View file

@ -248,6 +248,7 @@ static void CSQC_FindGlobals(qboolean nofuncs)
csqcg.input_head_status = csqcg.input_left_status = csqcg.input_right_status = NULL;
csqcg.input_head_angles = csqcg.input_left_angles = csqcg.input_right_angles = NULL;
csqcg.input_head_origin = csqcg.input_left_origin = csqcg.input_right_origin = NULL;
csqcg.input_head_weapon = csqcg.input_left_weapon = csqcg.input_right_weapon = NULL;
}
else if (csqcg.CSQC_UpdateView || csqcg.CSQC_UpdateViewLoading)
{ //full csqc AND simplecsqc's entry points at the same time are a bad idea that just result in confusion.
@ -3871,6 +3872,8 @@ static void cs_set_input_state (usercmd_t *cmd)
csqcg.input_head_avelocity[1] = SHORT2ANGLE(cmd->vr[VRDEV_HEAD].avelocity[1]);
csqcg.input_head_avelocity[2] = SHORT2ANGLE(cmd->vr[VRDEV_HEAD].avelocity[2]);
}
if (csqcg.input_head_weapon)
*csqcg.input_head_weapon = cmd->vr[VRDEV_HEAD].weapon;
if (csqcg.input_left_status)
*csqcg.input_left_status = cmd->vr[VRDEV_LEFT].status;
@ -3971,6 +3974,8 @@ static void cs_get_input_state (usercmd_t *cmd)
cmd->vr[VRDEV_HEAD].avelocity[1] = ANGLE2SHORT(csqcg.input_head_avelocity[1]);
cmd->vr[VRDEV_HEAD].avelocity[2] = ANGLE2SHORT(csqcg.input_head_avelocity[2]);
}
if (csqcg.input_head_weapon)
cmd->vr[VRDEV_HEAD].weapon = *csqcg.input_head_weapon;
if (csqcg.input_left_status)
cmd->vr[VRDEV_LEFT].status = *csqcg.input_left_status;
@ -3990,6 +3995,8 @@ static void cs_get_input_state (usercmd_t *cmd)
cmd->vr[VRDEV_LEFT].avelocity[1] = ANGLE2SHORT(csqcg.input_left_avelocity[1]);
cmd->vr[VRDEV_LEFT].avelocity[2] = ANGLE2SHORT(csqcg.input_left_avelocity[2]);
}
if (csqcg.input_left_weapon)
cmd->vr[VRDEV_LEFT].weapon = *csqcg.input_left_weapon;
if (csqcg.input_right_status)
cmd->vr[VRDEV_RIGHT].status = *csqcg.input_right_status;
@ -4009,6 +4016,8 @@ static void cs_get_input_state (usercmd_t *cmd)
cmd->vr[VRDEV_RIGHT].avelocity[1] = ANGLE2SHORT(csqcg.input_right_avelocity[1]);
cmd->vr[VRDEV_RIGHT].avelocity[2] = ANGLE2SHORT(csqcg.input_right_avelocity[2]);
}
if (csqcg.input_right_weapon)
cmd->vr[VRDEV_RIGHT].weapon = *csqcg.input_right_weapon;
}
//sets implicit pause (only works when singleplayer)

View file

@ -1353,6 +1353,13 @@ void MSGQ2_WriteDeltaUsercmd (sizebuf_t *buf, const usercmd_t *from, const userc
//#define UC_UNUSED (1<<31)
#define UC_UNSUPPORTED (~(UC_ANGLE1 | UC_ANGLE2 | UC_ANGLE3 | UC_FORWARD | UC_RIGHT | UC_BUTTONS | UC_IMPULSE | UC_UP | UC_ABSANG | UC_BIGMOVES | UC_WEAPON | UC_CURSORFLDS | UC_LIGHTLEV | UC_VR_HEAD | UC_VR_RIGHT | UC_VR_LEFT))
#define UC_VR_STATUS (1<<0)
#define UC_VR_ANG (1<<1)
#define UC_VR_AVEL (1<<2)
#define UC_VR_ORG (1<<3)
#define UC_VR_VEL (1<<4)
#define UC_VR_WEAPON (1<<5)
#ifdef HAVE_CLIENT
fte_inlinestatic qboolean MSG_CompareVR(int i, const usercmd_t *from, const usercmd_t *cmd)
{
@ -1366,42 +1373,49 @@ fte_inlinestatic qboolean MSG_CompareVR(int i, const usercmd_t *from, const user
}
static void MSG_WriteVR(int i, sizebuf_t *buf, const usercmd_t *from, const usercmd_t *cmd)
{
quint64_t status = cmd->vr[i].status;
status <<= 4;
unsigned int bits = 0;
if (cmd->vr[i].status != from->vr[i].status)
bits |= UC_VR_STATUS;
if (cmd->vr[i].angles[0] != from->vr[i].angles[0] || cmd->vr[i].angles[1] != from->vr[i].angles[1] || cmd->vr[i].angles[2] != from->vr[i].angles[2])
status |= VRSTATUS_ANG;
bits |= UC_VR_ANG;
if (cmd->vr[i].avelocity[0] != from->vr[i].avelocity[0] || cmd->vr[i].avelocity[1] != from->vr[i].avelocity[1] || cmd->vr[i].avelocity[2] != from->vr[i].avelocity[2])
status |= VRSTATUS_AVEL;
bits |= UC_VR_AVEL;
if (cmd->vr[i].origin[0] != from->vr[i].origin[0] || cmd->vr[i].origin[1] != from->vr[i].origin[1] || cmd->vr[i].origin[2] != from->vr[i].origin[2])
status |= VRSTATUS_ORG;
bits |= UC_VR_ORG;
if (cmd->vr[i].velocity[0] != from->vr[i].velocity[0] || cmd->vr[i].velocity[1] != from->vr[i].velocity[1] || cmd->vr[i].velocity[2] != from->vr[i].velocity[2])
status |= VRSTATUS_VEL;
bits |= UC_VR_VEL;
if (cmd->vr[i].weapon != from->vr[i].weapon)
bits |= UC_VR_WEAPON;
MSG_WriteUInt64(buf,status);
if (status & VRSTATUS_ANG)
MSG_WriteUInt64(buf, bits);
if (bits & UC_VR_STATUS)
MSG_WriteUInt64(buf, cmd->vr[i].status);
if (bits & UC_VR_ANG)
{
MSG_WriteShort(buf, cmd->vr[i].angles[0]);
MSG_WriteShort(buf, cmd->vr[i].angles[1]);
MSG_WriteShort(buf, cmd->vr[i].angles[2]);
}
if (status & VRSTATUS_AVEL)
if (bits & UC_VR_AVEL)
{
MSG_WriteShort(buf, cmd->vr[i].avelocity[0]);
MSG_WriteShort(buf, cmd->vr[i].avelocity[1]);
MSG_WriteShort(buf, cmd->vr[i].avelocity[2]);
}
if (status & VRSTATUS_ORG)
if (bits & UC_VR_ORG)
{
MSG_WriteFloat(buf, cmd->vr[i].origin[0]);
MSG_WriteFloat(buf, cmd->vr[i].origin[1]);
MSG_WriteFloat(buf, cmd->vr[i].origin[2]);
}
if (status & VRSTATUS_VEL)
if (bits & UC_VR_VEL)
{
MSG_WriteFloat(buf, cmd->vr[i].velocity[0]);
MSG_WriteFloat(buf, cmd->vr[i].velocity[1]);
MSG_WriteFloat(buf, cmd->vr[i].velocity[2]);
}
if (bits & UC_VR_WEAPON)
MSG_WriteUInt64(buf, cmd->vr[i].weapon);
}
void MSGFTE_WriteDeltaUsercmd (sizebuf_t *buf, const short baseangles[3], const usercmd_t *from, const usercmd_t *cmd)
{
@ -1533,32 +1547,35 @@ void MSGFTE_WriteDeltaUsercmd (sizebuf_t *buf, const short baseangles[3], const
#ifdef HAVE_SERVER
static void MSG_ReadVR(int i, usercmd_t *cmd)
{
quint64_t status = MSG_ReadUInt64();
cmd->vr[i].status = status>>4;
if (status & VRSTATUS_ANG)
quint64_t bits = MSG_ReadUInt64();
if (bits & UC_VR_STATUS)
cmd->vr[i].status = MSG_ReadUInt64();
if (bits & UC_VR_ANG)
{
cmd->vr[i].angles[0] = MSG_ReadShort();
cmd->vr[i].angles[1] = MSG_ReadShort();
cmd->vr[i].angles[2] = MSG_ReadShort();
}
if (status & VRSTATUS_AVEL)
if (bits & UC_VR_AVEL)
{
cmd->vr[i].avelocity[0] = MSG_ReadShort();
cmd->vr[i].avelocity[1] = MSG_ReadShort();
cmd->vr[i].avelocity[2] = MSG_ReadShort();
}
if (status & VRSTATUS_ORG)
if (bits & UC_VR_ORG)
{
cmd->vr[i].origin[0] = MSG_ReadFloat();
cmd->vr[i].origin[1] = MSG_ReadFloat();
cmd->vr[i].origin[2] = MSG_ReadFloat();
}
if (status & VRSTATUS_VEL)
if (bits & UC_VR_VEL)
{
cmd->vr[i].velocity[0] = MSG_ReadFloat();
cmd->vr[i].velocity[1] = MSG_ReadFloat();
cmd->vr[i].velocity[2] = MSG_ReadFloat();
}
if (bits & UC_VR_WEAPON)
cmd->vr[i].weapon = MSG_ReadUInt64();
}
void MSGFTE_ReadDeltaUsercmd (const usercmd_t *from, usercmd_t *cmd)
{

View file

@ -1133,16 +1133,19 @@ enum
globalvector(input_head_angles) /*filled by getinputstate, for vr*/ \
globalvector(input_head_velocity) /*filled by getinputstate, for vr*/ \
globalvector(input_head_avelocity) /*filled by getinputstate, for vr*/ \
globaluint (input_head_weapon) /*filled by getinputstate, for vr*/ \
globaluint (input_left_status) /*filled by getinputstate, for vr*/ \
globalvector(input_left_origin) /*filled by getinputstate, for vr*/ \
globalvector(input_left_angles) /*filled by getinputstate, for vr*/ \
globalvector(input_left_velocity) /*filled by getinputstate, for vr*/ \
globalvector(input_left_avelocity) /*filled by getinputstate, for vr*/ \
globaluint (input_left_weapon) /*filled by getinputstate, for vr*/ \
globaluint (input_right_status) /*filled by getinputstate, for vr*/ \
globalvector(input_right_origin) /*filled by getinputstate, for vr*/ \
globalvector(input_right_angles) /*filled by getinputstate, for vr*/ \
globalvector(input_right_velocity) /*filled by getinputstate, for vr*/ \
globalvector(input_right_avelocity) /*filled by getinputstate, for vr*/ \
globaluint (input_right_weapon) /*filled by getinputstate, for vr*/ \
\
globalvector(global_gravitydir) /*vector used when .gravitydir is 0 0 0 */ \
globalfloat (dimension_default) /*float default value for dimension_hit+dimension_solid*/ \

View file

@ -1210,6 +1210,7 @@ struct vrdevinfo_s
short avelocity[3];
vec3_t origin;
vec3_t velocity;
unsigned int weapon;
#define VRDEV_LEFT 0
#define VRDEV_RIGHT 1
#define VRDEV_HEAD 2

View file

@ -957,16 +957,19 @@ void PR_LoadGlabalStruct(qboolean muted)
globalvec (false, input_head_angles) \
globalvec (false, input_head_velocity) \
globalvec (false, input_head_avelocity) \
globaluint (false, input_head_weapon) \
globaluint (false, input_left_status) \
globalvec (false, input_left_origin) \
globalvec (false, input_left_angles) \
globalvec (false, input_left_velocity) \
globalvec (false, input_left_avelocity) \
globaluint (false, input_left_weapon) \
globaluint (false, input_right_status) \
globalvec (false, input_right_origin) \
globalvec (false, input_right_angles) \
globalvec (false, input_right_velocity) \
globalvec (false, input_right_avelocity) \
globaluint (false, input_right_weapon) \
globalfloat (false, input_servertime) \
\
globalint (false, serverid) \
@ -10322,20 +10325,11 @@ void SV_SetSSQCInputs(usercmd_t *ucmd)
//precision inaccuracies. :(
#define ANGLE2SHORT(x) (x) * (65536/360.0)
if (pr_global_ptrs->input_angles)
{
if (sv_player->v->fixangle)
{ //hate this, but somehow still pending
(pr_global_struct->input_angles)[0] = sv_player->v->angles[0];
(pr_global_struct->input_angles)[1] = sv_player->v->angles[1];
(pr_global_struct->input_angles)[2] = sv_player->v->angles[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 (pr_global_ptrs->input_movevalues)
{
@ -10381,6 +10375,8 @@ void SV_SetSSQCInputs(usercmd_t *ucmd)
(pr_global_struct->input_head_avelocity)[1] = SHORT2ANGLE(ucmd->vr[VRDEV_HEAD].avelocity[1]);
(pr_global_struct->input_head_avelocity)[2] = SHORT2ANGLE(ucmd->vr[VRDEV_HEAD].avelocity[2]);
}
if (pr_global_ptrs->input_head_weapon)
pr_global_struct->input_head_weapon = ucmd->vr[VRDEV_HEAD].weapon;
if (pr_global_ptrs->input_left_status)
pr_global_struct->input_left_status = ucmd->vr[VRDEV_LEFT].status;
@ -10400,6 +10396,8 @@ void SV_SetSSQCInputs(usercmd_t *ucmd)
(pr_global_struct->input_left_avelocity)[1] = SHORT2ANGLE(ucmd->vr[VRDEV_LEFT].avelocity[1]);
(pr_global_struct->input_left_avelocity)[2] = SHORT2ANGLE(ucmd->vr[VRDEV_LEFT].avelocity[2]);
}
if (pr_global_ptrs->input_left_weapon)
pr_global_struct->input_left_weapon = ucmd->vr[VRDEV_LEFT].weapon;
if (pr_global_ptrs->input_right_status)
pr_global_struct->input_right_status = ucmd->vr[VRDEV_RIGHT].status;
@ -10419,6 +10417,8 @@ void SV_SetSSQCInputs(usercmd_t *ucmd)
(pr_global_struct->input_right_avelocity)[1] = SHORT2ANGLE(ucmd->vr[VRDEV_RIGHT].avelocity[1]);
(pr_global_struct->input_right_avelocity)[2] = SHORT2ANGLE(ucmd->vr[VRDEV_RIGHT].avelocity[2]);
}
if (pr_global_ptrs->input_right_weapon)
pr_global_struct->input_right_weapon = ucmd->vr[VRDEV_RIGHT].weapon;
}
//EXT_CSQC_1 (called when a movement command is received. runs full acceleration + movement)
@ -10441,6 +10441,18 @@ qboolean SV_RunFullQCMovement(client_t *client, usercmd_t *ucmd)
}
#endif
if (host_client->state && host_client->protocol != SCP_BAD)
{
if (!sv_player->v->fixangle)
{
sv_player->v->v_angle[0] = SHORT2ANGLE(ucmd->angles[0]);
sv_player->v->v_angle[1] = SHORT2ANGLE(ucmd->angles[1]);
sv_player->v->v_angle[2] = SHORT2ANGLE(ucmd->angles[2]);
}
sv_player->xv->movement[0] = ucmd->forwardmove;
sv_player->xv->movement[1] = ucmd->sidemove;
sv_player->xv->movement[2] = ucmd->upmove;
}
VectorCopy(sv_player->v->v_angle, startangle);
#ifdef HEXEN2
@ -10458,13 +10470,6 @@ qboolean SV_RunFullQCMovement(client_t *client, usercmd_t *ucmd)
sv_player->v->button0 = 0;
}
if (host_client->state && host_client->protocol != SCP_BAD)
{
sv_player->xv->movement[0] = ucmd->forwardmove;
sv_player->xv->movement[1] = ucmd->sidemove;
sv_player->xv->movement[2] = ucmd->upmove;
}
WPhys_CheckVelocity(&sv.world, (wedict_t*)sv_player);
//

View file

@ -122,16 +122,19 @@ typedef struct nqglobalvars_s
pvec3_t *input_head_angles;
pvec3_t *input_head_velocity;
pvec3_t *input_head_avelocity;
puint_t *input_head_weapon;
puint_t *input_left_status;
pvec3_t *input_left_origin;
pvec3_t *input_left_angles;
pvec3_t *input_left_velocity;
pvec3_t *input_left_avelocity;
puint_t *input_left_weapon;
puint_t *input_right_status;
pvec3_t *input_right_origin;
pvec3_t *input_right_angles;
pvec3_t *input_right_velocity;
pvec3_t *input_right_avelocity;
puint_t *input_right_weapon;
pvec3_t *global_gravitydir;
pvec_t *spawnparamglobals[NUM_SPAWN_PARMS];

View file

@ -8253,12 +8253,12 @@ void SV_ExecuteClientMessage (client_t *cl)
//store the info for the physics code to pick up the next time it ticks.
//yeah, nq sucks.
split->isindependant = false;
if (!split->edict->v->fixangle)
/*if (!split->edict->v->fixangle)
{
split->edict->v->v_angle[0] = newcmd.angles[0]* (360.0/65536);
split->edict->v->v_angle[1] = newcmd.angles[1]* (360.0/65536);
split->edict->v->v_angle[2] = newcmd.angles[2]* (360.0/65536);
}
}*/
if (newcmd.impulse)// && SV_FilterImpulse(newcmd.impulse, host_client->trustlevel))
split->edict->v->impulse = newcmd.impulse;
@ -8750,9 +8750,9 @@ void SVNQ_ReadClientMove (qboolean forceangle16)
}
}
host_client->edict->v->v_angle[0] = SHORT2ANGLE(cmd.angles[0]);
/*host_client->edict->v->v_angle[0] = SHORT2ANGLE(cmd.angles[0]);
host_client->edict->v->v_angle[1] = SHORT2ANGLE(cmd.angles[1]);
host_client->edict->v->v_angle[2] = SHORT2ANGLE(cmd.angles[2]);
host_client->edict->v->v_angle[2] = SHORT2ANGLE(cmd.angles[2]);*/
if (SV_RunFullQCMovement(host_client, &cmd))
{ //mod provides its own movement logic. this forces independance.