29 fActivated(false), iTargetTick(-1),
30 iControlPreSend(1), tWaitStart(
C4TimeMilliseconds::PositiveInfinity), iAvgControlSendTime(0), iTargetFPS(38),
31 iControlSent(0), iControlReady(0),
33 tNextControlRequest(0),
146 if (!IsEnabled() || !fActivated)
return false;
148 int32_t iSendFor = pParent->getCtrlTick(iFrame + iControlPreSend);
150 if (iTargetTick >= 0 && iControlSent >= iTargetTick)
return false;
152 return iSendFor > iControlSent;
201 {
LogFatal(
"Network: could not send direct control packet!");
break; }
233 {
LogFatal(
"Network: could not send direct control packet!");
break; }
298 LogF(
"Network: Fatal: got sync control to execute for ctrl tick %d, but already in ctrl tick %d!", iControlTick,
pParent->
ControlTick);
330 while ((pClient = rClients.
getClient(pClient)))
370 if (
eMode == enMode)
return;
395 int32_t iClientsPing=0; int32_t iPingClientCount=0; int32_t iNumTunnels=0; int32_t iHostPing=0;
401 if (pNetClt && !pNetClt->
isLocal())
425 int32_t iControlSendTime;
429 iControlSendTime = (iClientsPing + iHostPing * (iNumTunnels + 1)) / (iPingClientCount + iNumTunnels + 1);
431 if (!iNumTunnels) iControlSendTime /= 2;
436 iControlSendTime = iHostPing;
439 if (iControlSendTime)
461 #define GETPKT(type, name) \
462 assert(pPacket); const type &name = \
463 static_cast<const type &>(*pPacket);
489 if (rPkt.getCtrl().getPktType() <
CID_First)
break;
580 DoInput(eCtrlType, pCtrl, eType);
605 if (pClient->getClientID() == iID)
612 if (!pClient)
return;
617 for (; pPos; pPrev = pPos, pPos = pPos->
pNext)
622 pClient->
pNext = pPos;
636 if (pPrev->
pNext == pClient)
638 if (pPrev && pPrev->
pNext == pClient)
649 if (pCtrl->getClientID() ==
iClientID && pCtrl->getCtrlTick() == iCtrlTick)
672 if (iBeforeTick == -1 || pCtrl->
getCtrlTick() < iBeforeTick)
676 pCtrl = pCtrl->
pNext;
684 pCtrl = pCtrl->
pNext;
785 pComplete->
Add(*pCtrl);
807 while (pBefore && pBefore->getCtrlTick() <= iTick)
808 { pAfter = pBefore; pBefore = pBefore->
pNext; }
814 pnPkt->
pNext = pBefore;
858 iCtrlTick(Pkt2.getCtrlTick()),
const int32_t C4ClientIDHost
const int32_t C4ClientIDUnknown
#define GETPKT(type, name)
const int32_t C4ClientIDAll
const uint32_t C4ControlRequestInterval
const int32_t C4ControlBacklog
C4Application Application
C4GraphicsSystem GraphicsSystem
bool LogF(const char *strMessage,...)
bool LogFatal(const char *szMessage)
C4NetIOPacket MkC4NetIOPacket(char cStatus, const class C4PacketBase &Pkt, const C4NetIO::addr_t &addr=C4NetIO::addr_t())
void SCopy(const char *szSource, char *sTarget, size_t iMaxL)
T Clamp(T bval, T lbound, T rbound)
StdIntPackAdapt< T > mkIntPackAdapt(T &rVal)
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
StdStrBuf FormatString(const char *szFmt,...)
C4InteractiveThread InteractiveThread
const char * getName() const
C4Client * getClient(const C4Client *pAfter=nullptr) const
C4Client * getLocal() const
C4IDPacket * firstPkt() const
void Append(const C4Control &Ctrl)
void Add(C4PacketType eType, C4ControlPacket *pCtrl)
void Copy(const C4Control &Ctrl)
int32_t getByClient() const
C4GameControlClient * pNext
void AddPerf(int32_t iTime)
int32_t getNextControl() const
int32_t getPerfStat() const
void SetNextControl(int32_t inNextControl)
int32_t getClientID() const
void Set(int32_t iClientID, const char *szName)
void ExecControlPacket(C4PacketType eCtrlType, class C4ControlPacket *pPkt)
void ExecControl(const C4Control &rCtrl)
int32_t getNextControlTick() const
C4GameControlPacket * PackCompleteCtrl(int32_t iTick)
C4GameControlPacket * pSyncCtrlQueue
void ExecQueuedSyncCtrl()
void AddClient(int32_t iClientID, const char *szName)
C4TimeMilliseconds tNextControlRequest
C4GameControlNetworkMode eMode
int32_t ClientNextControl(int32_t iClientID)
C4GameControl *const pParent
int32_t ClientPerfStat(int32_t iClientID)
C4TimeMilliseconds tWaitStart
void HandleControlPkt(C4PacketType eCtrlType, C4ControlPacket *pPkt, enum C4ControlDeliveryType eType)
void ClearCtrl(int32_t iBeforeTick=-1)
bool CtrlNeeded(int32_t iTick) const
void setControlPreSend(int32_t iToVal)
void CalcPerformance(int32_t iCtrlTick)
void DoInput(const C4Control &Input)
C4GameControlClient * getClient(int32_t iID)
void SetCtrlMode(C4GameControlNetworkMode enMode)
C4GameControlClient * pClients
int32_t getControlPreSend() const
C4GameControlNetwork(class C4GameControl *pParent)
void SetActivated(bool fnActivated)
void CopyClientList(const C4ClientList &rClients)
void SetRunning(bool fnRunning, int32_t inTargetTick=-1)
bool Init(int32_t iClientID, bool fHost, int32_t iStartTick, bool fActivated, C4Network2 *pNetwork)
void HandlePacket(char cStatus, const C4PacketBase *pPacket, C4Network2IOConnection *pConn)
bool CtrlReady(int32_t iTick)
C4GameControlPacket * getCtrl(int32_t iClientID, int32_t iCtrlTick)
void AddSyncCtrlToQueue(const C4Control &Ctrl, int32_t iTick)
C4ControlDeliveryType DecideControlDelivery() const
void HandleControlReq(const C4PacketControlReq &rPkt, C4Network2IOConnection *pConn)
bool GetControl(C4Control *pCtrl, int32_t iTick)
bool ClientReady(int32_t iClientID, int32_t iTick)
void AddCtrl(C4GameControlPacket *pCtrl)
void CheckCompleteCtrl(bool fSetEvent)
void RemoveClient(int32_t iClientID)
void HandleControl(int32_t iByClientID, const C4GameControlPacket &rPkt)
C4GameControlPacket * pCtrlStack
volatile int32_t iControlReady
volatile int32_t iControlSent
void OnResComplete(C4Network2Res *pRes)
int32_t iAvgControlSendTime
int32_t getClientID() const
const C4Control & getControl() const
void Add(const C4GameControlPacket &Ctrl)
void Set(int32_t iClientID, int32_t iCtrlTick)
C4TimeMilliseconds getTime() const
C4GameControlPacket * pNext
void CompileFunc(StdCompiler *pComp) override
int32_t getCtrlTick() const
C4GameControlPacket & operator=(const C4GameControlPacket &Pkt2)
void FlashMessage(const char *message)
C4PacketType getPktType() const
C4PacketBase * getPkt() const
bool ThreadLog(const char *szMessage,...) GNUC_FORMAT_ATTRIBUTE_O
bool ThreadLogS(const char *szMessage,...) GNUC_FORMAT_ATTRIBUTE_O
C4Network2IOConnection * getMsgConn() const
C4Network2Client * GetClientByID(int32_t iID) const
bool BroadcastMsgToClients(const C4NetIOPacket &rPkt)
bool BroadcastMsgToConnClients(const C4NetIOPacket &rPkt)
bool SendMsgToHost(C4NetIOPacket rPkt)
C4Network2ClientList Clients
bool Send(const C4NetIOPacket &rPkt)
C4Network2ResType getType() const
int32_t getCtrlTick() const
int32_t getControlTick() const
static C4TimeMilliseconds Now()
void Value(const T &rStruct)