mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-07 08:21:59 +00:00
o misc little cleanups
o add plent_state_t, packet_players_t and delta_t in preparation for re-worked delta compression code. o use plent_state_t in the client.
This commit is contained in:
parent
2697671a9b
commit
d308d324cc
12 changed files with 195 additions and 177 deletions
|
@ -125,7 +125,7 @@
|
||||||
#define clc_bad 0
|
#define clc_bad 0
|
||||||
#define clc_nop 1
|
#define clc_nop 1
|
||||||
//define clc_doublemove 2
|
//define clc_doublemove 2
|
||||||
#define clc_move 3 // [[usercmd_t]
|
#define clc_move 3 // [usercmd_t]
|
||||||
#define clc_stringcmd 4 // [string] message
|
#define clc_stringcmd 4 // [string] message
|
||||||
#define clc_delta 5 // [byte] sequence number, requests delta compression of message
|
#define clc_delta 5 // [byte] sequence number, requests delta compression of message
|
||||||
#define clc_tmove 6 // teleport request, spectator only
|
#define clc_tmove 6 // teleport request, spectator only
|
||||||
|
@ -182,7 +182,7 @@
|
||||||
|
|
||||||
// if the high bit of the client to server byte is set, the low bits are
|
// if the high bit of the client to server byte is set, the low bits are
|
||||||
// client move cmd bits
|
// client move cmd bits
|
||||||
// ms and angle2 are always sent, the others are optional
|
// msec is always sent, the others are optional
|
||||||
#define CM_ANGLE1 (1<<0)
|
#define CM_ANGLE1 (1<<0)
|
||||||
#define CM_ANGLE3 (1<<1)
|
#define CM_ANGLE3 (1<<1)
|
||||||
#define CM_FORWARD (1<<2)
|
#define CM_FORWARD (1<<2)
|
||||||
|
@ -279,11 +279,10 @@
|
||||||
|
|
||||||
// entity_state_t is the information conveyed from the server
|
// entity_state_t is the information conveyed from the server
|
||||||
// in an update message
|
// in an update message
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
int number; // edict index
|
int number; // edict index
|
||||||
|
|
||||||
int flags; // nolerp, etc
|
unsigned int flags; // nolerp, etc
|
||||||
vec3_t origin;
|
vec3_t origin;
|
||||||
vec3_t angles;
|
vec3_t angles;
|
||||||
int modelindex;
|
int modelindex;
|
||||||
|
@ -292,7 +291,7 @@ typedef struct
|
||||||
int skinnum;
|
int skinnum;
|
||||||
int effects;
|
int effects;
|
||||||
|
|
||||||
// LordHavoc: Endy neglected to mark this as a QSG version 2 thingy...
|
// QSG 2
|
||||||
byte alpha;
|
byte alpha;
|
||||||
byte scale;
|
byte scale;
|
||||||
byte glow_size;
|
byte glow_size;
|
||||||
|
@ -300,17 +299,14 @@ typedef struct
|
||||||
byte colormod;
|
byte colormod;
|
||||||
} entity_state_t;
|
} entity_state_t;
|
||||||
|
|
||||||
|
|
||||||
#define MAX_PACKET_ENTITIES 64 // doesn't count nails
|
#define MAX_PACKET_ENTITIES 64 // doesn't count nails
|
||||||
#define MAX_DEMO_PACKET_ENTITIES 196 // doesn't count nails
|
#define MAX_DEMO_PACKET_ENTITIES 196 // doesn't count nails
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
int num_entities;
|
int num_entities;
|
||||||
entity_state_t *entities;
|
entity_state_t *entities;
|
||||||
} packet_entities_t;
|
} packet_entities_t;
|
||||||
|
|
||||||
typedef struct usercmd_s
|
typedef struct usercmd_s {
|
||||||
{
|
|
||||||
byte msec;
|
byte msec;
|
||||||
byte padding[3]; // make sure non-aligning compilers get it right
|
byte padding[3]; // make sure non-aligning compilers get it right
|
||||||
vec3_t angles;
|
vec3_t angles;
|
||||||
|
@ -319,4 +315,32 @@ typedef struct usercmd_s
|
||||||
byte impulse;
|
byte impulse;
|
||||||
} usercmd_t;
|
} usercmd_t;
|
||||||
|
|
||||||
|
typedef struct plent_state_s {
|
||||||
|
int number;
|
||||||
|
|
||||||
|
unsigned int flags;
|
||||||
|
vec3_t origin;
|
||||||
|
usercmd_t cmd;
|
||||||
|
vec3_t velocity;
|
||||||
|
int modelindex;
|
||||||
|
int frame;
|
||||||
|
int skinnum;
|
||||||
|
int effects;
|
||||||
|
int weaponframe;
|
||||||
|
|
||||||
|
byte msec;
|
||||||
|
|
||||||
|
// QSG 2
|
||||||
|
byte alpha;
|
||||||
|
byte scale;
|
||||||
|
byte glow_size;
|
||||||
|
byte glow_color;
|
||||||
|
byte colormod;
|
||||||
|
} plent_state_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int num_players;
|
||||||
|
plent_state_t *players;
|
||||||
|
} packet_players_t;
|
||||||
|
|
||||||
#endif//__qw_protocol_h
|
#endif//__qw_protocol_h
|
||||||
|
|
|
@ -49,29 +49,15 @@ typedef struct player_state_s {
|
||||||
|
|
||||||
double state_time; // not the same as the packet time,
|
double state_time; // not the same as the packet time,
|
||||||
// because player commands come asyncronously
|
// because player commands come asyncronously
|
||||||
usercmd_t command; // last command for prediction
|
|
||||||
|
|
||||||
vec3_t origin;
|
|
||||||
vec3_t viewangles; // only for demos, not from server
|
vec3_t viewangles; // only for demos, not from server
|
||||||
vec3_t velocity;
|
|
||||||
int weaponframe;
|
|
||||||
|
|
||||||
int number;
|
plent_state_t pls;
|
||||||
int modelindex;
|
|
||||||
int frame;
|
|
||||||
int skinnum;
|
|
||||||
int effects;
|
|
||||||
|
|
||||||
int flags; // dead, gib, etc
|
|
||||||
|
|
||||||
float waterjumptime;
|
float waterjumptime;
|
||||||
int onground; // -1 = in air, else pmove entity number
|
int onground; // -1 = in air, else pmove entity number
|
||||||
int oldbuttons;
|
int oldbuttons;
|
||||||
int oldonground;
|
int oldonground;
|
||||||
|
|
||||||
// QSG2
|
|
||||||
byte glow_size;
|
|
||||||
byte glow_color;
|
|
||||||
} player_state_t;
|
} player_state_t;
|
||||||
|
|
||||||
#undef MAX_SCOREBOARDNAME
|
#undef MAX_SCOREBOARDNAME
|
||||||
|
|
|
@ -56,8 +56,7 @@ typedef enum {
|
||||||
// some qc commands are only valid before the server has finished
|
// some qc commands are only valid before the server has finished
|
||||||
// initializing (precache commands, static sounds / objects, etc)
|
// initializing (precache commands, static sounds / objects, etc)
|
||||||
|
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
qboolean active; // false when server is going down
|
qboolean active; // false when server is going down
|
||||||
server_state_t state; // precache commands are only valid during load
|
server_state_t state; // precache commands are only valid during load
|
||||||
|
|
||||||
|
@ -118,8 +117,7 @@ typedef struct
|
||||||
|
|
||||||
#define NUM_SPAWN_PARMS 16
|
#define NUM_SPAWN_PARMS 16
|
||||||
|
|
||||||
typedef enum
|
typedef enum {
|
||||||
{
|
|
||||||
cs_free, // can be reused for a new connection
|
cs_free, // can be reused for a new connection
|
||||||
cs_server, // client is grabbed by the server for its own purposes
|
cs_server, // client is grabbed by the server for its own purposes
|
||||||
cs_zombie, // client has been disconnected, but don't reuse
|
cs_zombie, // client has been disconnected, but don't reuse
|
||||||
|
@ -128,16 +126,31 @@ typedef enum
|
||||||
cs_spawned // client is fully in game
|
cs_spawned // client is fully in game
|
||||||
} sv_client_state_t;
|
} sv_client_state_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
// received from client
|
// received from client
|
||||||
|
|
||||||
// reply
|
// reply
|
||||||
double senttime;
|
double senttime;
|
||||||
float ping_time;
|
float ping_time;
|
||||||
packet_entities_t entities;
|
packet_entities_t entities;
|
||||||
|
packet_players_t players;
|
||||||
} client_frame_t;
|
} client_frame_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
dt_pvs_normal,
|
||||||
|
dt_pvs_fat,
|
||||||
|
dt_pvs_none,
|
||||||
|
} delta_pvs_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
delta_pvs_t pvs;
|
||||||
|
int delta_sequence;
|
||||||
|
int cur_frame;
|
||||||
|
int out_frame;
|
||||||
|
struct client_s *client;
|
||||||
|
client_frame_t frames[UPDATE_BACKUP]; // updates can be deltad from here
|
||||||
|
} delta_t;
|
||||||
|
|
||||||
#define MAX_BACK_BUFFERS 8
|
#define MAX_BACK_BUFFERS 8
|
||||||
#define MAX_STUFFTEXT 512
|
#define MAX_STUFFTEXT 512
|
||||||
#define MAX_NAME 32
|
#define MAX_NAME 32
|
||||||
|
@ -148,8 +161,7 @@ typedef enum {
|
||||||
ft_cuff, // cuff penatly save over disconnect
|
ft_cuff, // cuff penatly save over disconnect
|
||||||
} filtertype_t;
|
} filtertype_t;
|
||||||
|
|
||||||
typedef struct client_s
|
typedef struct client_s {
|
||||||
{
|
|
||||||
sv_client_state_t state;
|
sv_client_state_t state;
|
||||||
int ping; // fake ping for server clients
|
int ping; // fake ping for server clients
|
||||||
qboolean prespawned;
|
qboolean prespawned;
|
||||||
|
@ -158,10 +170,10 @@ typedef struct client_s
|
||||||
int spectator; // non-interactive
|
int spectator; // non-interactive
|
||||||
|
|
||||||
qboolean sendinfo; // at end of frame, send info to all
|
qboolean sendinfo; // at end of frame, send info to all
|
||||||
// this prevents malicious multiple broadcasts
|
// this prevents malicious multiple
|
||||||
|
// broadcasts
|
||||||
float lastnametime; // time of last name change
|
float lastnametime; // time of last name change
|
||||||
int lastnamecount; // time of last name change
|
int lastnamecount; // time of last name change
|
||||||
unsigned int checksum; // checksum for calcs
|
|
||||||
qboolean drop; // lose this guy next opportunity
|
qboolean drop; // lose this guy next opportunity
|
||||||
int lossage; // loss percentage
|
int lossage; // loss percentage
|
||||||
|
|
||||||
|
@ -214,8 +226,6 @@ typedef struct client_s
|
||||||
int whensaidhead; // Head value for floodprots
|
int whensaidhead; // Head value for floodprots
|
||||||
double lockedtill;
|
double lockedtill;
|
||||||
|
|
||||||
qboolean upgradewarn; // did we warn him?
|
|
||||||
|
|
||||||
QFile *upload;
|
QFile *upload;
|
||||||
struct dstring_s *uploadfn;
|
struct dstring_s *uploadfn;
|
||||||
netadr_t snap_from;
|
netadr_t snap_from;
|
||||||
|
@ -243,8 +253,7 @@ extern qboolean rcon_from_user; // current command is a from a user
|
||||||
|
|
||||||
|
|
||||||
#define STATFRAMES 100
|
#define STATFRAMES 100
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
double active;
|
double active;
|
||||||
double idle;
|
double idle;
|
||||||
double demo;
|
double demo;
|
||||||
|
@ -262,15 +271,13 @@ typedef struct
|
||||||
// out before legitimate users connected
|
// out before legitimate users connected
|
||||||
#define MAX_CHALLENGES 1024
|
#define MAX_CHALLENGES 1024
|
||||||
|
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
netadr_t adr;
|
netadr_t adr;
|
||||||
int challenge;
|
int challenge;
|
||||||
int time;
|
int time;
|
||||||
} challenge_t;
|
} challenge_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
int spawncount; // number of servers spawned since start,
|
int spawncount; // number of servers spawned since start,
|
||||||
// used to check late spawns
|
// used to check late spawns
|
||||||
client_t clients[MAX_CLIENTS];
|
client_t clients[MAX_CLIENTS];
|
||||||
|
@ -300,8 +307,7 @@ typedef struct
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
// DoSflood protection
|
// DoSflood protection
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
netadr_t adr;
|
netadr_t adr;
|
||||||
double issued;
|
double issued;
|
||||||
int floodcount;
|
int floodcount;
|
||||||
|
@ -309,8 +315,7 @@ typedef struct
|
||||||
double firstseen;
|
double firstseen;
|
||||||
} flood_t;
|
} flood_t;
|
||||||
|
|
||||||
typedef enum
|
typedef enum {
|
||||||
{
|
|
||||||
FLOOD_PING,
|
FLOOD_PING,
|
||||||
FLOOD_LOG,
|
FLOOD_LOG,
|
||||||
FLOOD_CONNECT,
|
FLOOD_CONNECT,
|
||||||
|
|
|
@ -229,23 +229,23 @@ Cam_TryFlyby (player_state_t * self, player_state_t * player, vec3_t vec,
|
||||||
vectoangles (vec, v);
|
vectoangles (vec, v);
|
||||||
VectorCopy (v, pmove.angles);
|
VectorCopy (v, pmove.angles);
|
||||||
VectorNormalize (vec);
|
VectorNormalize (vec);
|
||||||
VectorMultAdd (player->origin, 800, vec, v);
|
VectorMultAdd (player->pls.origin, 800, vec, v);
|
||||||
// v is endpos
|
// v is endpos
|
||||||
// fake a player move
|
// fake a player move
|
||||||
trace = Cam_DoTrace (player->origin, v);
|
trace = Cam_DoTrace (player->pls.origin, v);
|
||||||
if ( /* trace.inopen || */ trace.inwater)
|
if ( /* trace.inopen || */ trace.inwater)
|
||||||
return 9999;
|
return 9999;
|
||||||
VectorCopy (trace.endpos, vec);
|
VectorCopy (trace.endpos, vec);
|
||||||
len = VectorDistance (trace.endpos, player->origin);
|
len = VectorDistance (trace.endpos, player->pls.origin);
|
||||||
|
|
||||||
if (len < 32 || len > 800)
|
if (len < 32 || len > 800)
|
||||||
return 9999;
|
return 9999;
|
||||||
if (checkvis) {
|
if (checkvis) {
|
||||||
trace = Cam_DoTrace (self->origin, vec);
|
trace = Cam_DoTrace (self->pls.origin, vec);
|
||||||
if (trace.fraction != 1 || trace.inwater)
|
if (trace.fraction != 1 || trace.inwater)
|
||||||
return 9999;
|
return 9999;
|
||||||
|
|
||||||
len = VectorDistance (trace.endpos, self->origin);
|
len = VectorDistance (trace.endpos, self->pls.origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
|
@ -259,11 +259,11 @@ Cam_IsVisible (player_state_t * player, vec3_t vec)
|
||||||
trace_t trace;
|
trace_t trace;
|
||||||
vec3_t v;
|
vec3_t v;
|
||||||
|
|
||||||
trace = Cam_DoTrace (player->origin, vec);
|
trace = Cam_DoTrace (player->pls.origin, vec);
|
||||||
if (trace.fraction != 1 || /* trace.inopen || */ trace.inwater)
|
if (trace.fraction != 1 || /* trace.inopen || */ trace.inwater)
|
||||||
return false;
|
return false;
|
||||||
// check distance, don't let the player get too far away or too close
|
// check distance, don't let the player get too far away or too close
|
||||||
VectorSubtract (player->origin, vec, v);
|
VectorSubtract (player->pls.origin, vec, v);
|
||||||
d = VectorLength (v);
|
d = VectorLength (v);
|
||||||
|
|
||||||
return (d > 16.0);
|
return (d > 16.0);
|
||||||
|
@ -451,22 +451,22 @@ Cam_Track (usercmd_t *cmd)
|
||||||
cmd->forwardmove = cmd->sidemove = cmd->upmove = 0;
|
cmd->forwardmove = cmd->sidemove = cmd->upmove = 0;
|
||||||
|
|
||||||
VectorCopy (player->viewangles, cl.viewangles);
|
VectorCopy (player->viewangles, cl.viewangles);
|
||||||
VectorCopy (player->origin, desired_position);
|
VectorCopy (player->pls.origin, desired_position);
|
||||||
if (memcmp (&desired_position, &self->origin,
|
if (memcmp (&desired_position, &self->pls.origin,
|
||||||
sizeof (desired_position)) != 0) {
|
sizeof (desired_position)) != 0) {
|
||||||
if (!cls.demoplayback) {
|
if (!cls.demoplayback) {
|
||||||
MSG_WriteByte (&cls.netchan.message, clc_tmove);
|
MSG_WriteByte (&cls.netchan.message, clc_tmove);
|
||||||
MSG_WriteCoordV (&cls.netchan.message, desired_position);
|
MSG_WriteCoordV (&cls.netchan.message, desired_position);
|
||||||
}
|
}
|
||||||
// move there locally immediately
|
// move there locally immediately
|
||||||
VectorCopy (desired_position, self->origin);
|
VectorCopy (desired_position, self->pls.origin);
|
||||||
}
|
}
|
||||||
self->weaponframe = player->weaponframe;
|
self->pls.weaponframe = player->pls.weaponframe;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Ok, move to our desired position and set our angles to view
|
// Ok, move to our desired position and set our angles to view
|
||||||
// the player
|
// the player
|
||||||
VectorSubtract (desired_position, self->origin, vec);
|
VectorSubtract (desired_position, self->pls.origin, vec);
|
||||||
len = VectorLength (vec);
|
len = VectorLength (vec);
|
||||||
cmd->forwardmove = cmd->sidemove = cmd->upmove = 0;
|
cmd->forwardmove = cmd->sidemove = cmd->upmove = 0;
|
||||||
if (len > 16) { // close enough?
|
if (len > 16) { // close enough?
|
||||||
|
@ -476,9 +476,9 @@ Cam_Track (usercmd_t *cmd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// move there locally immediately
|
// move there locally immediately
|
||||||
VectorCopy (desired_position, self->origin);
|
VectorCopy (desired_position, self->pls.origin);
|
||||||
|
|
||||||
VectorSubtract (player->origin, desired_position, vec);
|
VectorSubtract (player->pls.origin, desired_position, vec);
|
||||||
vectoangles (vec, cl.viewangles);
|
vectoangles (vec, cl.viewangles);
|
||||||
cl.viewangles[0] = -cl.viewangles[0];
|
cl.viewangles[0] = -cl.viewangles[0];
|
||||||
}
|
}
|
||||||
|
@ -531,7 +531,7 @@ Cam_SetView (void)
|
||||||
player = frame->playerstate + spec_track;
|
player = frame->playerstate + spec_track;
|
||||||
self = frame->playerstate + cl.playernum;
|
self = frame->playerstate + cl.playernum;
|
||||||
|
|
||||||
VectorSubtract (player->origin, cl.simorg, vec);
|
VectorSubtract (player->pls.origin, cl.simorg, vec);
|
||||||
if (cam_forceview) {
|
if (cam_forceview) {
|
||||||
cam_forceview = false;
|
cam_forceview = false;
|
||||||
vectoangles (vec, cam_viewangles);
|
vectoangles (vec, cam_viewangles);
|
||||||
|
@ -570,7 +570,7 @@ Cam_FinishMove (usercmd_t *cmd)
|
||||||
player = frame->playerstate + spec_track;
|
player = frame->playerstate + spec_track;
|
||||||
self = frame->playerstate + cl.playernum;
|
self = frame->playerstate + cl.playernum;
|
||||||
|
|
||||||
VectorSubtract (player->origin, self->origin, vec);
|
VectorSubtract (player->pls.origin, self->pls.origin, vec);
|
||||||
if (cam_forceview) {
|
if (cam_forceview) {
|
||||||
cam_forceview = false;
|
cam_forceview = false;
|
||||||
vectoangles (vec, cam_viewangles);
|
vectoangles (vec, cam_viewangles);
|
||||||
|
|
|
@ -675,7 +675,7 @@ CL_ParsePlayerinfo (void)
|
||||||
info = &cl.players[num];
|
info = &cl.players[num];
|
||||||
state = &cl.frames[parsecountmod].playerstate[num];
|
state = &cl.frames[parsecountmod].playerstate[num];
|
||||||
|
|
||||||
state->number = num;
|
state->pls.number = num;
|
||||||
|
|
||||||
if (cls.demoplayback2) {
|
if (cls.demoplayback2) {
|
||||||
if (info->prevcount > cl.parsecount || !cl.parsecount) {
|
if (info->prevcount > cl.parsecount || !cl.parsecount) {
|
||||||
|
@ -699,35 +699,35 @@ CL_ParsePlayerinfo (void)
|
||||||
memcpy (state, prevstate, sizeof (player_state_t));
|
memcpy (state, prevstate, sizeof (player_state_t));
|
||||||
|
|
||||||
flags = MSG_ReadShort (net_message);
|
flags = MSG_ReadShort (net_message);
|
||||||
state->flags = TranslateFlags (flags);
|
state->pls.flags = TranslateFlags (flags);
|
||||||
state->messagenum = cl.parsecount;
|
state->messagenum = cl.parsecount;
|
||||||
state->command.msec = 0;
|
state->pls.cmd.msec = 0;
|
||||||
state->frame = MSG_ReadByte (net_message);
|
state->pls.frame = MSG_ReadByte (net_message);
|
||||||
state->state_time = parsecounttime;
|
state->state_time = parsecounttime;
|
||||||
for (i=0; i <3; i++)
|
for (i=0; i <3; i++)
|
||||||
if (flags & (DF_ORIGIN << i))
|
if (flags & (DF_ORIGIN << i))
|
||||||
state->origin[i] = MSG_ReadCoord (net_message);
|
state->pls.origin[i] = MSG_ReadCoord (net_message);
|
||||||
for (i=0; i <3; i++)
|
for (i=0; i <3; i++)
|
||||||
if (flags & (DF_ANGLES << i))
|
if (flags & (DF_ANGLES << i))
|
||||||
state->command.angles[i] = MSG_ReadAngle16 (net_message);
|
state->pls.cmd.angles[i] = MSG_ReadAngle16 (net_message);
|
||||||
if (flags & DF_MODEL)
|
if (flags & DF_MODEL)
|
||||||
state->modelindex = MSG_ReadByte (net_message);
|
state->pls.modelindex = MSG_ReadByte (net_message);
|
||||||
if (flags & DF_SKINNUM)
|
if (flags & DF_SKINNUM)
|
||||||
state->skinnum = MSG_ReadByte (net_message);
|
state->pls.skinnum = MSG_ReadByte (net_message);
|
||||||
if (flags & DF_EFFECTS)
|
if (flags & DF_EFFECTS)
|
||||||
state->effects = MSG_ReadByte (net_message);
|
state->pls.effects = MSG_ReadByte (net_message);
|
||||||
if (flags & DF_WEAPONFRAME)
|
if (flags & DF_WEAPONFRAME)
|
||||||
state->weaponframe = MSG_ReadByte (net_message);
|
state->pls.weaponframe = MSG_ReadByte (net_message);
|
||||||
VectorCopy (state->command.angles, state->viewangles);
|
VectorCopy (state->pls.cmd.angles, state->viewangles);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
flags = state->flags = MSG_ReadShort (net_message);
|
flags = state->pls.flags = MSG_ReadShort (net_message);
|
||||||
|
|
||||||
state->messagenum = cl.parsecount;
|
state->messagenum = cl.parsecount;
|
||||||
MSG_ReadCoordV (net_message, state->origin);
|
MSG_ReadCoordV (net_message, state->pls.origin);
|
||||||
|
|
||||||
state->frame = MSG_ReadByte (net_message);
|
state->pls.frame = MSG_ReadByte (net_message);
|
||||||
|
|
||||||
// the other player's last move was likely some time
|
// the other player's last move was likely some time
|
||||||
// before the packet was sent out, so accurately track
|
// before the packet was sent out, so accurately track
|
||||||
|
@ -739,36 +739,36 @@ CL_ParsePlayerinfo (void)
|
||||||
state->state_time = parsecounttime;
|
state->state_time = parsecounttime;
|
||||||
|
|
||||||
if (flags & PF_COMMAND)
|
if (flags & PF_COMMAND)
|
||||||
MSG_ReadDeltaUsercmd (net_message, &nullcmd, &state->command);
|
MSG_ReadDeltaUsercmd (net_message, &nullcmd, &state->pls.cmd);
|
||||||
|
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
if (flags & (PF_VELOCITY1 << i))
|
if (flags & (PF_VELOCITY1 << i))
|
||||||
state->velocity[i] = MSG_ReadShort (net_message);
|
state->pls.velocity[i] = MSG_ReadShort (net_message);
|
||||||
else
|
else
|
||||||
state->velocity[i] = 0;
|
state->pls.velocity[i] = 0;
|
||||||
}
|
}
|
||||||
if (flags & PF_MODEL)
|
if (flags & PF_MODEL)
|
||||||
i = MSG_ReadByte (net_message);
|
i = MSG_ReadByte (net_message);
|
||||||
else
|
else
|
||||||
i = cl_playerindex;
|
i = cl_playerindex;
|
||||||
state->modelindex = i;
|
state->pls.modelindex = i;
|
||||||
|
|
||||||
if (flags & PF_SKINNUM)
|
if (flags & PF_SKINNUM)
|
||||||
state->skinnum = MSG_ReadByte (net_message);
|
state->pls.skinnum = MSG_ReadByte (net_message);
|
||||||
else
|
else
|
||||||
state->skinnum = 0;
|
state->pls.skinnum = 0;
|
||||||
|
|
||||||
if (flags & PF_EFFECTS)
|
if (flags & PF_EFFECTS)
|
||||||
state->effects = MSG_ReadByte (net_message);
|
state->pls.effects = MSG_ReadByte (net_message);
|
||||||
else
|
else
|
||||||
state->effects = 0;
|
state->pls.effects = 0;
|
||||||
|
|
||||||
if (flags & PF_WEAPONFRAME)
|
if (flags & PF_WEAPONFRAME)
|
||||||
state->weaponframe = MSG_ReadByte (net_message);
|
state->pls.weaponframe = MSG_ReadByte (net_message);
|
||||||
else
|
else
|
||||||
state->weaponframe = 0;
|
state->pls.weaponframe = 0;
|
||||||
|
|
||||||
VectorCopy (state->command.angles, state->viewangles);
|
VectorCopy (state->pls.cmd.angles, state->viewangles);
|
||||||
|
|
||||||
if (cl.stdver >= 2.0 && (flags & PF_QF)) {
|
if (cl.stdver >= 2.0 && (flags & PF_QF)) {
|
||||||
// QSG2
|
// QSG2
|
||||||
|
@ -787,13 +787,13 @@ CL_ParsePlayerinfo (void)
|
||||||
ent->scale = val / 16.0;
|
ent->scale = val / 16.0;
|
||||||
}
|
}
|
||||||
if (bits & PF_EFFECTS2) {
|
if (bits & PF_EFFECTS2) {
|
||||||
state->effects |= MSG_ReadByte (net_message) << 8;
|
state->pls.effects |= MSG_ReadByte (net_message) << 8;
|
||||||
}
|
}
|
||||||
if (bits & PF_GLOWSIZE) {
|
if (bits & PF_GLOWSIZE) {
|
||||||
state->glow_size = MSG_ReadByte (net_message);
|
state->pls.glow_size = MSG_ReadByte (net_message);
|
||||||
}
|
}
|
||||||
if (bits & PF_GLOWCOLOR) {
|
if (bits & PF_GLOWCOLOR) {
|
||||||
state->glow_color = MSG_ReadByte (net_message);
|
state->pls.glow_color = MSG_ReadByte (net_message);
|
||||||
}
|
}
|
||||||
if (bits & PF_COLORMOD) {
|
if (bits & PF_COLORMOD) {
|
||||||
val = MSG_ReadByte (net_message);
|
val = MSG_ReadByte (net_message);
|
||||||
|
@ -806,7 +806,7 @@ CL_ParsePlayerinfo (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (bits & PF_FRAME2) {
|
if (bits & PF_FRAME2) {
|
||||||
state->frame |= MSG_ReadByte (net_message) << 8;
|
state->pls.frame |= MSG_ReadByte (net_message) << 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -900,37 +900,38 @@ CL_LinkPlayers (void)
|
||||||
r_player_entity = &cl_player_ents[j];
|
r_player_entity = &cl_player_ents[j];
|
||||||
clientplayer = true;
|
clientplayer = true;
|
||||||
} else {
|
} else {
|
||||||
VectorCopy (state->origin, org);
|
VectorCopy (state->pls.origin, org);
|
||||||
clientplayer = false;
|
clientplayer = false;
|
||||||
}
|
}
|
||||||
CL_NewDlight (j + 1, org, state->effects, state->glow_size,
|
CL_NewDlight (j + 1, org, state->pls.effects, state->pls.glow_size,
|
||||||
state->glow_color);
|
state->pls.glow_color);
|
||||||
|
|
||||||
// Draw player?
|
// Draw player?
|
||||||
if (!Cam_DrawPlayer (j))
|
if (!Cam_DrawPlayer (j))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!state->modelindex)
|
if (!state->pls.modelindex)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Hack hack hack
|
// Hack hack hack
|
||||||
if (cl_deadbodyfilter->int_val && state->modelindex == cl_playerindex
|
if (cl_deadbodyfilter->int_val
|
||||||
&& ((i = state->frame) == 49 || i == 60 || i == 69 || i == 84
|
&& state->pls.modelindex == cl_playerindex
|
||||||
|
&& ((i = state->pls.frame) == 49 || i == 60 || i == 69 || i == 84
|
||||||
|| i == 93 || i == 102))
|
|| i == 93 || i == 102))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// only predict half the move to minimize overruns
|
// only predict half the move to minimize overruns
|
||||||
msec = 500 * (playertime - state->state_time);
|
msec = 500 * (playertime - state->state_time);
|
||||||
if (msec <= 0 || (!cl_predict_players->int_val) || cls.demoplayback2) {
|
if (msec <= 0 || (!cl_predict_players->int_val) || cls.demoplayback2) {
|
||||||
VectorCopy (state->origin, ent->origin);
|
VectorCopy (state->pls.origin, ent->origin);
|
||||||
} else { // predict players movement
|
} else { // predict players movement
|
||||||
state->command.msec = msec = min (msec, 255);
|
state->pls.cmd.msec = msec = min (msec, 255);
|
||||||
|
|
||||||
oldphysent = pmove.numphysent;
|
oldphysent = pmove.numphysent;
|
||||||
CL_SetSolidPlayers (j);
|
CL_SetSolidPlayers (j);
|
||||||
CL_PredictUsercmd (state, &exact, &state->command, clientplayer);
|
CL_PredictUsercmd (state, &exact, &state->pls.cmd, clientplayer);
|
||||||
pmove.numphysent = oldphysent;
|
pmove.numphysent = oldphysent;
|
||||||
VectorCopy (exact.origin, ent->origin);
|
VectorCopy (exact.pls.origin, ent->origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
// angles
|
// angles
|
||||||
|
@ -942,17 +943,18 @@ CL_LinkPlayers (void)
|
||||||
ent->angles[PITCH] = -state->viewangles[PITCH] / 3.0;
|
ent->angles[PITCH] = -state->viewangles[PITCH] / 3.0;
|
||||||
ent->angles[YAW] = state->viewangles[YAW];
|
ent->angles[YAW] = state->viewangles[YAW];
|
||||||
}
|
}
|
||||||
ent->angles[ROLL] = V_CalcRoll (ent->angles, state->velocity) * 4.0;
|
ent->angles[ROLL] = V_CalcRoll (ent->angles,
|
||||||
|
state->pls.velocity) * 4.0;
|
||||||
|
|
||||||
ent->model = cl.model_precache[state->modelindex];
|
ent->model = cl.model_precache[state->pls.modelindex];
|
||||||
ent->frame = state->frame;
|
ent->frame = state->pls.frame;
|
||||||
ent->colormap = info->translations;
|
ent->colormap = info->translations;
|
||||||
ent->skinnum = state->skinnum;
|
ent->skinnum = state->pls.skinnum;
|
||||||
|
|
||||||
ent->min_light = 0;
|
ent->min_light = 0;
|
||||||
ent->fullbright = 0;
|
ent->fullbright = 0;
|
||||||
|
|
||||||
if (state->modelindex == cl_playerindex) { //XXX
|
if (state->pls.modelindex == cl_playerindex) { //XXX
|
||||||
// use custom skin
|
// use custom skin
|
||||||
if (!info->skin)
|
if (!info->skin)
|
||||||
Skin_Find (info);
|
Skin_Find (info);
|
||||||
|
@ -976,9 +978,9 @@ CL_LinkPlayers (void)
|
||||||
// stuff entity in map
|
// stuff entity in map
|
||||||
R_AddEfrags (ent);
|
R_AddEfrags (ent);
|
||||||
|
|
||||||
if (state->effects & EF_FLAG1)
|
if (state->pls.effects & EF_FLAG1)
|
||||||
CL_AddFlagModels (ent, 0, j);
|
CL_AddFlagModels (ent, 0, j);
|
||||||
else if (state->effects & EF_FLAG2)
|
else if (state->pls.effects & EF_FLAG2)
|
||||||
CL_AddFlagModels (ent, 1, j);
|
CL_AddFlagModels (ent, 1, j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1066,30 +1068,30 @@ CL_SetUpPlayerPrediction (qboolean dopred)
|
||||||
if (state->messagenum != cl.parsecount)
|
if (state->messagenum != cl.parsecount)
|
||||||
continue; // not present this frame
|
continue; // not present this frame
|
||||||
|
|
||||||
if (!state->modelindex)
|
if (!state->pls.modelindex)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
pplayer->active = true;
|
pplayer->active = true;
|
||||||
pplayer->flags = state->flags;
|
pplayer->flags = state->pls.flags;
|
||||||
|
|
||||||
// note that the local player is special, since he moves locally
|
// note that the local player is special, since he moves locally
|
||||||
// we use his last predicted postition
|
// we use his last predicted postition
|
||||||
if (j == cl.playernum) {
|
if (j == cl.playernum) {
|
||||||
VectorCopy (cl.frames[cls.netchan.outgoing_sequence & UPDATE_MASK].
|
VectorCopy (cl.frames[cls.netchan.outgoing_sequence & UPDATE_MASK].
|
||||||
playerstate[cl.playernum].origin, pplayer->origin);
|
playerstate[cl.playernum].pls.origin, pplayer->origin);
|
||||||
} else {
|
} else {
|
||||||
// only predict half the move to minimize overruns
|
// only predict half the move to minimize overruns
|
||||||
msec = 500 * (playertime - state->state_time);
|
msec = 500 * (playertime - state->state_time);
|
||||||
if (msec <= 0 || !dopred) {
|
if (msec <= 0 || !dopred) {
|
||||||
VectorCopy (state->origin, pplayer->origin);
|
VectorCopy (state->pls.origin, pplayer->origin);
|
||||||
// Con_DPrintf ("nopredict\n");
|
// Con_DPrintf ("nopredict\n");
|
||||||
} else {
|
} else {
|
||||||
// predict players movement
|
// predict players movement
|
||||||
state->command.msec = msec = min (msec, 255);
|
state->pls.cmd.msec = msec = min (msec, 255);
|
||||||
// Con_DPrintf ("predict: %i\n", msec);
|
// Con_DPrintf ("predict: %i\n", msec);
|
||||||
|
|
||||||
CL_PredictUsercmd (state, &exact, &state->command, false);
|
CL_PredictUsercmd (state, &exact, &state->pls.cmd, false);
|
||||||
VectorCopy (exact.origin, pplayer->origin);
|
VectorCopy (exact.pls.origin, pplayer->origin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1548,8 +1548,8 @@ Host_Frame (float time)
|
||||||
oldself = &cl.frames[(cls.netchan.outgoing_sequence - 1)
|
oldself = &cl.frames[(cls.netchan.outgoing_sequence - 1)
|
||||||
& UPDATE_MASK].playerstate[cl.playernum];
|
& UPDATE_MASK].playerstate[cl.playernum];
|
||||||
self->messagenum = cl.parsecount;
|
self->messagenum = cl.parsecount;
|
||||||
VectorCopy (oldself->origin, self->origin);
|
VectorCopy (oldself->pls.origin, self->pls.origin);
|
||||||
VectorCopy (oldself->velocity, self->velocity);
|
VectorCopy (oldself->pls.velocity, self->pls.velocity);
|
||||||
VectorCopy (oldself->viewangles, self->viewangles);
|
VectorCopy (oldself->viewangles, self->viewangles);
|
||||||
|
|
||||||
CL_ParseClientdata ();
|
CL_ParseClientdata ();
|
||||||
|
|
|
@ -1171,7 +1171,7 @@ CL_MuzzleFlash (void)
|
||||||
else
|
else
|
||||||
AngleVectors (pl->viewangles, fv, rv, uv);
|
AngleVectors (pl->viewangles, fv, rv, uv);
|
||||||
|
|
||||||
VectorMultAdd (pl->origin, 18, fv, dl->origin);
|
VectorMultAdd (pl->pls.origin, 18, fv, dl->origin);
|
||||||
dl->radius = 200 + (rand () & 31);
|
dl->radius = 200 + (rand () & 31);
|
||||||
dl->die = cl.time + 0.1;
|
dl->die = cl.time + 0.1;
|
||||||
dl->minlight = 32;
|
dl->minlight = 32;
|
||||||
|
|
|
@ -53,10 +53,10 @@ CL_PredictUsercmd (player_state_t * from, player_state_t * to, usercmd_t *u,
|
||||||
qboolean clientplayer)
|
qboolean clientplayer)
|
||||||
{
|
{
|
||||||
if (!clientplayer) {
|
if (!clientplayer) {
|
||||||
if (VectorIsZero (from->velocity)) {
|
if (VectorIsZero (from->pls.velocity)) {
|
||||||
VectorCopy (from->origin, to->origin);
|
VectorCopy (from->pls.origin, to->pls.origin);
|
||||||
VectorCopy (u->angles, to->viewangles);
|
VectorCopy (u->angles, to->viewangles);
|
||||||
VectorCopy (from->velocity, to->velocity);
|
VectorCopy (from->pls.velocity, to->pls.velocity);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -74,9 +74,9 @@ CL_PredictUsercmd (player_state_t * from, player_state_t * to, usercmd_t *u,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
VectorCopy (from->origin, pmove.origin);
|
VectorCopy (from->pls.origin, pmove.origin);
|
||||||
VectorCopy (u->angles, pmove.angles);
|
VectorCopy (u->angles, pmove.angles);
|
||||||
VectorCopy (from->velocity, pmove.velocity);
|
VectorCopy (from->pls.velocity, pmove.velocity);
|
||||||
|
|
||||||
pmove.oldbuttons = from->oldbuttons;
|
pmove.oldbuttons = from->oldbuttons;
|
||||||
pmove.oldonground = from->oldonground;
|
pmove.oldonground = from->oldonground;
|
||||||
|
@ -94,11 +94,11 @@ CL_PredictUsercmd (player_state_t * from, player_state_t * to, usercmd_t *u,
|
||||||
to->waterjumptime = pmove.waterjumptime;
|
to->waterjumptime = pmove.waterjumptime;
|
||||||
to->oldbuttons = pmove.oldbuttons; // Tonik
|
to->oldbuttons = pmove.oldbuttons; // Tonik
|
||||||
to->oldonground = pmove.oldonground;
|
to->oldonground = pmove.oldonground;
|
||||||
VectorCopy (pmove.origin, to->origin);
|
VectorCopy (pmove.origin, to->pls.origin);
|
||||||
VectorCopy (pmove.angles, to->viewangles);
|
VectorCopy (pmove.angles, to->viewangles);
|
||||||
VectorCopy (pmove.velocity, to->velocity);
|
VectorCopy (pmove.velocity, to->pls.velocity);
|
||||||
to->onground = onground;
|
to->onground = onground;
|
||||||
to->weaponframe = from->weaponframe;
|
to->pls.weaponframe = from->pls.weaponframe;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -151,8 +151,8 @@ CL_PredictMove (void)
|
||||||
check_onserver ();
|
check_onserver ();
|
||||||
|
|
||||||
if (!cl_predict->int_val) {
|
if (!cl_predict->int_val) {
|
||||||
VectorCopy (from->playerstate[cl.playernum].velocity, cl.simvel);
|
VectorCopy (from->playerstate[cl.playernum].pls.velocity, cl.simvel);
|
||||||
VectorCopy (from->playerstate[cl.playernum].origin, cl.simorg);
|
VectorCopy (from->playerstate[cl.playernum].pls.origin, cl.simorg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,21 +188,21 @@ CL_PredictMove (void)
|
||||||
(to->senttime - from->senttime), 1);
|
(to->senttime - from->senttime), 1);
|
||||||
|
|
||||||
for (i = 0; i < 3; i++)
|
for (i = 0; i < 3; i++)
|
||||||
if (fabs (from->playerstate[cl.playernum].origin[i] -
|
if (fabs (from->playerstate[cl.playernum].pls.origin[i] -
|
||||||
to->playerstate[cl.playernum].origin[i]) > 128) {
|
to->playerstate[cl.playernum].pls.origin[i]) > 128) {
|
||||||
// teleported, so don't lerp
|
// teleported, so don't lerp
|
||||||
VectorCopy (to->playerstate[cl.playernum].velocity, cl.simvel);
|
VectorCopy (to->playerstate[cl.playernum].pls.velocity, cl.simvel);
|
||||||
VectorCopy (to->playerstate[cl.playernum].origin, cl.simorg);
|
VectorCopy (to->playerstate[cl.playernum].pls.origin, cl.simorg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
cl.simorg[i] = from->playerstate[cl.playernum].origin[i] +
|
cl.simorg[i] = from->playerstate[cl.playernum].pls.origin[i] +
|
||||||
f * (to->playerstate[cl.playernum].origin[i] -
|
f * (to->playerstate[cl.playernum].pls.origin[i] -
|
||||||
from->playerstate[cl.playernum].origin[i]);
|
from->playerstate[cl.playernum].pls.origin[i]);
|
||||||
cl.simvel[i] = from->playerstate[cl.playernum].velocity[i] +
|
cl.simvel[i] = from->playerstate[cl.playernum].pls.velocity[i] +
|
||||||
f * (to->playerstate[cl.playernum].velocity[i] -
|
f * (to->playerstate[cl.playernum].pls.velocity[i] -
|
||||||
from->playerstate[cl.playernum].velocity[i]);
|
from->playerstate[cl.playernum].pls.velocity[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -627,14 +627,14 @@ V_CalcRefdef (void)
|
||||||
V_CalcViewRoll ();
|
V_CalcViewRoll ();
|
||||||
V_AddIdle ();
|
V_AddIdle ();
|
||||||
|
|
||||||
if (view_message->flags & PF_GIB)
|
if (view_message->pls.flags & PF_GIB)
|
||||||
r_refdef.vieworg[2] += 8; // gib view height
|
r_refdef.vieworg[2] += 8; // gib view height
|
||||||
else if (view_message->flags & PF_DEAD)
|
else if (view_message->pls.flags & PF_DEAD)
|
||||||
r_refdef.vieworg[2] -= 16; // corpse view height
|
r_refdef.vieworg[2] -= 16; // corpse view height
|
||||||
else
|
else
|
||||||
r_refdef.vieworg[2] += zofs; // view height
|
r_refdef.vieworg[2] += zofs; // view height
|
||||||
|
|
||||||
if (view_message->flags & PF_DEAD) // PF_GIB will also set PF_DEAD
|
if (view_message->pls.flags & PF_DEAD) // PF_GIB will also set PF_DEAD
|
||||||
r_refdef.viewangles[ROLL] = 80; // dead view angle
|
r_refdef.viewangles[ROLL] = 80; // dead view angle
|
||||||
|
|
||||||
// offsets
|
// offsets
|
||||||
|
@ -668,11 +668,11 @@ V_CalcRefdef (void)
|
||||||
else if (scr_viewsize->int_val == 80)
|
else if (scr_viewsize->int_val == 80)
|
||||||
view->origin[2] += 0.5;
|
view->origin[2] += 0.5;
|
||||||
|
|
||||||
if (view_message->flags & (PF_GIB | PF_DEAD))
|
if (view_message->pls.flags & (PF_GIB | PF_DEAD))
|
||||||
view->model = NULL;
|
view->model = NULL;
|
||||||
else
|
else
|
||||||
view->model = cl.model_precache[cl.stats[STAT_WEAPON]];
|
view->model = cl.model_precache[cl.stats[STAT_WEAPON]];
|
||||||
view->frame = view_message->weaponframe;
|
view->frame = view_message->pls.weaponframe;
|
||||||
view->colormap = vid.colormap8;
|
view->colormap = vid.colormap8;
|
||||||
|
|
||||||
// set up the refresh position
|
// set up the refresh position
|
||||||
|
|
|
@ -154,11 +154,11 @@ SV_EmitNailUpdate (sizebuf_t *msg, qboolean recorder)
|
||||||
*buf++ = (byte)SVfloat (ent, colormap);
|
*buf++ = (byte)SVfloat (ent, colormap);
|
||||||
}
|
}
|
||||||
|
|
||||||
x = ((int) (SVvector (ent, origin)[0] + 4096 + 1) >> 1) & 4095;
|
x = ((int) (SVvector (ent, origin)[0] + 4096 + 1) >> 1) & 0xfff;
|
||||||
y = ((int) (SVvector (ent, origin)[1] + 4096 + 1) >> 1) & 4095;
|
y = ((int) (SVvector (ent, origin)[1] + 4096 + 1) >> 1) & 0xfff;
|
||||||
z = ((int) (SVvector (ent, origin)[2] + 4096 + 1) >> 1) & 4095;
|
z = ((int) (SVvector (ent, origin)[2] + 4096 + 1) >> 1) & 0xfff;
|
||||||
p = (int) (SVvector (ent, angles)[0] * (16.0 / 360.0)) & 15;
|
p = (int) (SVvector (ent, angles)[0] * (16.0 / 360.0)) & 0x00f;
|
||||||
yaw = (int) (SVvector (ent, angles)[1] * (256.0 / 360.0)) & 255;
|
yaw = (int) (SVvector (ent, angles)[1] * (256.0 / 360.0)) & 0x0ff;
|
||||||
|
|
||||||
*buf++ = x;
|
*buf++ = x;
|
||||||
*buf++ = (x >> 8) | (y << 4);
|
*buf++ = (x >> 8) | (y << 4);
|
||||||
|
@ -209,7 +209,7 @@ SV_WriteDelta (entity_state_t *from, entity_state_t *to, sizebuf_t *msg,
|
||||||
if (to->frame != from->frame)
|
if (to->frame != from->frame)
|
||||||
bits |= U_FRAME;
|
bits |= U_FRAME;
|
||||||
|
|
||||||
if (to->effects != from->effects)
|
if ((to->effects & 0xff) != (from->effects & 0xff))
|
||||||
bits |= U_EFFECTS;
|
bits |= U_EFFECTS;
|
||||||
|
|
||||||
if (to->modelindex != from->modelindex)
|
if (to->modelindex != from->modelindex)
|
||||||
|
@ -224,7 +224,7 @@ SV_WriteDelta (entity_state_t *from, entity_state_t *to, sizebuf_t *msg,
|
||||||
if (to->scale != from->scale)
|
if (to->scale != from->scale)
|
||||||
bits |= U_SCALE;
|
bits |= U_SCALE;
|
||||||
|
|
||||||
if (to->effects > 255)
|
if ((to->effects & 0xff00) != (from->effects & 0xff00))
|
||||||
bits |= U_EFFECTS2;
|
bits |= U_EFFECTS2;
|
||||||
|
|
||||||
if (to->glow_size != from->glow_size)
|
if (to->glow_size != from->glow_size)
|
||||||
|
|
|
@ -749,6 +749,8 @@ SV_AllocClient (int spectator, int server)
|
||||||
svs.num_clients++;
|
svs.num_clients++;
|
||||||
memset (cl, 0, sizeof (client_t));
|
memset (cl, 0, sizeof (client_t));
|
||||||
cl->userid = userid++; // so every client gets a unique id
|
cl->userid = userid++; // so every client gets a unique id
|
||||||
|
if (userid < 0) // reserve -ve userids for special purposes
|
||||||
|
userid = 0;
|
||||||
cl->edict = EDICT_NUM (&sv_pr_state, (cl - svs.clients) + 1);
|
cl->edict = EDICT_NUM (&sv_pr_state, (cl - svs.clients) + 1);
|
||||||
return cl;
|
return cl;
|
||||||
}
|
}
|
||||||
|
|
|
@ -313,7 +313,6 @@ SV_PreSpawn_f (void *unused)
|
||||||
SV_DropClient (host_client);
|
SV_DropClient (host_client);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
host_client->checksum = check;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
host_client->prespawned = true;
|
host_client->prespawned = true;
|
||||||
|
|
Loading…
Reference in a new issue