r5sdk/r5dev/engine/shared/datablock.cpp
Kawe Mazidjatari 74da5c7c20 Engine: cleanup data block sender/receiver and add types
* Move member vars to correct place, to match it with the engine.
* Added out-of-band network message ID's for the R5 engine.

Also implemented 'ServerDataBlockSender::SendDataBlock()' and 'ClientDataBlockReceiver::AcknowledgeTransmission()'. NOTE that these are currently not tested, and also not in use! The code uses the version stored in the vftable which is what the engine itself provides. These have been implemented for reference only. If they need to be used, they need to be thoroughly tested first!
2024-04-05 18:06:36 +02:00

113 lines
3.5 KiB
C++

//===========================================================================//
//
// Purpose: data block sender & receiver
//
//===========================================================================//
#include "datablock.h"
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
NetDataBlockSender::~NetDataBlockSender()
{
ResetBlockSender();
delete[] m_pScratchBuffer;
m_pScratchBuffer = nullptr;
m_pClient = nullptr;
}
//-----------------------------------------------------------------------------
// Purpose: reset the data block sender context
//-----------------------------------------------------------------------------
void NetDataBlockSender::ResetBlockSender(void)
{
m_bInitialized = false;
m_bStartedTransfer = false;
m_nTransferId = 0;
m_nTransferSize = 0;
m_nTotalBlocks = 0;
m_nBlockAckTick = 0;
m_TimeCurrentSend = 0.0;
m_TimeFirstSend = 0.0;
m_nTotalSizeRemaining = 0;
m_TimeLastSend = 0.0;
m_szDebugName[0] = '\0';
m_bDumbDataBlockInfo = false;
m_nCurrentBlock = DATABLOCK_INVALID_BLOCK_NR;
m_nBlockSendsAttempted = 0;
memset(m_bBlockAckStatus, 0, sizeof(m_bBlockAckStatus));
memset(m_flBlockSendTimes, 0, sizeof(m_flBlockSendTimes));
}
//-----------------------------------------------------------------------------
// Purpose: initialize the data block sender context
//-----------------------------------------------------------------------------
void NetDataBlockSender::StartBlockSender(const int transferSize, const bool isMultiplayer, const char* const debugName)
{
m_bMultiplayer = isMultiplayer;
m_nBlockAckTick = 0;
m_nTransferSize = transferSize;
// calculate the number of data blocks we have, which get sent individually
// to the receiver
m_nTotalBlocks = m_nTransferSize / MAX_DATABLOCK_FRAGMENT_SIZE + (m_nTransferSize % MAX_DATABLOCK_FRAGMENT_SIZE != 0);
strncpy(m_szDebugName, debugName, sizeof(m_szDebugName));
m_szDebugName[sizeof(m_szDebugName) - 1] = '\0';
// null status memory
memset(m_bBlockAckStatus, 0, sizeof(m_bBlockAckStatus));
memset(m_flBlockSendTimes, 0, sizeof(m_flBlockSendTimes));
m_bInitialized = true;
m_bStartedTransfer = false;
const double currentTime = Plat_FloatTime();
m_TimeLastSend = currentTime;
m_TimeCurrentSend = currentTime;
m_TimeFirstSend = currentTime;
m_nTotalSizeRemaining = 4096;
m_nBlockSendsAttempted = 0;
}
//-----------------------------------------------------------------------------
// Purpose: initialize the data block receiver context
//-----------------------------------------------------------------------------
void NetDataBlockReceiver::StartBlockReceiver(const int transferSize, const double startTime)
{
m_bStartedRecv = true;
m_nTransferSize = transferSize;
m_nTotalBlocks = transferSize / MAX_DATABLOCK_FRAGMENT_SIZE + (transferSize % MAX_DATABLOCK_FRAGMENT_SIZE != 0);
m_nBlockAckTick = 0;
m_flStartTime = startTime;
memset(m_BlockStatus, 0, sizeof(m_BlockStatus));
}
//-----------------------------------------------------------------------------
// Purpose: reset the data block receiver context
//-----------------------------------------------------------------------------
void NetDataBlockReceiver::ResetBlockReceiver(const short transferNr)
{
m_nTransferNr = transferNr;
m_bStartedRecv = false;
m_bCompletedRecv = false;
m_TransferId = 0;
m_nTotalBlocks = 0;
m_nBlockAckTick = 0;
m_flStartTime = 0.0;
memset(m_BlockStatus, 0, sizeof(m_BlockStatus));
}