Skip to content

Commit

Permalink
Fixed|Server: Merging mobj flags in the delta pool
Browse files Browse the repository at this point in the history
When mobjs deltas were being merged with deltas already existing
in a pool, the mobj flags were not being copied. This caused an issue
where a player's color would randomly not change after "setcolor".
  • Loading branch information
skyjake committed Jul 5, 2012
1 parent 2a7a596 commit 9a29339
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 37 deletions.
9 changes: 7 additions & 2 deletions doomsday/engine/portable/src/cl_mobj.c
Expand Up @@ -299,8 +299,13 @@ void Cl_UpdateRealPlayerMobj(mobj_t *localMobj, mobj_t *remoteClientMobj, int fl
//localMobj->nexttime = clmo->nexttime;
#define DDMF_KEEP_MASK (DDMF_REMOTE | DDMF_SOLID)
localMobj->ddFlags = (localMobj->ddFlags & DDMF_KEEP_MASK) | (remoteClientMobj->ddFlags & ~DDMF_KEEP_MASK);
localMobj->flags = (localMobj->flags & ~0x1c000000) |
(remoteClientMobj->flags & 0x1c000000); // color translation flags (MF_TRANSLATION)
if(flags & MDF_FLAGS)
{
localMobj->flags = (localMobj->flags & ~0x1c000000) |
(remoteClientMobj->flags & 0x1c000000); // color translation flags (MF_TRANSLATION)
//DEBUG_Message(("UpdateRealPlayerMobj: translation=%i\n", (localMobj->flags >> 26) & 7));
}

localMobj->height = remoteClientMobj->height;
/*#ifdef _DEBUG
if(localMobj->floorClip != remoteClientMobj->floorClip)
Expand Down
20 changes: 0 additions & 20 deletions doomsday/engine/portable/src/sv_frame.c
Expand Up @@ -898,26 +898,6 @@ void Sv_SendFrame(int plrNum)
// First send the gameTime of this frame.
Writer_WriteFloat(msgWriter, gameTime);

/*
// The first byte contains the set number, which identifies this
// frame. The client will keep track of the numbers to detect
// duplicates.
Writer_WriteByte(msgWriter, pool->setDealer);
*/

// The number of deltas in the packet will be here.
//deltaCountOffset = Msg_Offset();
/*
#ifdef _NETDEBUG
Msg_WriteLong(0);
#endif
*/

/*
#ifdef _DEBUG
Con_Printf("set%i\n", pool->setDealer);
#endif
*/
// Keep writing until the maximum size is reached.
while((delta = Sv_PoolQueueExtract(pool)) != NULL &&
(lastStart = Writer_Size(msgWriter)) < maxFrameSize)
Expand Down
8 changes: 6 additions & 2 deletions doomsday/engine/portable/src/sv_pool.c
Expand Up @@ -502,8 +502,7 @@ void Sv_RegisterPoly(dt_poly_t* reg, uint number)
/**
* @return @c true, if the result is not void.
*/
boolean Sv_RegisterCompareMobj(cregister_t* reg, const mobj_t* s,
mobjdelta_t* d)
boolean Sv_RegisterCompareMobj(cregister_t* reg, const mobj_t* s, mobjdelta_t* d)
{
int df;
reg_mobj_t* regMo = NULL;
Expand Down Expand Up @@ -1215,7 +1214,12 @@ void Sv_ApplyDeltaData(void* destDelta, const void* srcDelta)
if(sf & MDF_HEIGHT)
d->height = s->height;
if(sf & MDF_FLAGS)
{
d->ddFlags = s->ddFlags;
d->flags = s->flags;
d->flags2 = s->flags2;
d->flags3 = s->flags3;
}
if(sf & MDF_FLOORCLIP)
d->floorClip = s->floorClip;
if(sf & MDFC_TRANSLUCENCY)
Expand Down
7 changes: 3 additions & 4 deletions doomsday/plugins/common/src/d_netcl.c
Expand Up @@ -795,17 +795,16 @@ void NetCl_UpdatePlayerInfo(Reader *msg)

num = Reader_ReadByte(msg);
cfg.playerColor[num] = Reader_ReadByte(msg);
players[num].colorMap = cfg.playerColor[num];
#if __JHEXEN__ || __JHERETIC__
cfg.playerClass[num] = Reader_ReadByte(msg);
players[num].class_ = cfg.playerClass[num];
#endif

#if __JDOOM__ || __JSTRIFE__ || __JDOOM64__
Con_Message("NetCl_UpdatePlayerInfo: pl=%i color=%i\n", num,
cfg.playerColor[num]);
Con_Message("NetCl_UpdatePlayerInfo: pl=%i color=%i\n", num, cfg.playerColor[num]);
#else
Con_Message("NetCl_UpdatePlayerInfo: pl=%i color=%i class=%i\n", num,
cfg.playerColor[num], cfg.playerClass[num]);
Con_Message("NetCl_UpdatePlayerInfo: pl=%i color=%i class=%i\n", num, cfg.playerColor[num], cfg.playerClass[num]);
#endif
}

Expand Down
10 changes: 1 addition & 9 deletions doomsday/plugins/common/src/d_netsv.c
Expand Up @@ -1163,20 +1163,12 @@ void NetSv_ChangePlayerInfo(int from, Reader* msg)
// translation flags when the player is (re)spawned.
pl->colorMap = cfg.playerColor[from];

#ifndef __JHEXEN__
if(pl->plr->mo)
{
// Change the player's mobj's color translation flags.
pl->plr->mo->flags &= ~MF_TRANSLATION;
pl->plr->mo->flags |= col << MF_TRANSSHIFT;
pl->plr->mo->flags |= cfg.playerColor[from] << MF_TRANSSHIFT;
}
#endif

/*
#if __JHEXEN__
P_PlayerChangeClass(pl, cfg.playerClass[from]);
#endif
*/

#ifdef _DEBUG
if(pl->plr->mo)
Expand Down

0 comments on commit 9a29339

Please sign in to comment.