mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-12 06:51:09 +00:00
player deltas seem to be working
This commit is contained in:
parent
85c25488b1
commit
47bf8c8423
4 changed files with 77 additions and 43 deletions
|
@ -440,65 +440,89 @@ sv_packetentities (server_t *sv, qmsg_t *msg, int delta)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sv_playerinfo (server_t *sv, qmsg_t *msg)
|
parse_player_delta (qmsg_t *msg, plent_state_t *to)
|
||||||
{
|
{
|
||||||
player_t *pl;
|
|
||||||
plent_state_t dummy; // for bad player indices
|
|
||||||
plent_state_t *ent;
|
|
||||||
int num, flags;
|
|
||||||
int i;
|
int i;
|
||||||
|
int flags;
|
||||||
|
|
||||||
num = MSG_ReadByte (msg);
|
flags = to->flags = MSG_ReadShort (msg);
|
||||||
if (num > MAX_SV_PLAYERS) {
|
MSG_ReadCoordV (msg, to->origin);
|
||||||
qtv_printf ("bogus player: %d\n", num);
|
to->frame = (to->frame & 0xff00) | MSG_ReadByte (msg);
|
||||||
ent = &dummy;
|
|
||||||
} else {
|
|
||||||
pl = &sv->players[num];
|
|
||||||
ent = &pl->ent;
|
|
||||||
}
|
|
||||||
flags = ent->flags = MSG_ReadShort (msg);
|
|
||||||
//qtv_printf ("%2d %x\n", num, flags);
|
|
||||||
MSG_ReadCoordV (msg, ent->origin);
|
|
||||||
ent->frame = (ent->frame & 0xff00) | MSG_ReadByte (msg);
|
|
||||||
if (flags & PF_MSEC)
|
if (flags & PF_MSEC)
|
||||||
ent->msec = MSG_ReadByte (msg);
|
to->msec = MSG_ReadByte (msg);
|
||||||
if (flags & PF_COMMAND)
|
if (flags & PF_COMMAND)
|
||||||
MSG_ReadDeltaUsercmd (msg, &nullcmd, &ent->cmd);
|
MSG_ReadDeltaUsercmd (msg, &nullcmd, &to->cmd);
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
if (flags & (PF_VELOCITY1 << i))
|
if (flags & (PF_VELOCITY1 << i))
|
||||||
ent->velocity[i] = MSG_ReadShort (msg);
|
to->velocity[i] = MSG_ReadShort (msg);
|
||||||
}
|
}
|
||||||
if (flags & PF_MODEL)
|
if (flags & PF_MODEL)
|
||||||
ent->modelindex = MSG_ReadByte (msg);
|
to->modelindex = MSG_ReadByte (msg);
|
||||||
if (flags & PF_SKINNUM)
|
if (flags & PF_SKINNUM)
|
||||||
ent->skinnum = MSG_ReadByte (msg);
|
to->skinnum = MSG_ReadByte (msg);
|
||||||
if (flags & PF_EFFECTS)
|
if (flags & PF_EFFECTS)
|
||||||
ent->effects = (ent->effects & 0xff00) | MSG_ReadByte (msg);;
|
to->effects = (to->effects & 0xff00) | MSG_ReadByte (msg);;
|
||||||
if (flags & PF_WEAPONFRAME)
|
if (flags & PF_WEAPONFRAME)
|
||||||
ent->weaponframe = MSG_ReadByte (msg);
|
to->weaponframe = MSG_ReadByte (msg);
|
||||||
if (flags & PF_QF) {
|
if (flags & PF_QF) {
|
||||||
int bits;
|
int bits;
|
||||||
|
|
||||||
bits = MSG_ReadByte (msg);
|
bits = MSG_ReadByte (msg);
|
||||||
if (bits & PF_ALPHA)
|
if (bits & PF_ALPHA)
|
||||||
ent->alpha = MSG_ReadByte (msg);
|
to->alpha = MSG_ReadByte (msg);
|
||||||
if (bits & PF_SCALE)
|
if (bits & PF_SCALE)
|
||||||
ent->scale = MSG_ReadByte (msg);
|
to->scale = MSG_ReadByte (msg);
|
||||||
if (bits & PF_EFFECTS2)
|
if (bits & PF_EFFECTS2)
|
||||||
ent->effects = (ent->effects & 0x00ff)
|
to->effects = (to->effects & 0x00ff)
|
||||||
| (MSG_ReadByte (msg) << 8);
|
| (MSG_ReadByte (msg) << 8);
|
||||||
if (bits & PF_GLOWSIZE)
|
if (bits & PF_GLOWSIZE)
|
||||||
ent->glow_size = MSG_ReadByte (msg);
|
to->glow_size = MSG_ReadByte (msg);
|
||||||
if (bits & PF_GLOWCOLOR)
|
if (bits & PF_GLOWCOLOR)
|
||||||
ent->glow_color = MSG_ReadByte (msg);
|
to->glow_color = MSG_ReadByte (msg);
|
||||||
if (bits & PF_COLORMOD)
|
if (bits & PF_COLORMOD)
|
||||||
ent->colormod = MSG_ReadByte (msg);
|
to->colormod = MSG_ReadByte (msg);
|
||||||
if (bits & PF_FRAME2)
|
if (bits & PF_FRAME2)
|
||||||
ent->frame = (ent->frame & 0xff)
|
to->frame = (to->frame & 0xff)
|
||||||
| (MSG_ReadByte (msg) << 8);
|
| (MSG_ReadByte (msg) << 8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sv_playerinfo (server_t *sv, qmsg_t *msg)
|
||||||
|
{
|
||||||
|
plent_state_t dummy; // for bad player indices
|
||||||
|
plent_state_t *ent;
|
||||||
|
plent_state_t *from, *to;
|
||||||
|
int num;
|
||||||
|
int fromind, toind;
|
||||||
|
static plent_state_t null_player_state;
|
||||||
|
|
||||||
|
if (!null_player_state.alpha) {
|
||||||
|
null_player_state.alpha = 255;
|
||||||
|
null_player_state.scale = 16;
|
||||||
|
null_player_state.glow_size = 0;
|
||||||
|
null_player_state.glow_color = 254;
|
||||||
|
null_player_state.colormod = 255;
|
||||||
|
}
|
||||||
|
fromind = MSG_ReadByte (msg);
|
||||||
|
toind = sv->netchan.incoming_sequence & UPDATE_MASK;
|
||||||
|
num = MSG_ReadByte (msg);
|
||||||
|
if (num > MAX_SV_PLAYERS) {
|
||||||
|
qtv_printf ("bogus player: %d\n", num);
|
||||||
|
ent = from = to = &dummy;
|
||||||
|
} else {
|
||||||
|
ent = &sv->players[num].ent;
|
||||||
|
from = &null_player_state;
|
||||||
|
if (fromind != 255)
|
||||||
|
from = &sv->player_states[fromind & UPDATE_MASK][num];
|
||||||
|
to = &sv->player_states[toind][num];
|
||||||
|
*to = *from;
|
||||||
|
}
|
||||||
|
parse_player_delta (msg, to);
|
||||||
|
qtv_printf ("%3d %g %g %g %d\n", fromind, to->origin[0], to->origin[1], to->origin[2], to->modelindex);
|
||||||
|
*ent = *to;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sv_serverinfo (server_t *sv, qmsg_t *msg)
|
sv_serverinfo (server_t *sv, qmsg_t *msg)
|
||||||
{
|
{
|
||||||
|
|
|
@ -139,6 +139,7 @@ typedef struct {
|
||||||
typedef enum {
|
typedef enum {
|
||||||
dt_tp_normal,
|
dt_tp_normal,
|
||||||
dt_tp_demo,
|
dt_tp_demo,
|
||||||
|
dt_tp_qtv,
|
||||||
} delta_type_t;
|
} delta_type_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
|
@ -396,8 +396,8 @@ SV_EmitPacketEntities (delta_t *delta, packet_entities_t *to, sizebuf_t *msg,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
write_demoplayer (plent_state_t *from, plent_state_t *to, sizebuf_t *msg,
|
write_demoplayer (delta_t *delta, plent_state_t *from, plent_state_t *to,
|
||||||
int mask, int full)
|
sizebuf_t *msg, int mask, int full)
|
||||||
{
|
{
|
||||||
int flags;
|
int flags;
|
||||||
int j;
|
int j;
|
||||||
|
@ -455,12 +455,13 @@ write_demoplayer (plent_state_t *from, plent_state_t *to, sizebuf_t *msg,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
write_player (plent_state_t *from, plent_state_t *to, sizebuf_t *msg, int mask,
|
write_player (delta_t *delta, plent_state_t *from, plent_state_t *to,
|
||||||
int full)
|
sizebuf_t *msg, int mask, int full)
|
||||||
{
|
{
|
||||||
int flags = to->flags;
|
int flags = to->flags;
|
||||||
int qf_bits = 0;
|
int qf_bits = 0;
|
||||||
int i;
|
int i;
|
||||||
|
int ds = delta->delta_sequence & 0x7f;
|
||||||
|
|
||||||
if (full) {
|
if (full) {
|
||||||
flags |= PF_VELOCITY1 | PF_VELOCITY2 | PF_VELOCITY3 | PF_MODEL
|
flags |= PF_VELOCITY1 | PF_VELOCITY2 | PF_VELOCITY3 | PF_MODEL
|
||||||
|
@ -470,6 +471,7 @@ write_player (plent_state_t *from, plent_state_t *to, sizebuf_t *msg, int mask,
|
||||||
| PF_GLOWCOLOR | PF_COLORMOD | PF_FRAME2;
|
| PF_GLOWCOLOR | PF_COLORMOD | PF_FRAME2;
|
||||||
flags |= PF_QF;
|
flags |= PF_QF;
|
||||||
}
|
}
|
||||||
|
ds = -1;
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; i < 3; i++)
|
for (i = 0; i < 3; i++)
|
||||||
if (from->velocity[i] != to->velocity[i])
|
if (from->velocity[i] != to->velocity[i])
|
||||||
|
@ -504,6 +506,8 @@ write_player (plent_state_t *from, plent_state_t *to, sizebuf_t *msg, int mask,
|
||||||
flags &= mask;
|
flags &= mask;
|
||||||
|
|
||||||
MSG_WriteByte (msg, svc_playerinfo);
|
MSG_WriteByte (msg, svc_playerinfo);
|
||||||
|
if (delta->type == dt_tp_qtv)
|
||||||
|
MSG_WriteByte (msg, ds);
|
||||||
MSG_WriteByte (msg, to->number);
|
MSG_WriteByte (msg, to->number);
|
||||||
MSG_WriteShort (msg, flags);
|
MSG_WriteShort (msg, flags);
|
||||||
|
|
||||||
|
@ -560,7 +564,8 @@ SV_WritePlayersToClient (delta_t *delta, byte *pvs, sizebuf_t *msg)
|
||||||
packet_players_t *from_pack = 0;
|
packet_players_t *from_pack = 0;
|
||||||
plent_state_t dummy_player_state, *state = &dummy_player_state;
|
plent_state_t dummy_player_state, *state = &dummy_player_state;
|
||||||
static plent_state_t null_player_state;
|
static plent_state_t null_player_state;
|
||||||
void (*write) (plent_state_t *, plent_state_t *, sizebuf_t *, int, int);
|
void (*write) (delta_t *, plent_state_t *, plent_state_t *, sizebuf_t *,
|
||||||
|
int, int);
|
||||||
|
|
||||||
if (!null_player_state.alpha) {
|
if (!null_player_state.alpha) {
|
||||||
null_player_state.alpha = 255;
|
null_player_state.alpha = 255;
|
||||||
|
@ -586,7 +591,7 @@ SV_WritePlayersToClient (delta_t *delta, byte *pvs, sizebuf_t *msg)
|
||||||
if (delta->delta_sequence != -1) {
|
if (delta->delta_sequence != -1) {
|
||||||
client_frame_t *fromframe;
|
client_frame_t *fromframe;
|
||||||
fromframe = &delta->frames[delta->delta_sequence & UPDATE_MASK];
|
fromframe = &delta->frames[delta->delta_sequence & UPDATE_MASK];
|
||||||
from_pack = &frame->players;
|
from_pack = &fromframe->players;
|
||||||
full = 0;
|
full = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -689,14 +694,17 @@ SV_WritePlayersToClient (delta_t *delta, byte *pvs, sizebuf_t *msg)
|
||||||
mask |= PF_WEAPONFRAME;
|
mask |= PF_WEAPONFRAME;
|
||||||
|
|
||||||
if (from_pack && from_pack->players) {
|
if (from_pack && from_pack->players) {
|
||||||
while (from_pack->players[k].number < state->number)
|
while (k < from_pack->num_players
|
||||||
|
&& from_pack->players[k].number < state->number)
|
||||||
k++;
|
k++;
|
||||||
if (from_pack->players[k].number == state->number) {
|
if (k < from_pack->num_players
|
||||||
write (&from_pack->players[k], state, msg, mask, full);
|
&& from_pack->players[k].number == state->number) {
|
||||||
|
write (delta, &from_pack->players[k], state, msg, mask, full);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
full = 1;
|
||||||
}
|
}
|
||||||
write (&null_player_state, state, msg, mask, full);
|
write (delta, &null_player_state, state, msg, mask, full);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -351,6 +351,7 @@ SVR_AddUser (void (*write)(void *, sizebuf_t *, int), int (*frame)(void *),
|
||||||
r->next = sv.recorders;
|
r->next = sv.recorders;
|
||||||
sv.recorders = r;
|
sv.recorders = r;
|
||||||
|
|
||||||
|
r->delta.type = dt_tp_qtv;
|
||||||
r->delta.pvs = dt_pvs_none;
|
r->delta.pvs = dt_pvs_none;
|
||||||
if (demo) {
|
if (demo) {
|
||||||
r->delta.type = dt_tp_demo;
|
r->delta.type = dt_tp_demo;
|
||||||
|
|
Loading…
Reference in a new issue