/* =================== SV_ReadClientMove =================== */ static void SV_ReadClientMove(client_t *client, usercmd_t *move) { edict_t *player = client->edict; int i, ping, buttonbits, impulse; /* read ping time */ ping = client->num_pings % NUM_PING_TIMES; client->ping_times[ping] = sv.time - MSG_ReadFloat(); client->num_pings++; /* read current angles */ for (i = 0; i < 3; i++) { if (sv.protocol == PROTOCOL_VERSION_FITZ) player->v.v_angle[i] = MSG_ReadAngle16(); else player->v.v_angle[i] = MSG_ReadAngle(); } /* read movement */ move->forwardmove = MSG_ReadShort(); move->sidemove = MSG_ReadShort(); move->upmove = MSG_ReadShort(); /* read buttons */ buttonbits = MSG_ReadByte(); player->v.button0 = buttonbits & 1; player->v.button2 = (buttonbits & 2) >> 1; impulse = MSG_ReadByte(); if (impulse) player->v.impulse = impulse; }
/* =================== SV_ReadClientMove =================== */ void SV_ReadClientMove (usercmd_t *move) { int i; vec3_t angle; int bits; // read ping time host_client->ping_times[host_client->num_pings%NUM_PING_TIMES] = sv.time - MSG_ReadFloat (net_message); host_client->num_pings++; // read current angles if ((host_client->netconnection->mod == MOD_PROQUAKE) && (sv.protocol == PROTOCOL_NETQUAKE)) // precise aim for ProQuake { for (i=0 ; i<3 ; i++) angle[i] = MSG_ReadPreciseAngle (net_message); } else if (sv.protocol == PROTOCOL_FITZQUAKE || sv.protocol == PROTOCOL_FITZQUAKE_PLUS) //johnfitz -- 16-bit angles for PROTOCOL_FITZQUAKE { for (i=0 ; i<3 ; i++) angle[i] = MSG_ReadAngle16 (net_message); } else { for (i=0 ; i<3 ; i++) angle[i] = MSG_ReadAngle (net_message); } VectorCopy (angle, host_client->edict->v.v_angle); // read movement move->forwardmove = MSG_ReadShort (net_message); move->sidemove = MSG_ReadShort (net_message); move->upmove = MSG_ReadShort (net_message); // read buttons bits = MSG_ReadByte (net_message); host_client->edict->v.button0 = bits & 1; host_client->edict->v.button2 = (bits & 2)>>1; i = MSG_ReadByte (net_message); if (i) host_client->edict->v.impulse = i; }
/* =================== SV_ReadClientMove =================== */ void SV_ReadClientMove (usercmd_t *move) { int i; vec3_t angle; int bits; // read ping time host_client->ping_times[host_client->num_pings%NUM_PING_TIMES] = sv.time - MSG_ReadFloat (); host_client->num_pings++; // read current angles for (i=0 ; i<3 ; i++) //johnfitz -- 16-bit angles for PROTOCOL_FITZQUAKE if (sv.protocol == PROTOCOL_NETQUAKE) angle[i] = MSG_ReadAngle (sv.protocolflags); else angle[i] = MSG_ReadAngle16 (sv.protocolflags); //johnfitz VectorCopy (angle, host_client->edict->v.v_angle); // read movement move->forwardmove = MSG_ReadShort (); move->sidemove = MSG_ReadShort (); move->upmove = MSG_ReadShort (); // read buttons bits = MSG_ReadByte (); host_client->edict->v.button0 = bits & 1; host_client->edict->v.button2 = (bits & 2)>>1; i = MSG_ReadByte (); if (i) host_client->edict->v.impulse = i; }
/* =================== CL_ParsePlayerstate =================== */ void CL_ParsePlayerstate (frame_t *oldframe, frame_t *newframe) { int flags; player_state_t *state; int i; int statbits; state = &newframe->playerstate; // clear to old value before delta parsing if (oldframe) *state = oldframe->playerstate; else memset (state, 0, sizeof(*state)); flags = MSG_ReadShort (&net_message); // // parse the pmove_state_t // if (flags & PS_M_TYPE) state->pmove.pm_type = MSG_ReadByte(&net_message); if (flags & PS_M_ORIGIN) { state->pmove.origin[0] = MSG_ReadShort (&net_message); state->pmove.origin[1] = MSG_ReadShort (&net_message); state->pmove.origin[2] = MSG_ReadShort (&net_message); } if (flags & PS_M_VELOCITY) { state->pmove.velocity[0] = MSG_ReadShort (&net_message); state->pmove.velocity[1] = MSG_ReadShort (&net_message); state->pmove.velocity[2] = MSG_ReadShort (&net_message); } if (flags & PS_M_TIME) state->pmove.pm_time = MSG_ReadByte(&net_message); if (flags & PS_M_FLAGS) state->pmove.pm_flags = MSG_ReadByte(&net_message); if (flags & PS_M_GRAVITY) state->pmove.gravity = MSG_ReadShort (&net_message); if (flags & PS_M_DELTA_ANGLES) { state->pmove.delta_angles[0] = MSG_ReadShort (&net_message); state->pmove.delta_angles[1] = MSG_ReadShort (&net_message); state->pmove.delta_angles[2] = MSG_ReadShort (&net_message); } if (cl.attractloop) state->pmove.pm_type = PM_FREEZE; // demo playback // // parse the rest of the player_state_t // if (flags & PS_VIEWOFFSET) { state->viewoffset[0] = MSG_ReadChar(&net_message) * 0.25; state->viewoffset[1] = MSG_ReadChar(&net_message) * 0.25; state->viewoffset[2] = MSG_ReadChar(&net_message) * 0.25; } if (flags & PS_VIEWANGLES) { state->viewangles[0] = MSG_ReadAngle16(&net_message); state->viewangles[1] = MSG_ReadAngle16(&net_message); state->viewangles[2] = MSG_ReadAngle16(&net_message); } if (flags & PS_KICKANGLES) { state->kick_angles[0] = MSG_ReadChar(&net_message) * 0.25; state->kick_angles[1] = MSG_ReadChar(&net_message) * 0.25; state->kick_angles[2] = MSG_ReadChar(&net_message) * 0.25; } if (flags & PS_WEAPONINDEX) { state->gunindex = MSG_ReadByte(&net_message); } if (flags & PS_WEAPONFRAME) { state->gunframe = MSG_ReadByte(&net_message); state->gunoffset[0] = MSG_ReadChar(&net_message)*0.25; state->gunoffset[1] = MSG_ReadChar(&net_message)*0.25; state->gunoffset[2] = MSG_ReadChar(&net_message)*0.25; state->gunangles[0] = MSG_ReadChar(&net_message)*0.25; state->gunangles[1] = MSG_ReadChar(&net_message)*0.25; state->gunangles[2] = MSG_ReadChar(&net_message)*0.25; } if (flags & PS_BLEND) { state->blend[0] = MSG_ReadByte(&net_message)*0.003921568627450980392156862745098; state->blend[1] = MSG_ReadByte(&net_message)*0.003921568627450980392156862745098; state->blend[2] = MSG_ReadByte(&net_message)*0.003921568627450980392156862745098; state->blend[3] = MSG_ReadByte(&net_message)*0.003921568627450980392156862745098; } if (flags & PS_FOV) state->fov = MSG_ReadByte(&net_message); if (flags & PS_RDFLAGS) state->rdflags = MSG_ReadByte(&net_message); // parse stats statbits = MSG_ReadLong (&net_message); for (i=0 ; i<MAX_STATS ; i++) if (statbits & (1<<i) ) state->stats[i] = MSG_ReadShort(&net_message); }