/** * The actual script is sent to the clients. @a script can be NULL. */ void Sv_Finale(finaleid_t id, int flags, const char* script) { size_t scriptLen = 0; if(isClient) return; // How much memory do we need? if(script) { flags |= FINF_SCRIPT; scriptLen = strlen(script); } // First the flags. Msg_Begin(PSV_FINALE); Writer_WriteByte(msgWriter, flags); Writer_WriteUInt32(msgWriter, id); // serverside Id if(script) { // Then the script itself. Writer_WriteUInt32(msgWriter, scriptLen); Writer_Write(msgWriter, script, scriptLen); } Msg_End(); Net_SendBuffer(NSP_BROADCAST, 0); }
DENG_EXTERN_C void Net_SendPacket(int to_player, int type, const void* data, size_t length) { unsigned int flags = 0; #ifndef DENG_WRITER_TYPECHECK Msg_Begin(type); if(data) Writer_Write(msgWriter, data, length); Msg_End(); #else assert(length <= NETBUFFER_MAXSIZE); netBuffer.msg.type = type; netBuffer.length = length; if(data) memcpy(netBuffer.msg.data, data, length); #endif if(isClient) { // As a client we can only send messages to the server. Net_SendBuffer(0, flags); } else { // The server can send packets to any player. // Only allow sending to the sixteen possible players. Net_SendBuffer(to_player & DDSP_ALL_PLAYERS ? NSP_BROADCAST : (to_player & 0xf), flags); } }
void Str_Write(const ddstring_t *str, Writer *writer) { size_t len = Str_Length(str); DENG_ASSERT(str); Writer_WriteUInt32(writer, len); Writer_Write(writer, Str_Text(str), len); }
void Net_SendPlayerInfo(int srcPlrNum, int destPlrNum) { size_t nameLen; assert(srcPlrNum >= 0 && srcPlrNum < DDMAXPLAYERS); nameLen = strlen(clients[srcPlrNum].name); #ifdef _DEBUG Con_Message("Net_SendPlayerInfo: src=%i dest=%i name=%s", srcPlrNum, destPlrNum, clients[srcPlrNum].name); #endif Msg_Begin(PKT_PLAYER_INFO); Writer_WriteByte(msgWriter, srcPlrNum); Writer_WriteUInt16(msgWriter, nameLen); Writer_Write(msgWriter, clients[srcPlrNum].name, nameLen); Msg_End(); Net_SendBuffer(destPlrNum, 0); }
void mobj_s::write(MapStateWriter *msw) const { Writer1 *writer = msw->writer(); mobj_t const *mo = this; // Version. // JHEXEN // 2: Added the 'translucency' byte. // 3: Added byte 'vistarget' // 4: Added long 'tracer' // 4: Added long 'lastenemy' // 5: Added flags3 // 6: Floor material removed. // // JDOOM || JHERETIC || JDOOM64 // 4: Added byte 'translucency' // 5: Added byte 'vistarget' // 5: Added tracer in jDoom // 5: Added dropoff fix in jHeretic // 5: Added long 'floorclip' // 6: Added proper respawn data // 6: Added flags 2 in jDoom // 6: Added damage // 7: Added generator in jHeretic // 7: Added flags3 // // JDOOM // 9: Revised mapspot flag interpretation // // JHERETIC // 8: Added special3 // 9: Revised mapspot flag interpretation // // JHEXEN // 7: Removed superfluous info ptr // 8: Added 'onMobj' Writer_WriteByte(writer, MOBJ_SAVEVERSION); #if !__JHEXEN__ // A version 2 features: archive number and target. Writer_WriteInt16(writer, msw->serialIdFor(mo)); Writer_WriteInt16(writer, msw->serialIdFor(mo->target)); # if __JDOOM__ || __JDOOM64__ // Ver 5 features: Save tracer (fixes Archvile, Revenant bug) Writer_WriteInt16(writer, msw->serialIdFor(mo->tracer)); # endif #endif Writer_WriteInt16(writer, msw->serialIdFor(mo->onMobj)); // Info for drawing: position. Writer_WriteInt32(writer, FLT2FIX(mo->origin[VX])); Writer_WriteInt32(writer, FLT2FIX(mo->origin[VY])); Writer_WriteInt32(writer, FLT2FIX(mo->origin[VZ])); //More drawing info: to determine current sprite. Writer_WriteInt32(writer, mo->angle); // Orientation. Writer_WriteInt32(writer, mo->sprite); // Used to find patch_t and flip value. Writer_WriteInt32(writer, mo->frame); #if !__JHEXEN__ // The closest interval over all contacted Sectors. Writer_WriteInt32(writer, FLT2FIX(mo->floorZ)); Writer_WriteInt32(writer, FLT2FIX(mo->ceilingZ)); #endif // For movement checking. Writer_WriteInt32(writer, FLT2FIX(mo->radius)); Writer_WriteInt32(writer, FLT2FIX(mo->height)); // Momentums, used to update position. Writer_WriteInt32(writer, FLT2FIX(mo->mom[MX])); Writer_WriteInt32(writer, FLT2FIX(mo->mom[MY])); Writer_WriteInt32(writer, FLT2FIX(mo->mom[MZ])); // If == VALIDCOUNT, already checked. Writer_WriteInt32(writer, mo->valid); Writer_WriteInt32(writer, mo->type); Writer_WriteInt32(writer, mo->tics); // State tic counter. Writer_WriteInt32(writer, int(mo->state - STATES) /*PTR2INT(mo->state)*/); #if __JHEXEN__ Writer_WriteInt32(writer, mo->damage); #endif Writer_WriteInt32(writer, mo->flags); #if __JHEXEN__ Writer_WriteInt32(writer, mo->flags2); Writer_WriteInt32(writer, mo->flags3); if(mo->type == MT_KORAX) Writer_WriteInt32(writer, 0); // Searching index. else Writer_WriteInt32(writer, mo->special1); switch(mo->type) { case MT_LIGHTNING_FLOOR: case MT_LIGHTNING_ZAP: case MT_HOLY_TAIL: case MT_LIGHTNING_CEILING: if(mo->flags & MF_CORPSE) Writer_WriteInt32(writer, 0); else Writer_WriteInt32(writer, msw->serialIdFor(INT2PTR(mobj_t, mo->special2))); break; default: Writer_WriteInt32(writer, mo->special2); break; } #endif Writer_WriteInt32(writer, mo->health); // Movement direction, movement generation (zig-zagging). Writer_WriteInt32(writer, mo->moveDir); // 0-7 Writer_WriteInt32(writer, mo->moveCount); // When 0, select a new dir. #if __JHEXEN__ if(mo->flags & MF_CORPSE) Writer_WriteInt32(writer, 0); else Writer_WriteInt32(writer, (int) msw->serialIdFor(mo->target)); #endif // Reaction time: if non 0, don't attack yet. // Used by player to freeze a bit after teleporting. Writer_WriteInt32(writer, mo->reactionTime); // If >0, the target will be chased no matter what (even if shot). Writer_WriteInt32(writer, mo->threshold); // Additional info record for player avatars only (only valid if type is MT_PLAYER). { int const playerNum = (mo->player? int(mo->player - players + 1) : 0); Writer_WriteInt32(writer, playerNum /*PTR2INT(mo->player)*/); } // Player number last looked for. Writer_WriteInt32(writer, mo->lastLook); #if !__JHEXEN__ // For nightmare/multiplayer respawn. Writer_WriteInt32(writer, FLT2FIX(mo->spawnSpot.origin[VX])); Writer_WriteInt32(writer, FLT2FIX(mo->spawnSpot.origin[VY])); Writer_WriteInt32(writer, FLT2FIX(mo->spawnSpot.origin[VZ])); Writer_WriteInt32(writer, mo->spawnSpot.angle); Writer_WriteInt32(writer, mo->spawnSpot.flags); Writer_WriteInt32(writer, mo->intFlags); // $dropoff_fix: internal flags. Writer_WriteInt32(writer, FLT2FIX(mo->dropOffZ)); // $dropoff_fix Writer_WriteInt32(writer, mo->gear); // Used in torque simulation. Writer_WriteInt32(writer, mo->damage); Writer_WriteInt32(writer, mo->flags2); Writer_WriteInt32(writer, mo->flags3); # ifdef __JHERETIC__ Writer_WriteInt32(writer, mo->special1); Writer_WriteInt32(writer, mo->special2); Writer_WriteInt32(writer, mo->special3); # endif Writer_WriteByte(writer, mo->translucency); Writer_WriteByte(writer, (byte)(mo->visTarget + 1)); #endif Writer_WriteInt32(writer, FLT2FIX(mo->floorClip)); #if __JHEXEN__ Writer_WriteInt32(writer, msw->serialIdFor(mo)); Writer_WriteInt32(writer, mo->tid); Writer_WriteInt32(writer, mo->special); Writer_Write(writer, mo->args, sizeof(mo->args)); Writer_WriteByte(writer, mo->translucency); Writer_WriteByte(writer, (byte)(mo->visTarget + 1)); switch(mo->type) { case MT_BISH_FX: case MT_HOLY_FX: case MT_DRAGON: case MT_THRUSTFLOOR_UP: case MT_THRUSTFLOOR_DOWN: case MT_MINOTAUR: case MT_SORCFX1: case MT_MSTAFF_FX2: case MT_HOLY_TAIL: case MT_LIGHTNING_CEILING: if(mo->flags & MF_CORPSE) Writer_WriteInt32(writer, 0); else Writer_WriteInt32(writer, msw->serialIdFor(mo->tracer)); break; default: DENG_ASSERT(mo->tracer == NULL); /// @todo Tracer won't be saved correctly? Writer_WriteInt32(writer, PTR2INT(mo->tracer)); break; } Writer_WriteInt32(writer, PTR2INT(mo->lastEnemy)); #elif __JHERETIC__ Writer_WriteInt16(writer, msw->serialIdFor(mo->generator)); #endif }