Files
FC1/CryNetwork/Network.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

819 lines
21 KiB
C++

// Network.cpp: implementation of the CNetwork class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Network.h"
#include "Client.h"
#include "ClientLocal.h"
#include "ServerSlot.h"
#include "ServerSnooper.h"
#include "NETServerSnooper.h"
#include "Server.h"
#include "RConSystem.h"
#include "DefenceWall.h"
#if !defined(NOT_USE_PUNKBUSTER_SDK)
#include "PunkBusterInterface.h"
#endif
#include "ITimer.h"
#ifndef NOT_USE_UBICOM_SDK
#include "NewUbisoftClient.h" // NewUbisoftClient
#include "ScriptObjectNewUbisoftClient.h" // CScriptObjectNewUbisoftClient
#endif // NOT_USE_UBICOM_SDK
#define ANTI_CHEATS
#include "platform.h"
#if defined(LINUX)
#include "INetwork.h"
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
unsigned int CNetwork::m_nCryNetInitialized = 0;
struct CryNetError CNetwork::m_neNetErrors[]=
{
{NET_OK, "No Error"},
{NET_FAIL, "Generic Error"},
// SOCKET
{NET_EINTR, "WSAEINTR - interrupted function call"},
{NET_EBADF, "WSAEBADF - Bad file number"},
{NET_EACCES, "WSAEACCES - error in accessing socket"},
{NET_EFAULT, "WSAEFAULT - bad address"},
{NET_EINVAL, "WSAEINVAL - invalid argument"},
{NET_EMFILE, "WSAEMFILE - too many open files"},
{NET_EWOULDBLOCK, "WSAEWOULDBLOCK - resource temporarily unavailable"},
{NET_EINPROGRESS, "WSAEINPROGRESS - operation now in progress"},
{NET_EALREADY, "WSAEALREADY - operation already in progress"},
{NET_ENOTSOCK, "WSAENOTSOCK - socket operation on non-socket"},
{NET_EDESTADDRREQ, "WSAEDESTADDRREQ - destination address required"},
{NET_EMSGSIZE, "WSAEMSGSIZE - message to long"},
{NET_EPROTOTYPE, "WSAEPROTOTYPE - protocol wrong type for socket"},
{NET_ENOPROTOOPT, "WSAENOPROTOOPT - bad protocol option"},
{NET_EPROTONOSUPPORT, "WSAEPROTONOSUPPORT - protocol not supported"},
{NET_ESOCKTNOSUPPORT, "WSAESOCKTNOSUPPORT - socket type not supported"},
{NET_EOPNOTSUPP, "WSAEOPNOTSUPP - operation not supported"},
{NET_EPFNOSUPPORT, "WSAEPFNOSUPPORT - protocol family not supported"},
{NET_EAFNOSUPPORT, "WSAEAFNOSUPPORT - address family not supported by protocol"},
{NET_EADDRINUSE, "WSAEADDRINUSE - address is in use"},
{NET_EADDRNOTAVAIL, "WSAEADDRNOTAVAIL - address is not valid in context"},
{NET_ENETDOWN, "WSAENETDOWN - network is down"},
{NET_ENETUNREACH, "WSAENETUNREACH - network is unreachable"},
{NET_ENETRESET, "WSAENETRESET - network dropped connection on reset"},
{NET_ECONNABORTED, "WSACONNABORTED - software caused connection aborted"},
{NET_ECONNRESET, "WSAECONNRESET - connection reset by peer"},
{NET_ENOBUFS, "WSAENOBUFS - no buffer space available"},
{NET_EISCONN, "WSAEISCONN - socket is already connected"},
{NET_ENOTCONN, "WSAENOTCONN - socket is not connected"},
{NET_ESHUTDOWN, "WSAESHUTDOWN - cannot send after socket shutdown"},
{NET_ETOOMANYREFS, "WSAETOOMANYREFS - Too many references: cannot splice"},
{NET_ETIMEDOUT, "WSAETIMEDOUT - connection timed out"},
{NET_ECONNREFUSED, "WSAECONNREFUSED - connection refused"},
{NET_ELOOP, "WSAELOOP - Too many levels of symbolic links"},
{NET_ENAMETOOLONG, "WSAENAMETOOLONG - File name too long"},
{NET_EHOSTDOWN, "WSAEHOSTDOWN - host is down"},
{NET_EHOSTUNREACH, "WSAEHOSTUNREACH - no route to host"},
{NET_ENOTEMPTY, "WSAENOTEMPTY - Cannot remove a directory that is not empty"},
{NET_EUSERS, "WSAEUSERS - Ran out of quota"},
{NET_EDQUOT, "WSAEDQUOT - Ran out of disk quota"},
{NET_ESTALE, "WSAESTALE - File handle reference is no longer available"},
{NET_EREMOTE, "WSAEREMOTE - Item is not available locally"},
// extended winsock errors(not BSD compliant)
#ifdef _WIN32
{NET_EPROCLIM, "WSAEPROCLIM - too many processes"},
{NET_HOST_NOT_FOUND, "WSAHOST_NOT_FOUND - host not found"},
{NET_TRY_AGAIN, "WSATRY_AGAIN - non-authoritative host not found"},
{NET_NO_RECOVERY, "WSANO_RECOVERY - non-recoverable error"},
{NET_NO_DATA, "WSANO_DATA - valid name, no data record of requested type"},
{NET_NO_ADDRESS, "WSANO_ADDRESS - (undocumented)"},
{NET_SYSNOTREADY, "WSASYSNOTREADY - network subsystem is unavailable"},
{NET_VERNOTSUPPORTED, "WSAVERNOTSUPPORTED - winsock.dll verison out of range"},
{NET_NOTINITIALISED, "WSANOTINITIALISED - WSAStartup not yet performed"},
{NET_NO_DATA, "WSANO_DATA - valid name, no data record of requested type"},
{NET_EDISCON, "WSAEDISCON - graceful shutdown in progress"},
#endif
// XNetwork specific
{NET_NOIMPL, "XNetwork - Function not implemented"},
{NET_SOCKET_NOT_CREATED, "XNetwork - socket not yet created"},
{0, 0} // sentinel
};
CNetwork::CNetwork()
{
m_dwLocalIP=0;
m_pNetCompressPackets = 0;
m_pNetLog = 0;
m_pDefenceWall = 0;
#if !defined(NOT_USE_PUNKBUSTER_SDK)
m_pPunkBuster = 0;
#endif
m_bHaveServer = false;
m_bHaveClient = false;
#ifndef NOT_USE_UBICOM_SDK
m_pScriptObjectNewUbisoftClient=0;
m_pUbiSoftClient=0;
#endif // NOT_USE_UBICOM_SDK
m_pScriptSystem=0;
m_pClient=0;
}
CNetwork::~CNetwork()
{
#ifndef NOT_USE_UBICOM_SDK
SAFE_DELETE(m_pUbiSoftClient);
SAFE_DELETE(m_pScriptObjectNewUbisoftClient);
CScriptObjectNewUbisoftClient::ReleaseTemplate();
#endif // NOT_USE_UBICOM_SDK
SAFE_RELEASE( m_pNetCompressPackets );
SAFE_RELEASE( m_pNetLog );
SAFE_DELETE( m_pDefenceWall );
#if !defined(NOT_USE_PUNKBUSTER_SDK)
SAFE_DELETE( m_pPunkBuster );
#endif
}
ICompressionHelper *CNetwork::GetCompressionHelper()
{
return &m_Compressor;
}
void CNetwork::SetLocalIP( const char *szLocalIP )
{
CIPAddress ip;
ip.Set(0,(char *)szLocalIP);
m_dwLocalIP=ip.GetAsUINT();
#ifndef NOT_USE_UBICOM_SDK
// Ubi.com cannot change the IP later than creation
{
CIPAddress localip;
localip.Set(0,GetLocalIP());
m_pUbiSoftClient=new NewUbisoftClient(localip.GetAsString());
m_pScriptObjectNewUbisoftClient=new CScriptObjectNewUbisoftClient;
CScriptObjectNewUbisoftClient::InitializeTemplate(m_pScriptSystem);
m_pScriptObjectNewUbisoftClient->Init(m_pScriptSystem,m_pSystem,m_pUbiSoftClient);
}
#endif // NOT_USE_UBICOM_SDK
}
DWORD CNetwork::GetLocalIP() const
{
return m_dwLocalIP;
}
bool CNetwork::Init( IScriptSystem *pScriptSystem )
{
assert(pScriptSystem);
m_pScriptSystem = pScriptSystem;
if(CNetwork::m_nCryNetInitialized)
return true;
#if !defined(PS2) && !defined(LINUX)
WORD wVersionRequested;
WSADATA wsaData;
int err;
// WARNING :use a later version require a change in the multicast code with
// a WS2's specific one
// not compatible with other platforms
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return false;
}
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return false;
}
#endif
CNetwork::m_nCryNetInitialized+=1;
int n=0;
while(m_neNetErrors[n].sErrorDescription!='\0'){
m_mapErrors[m_neNetErrors[n].nrErrorCode]=m_neNetErrors[n].sErrorDescription;
n++;
}
/// Register Console Vars related to network.
m_pSystem = GetISystem();
CreateConsoleVars();
#ifdef ANTI_CHEATS
m_pDefenceWall = new CDefenceWall(this);
#endif //ANTI_CHEATS
#if !defined(NOT_USE_PUNKBUSTER_SDK)
m_pPunkBuster = new CPunkBusterInterface(this);
PBsdk_SetPointers ( m_pPunkBuster ) ;
#endif
LogNetworkInfo();
return true;
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::CreateConsoleVars()
{
m_pNetCompressPackets = m_pSystem->GetIConsole()->CreateVariable( "net_compress_packets","1",0 );
m_pNetLog = m_pSystem->GetIConsole()->CreateVariable( "net_log","0",0 );
//m_pNetCheatProtection = m_pSystem->GetIConsole()->CreateVariable( "net_cheatprotection","0",VF_DUMPTODISK );
m_pNetCheatProtection = m_pSystem->GetIConsole()->CreateVariable( "net_cheatprotection","0",VF_READONLY );
m_pNetCheatProtection->ForceSet("0");
m_pSystem->GetIConsole()->CreateVariable("sv_ServerType", "LAN",0,
"Specifies the server connection type (next server creation, not case sensitive) 'UBI', 'LAN' or 'NET'\n"
"Usage: sv_ServerType UBI\n");
m_pSystem->GetIConsole()->CreateVariable("sv_regserver_port","",0,
"Sets the local port for a registering the server on Ubi.com GS.\n"
"Usage: sv_regserver_port portnumber\n"
"Default is '0' (first free).");
m_pSystem->GetIConsole()->CreateVariable("sv_authport","",0,
"Sets the local port for a CDKey authentication comunications.\n"
"Usage: sv_auth_port portnumber\n"
"Default is '0' (first free).");
}
//////////////////////////////////////////////////////////////////////////
IClient *CNetwork::CreateClient(IClientSink *pSink, bool bLocal)
{
assert(!m_pClient); // only one client at a time is allowed
m_bHaveClient = true;
if(bLocal)
{
CClientLocal *pClient=new CClientLocal(this,pSink);
m_pClient=pClient;
return pClient;
}
else
{
CClient *pClient = new CClient( this );
if(!pClient->Init(pSink))
{
delete pClient;
return NULL;
}
if (GetCheatProtectionLevel() > 0)
{
if (m_pDefenceWall)
m_pDefenceWall->SetClient(pClient);
}
m_pClient=pClient;
return pClient;
}
return NULL;
}
IServer *CNetwork::CreateServer(IServerSlotFactory *pFactory, WORD nPort, bool listen)
{
m_bHaveServer = true;
CServer *pServer = new CServer(this);
if (!pServer->Init(pFactory, nPort, listen))
{
delete pServer;
return NULL;
}
m_mapServers.insert(MapServersItor::value_type(nPort, pServer));
if (GetCheatProtectionLevel() > 0)
{
if (m_pDefenceWall)
m_pDefenceWall->SetServer(pServer);
}
IConsole *pConsole = GetISystem()->GetIConsole();
assert(pConsole);
ICVar *sv_punkbuster = pConsole->GetCVar("sv_punkbuster");
if (sv_punkbuster && sv_punkbuster->GetIVal() != 0)
{
InitPunkbusterServer(listen, pServer);
// if this is a lan server
if(pServer->GetServerType()==eMPST_LAN)
{
// set pb variables to lan defaults
pConsole->ExecuteString("pb_sv_lan 1", 0, 1);
pConsole->ExecuteString("pb_sv_guidrelax 7", 0, 1);
}
}
#ifndef NOT_USE_UBICOM_SDK
m_pUbiSoftClient->Server_SetGamePort(nPort); // set the connection to the server
#endif // NOT_USE_UBICOM_SDK
LockPunkbusterCVars();
return pServer;
}
INETServerSnooper *CNetwork::CreateNETServerSnooper(INETServerSnooperSink *pSink)
{
CNETServerSnooper *pSnooper = new CNETServerSnooper;
if (!pSnooper->Create(GetISystem(), pSink))
{
delete pSnooper;
return 0;
}
return pSnooper;
}
IRConSystem *CNetwork::CreateRConSystem()
{
CRConSystem *pRCon = new CRConSystem;
if(!pRCon->Create(GetISystem()))
{
delete pRCon;
return 0;
}
return pRCon;
}
IServerSnooper *CNetwork::CreateServerSnooper(IServerSnooperSink *pSink)
{
CServerSnooper *pSnooper=new CServerSnooper;
if(!pSnooper->Init(pSink))
{
delete pSnooper;
return NULL;
}
return pSnooper;
}
CServerSlotLocal *CNetwork::ConnectToLocalServerSlot(CClientLocal *pClient, WORD wPort)
{
MapServersItor itor;
if(m_mapServers.empty())
return NULL;
//check if the local server exists
itor=m_mapServers.find(wPort);
if(itor==m_mapServers.end()){
itor=m_mapServers.begin();
}
//<<FIXME>> make the port variable
CIPAddress ip(0,"127.0.0.1");
CServerSlotLocal *pServerSlot=new CServerSlotLocal(itor->second,pClient,ip,this);
itor->second->RegisterLocalServerSlot(pServerSlot,ip);
return pServerSlot;
}
const char *CNetwork::EnumerateError(NRESULT err)
{
ERROR_MAPItor itor;
itor = m_mapErrors.find(err);
if (itor != m_mapErrors.end())
{
return itor->second;
}
return "Unknown";
}
void CNetwork::Release()
{
CNetwork::m_nCryNetInitialized -= 1;
if (CNetwork::m_nCryNetInitialized)
return;
#if !defined(LINUX)
#if !defined(PS2)
else
WSACleanup();
#else
CSocketManager::releaseImpl();
delete &ISocketManagerImplementation::getInstance();
#endif
#endif
delete this;
}
IServer *CNetwork::GetServerByPort( const WORD wPort )
{
//check if the local server exists
MapServersItor itor=m_mapServers.find(wPort);
if(itor==m_mapServers.end())
return 0; // not found
return itor->second;
}
void CNetwork::UnregisterServer(WORD wPort)
{
#ifndef NOT_USE_UBICOM_SDK
// We have to tell Ubisoft that the client has finished the game.
// If ubisoft is not running this won't do anything.
m_pUbiSoftClient->Client_LeaveGameServer();
#endif // NOT_USE_UBICOM_SDK
if(m_bHaveServer)
{
#if !defined(NOT_USE_PUNKBUSTER_SDK)
if (m_pPunkBuster)
m_pPunkBuster->ShutDown(false);
#endif
}
m_mapServers.erase(wPort);
}
void CNetwork::UnregisterClient( IClient *pClient )
{
assert(pClient);
assert(m_pClient==pClient);
m_pClient=0;
if(m_bHaveClient)
{
#if !defined(NOT_USE_PUNKBUSTER_SDK)
if (m_pPunkBuster)
m_pPunkBuster->ShutDown(true);
#endif
}
}
void CNetwork::GetMemoryStatistics(ICrySizer *pSizer)
{
pSizer->AddObject(m_neNetErrors,sizeof(m_neNetErrors));
#ifndef NOT_USE_UBICOM_SDK
pSizer->AddObject( m_pScriptObjectNewUbisoftClient, sizeof *m_pScriptObjectNewUbisoftClient);
#endif // NOT_USE_UBICOM_SDK
}
bool CNetwork::IsPacketCompressionEnabled() const
{
return m_pNetCompressPackets->GetIVal() != 0;
}
//////////////////////////////////////////////////////////////////////////
CTimeValue CNetwork::GetCurrentTime()
{
return m_pSystem->GetITimer()->GetCurrTimePrecise();
}
//////////////////////////////////////////////////////////////////////////
u32 CNetwork::GetStringHash( const char *szString )
{
#if defined(LINUX)
return 0;
#else
#ifdef _DATAPROBE
return m_pSystem->GetIDataProbe()->GetHash( szString );
#else
return 0;
#endif
#endif
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::PunkDetected( CIPAddress &ip )
{
// Disconnect.
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::UpdateNetwork()
{
#ifndef NOT_USE_UBICOM_SDK
// Update ubisoft
m_pUbiSoftClient->Update();
#endif // NOT_USE_UBICOM_SDK
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::OnClientUpdate()
{
#if !defined(NOT_USE_PUNKBUSTER_SDK)
if (m_pPunkBuster)
m_pPunkBuster->Update(true);
#endif
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::OnServerUpdate()
{
if (m_pDefenceWall && GetCheatProtectionLevel() > 0)
m_pDefenceWall->ServerUpdate();
#if !defined(NOT_USE_PUNKBUSTER_SDK)
if (m_pPunkBuster)
m_pPunkBuster->Update(false);
#endif
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::ClearProtectedFiles()
{
if (m_pDefenceWall)
m_pDefenceWall->ClearProtectedFiles();
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::AddProtectedFile( const char *sFilename )
{
if (m_pDefenceWall)
m_pDefenceWall->AddProtectedFile( sFilename );
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::AddClientToDefenceWall( CIPAddress &clientIP )
{
#if !defined(NOT_USE_PUNKBUSTER_SDK)
//we want PB to work on devmode servers so handle this first
if (m_pPunkBuster)
m_pPunkBuster->OnAddClient(clientIP);
#endif
// if in dev mode ignore it.
if (!m_pSystem->GetForceNonDevMode())
return;
if (m_pDefenceWall && GetCheatProtectionLevel() > 0)
m_pDefenceWall->OnAddClient( clientIP );
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::RemoveClientFromDefenceWall( CIPAddress &clientIP )
{
if (m_pDefenceWall)
m_pDefenceWall->OnDisconnectClient( clientIP );
#if !defined(NOT_USE_PUNKBUSTER_SDK)
if (m_pPunkBuster)
m_pPunkBuster->OnDisconnectClient(clientIP);
#endif
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::OnSecurityMsgResponse( CIPAddress &ipAddress,CStream &stm )
{
if (m_pDefenceWall)
m_pDefenceWall->OnClientResponse(ipAddress,stm);
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::OnSecurityMsgQuery( CStream &stm )
{
if (m_pDefenceWall)
m_pDefenceWall->OnServerRequest(stm);
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::OnCCPPunkBusterMsg( CIPAddress &ipAddress,CStream &stm )
{
#if !defined(NOT_USE_PUNKBUSTER_SDK)
if (m_pPunkBuster)
m_pPunkBuster->OnCCPPunkBusterMsg( ipAddress,stm );
#endif
}
//////////////////////////////////////////////////////////////////////////
int CNetwork::GetLogLevel()
{
return m_pNetLog->GetIVal();
}
//////////////////////////////////////////////////////////////////////////
int CNetwork::GetCheatProtectionLevel()
{
//return m_pNetCheatProtection->GetIVal();
return 0; // disable the cheat protection..
}
//////////////////////////////////////////////////////////////////////////
bool CNetwork::CheckPBPacket(CStream &stmPacket,CIPAddress &ip)
{
#if !defined(NOT_USE_PUNKBUSTER_SDK)
if (m_pPunkBuster)
return m_pPunkBuster->CheckPBPacket(stmPacket,ip);
#endif
return true;
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::ValidateClient( CServerSlot *pSlot )
{
#if !defined(NOT_USE_PUNKBUSTER_SDK)
if (m_pPunkBuster)
return m_pPunkBuster->ValidateClient( pSlot );
#endif
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::InitPunkbusterClient(CClient *pClient)
{
#if !defined(NOT_USE_PUNKBUSTER_SDK)
if (m_pPunkBuster)
{
m_pPunkBuster->Init(true, false);
m_pPunkBuster->SetClient(pClient);
}
#endif
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::InitPunkbusterClientLocal(CClientLocal *pClientLocal)
{
#if !defined(NOT_USE_PUNKBUSTER_SDK)
if (m_pPunkBuster)
{
m_pPunkBuster->Init(true, true);
m_pPunkBuster->SetClientLocal(pClientLocal);
}
#endif
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::InitPunkbusterServer(bool bLocal, CServer *pServer)
{
#if !defined(NOT_USE_PUNKBUSTER_SDK)
if (m_pPunkBuster)
{
m_pPunkBuster->Init(false, bLocal);
m_pPunkBuster->SetServer(pServer);
}
#endif
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::LockPunkbusterCVars()
{
#if !defined(NOT_USE_PUNKBUSTER_SDK)
if (m_pPunkBuster)
{
m_pPunkBuster->LockCVars();
}
#endif
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::LogNetworkInfo()
{
DWORD i;
char buf[256];
struct hostent *hp;
if(!gethostname(buf, sizeof(buf)))
{
hp = gethostbyname(buf);
if (hp)
{
CryLogAlways("network hostname: %s",hp->h_name);
i = 0;
while(hp->h_aliases[i])
{
CryLogAlways(" alias: %s\n", hp->h_aliases[i]);
i++;
}
i = 0;
while(hp->h_addr_list[i])
{
sockaddr_in temp;
memcpy(&(temp.sin_addr), hp->h_addr_list[i], hp->h_length);
#if defined(LINUX)
const in_addr_windows *pin_addr_win = reinterpret_cast<const in_addr_windows*>(&temp.sin_addr);
CryLogAlways(" ip:%d.%d.%d.%d", // port:%d family:%x",
(int)(pin_addr_win->S_un.S_un_b.s_b1),
(int)(pin_addr_win->S_un.S_un_b.s_b2),
(int)(pin_addr_win->S_un.S_un_b.s_b3),
(int)(pin_addr_win->S_un.S_un_b.s_b4));
#else
CryLogAlways(" ip:%d.%d.%d.%d", // port:%d family:%x",
(int)(temp.sin_addr.S_un.S_un_b.s_b1),
(int)(temp.sin_addr.S_un.S_un_b.s_b2),
(int)(temp.sin_addr.S_un.S_un_b.s_b3),
(int)(temp.sin_addr.S_un.S_un_b.s_b4));
// (int)temp.sin_port,(unsigned int)temp.sin_family);
#endif
i++;
}
}
}
}
//////////////////////////////////////////////////////////////////////////
IClient *CNetwork::GetClient()
{
return m_pClient;
}
//////////////////////////////////////////////////////////////////////////
void CNetwork::OnAfterServerLoadLevel( const char *szServerName, const uint32 dwPlayerCount, const WORD wPort )
{
assert(szServerName);
assert(dwPlayerCount>0);
// m_pSystem->GetILog()->Log("Ubi.com DEBUG OnAfterServerLoadLevel() 1");
IServer *pServer=GetServerByPort(wPort);
if(!pServer)
{
assert(pServer); // internal error
return;
}
#ifndef NOT_USE_UBICOM_SDK
if(m_pSystem->GetIGame()->GetModuleState(EGameMultiplayer) && pServer->GetServerType()!=eMPST_LAN)
{
// if it's a ubi-server, publish the server
if(pServer->GetServerType()==eMPST_UBI)
m_pUbiSoftClient->Server_CreateServer(szServerName,dwPlayerCount);
// if it's a internet server, check CDKey
// m_pSystem->GetILog()->Log("Ubi.com DEBUG OnAfterServerLoadLevel() 2");
m_pUbiSoftClient->Server_CheckCDKeys(1);
}
else
{
// m_pSystem->GetILog()->Log("Ubi.com DEBUG OnAfterServerLoadLevel() 3");
m_pUbiSoftClient->Server_DestroyServer();
m_pUbiSoftClient->Server_CheckCDKeys(0);
}
#endif // NOT_USE_UBICOM_SDK
}
bool CNetwork::VerifyMultiplayerOverInternet()
{
#ifndef NOT_USE_UBICOM_SDK
if(!m_pUbiSoftClient->Client_IsConnected())
{
// if this is a ubi.com server, and we don't have a ubi.com connection
// disconnect, login, and retry
GetClient()->Disconnect("@UserDisconnected");
HSCRIPTFUNCTION pfnOnConnectNeedUbi = m_pScriptSystem->GetFunctionPtr("Game", "OnConnectNeedUbi");
if (pfnOnConnectNeedUbi)
{
_SmartScriptObject pGameScriptObject(m_pScriptSystem,true);
m_pScriptSystem->GetGlobalValue("Game",*pGameScriptObject);
m_pScriptSystem->BeginCall(pfnOnConnectNeedUbi);
m_pScriptSystem->PushFuncParam(pGameScriptObject);
m_pScriptSystem->EndCall();
m_pScriptSystem->ReleaseFunc(pfnOnConnectNeedUbi);
}
return false;
}
#endif // NOT_USE_UBICOM_SDK
return true;
}
void CNetwork::Client_ReJoinGameServer()
{
#ifndef NOT_USE_UBICOM_SDK
// We have to tell Ubisoft that the client has successfully connected
// If ubisoft is not running this won't do anything.
m_pUbiSoftClient->Client_ReJoinGameServer();
#endif NOT_USE_UBICOM_SDK
}