Index: server/src/sv_main.cpp =================================================================== --- server/src/sv_main.cpp (revision 2796) +++ server/src/sv_main.cpp (working copy) @@ -1465,13 +1465,26 @@ return; MSG_WriteMarker(&cl->reliablebuf, svc_spawnmobj); - MSG_WriteLong(&cl->reliablebuf, mo->x); - MSG_WriteLong(&cl->reliablebuf, mo->y); - MSG_WriteLong(&cl->reliablebuf, mo->z); - MSG_WriteLong(&cl->reliablebuf, mo->angle); - MSG_WriteShort(&cl->reliablebuf, mo->type); MSG_WriteShort(&cl->reliablebuf, mo->netid); + + // [SL] 2012-02-25 - Send the position for a bullet/blood puff as 16 bits + // instead of 32-bit fixed-point. This is done kind of hacky and should + // be revised in the future. + if (mo->type == MT_PUFF || mo->type == MT_BLOOD) + { + MSG_WriteShort(&cl->reliablebuf, mo->x >> FRACBITS); + MSG_WriteShort(&cl->reliablebuf, mo->y >> FRACBITS); + MSG_WriteShort(&cl->reliablebuf, mo->z >> FRACBITS); + } + else + { + MSG_WriteLong(&cl->reliablebuf, mo->x); + MSG_WriteLong(&cl->reliablebuf, mo->y); + MSG_WriteLong(&cl->reliablebuf, mo->z); + MSG_WriteLong(&cl->reliablebuf, mo->angle); + } + MSG_WriteByte(&cl->reliablebuf, mo->rndindex); MSG_WriteShort(&cl->reliablebuf, (mo->state - states)); // denis - sending state fixes monster ghosts appearing under doors Index: client/src/cl_main.cpp =================================================================== --- client/src/cl_main.cpp (revision 2796) +++ client/src/cl_main.cpp (working copy) @@ -1569,14 +1569,28 @@ { fixed_t x = 0, y = 0, z = 0; AActor *mo; + angle_t angle = 0; - x = MSG_ReadLong(); - y = MSG_ReadLong(); - z = MSG_ReadLong(); - angle_t angle = MSG_ReadLong(); - unsigned short type = MSG_ReadShort(); unsigned short netid = MSG_ReadShort(); + + // [SL] 2012-02-25 - The position for a bullet/blood puff is sent as 16 bits + // instead of 32-bit fixed-point. This is done kind of hacky and should + // be revised in the future. + if (type == MT_PUFF || type == MT_BLOOD) + { + x = MSG_ReadShort() << FRACBITS; + y = MSG_ReadShort() << FRACBITS; + z = MSG_ReadShort() << FRACBITS; + } + else + { + x = MSG_ReadLong(); + y = MSG_ReadLong(); + z = MSG_ReadLong(); + angle = MSG_ReadLong(); + } + byte rndindex = MSG_ReadByte(); SWORD state = MSG_ReadShort();