21 #include "C4Version.h"
42 #include <sys/socket.h>
43 #include <netinet/in.h>
44 #include <arpa/inet.h>
49 #pragma warning (disable: 4355)
64 case GS_Go:
return "go";
79 return LoadResStr(
"IDS_DESC_UNKNOWNGAMESTATE");
115 {
"Running",
GS_Go },
156 {
LogFatal(
"Network: failed to initialize resource list!");
Clear();
return false; }
164 {
Clear();
return false; }
191 static void SortAddresses(std::vector<C4Network2Address>& addrs)
195 bool haveIPv6 =
false;
196 for (
auto& addr : localAddrs)
210 auto addr = Addr.getAddr();
211 switch (addr.GetFamily())
216 else if (addr.IsPrivate())
223 if (addr.IsPrivate())
229 assert(!
"Unexpected address family");
235 std::stable_sort(addrs.begin(), addrs.end(), [&](
auto a,
auto b) { return rank(a) > rank(b); });
265 std::vector<C4Network2Address> Addrs;
270 Addrs.push_back(std::move(
a));
272 SortAddresses(Addrs);
292 LogSilent(
"Network: Could not connect!");
315 :
CStdTimerProc(DELAY), Addrs(Addrs), CurrentAddr(this->Addrs.cbegin()),
316 HostCore(HostCore), Password(Password)
333 void C4Network2::InitialConnect::TryNext()
335 StdStrBuf strAddresses;
int Successes = 0;
336 for (; Successes < ADDR_PER_TRY && CurrentAddr != Addrs.cend(); ++CurrentAddr)
338 if (!CurrentAddr->isIPNull())
340 auto addr = CurrentAddr->getAddr();
341 std::vector<C4NetIO::addr_t> addrs;
348 addrs.push_back(addr);
352 addrs.push_back(addr);
355 for (
auto&
a : addrs)
358 if (cnt == 0)
continue;
361 strAddresses.
Append(
", ");
362 strAddresses.
Append(CurrentAddr->toString());
376 void C4Network2::InitialConnect::Done()
405 InitialConnect iconn(Addrs, HostCore, szPassword);
407 std::unique_ptr<C4GUI::MessageDialog> pDlg =
nullptr;
412 pDlg = std::make_unique<C4GUI::MessageDialog>(
422 if (pDlg && pDlg->IsAborted())
461 {
Clear();
return false; }
477 {
Clear();
return false; }
562 if (!pDlg->
Show(::
pGUI,
true))
return false;
571 if (!pDlg->
Execute()) {
delete pDlg;
Clear();
return false; }
576 {
Clear();
return false; }
593 if (
isHost())
return false;
620 StdStrBuf MaterialScenario, MaterialDynamic;
630 if (!ScenGrp.
Open(szScenario) ||
631 !ScenGrp.
Merge(szTempDynamic))
776 if (!szToPassword || !*szToPassword)
859 if (!pClient)
return;
886 if (pClient && pClient->
isLocal()) { pConn->
Close();
return; }
888 #define GETPKT(type, name) \
889 assert(pPacket); const type &name = \
890 static_cast<const type &>(*pPacket);
896 if (!pConn->
isOpen())
break;
913 if (!pConn->
isOpen())
break;
924 if (!pConn->
isOpen())
break;
976 #define GETPKT(c) dynamic_cast<C4NetpuncherPacket##c*>(pkt.get())
977 switch (pkt->GetType())
1001 default:
return false;
1020 auto maybe_v4 = addr.
AsIPv4();
1029 auto family = maybe_v4.GetFamily();
1049 if (!PuncherAddr.
IsNull())
1055 if (!PuncherAddr.
IsNull())
1104 if (pMsgIO && pDataIO)
1108 int32_t iMsgPort = 0, iDataPort = 0;
1121 Stat.
AppendFormat(
"|Protocols: %s: %s (%d i%d o%d bc%d)",
1122 pMsgIO != pDataIO ?
"Msg" :
"Msg/Data",
1125 if (pMsgIO != pDataIO)
1131 Stat.
Append(
"|Protocols: none");
1134 Stat.
AppendFormat(
"|Control: %s, Tick %d, Behind %d, Rate %d, PreSend %d, ACT: %d",
1141 Stat.
AppendFormat(
"|Streaming: %lu waiting, %u in, %lu out, %lu sent",
1148 Stat.
Append(
"|Clients:");
1152 if (pClient->isLocal())
continue;
1155 const char *szClientStatus;
1156 switch (pClient->getStatus())
1158 case NCS_Joining: szClientStatus =
" (joining)";
break;
1159 case NCS_Chasing: szClientStatus =
" (chasing)";
break;
1161 case NCS_Remove: szClientStatus =
" (removed)";
break;
1162 default: szClientStatus =
"";
break;
1164 Stat.
AppendFormat(
"|- %s %s %s (ID %d) (wait %d ms, behind %d)%s%s",
1172 if (pClient->isConnected())
1174 Stat.
AppendFormat(
"| Connections: %s: %s (%s p%d l%d)",
1175 pClient->getMsgConn() == pClient->getDataConn() ?
"Msg/Data" :
"Msg",
1177 pClient->getMsgConn()->getPeerAddr().ToString().getData(),
1178 pClient->getMsgConn()->getPingTime(),
1179 pClient->getMsgConn()->getPacketLoss());
1180 if (pClient->getMsgConn() != pClient->getDataConn())
1183 pClient->getDataConn()->getPeerAddr().ToString().getData(),
1184 pClient->getDataConn()->getPingTime(),
1185 pClient->getDataConn()->getPacketLoss());
1188 Stat.
Append(
"| Not connected");
1191 Stat.
Append(
"| - none -");
1246 if (Pkt.
getVer() != C4XVER1*100 + C4XVER2)
1248 reply.
Format(
"wrong engine (%d.%d, I have %d.%d)", Pkt.
getVer()/100, Pkt.
getVer()%100, C4XVER1, C4XVER2);
1254 if (
CheckConn(NewCCore, pConn, pClient, &reply))
1257 if (!reply) reply =
"connection accepted";
1265 if (!reply) reply =
"host connection accepted";
1269 if (!fOK &&
isHost() && !pClient)
1274 reply =
"wrong password";
1278 else if (
Join(NewCCore, pConn, &reply))
1283 if (!reply) reply =
"join accepted";
1290 if (!fOK && !reply) reply =
"connection denied";
1319 if (!pConn || !pClient)
return false;
1322 { *szReply =
"already connected";
return true; }
1325 { *szReply =
"wrong client core";
return false; }
1332 if (!pConn)
return false;
1333 if (!CCore.
isHost()) { *szReply =
"not host";
return false; }
1337 if (!pClient)
return false;
1344 if (!pConn)
return false;
1346 if (!
isHost()) { *szReply =
"not host";
return false; }
1358 char szNameTmpl[256+1], szNewName[256+1];
1362 sprintf(szNewName, szNameTmpl, ++i);
1395 if (!pClient) { pConn->
Close();
return; }
1516 {
LogSilentF(
"Network: unexpected join data received!");
return; }
1519 {
LogSilentF(
"Network: host didn't set client ID!");
Clear();
return; }
1534 {
LogSilentF(
"Network: Could not find local client in join data!");
Clear();
return; }
1548 {
LogFatal(
"Network: can not not retrieve dynamic!");
Clear();
return; }
1558 LogSilentF(
"Network: %s %s connected (%s/%s) (%s)", pClient->
isHost() ?
"host" :
"client",
1682 int32_t iProcess = -1;
1695 if (!fWaitForCore)
return nullptr;
1709 if (pDlg)
delete pDlg;
1725 if (pDlg)
delete pDlg;
1743 if (!pDlg->
Show(::
pGUI,
true)) {
delete pDlg;
return nullptr; }
1753 {
if (pDlg)
delete pDlg;
return nullptr; }
1772 if (!
isHost())
return false;
1784 if (!SaveGame.
Save(szDynamicFilename) || !SaveGame.
Close())
1785 {
Log(
LoadResStr(
"IDS_NET_SAVE_ERR_SAVEDYNFILE"));
return false; }
1788 if (!pRes) {
Log(
LoadResStr(
"IDS_NET_SAVE_ERR_ADDDYNDATARES"));
return false; }
1800 if (pRes) pRes->
Remove();
1820 if (!
isHost())
return false;
1979 if (!pClient->isLocal() && pClient->isActivated())
2099 bool fResult =
true;
2104 if (pCancel) *pCancel = fResult;
2135 if (pCancel) *pCancel =
true;
2155 *pCancel = !fResult;
2173 if (!pDlg || !pDlg->
Show(::
pGUI,
true))
return false;
2183 if (pDlg)
delete pDlg;
2194 StdStrBuf LeagueServerMessage, League, StreamingAddr;
2215 *pCancel = !fResult;
2237 *pCancel = !fResult;
2249 if (MaxPlayersLeague)
2321 for (
int iClient = 0; (pInfos = TargetList.
GetIndexedInfo(iClient)); iClient++)
2322 for (
int iInfo = 0; (pInfo = pInfos->
GetPlayerInfo(iInfo)); iInfo++)
2344 bool fIsError =
true;
2354 const int MAX_RETRIES = 10;
2355 for (
int iRetry = 0; iRetry < MAX_RETRIES; iRetry++)
2370 if (fRetry)
continue;
2397 if (fRetry)
continue;
2438 bool fRememberLogin =
false;
2443 fRememberLogin = (Password.
getLength()>0);
2475 if (!pDlg || !pDlg->
Show(::
pGUI,
true))
return false;
2485 if (pDlg)
delete pDlg;
2497 StdStrBuf AUID, AccountMaster, LoginToken;
bool fUnregistered =
false;
2542 Account.
Take(std::move(AccountMaster));
2600 if (!pInfos)
return;
2607 LogF(
LoadResStr(
"IDS_LEAGUE_LEAGUEREPORTINGUNEXPECTED"), (
int) eReason);
2615 szMsg =
LoadResStr(
"IDS_MSG_LEAGUEUNEXPECTEDDISCONNEC");
2617 szMsg =
LoadResStr(
"IDS_ERR_LEAGUEERRORREPORTINGUNEXP");
2704 if (pPkt->getPktType() ==
CID_Vote)
2791 LoadResStr(
"IDS_VOTE_SURRENDERWARNING"), eType, iData,
true);
2808 eVoteType(eVoteType), iVoteData(iVoteData), fSurrender(fSurrender)
2813 void C4VoteDialog::OnClosed(
bool fOK)
2815 bool fAbortGame =
false;
2847 MessageDialog::OnClosed(
fOK);
2961 if (!fFinish || ret == Z_STREAM_END)
const int32_t C4ClientIDHost
const int32_t C4ClientCoreDL_IDMatch
const int32_t C4ClientIDUnknown
const int32_t C4ClientIDStart
const int32_t C4ClientIDAll
C4Application Application
C4GraphicsSystem GraphicsSystem
C4GraphicsResource GraphicsResource
bool C4Group_CopyItem(const char *source, const char *target, bool no_sorting, bool reset_attributes)
bool C4Group_UnpackDirectory(const char *filename)
const char * LoadResStr(const char *id)
bool LogSilent(const char *szMessage, bool fConsole)
bool Log(const char *szMessage)
bool LogSilentF(const char *strMessage,...)
bool LogF(const char *strMessage,...)
bool LogFatal(const char *szMessage)
#define GETPKT(type, name)
const int C4NetDeactivationDelay
const unsigned int C4NetChaseTargetUpdateInterval
const size_t C4NetStreamingMaxBlockSize
const unsigned int C4NetVotingTimeout
const unsigned int C4NetMinVotingInterval
const int C4NetMaxBehind4Activation
const int C4NetActivationReqInterval
const unsigned int C4NetReferenceUpdateInterval
const size_t C4NetStreamingMinBlockSize
const int C4NetResRetrieveTimeout
const unsigned int C4NetMinLeagueUpdateInterval
const int16_t C4NetStdPortPuncher
const int C4NetStreamingInterval
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)
bool SEqualNoCase(const char *szStr1, const char *szStr2, int iLen)
void SAppend(const char *szSource, char *szTarget, int iMaxL)
std::enable_if< std::is_pod< T >::value >::type ZeroMem(T *lpMem, size_t dwSize)
T Clamp(T bval, T lbound, T rbound)
bool SEqual(const char *szStr1, const char *szStr2)
StdIntPackAdapt< T > mkIntPackAdapt(T &rVal)
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
StdStrBuf FormatString(const char *szFmt,...)
bool EraseDirectory(const char *szDirName)
char * GetFilename(char *szPath)
bool FileExists(const char *szFileName)
void NotifyUserIfInactive()
C4InteractiveThread InteractiveThread
const char * GetRevision() const
void SetObserver(bool fnObserver)
int32_t getDiffLevel(const C4ClientCore &CCore2) const
const char * getRevision() const
void SetActivated(bool fnActivated)
const char * getName() const
void SetName(const char *sznName)
const C4ClientCore & getCore() const
const char * getName() const
C4Client * getLocal() const
const C4ClientCore & getLocalCore() const
C4Client * getClientByID(int32_t iID) const
void CtrlRemove(const C4Client *pClient, const char *szReason)
bool Init(int32_t iLocalClientID=C4ClientIDHost)
void Add(C4Client *pClient)
C4Client * getHost() const
int32_t getLocalID() const
void SetLocalID(int32_t iID)
C4PlayerInfo * GetPlayerInfoByID(int32_t id) const
C4PlayerInfo * GetPlayerInfo(int32_t iIndex) const
int32_t GetPlayerCount() const
int32_t GetJoinedPlayerCount() const
const char * AtNetworkPath(const char *filename)
bool GetLeagueLoginData(const char *server_name, const char *player_name, StdStrBuf *account, StdStrBuf *login_token) const
int32_t MasterServerSignUp
int32_t MasterReferencePeriod
void CheckPortsForCollisions()
const char * GetLeagueServerAddress()
void SetLeagueLoginData(const char *server_name, const char *player_name, const char *account, const char *login_token)
char PuncherAddress[CFG_MaxString+1]
int32_t LeagueServerSignUp
bool UpdateHaltCtrls(bool fHalt)
C4IDPacket * firstPkt() const
void Add(C4PacketType eType, C4ControlPacket *pCtrl)
void Delete(C4IDPacket *pPkt)
C4IDPacket * nextPkt(C4IDPacket *pPkt) const
int32_t getByClient() const
C4ControlVoteType getType() const
StdStrBuf getDesc() const
StdStrBuf getDescWarning() const
bool TextOut(const char *szText, CStdFont &rFont, float fZoom, C4Surface *sfcDest, float iTx, float iTy, DWORD dwFCol=0xffffffff, BYTE byForm=ALeft, bool fDoMarkup=true)
void SetDelOnClose(bool fToVal=true)
bool FadeIn(Screen *pOnScreen)
bool Show(Screen *pOnScreen, bool fCB)
void SetProgress(int32_t iToProgress)
bool ShowModalDlg(Dialog *pDlg, bool fDestruct=true)
bool ShowErrorMessage(const char *szMessage)
bool ShowMessageModal(const char *szMessage, const char *szCaption, DWORD dwButtons, Icons icoIcon, int32_t *piConfigDontShowAgainSetting=nullptr)
void CloseAllDialogs(bool fWithOK)
C4GameControlNetwork Network
bool CtrlTickReached(int32_t iTick)
void DoInput(C4PacketType eCtrlType, C4ControlPacket *pPkt, C4ControlDeliveryType eDelivery)
int32_t getNextControlTick() const
int32_t ClientNextControl(int32_t iClientID)
int32_t ClientPerfStat(int32_t iClientID)
int32_t getAvgControlSendTime() const
void SetCtrlMode(C4GameControlNetworkMode enMode)
int32_t getControlPreSend() const
void CopyClientList(const C4ClientList &rClients)
void SetRunning(bool fnRunning, int32_t inTargetTick=-1)
int32_t GetBehind(int32_t iTick) const
bool Init(int32_t iClientID, bool fHost, int32_t iStartTick, bool fActivated, C4Network2 *pNetwork)
bool CtrlReady(int32_t iTick)
bool ClientReady(int32_t iClientID, int32_t iTick)
C4RoundResults & RoundResults
void Abort(bool fApproved=false)
class C4ScenarioParameterDefs & ScenarioParameterDefs
char ScenarioFilename[_MAX_PATH_LEN]
C4PlayerInfoList & PlayerInfos
C4GameParameters & Parameters
void Synchronize(bool save_player_files)
void HandlePacket(char cStatus, const C4PacketBase *pBasePkt, C4Network2Client *pClient)
void OnClientConnect(C4Client *pClient, C4Network2IOConnection *pConn)
StdCopyStrBuf StreamAddress
bool InitNetwork(C4Network2ResList *pResList)
void EnforceLeagueRules(class C4Scenario *pScenario)
StdCopyStrBuf LeagueAddress
C4PlayerInfoList PlayerInfos
const C4Network2ResCore * getResCore() const
bool InitNetwork(C4Network2ResList *pNetResList)
bool Save(const char *szFilename)
void FlashMessage(const char *message)
bool Merge(const char *folders)
bool Open(const char *group_name, bool do_create=false)
virtual const char * GetError() const
bool SetServer(const char *szServerAddress)
bool Query(const StdBuf &Data, bool fBinary)
const char * getServerName() const
C4PacketBase * getPkt() const
bool ThreadLogS(const char *szMessage,...) GNUC_FORMAT_ATTRIBUTE_O
C4LeagueAction getCurrentAction() const
bool Start(const C4Network2Reference &Ref)
bool GetAuthReply(StdStrBuf *pMessage, StdStrBuf *pAUID, StdStrBuf *pAccount, bool *pRegister, StdStrBuf *pLoginToken)
bool GetStartReply(StdStrBuf *pMessage, StdStrBuf *pLeague, StdStrBuf *pStreamingAddr, int32_t *pSeed, int32_t *pMaxPlayers)
bool GetReportDisconnectReply(StdStrBuf *pMessage)
bool GetAuthCheckReply(StdStrBuf *pMessage, const char *szLeague, class C4PlayerInfo *pPlrInfo)
void ResetCurrentAction()
bool ReportDisconnect(const C4ClientPlayerInfos &rSendPlayerFBIDs, C4LeagueDisconnectReason eReason)
bool Auth(const C4PlayerInfo &PlrInfo, const char *szAccount, const char *szPassword, const char *szNewAccount=nullptr, const char *szNewPassword=nullptr, bool fRememberLogin=false)
bool GetEndReply(StdStrBuf *pMessage, class C4RoundResultsPlayers *pRoundResults)
bool Update(const C4Network2Reference &Ref)
bool GetUpdateReply(StdStrBuf *pMessage, C4ClientPlayerInfos *pPlayerLeagueInfos)
bool AuthCheck(const C4PlayerInfo &PlrInfo)
bool End(const C4Network2Reference &Ref, const char *szRecordName, const BYTE *pRecordSHA)
static bool ShowModal(const char *szPlayerName, const char *szLeagueName, const char *szLeagueServerName, StdStrBuf *psAccount, StdStrBuf *psPass, bool fWarnThirdParty, bool fRegister, bool *pfRememberLogin)
static std::vector< HostAddress > GetLocalAddresses()
std::unique_ptr< C4NetpuncherPacket > uptr
bool Execute(int, pollfd *) override
~InitialConnect() override
InitialConnect(const std::vector< C4Network2Address > &Addrs, const C4ClientCore &HostCore, const char *Password)
void AddAddrFromPuncher(const C4NetIO::addr_t &addr)
const char * getName() const
void SetStatus(C4Network2ClientStatus enStatus)
const std::set< int > & getInterfaceIDs() const
void RemoveConn(C4Network2IOConnection *pConn)
bool SendMsg(C4NetIOPacket rPkt) const
C4Network2IOConnection * getMsgConn() const
void SetDataConn(C4Network2IOConnection *pConn)
bool AddAddr(const C4Network2Address &addr, bool fAnnounce)
C4Client * getClient() const
bool hasConn(C4Network2IOConnection *pConn)
void SetMsgConn(C4Network2IOConnection *pConn)
void AddLocalAddrs(int16_t iPortTCP, int16_t iPortUDP)
const C4ClientCore & getCore() const
bool AllClientsReady() const
C4Network2Client * GetClient(const char *szName) const
C4Network2Client * GetHost()
bool SendMsgToClient(int32_t iClient, C4NetIOPacket &&rPkt)
C4Network2Client * GetNextClient(C4Network2Client *pClient)
void UpdateClientActivity()
C4Network2Client * GetClientByID(int32_t iID) const
C4Network2Client * GetLocal() const
bool BroadcastMsgToClients(const C4NetIOPacket &rPkt)
void Init(C4ClientList *pClientList, bool fHost)
bool SendMsgToHost(C4NetIOPacket rPkt)
void SendAddresses(C4Network2IOConnection *pConn)
bool CheckConn(const C4ClientCore &CCore, C4Network2IOConnection *pConn, C4Network2Client *pClient, StdStrBuf *szReply)
C4Network2Players Players
void HandleLobbyPacket(char cStatus, const C4PacketBase *pBasePkt, C4Network2IOConnection *pConn)
void DrawStatus(C4TargetFacet &cgo)
StdCopyStrBuf NetpuncherAddr
C4Network2ResList ResList
bool StartStreaming(C4Record *pRecord)
bool LeagueSignupEnable()
void OpenSurrenderDialog(C4ControlVoteType eType, int32_t iData)
bool LeagueStart(bool *pCancel)
bool InitNetIO(bool fNoClientID, bool fHost)
class C4LeagueClient * pLeagueClient
bool ToggleClientListDlg()
StdStrBuf QueryClientPassword()
void OnGameSynchronized()
time_t iLastStreamAttempt
class C4VoteDialog * pVoteDialog
void DeactivateInactiveClients()
void HandleStatus(const C4Network2Status &nStatus)
InitResult InitClient(const class C4Network2Reference &Ref, bool fObserver)
void AbortLobbyCountdown()
C4NetpuncherID getNetpuncherGameID() const
void HandleJoinData(const class C4PacketJoinData &rPkt)
void LeagueGameEvaluate(const char *szRecordName=nullptr, const BYTE *pRecordSHA=nullptr)
void OnClientDisconnect(C4Network2Client *pClient)
void HandleActivateReq(int32_t iTick, C4Network2Client *pClient)
bool InitLeague(bool *pCancel)
void OnDisconn(C4Network2IOConnection *pConn)
void HandleStatusAck(const C4Network2Status &nStatus, C4Network2Client *pClient)
void OnSec1Timer() override
class C4GameLobby::MainDlg * GetLobby() const
StdCopyStrBuf MasterServerAddress
void InvalidateReference()
void HandleConnRe(const class C4PacketConnRe &Pkt, C4Network2IOConnection *pConn, C4Network2Client *pClient)
void AllowJoin(bool fAllow)
C4Record * pStreamedRecord
C4TimeMilliseconds tLastActivateRequest
size_t getPendingStreamData() const
bool ChangeGameStatus(C4NetGameState enState, int32_t iTargetCtrlTick, int32_t iCtrlMode=-1)
void LeagueShowError(const char *szMsg)
uint32_t iLastLeagueUpdate
void OnVoteDialogClosed()
uint32_t iLastReferenceUpdate
bool LeaguePlrAuthCheck(C4PlayerInfo *pInfo)
void OnPuncherConnect(C4NetIO::addr_t addr)
bool HostConnect(const C4ClientCore &CCore, C4Network2IOConnection *pConn, StdStrBuf *szReply)
uint32_t iLastChaseTargetUpdate
bool StreamIn(bool fFinish)
unsigned int iCurrentStreamAmount
bool HandlePuncherPacket(C4NetpuncherPacket::uptr, C4NetIO::HostAddress::AddressFamily family)
bool LeagueUpdateProcessReply()
void EndVote(C4ControlVoteType eType, bool fApprove, int32_t iData)
bool Join(C4ClientCore &CCore, C4Network2IOConnection *pConn, StdStrBuf *szReply)
StdStrBuf getNetpuncherAddr() const
void Vote(C4ControlVoteType eType, bool fApprove=true, int32_t iData=0)
void CheckStatusReached(bool fFromFinalInit=false)
unsigned int iCurrentStreamPosition
bool isPassworded() const
void HandlePacket(char cStatus, const C4PacketBase *pBasePkt, C4Network2IOConnection *pConn)
void SetCtrlMode(int32_t iCtrlMode)
void SetPassword(const char *szToPassword)
void LeagueSignupDisable()
C4NetpuncherID NetpuncherGameID
C4Network2ClientList Clients
bool InitHost(bool fLobby)
uint32_t iLeagueUpdateDelay
void LeagueNotifyDisconnect(int32_t iClientID, enum C4LeagueDisconnectReason eReason)
bool LeagueEnd(const char *szRecordName=nullptr, const BYTE *pRecordSHA=nullptr)
void OnDisconnect(C4Network2Client *pClient, C4Network2IOConnection *pConn)
C4Network2Res::Ref RetrieveRes(const C4Network2ResCore &Core, int32_t iTimeout, const char *szResName, bool fWaitForCore=false)
void OnConnect(C4Network2Client *pClient, C4Network2IOConnection *pConn, const char *szMsg, bool fFirstConnection)
void OnConnectFail(C4Network2IOConnection *pConn)
bool isLobbyActive() const
void AddVote(const C4ControlVote &Vote)
void OnClientConnect(C4Network2Client *pClient, C4Network2IOConnection *pConn)
bool CreateDynamic(bool fInit)
bool LeaguePlrAuth(C4PlayerInfo *pInfo)
void OnConn(C4Network2IOConnection *pConn)
void SendJoinData(C4Network2Client *pClient)
C4Network2ResCore ResDynamic
class C4GameControlNetwork * pControl
z_stream StreamCompressor
C4GameLobby::Countdown * pLobbyCountdown
C4IDPacket * GetVote(int32_t iClientID, C4ControlVoteType eType, int32_t iData)
void StartLobbyCountdown(int32_t iCountdownTime)
void SetAllowObserve(bool fAllow)
class C4HTTPClient * pStreamer
void HandleConn(const class C4PacketConn &Pkt, C4Network2IOConnection *pConn, C4Network2Client *pClient)
C4GameLobby::MainDlg * pLobby
bool RetrieveScenario(char *szScenario)
void SetCCore(const C4ClientCore &nCCore)
C4NetIO * getNetClass() const
const C4NetIO::addr_t & getPeerAddr() const
bool isHalfAccepted() const
bool Send(const C4NetIOPacket &rPkt)
bool isAutoAccepted() const
bool CreatePostMortem(class C4PacketPostMortem *pPkt)
uint32_t getOutPacketCounter() const
const C4NetIO::addr_t & getConnectAddr() const
C4Network2IOProtocol getProtocol() const
void SetLocalCCore(const C4ClientCore &CCore)
C4Network2IOProtocol getNetIOProt(C4NetIO *pNetIO)
int getProtORate(C4Network2IOProtocol eProt) const
void SendPuncherPacket(const C4NetpuncherPacket &, C4NetIO::HostAddress::AddressFamily family)
bool InitPuncher(C4NetIO::addr_t PuncherAddr)
void SetReference(class C4Network2Reference *pReference)
bool Connect(const C4NetIO::addr_t &addr, C4Network2IOProtocol eProt, const C4ClientCore &nCCore, const char *szPassword=nullptr)
int getProtBCRate(C4Network2IOProtocol eProt) const
void SetAcceptMode(bool fAcceptAll)
void Punch(const C4NetIO::addr_t &)
int getProtIRate(C4Network2IOProtocol eProt) const
const char * getNetIOName(C4NetIO *pNetIO)
void SetExclusiveConnMode(bool fExclusiveConn)
bool Init(int16_t iPortTCP, int16_t iPortUDP, int16_t iPortDiscovery=-1, int16_t iPortRefServer=-1, bool fBroadcast=false, bool enable_upnp=true)
void SendUpdatedPlayers()
C4GameParameters Parameters
bool isPasswordNeeded() const
const C4Network2Address & getAddr(int i) const
StdStrBuf getNetpuncherAddr() const
const C4NetIO::EndpointAddress & GetSourceAddress() const
C4NetpuncherID getNetpuncherGameID() const
const char * getFileName() const
const char * getFile() const
const C4Network2ResCore & getCore() const
int32_t getPresentPercent() const
C4Network2Res::Ref getRefRes(int32_t iResID)
bool FindTempResFileName(const char *szFilename, char *pTarget)
C4Network2Res::Ref AddByFile(const char *strFilePath, bool fTemp, C4Network2ResType eType, int32_t iResID=-1, const char *szResName=nullptr, bool fAllowUnloadable=false)
bool Init(int32_t iClientID, C4Network2IO *pIOClass)
void SetLocalID(int32_t iClientID)
C4Network2Res::Ref AddByCore(const C4Network2ResCore &Core, bool fLoad=true)
void OnClientConnect(C4Network2IOConnection *pConn)
int32_t getCtrlMode() const
void SetTargetTick(int32_t iTargetCtrlTick)
void SetCtrlMode(int32_t iCtrlMode)
C4NetGameState getState() const
void Set(C4NetGameState eState, int32_t iTargetCtrlTick)
void CompileFunc(StdCompiler *pComp, bool fReference)
int32_t getTargetCtrlTick() const
const char * getStateName() const
const char * getDescription() const
const C4ClientCore & getCCore() const
const char * getPassword() const
const char * getMsg() const
bool isPasswordWrong() const
C4ScenarioParameterDefs ScenarioParameterDefs
const C4Network2Status & getStatus() const
int32_t getStartCtrlTick() const
void SetStartCtrlTick(int32_t iTick)
const int32_t & getClientID() const
C4GameParameters Parameters
const C4Network2ResCore & getDynamicCore() const
void SetGameStatus(const C4Network2Status &Status)
void SetDynamicCore(const C4Network2ResCore &Core)
void SetClientID(int32_t inClientID)
uint32_t getPacketCount() const
void SetLeagueProjectedGain(int32_t iProjectedGain)
const char * GetName() const
int32_t GetLeagueProjectedGain() const
void SetAuthID(const char *sznAuthID)
C4ClientPlayerInfos * GetInfoByClientID(int32_t iClientID) const
C4ClientPlayerInfos * GetIndexedInfo(int32_t iIndex) const
unsigned int GetStreamingPos() const
void ClearStreamingBuf(unsigned int iAmount)
const StdBuf & GetStreamingBuf() const
void EvaluateLeague(const char *szResultMsg, bool fSuccess, const C4RoundResultsPlayers &rLeagueInfo)
void EvaluateNetwork(NetResult eResult, const char *szResultsString)
static C4TimeMilliseconds Now()
C4ControlVoteType getVoteType() const
int32_t getVoteData() const
C4VoteDialog(const char *szText, C4ControlVoteType eVoteType, int32_t iVoteData, bool fSurrender)
const void * getData() const
void Move(size_t iFrom, size_t inSize, size_t iTo=0)
void Value(const T &rStruct)
bool ScheduleProcs(int iTimeout=1000/36)
void Remove(StdSchedulerProc *pProc)
void Add(StdSchedulerProc *pProc)
void AppendFormat(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
const char * getData() const
void AppendChar(char cChar)
void Append(const char *pnData, size_t iChars)
void Format(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
void SetAddress(const sockaddr *addr)
StdStrBuf ToString(int flags=0) const
void SetDefaultPort(uint16_t port)
EndpointAddress AsIPv4() const