bool CNetworkModule::Startup(void) { // Create the socket descriptor RakNet::SocketDescriptor socketDescriptor(CVAR_GET_INTEGER("port"), CVAR_GET_STRING("hostaddress").Get()); // Attempt to startup raknet bool bReturn = (m_pRakPeer->Startup(CVAR_GET_INTEGER("maxplayers"), &socketDescriptor, 1, 0) == RakNet::RAKNET_STARTED); // Did it start? if(bReturn) { // Set the maximum incoming connections m_pRakPeer->SetMaximumIncomingConnections(CVAR_GET_INTEGER("maxplayers")); // Get the password string CString strPassword = CVAR_GET_STRING("password"); // Do we have a password? if(strPassword.GetLength() > 0) { // Set the server password m_pRakPeer->SetIncomingPassword(strPassword.Get(), strPassword.GetLength()); } } // Return return bReturn; }
void CChatWindow::InitFontAndBackground() { // Load our chat font m_pFont = g_pGUI->GetFont(CVAR_GET_STRING("chatfont").Get(), CVAR_GET_INTEGER("chatsize")); // Do we not have a valid font? if(!m_pFont) g_pGUI->ShowMessageBox("Invalid chat font.\nPlease set a valid font in the Chat tab of the Settings menu.", "Warning"); // Set our background colors m_ulBackgroundColor = D3DCOLOR_ARGB(CVAR_GET_INTEGER("chatbga"), CVAR_GET_INTEGER("chatbgr"), CVAR_GET_INTEGER("chatbgg"), CVAR_GET_INTEGER("chatbgb")); }
SQInteger CSystemNatives::MaxPlayers( SQVM * pVM ) { #ifdef _CLIENT sq_pushinteger( pVM, pCore->GetServerMaxPlayers() ); #else sq_pushinteger( pVM, CVAR_GET_INTEGER( "maxplayers" ) ); #endif return 1; }
// setWeather(weather) SQInteger CServerNatives::ForceWind(SQVM * pVM) { SQFloat fWind; sq_getfloat(pVM, 2, &fWind); if(fWind != CVAR_GET_INTEGER("wind")) { CVAR_SET_FLOAT("wind", (float)fWind); CBitStream bsSend; bsSend.Write((float)fWind); g_pNetworkManager->RPC(RPC_ScriptingForceWind, &bsSend, PRIORITY_HIGH, RELIABILITY_RELIABLE_ORDERED, INVALID_ENTITY_ID, true); sq_pushbool(pVM, true); return 1; } sq_pushbool(pVM, false); return 1; }
// setWeather(weather) SQInteger CServerNatives::SetWeather(SQVM * pVM) { SQInteger iWeather; sq_getinteger(pVM, 2, &iWeather); if(iWeather >= 1 && iWeather <= 10 && iWeather != CVAR_GET_INTEGER("weather")) { CVAR_SET_INTEGER("weather", (int)iWeather); CBitStream bsSend; bsSend.Write((unsigned char)iWeather); g_pNetworkManager->RPC(RPC_ScriptingSetPlayerWeather, &bsSend, PRIORITY_HIGH, RELIABILITY_RELIABLE_ORDERED, INVALID_ENTITY_ID, true); sq_pushbool(pVM, true); return 1; } sq_pushbool(pVM, false); return 1; }
void CServerBrowser::SetupUI( float fX, float fY, float fWidth, float fHeight ) { // Create the gui tab panel m_pTabs = m_pGUI->CreateTabPanel(); m_pTabs->SetPosition( Vector2( fX, fY ) ); m_pTabs->SetSize( Vector2( (fWidth - 260), fHeight ) ); m_pTabs->SetAlwaysOnTop( true ); // Create the players list m_pPlayers = m_pGUI->CreateTabPanel(); m_pPlayers->SetPosition( Vector2( ((fX + fWidth) - 250), fY ) ); m_pPlayers->SetSize( Vector2( 250, fHeight ) ); m_pPlayers->SetAlwaysOnTop( true ); // Create the status label m_pStatusLabel = m_pGUI->CreateLabel ( "", m_pGUI->GetDefaultFont( true ) ); m_pStatusLabel->SetSize ( Vector2 ( (fWidth - 260), 30 ) ); m_pStatusLabel->SetPosition ( Vector2 ( fX, (fY + fHeight + 10) ) ); // Create the players list tabs m_pPlayersTab = m_pPlayers->CreateTab( "Players" ); m_pRulesTab = m_pPlayers->CreateTab( "Rules" ); // Create the players grid list m_pPlayersGridList = m_pGUI->CreateGridList( m_pPlayersTab ); m_pPlayersGridList->SetPosition( Vector2( 1, 1 ) ); m_pPlayersGridList->SetSize( Vector2( 247, (fHeight - 26) ) ); m_pPlayersGridList->AddColumn ( "Name", 0.65f ); m_pPlayersGridList->AddColumn ( "Ping", 0.30f ); // Create the locked image m_pLockedImage = m_pGUI->CreateStaticImage(); m_pLockedImage->SetVisible( false ); m_pLockedImage->LoadFromFile( "locked.png", SharedUtility::GetAbsolutePath( "data\\gui\\images" ) ); m_pLockedImage->SetSize ( Vector2 ( 12, 12 ) ); // Create the tabs CreateTab( INTERNET, "Internet", (fWidth - 262), (fHeight - 26) ); CreateTab( HOSTED, "Hosted", (fWidth - 262), (fHeight - 26) ); // Hide the server browser SetVisible( false ); // Create the message box window m_pMessageBox = m_pGUI->CreateMessageBox ( "", "", "Close" ); m_pMessageBox->SetVisible ( false ); m_pMessageBox->GetWindow()->SetAlwaysOnTop ( true ); m_pMessageBox->SetButtonClickHandler ( 0, Button1ClickHandler, this ); // Create the quick connect window m_pQuickConnectWindow = m_pGUI->CreateWnd ( "Quick Connect" ); m_pQuickConnectWindow->SetSize ( Vector2 ( 260, 155 ) ); m_pQuickConnectWindow->SetPosition ( Vector2 ( (m_pGUI->GetResolution().fX / 2) - 150, (m_pGUI->GetResolution().fY / 2) - 77.5 ) ); m_pQuickConnectWindow->SetVisible ( false ); m_pQuickConnectWindow->SetAlwaysOnTop ( true ); m_pQuickConnectWindow->SetSizingEnabled ( false ); m_pQuickConnectWindow->SetAlpha ( 1.0f ); // Create the quick connect label m_pQuickConnectLabel = m_pGUI->CreateLabel ( "Enter the server IP, Port and Password:"******"last-server-ip")) != 0); // Create the quick connect IP input m_pQuickConnectAddress = m_pGUI->CreateEdit ( (bRestoreInformation ? CVAR_GET_STRING ( "last-server-ip" ) : "127.0.0.1"), m_pQuickConnectWindow ); m_pQuickConnectAddress->SetSize ( Vector2( 160, 24 ) ); m_pQuickConnectAddress->SetPosition ( Vector2 ( 18, 50 ) ); m_pQuickConnectAddress->SetClickHandler ( GUI_CALLBACK ( &CServerBrowser::Event_QuickConnectInputFocus, this ) ); // Create the quick connect port input m_pQuickConnectPort = m_pGUI->CreateEdit ( (bRestoreInformation ? String ( "%d", CVAR_GET_INTEGER ( "last-server-port" ) ) : "27015"), m_pQuickConnectWindow ); m_pQuickConnectPort->SetSize ( Vector2( 55, 24 ) ); m_pQuickConnectPort->SetPosition ( Vector2 ( 183, 50 ) ); m_pQuickConnectPort->SetClickHandler ( GUI_CALLBACK ( &CServerBrowser::Event_QuickConnectInputFocus, this ) ); // Create the quick connect password input m_pQuickConnectPassword = m_pGUI->CreateEdit ( (bRestoreInformation ? CVAR_GET_STRING ( "last-server-password" ) : ""), m_pQuickConnectWindow ); m_pQuickConnectPassword->SetSize ( Vector2( 220, 24 ) ); m_pQuickConnectPassword->SetPosition ( Vector2( 18, 85 ) ); m_pQuickConnectPassword->SetClickHandler ( GUI_CALLBACK ( &CServerBrowser::Event_QuickConnectInputFocus, this ) ); m_pQuickConnectPassword->SetMasked ( true ); // Create the quick connect submit button m_pQuickConnectSubmit = m_pGUI->CreateButton ( "Connect", m_pQuickConnectWindow ); m_pQuickConnectSubmit->SetSize ( Vector2 ( 75, 20 ) ); m_pQuickConnectSubmit->SetPosition ( Vector2 ( 18, 120 ) ); m_pQuickConnectSubmit->SetClickHandler ( GUI_CALLBACK( &CServerBrowser::Event_QuickConnectSubmitClick, this ) ); // Create the quick connect cancel button m_pQuickConnectCancel = m_pGUI->CreateButton ( "Cancel", m_pQuickConnectWindow ); m_pQuickConnectCancel->SetSize ( Vector2 ( 75, 20 ) ); m_pQuickConnectCancel->SetPosition ( Vector2 ( 100, 120 ) ); m_pQuickConnectCancel->SetClickHandler ( GUI_CALLBACK( &CServerBrowser::Event_QuickConnectCancelClick, this ) ); }
bool CServer::Startup() { // Register our RPCs before set the NetServer´s rpc handler CEvents* pEvents = new CEvents(); // Create all the managers m_pPlayerManager = new CPlayerManager(); m_pVehicleManager = new CVehicleManager(); m_pActorManager = new CActorManager(); m_pObjectManager = new CObjectManager(); m_pFireManager = new CFireManager(); m_pPickupManager = new CPickupManager(); m_p3DLabelManager = new C3DLabelManager(); m_pBlipManager = new CBlipManager(); m_pCheckpointManager = new CCheckpointManager(); // Open the settings file if(!CSettings::Open(SharedUtility::GetAbsolutePath("settings.xml"), true, false)) { CLogFile::Print("Failed to open settings.xml.."); #ifdef _WIN32 Sleep(3000); #else sleep(3); #endif return false; } #ifdef _WIN32 // Color stuff CONSOLE_SCREEN_BUFFER_INFO csbiScreen; WORD wOldColAttr; // For input process. GetConsoleScreenBufferInfo((HANDLE)GetStdHandle(STD_OUTPUT_HANDLE), &csbiScreen); wOldColAttr = csbiScreen.wAttributes; SetConsoleTextAttribute((HANDLE)GetStdHandle(STD_OUTPUT_HANDLE), wOldColAttr | FOREGROUND_INTENSITY); // Print message to console. SetConsoleTextAttribute((HANDLE)GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY); #endif CLogFile::Print(""); CLogFile::Print("===================================================================="); #ifdef _WIN32 SetConsoleTextAttribute((HANDLE)GetStdHandle(STD_OUTPUT_HANDLE), wOldColAttr | FOREGROUND_INTENSITY); #endif CLogFile::Print(" " VERSION_IDENTIFIER " " OS_STRING " Server"); CLogFile::Print(" Copyright (C) 2013 GTA-Network Team"); CLogFile::Printf(" Port: %d", CVAR_GET_INTEGER("port")); CLogFile::Printf(" HTTP Port: %d", CVAR_GET_INTEGER("httpport")); CLogFile::Printf(" Query Port: %d", (CVAR_GET_INTEGER("queryport"))); if(CVAR_GET_STRING("hostaddress").IsNotEmpty()) CLogFile::Printf(" Host Address: %s", CVAR_GET_STRING("hostaddress").Get()); if(CVAR_GET_STRING("httpserver").IsNotEmpty()) CLogFile::Printf(" HTTP Server: %s", CVAR_GET_STRING("httpserver").Get()); CLogFile::Printf(" Max Players: %d", CVAR_GET_INTEGER("maxplayers")); #ifdef _WIN32 SetConsoleTextAttribute((HANDLE)GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY); CLogFile::Print("===================================================================="); SetConsoleTextAttribute((HANDLE)GetStdHandle(STD_OUTPUT_HANDLE), wOldColAttr | FOREGROUND_INTENSITY); #else CLogFile::Print("===================================================================="); #endif // Load modules // Note: modules not implemented yet coming soon auto modules = CVAR_GET_LIST("module"); if(modules.size() > 0) { CLogFile::Print(""); CLogFile::Print("========================== Loading Modules ========================="); for(auto strModule : modules) { CLogFile::Printf("Loading module %s.", strModule.Get()); if(!strModule.ToLower().EndsWith(".so") && !strModule.ToLower().EndsWith(".dll")) { // If no extension specified in module name string, load SO for linux and DLL for Win #ifdef _WIN32 strModule.Append(".dll"); #else strModule.Append(".so"); #endif } //CModule * pModule = g_pModuleManager->LoadModule(strModule); //if(!pModule) CLogFile::Printf("Warning: Failed to load module %s.", strModule.Get()); } CLogFile::Print(""); } m_pResourceManager = new CResourceManager("resources"); m_pResourceManager->SetCreateVMCallback(OnCreateVM); // Loading resources #ifdef _WIN32 SetConsoleTextAttribute((HANDLE)GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY); CLogFile::Print(""); CLogFile::Print("============ Loading Resources ==========="); CLogFile::Print(""); SetConsoleTextAttribute((HANDLE)GetStdHandle(STD_OUTPUT_HANDLE), wOldColAttr | FOREGROUND_INTENSITY); #else CLogFile::Print(""); CLogFile::Print("============ Loading Resources ==========="); CLogFile::Print(""); #endif auto resources = CVAR_GET_LIST("resource"); int iResourcesLoaded = 0; int iFailedResources = 0; for(auto strResource : resources) { if(!strResource.IsEmpty()) { CLogFile::Printf("Loading resource (%s)", strResource.C_String()); if(CResource* pResource = m_pResourceManager->Load(SharedUtility::GetAbsolutePath(m_pResourceManager->GetResourceDirectory()),strResource)) { m_pResourceManager->StartResource(pResource); iResourcesLoaded++; } else { CLogFile::Printf("Warning: Failed to load resource %s.", strResource.Get()); iFailedResources++; } } } CLogFile::Printf("Successfully loaded %d resources (%d failed).", iResourcesLoaded, iFailedResources); #ifdef _WIN32 SetConsoleTextAttribute((HANDLE)GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY); CLogFile::Print(""); CLogFile::Print("===================================================================="); CLogFile::Print(""); SetConsoleTextAttribute((HANDLE)GetStdHandle(STD_OUTPUT_HANDLE), wOldColAttr | FOREGROUND_INTENSITY); #else CLogFile::Print(""); CLogFile::Print("===================================================================="); CLogFile::Print(""); #endif m_pNetworkModule->Startup(); return true; }
// getWeather(weather) SQInteger CServerNatives::GetWeather(SQVM * pVM) { sq_pushinteger(pVM, CVAR_GET_INTEGER("weather")); return 1; }
// getPlayerSlots() SQInteger CServerNatives::GetPlayerSlots(SQVM * pVM) { sq_pushinteger(pVM, CVAR_GET_INTEGER("maxplayers")); return 1; }
BOOL APIENTRY DllMain(HMODULE hModule, DWORD fdwReason, LPVOID lpReserved) { switch(fdwReason) { case DLL_PROCESS_ATTACH: { // Disable thread library notifications DisableThreadLibraryCalls(hModule); // Install the exception handler CExceptionHandler::Install(); // Delete chatlog CLogFile::Open("Chatlog.log"); CLogFile::Printf("New chatlog created!"); CLogFile::Close(); // Open the log file CLogFile::Open("Client.log"); // Log the version CLogFile::Printf(VERSION_IDENTIFIER "| " __DATE__ " - " __TIME__ ""); // Open the settings file CSettings::Open(SharedUtility::GetAbsolutePath("clientsettings.xml")); // Parse the command line CSettings::ParseCommandLine(GetCommandLine()); // Load the global vars from the settings g_strHost = CVAR_GET_STRING("ip"); g_usPort = CVAR_GET_INTEGER("port"); g_strNick = CVAR_GET_STRING("nick"); g_strPassword = CVAR_GET_STRING("pass"); g_bWindowedMode = CVAR_GET_BOOL("windowed"); g_bFPSToggle = CVAR_GET_BOOL("fps"); // IE9 fix - disabled if disableie9fix is set or shift is pressed if(!CVAR_GET_BOOL("disableie9fix") || GetAsyncKeyState(VK_SHIFT) > 0) { // Get the version info DWORD dwHandle; DWORD dwSize = GetFileVersionInfoSize("wininet.dll", &dwHandle); BYTE* byteFileInfo = new BYTE[dwSize]; GetFileVersionInfo("wininet.dll", dwHandle, dwSize, byteFileInfo); unsigned int uiLen; VS_FIXEDFILEINFO* fileInfo; VerQueryValue(byteFileInfo, "\\", (LPVOID *)&fileInfo, &uiLen); delete byteFileInfo; // using IE9? if(fileInfo->dwFileVersionMS == 0x90000) { // Try and load a wininet.dll from the iv:mp directory if(!LoadLibrary(SharedUtility::GetAbsolutePath("wininet.dll"))) { // Get path to it char szFindPath[MAX_PATH] = {0}; char szWinSxsPath[MAX_PATH] = {0}; char szBuildVersion[] = "00000"; GetEnvironmentVariable("windir", szWinSxsPath, sizeof(szWinSxsPath)); strcat_s(szWinSxsPath, sizeof(szWinSxsPath), "\\WinSxS\\"); strcpy_s(szFindPath, sizeof(szFindPath), szWinSxsPath); strcat_s(szFindPath, sizeof(szFindPath), "x86_microsoft-windows-i..tocolimplementation_31bf3856ad364e35*"); // try to find a usable wininet.dll in WinSXS (basically any non-9.x version) bool bLoaded = false; WIN32_FIND_DATA lpFindFileData; HANDLE hFindFile = FindFirstFile(szFindPath, &lpFindFileData); do { if(hFindFile == INVALID_HANDLE_VALUE) break; if(strlen(lpFindFileData.cFileName) > 63) { if(lpFindFileData.cFileName[62] < '9') { char szFullPath[MAX_PATH]; sprintf_s(szFullPath, MAX_PATH, "%s%s\\wininet.dll", szWinSxsPath, lpFindFileData.cFileName); if(LoadLibrary(szFullPath)) { CLogFile::Printf("Using %s to address IE9 issue", szFullPath); bLoaded = true; break; } } } } while(FindNextFile(hFindFile, &lpFindFileData)); // Still failed, tell the user if(!bLoaded) { if(MessageBox(0, "Unfortunately, you have Internet Explorer 9 installed which is not compatible with GTA:IV. Do you want proceed anyway (and possibly crash?)", "IV:MP", MB_YESNO | MB_ICONERROR) == IDNO) { // Doesn't want to continue ExitProcess(0); } // Save the user's choice CVAR_SET_BOOL("disableie9fix", true); } } } } // Initialize the streamer g_pStreamer = new CStreamer(); // Initialize the time g_pTime = new CTime(); // Initialize the traffic lights g_pTrafficLights = new CTrafficLights(); // Initialize the client task manager g_pClientTaskManager = new CClientTaskManager(); // Initialize the game CGame::Initialize(); // Install the XLive hook CXLiveHook::Install(); // Install the Direct3D hook CDirect3DHook::Install(); // Install the DirectInput hook CDirectInputHook::Install(); // Install the Cursor hook #ifdef IVMP_DEBUG CCursorHook::Install(); g_pDebugView = new CDebugView(); #endif // Initialize the client script manager g_pClientScriptManager = new CClientScriptManager(); // Initialize the events manager g_pEvents = new CEvents(); // Initialize the network module, if it fails, exit if(!CNetworkModule::Init()) { CLogFile::Printf("Failed to initialize the network module!\n"); ExitProcess(0); } // Initialize the file transfer g_pFileTransfer = new CFileTransfer(); // Initialize audio manager CAudioManager::Init(); } break; case DLL_PROCESS_DETACH: { // Delete our file transfer SAFE_DELETE(g_pFileTransfer); // Delete our camera SAFE_DELETE(g_pCamera); // Delete our model manager SAFE_DELETE(g_pModelManager); // Delete our pickup manager SAFE_DELETE(g_pPickupManager); // Delete our checkpoint manager SAFE_DELETE(g_pCheckpointManager); // Delete our object manager SAFE_DELETE(g_pObjectManager); // Delete our blip manager SAFE_DELETE(g_pBlipManager); // Delete our actor manager SAFE_DELETE(g_pActorManager); // Delete our vehicle manager SAFE_DELETE(g_pVehicleManager); // Delete our local player SAFE_DELETE(g_pLocalPlayer); // Delete our player manager SAFE_DELETE(g_pPlayerManager); // Delete our network manager SAFE_DELETE(g_pNetworkManager); // Delete our name tags SAFE_DELETE(g_pNameTags); // Delete our input window SAFE_DELETE(g_pInputWindow); // Delete our chat window SAFE_DELETE(g_pChatWindow); // Delete our fps counter SAFE_DELETE(g_pFPSCounter); #ifdef IVMP_DEBUG // Delete out debug viewer SAFE_DELETE(g_pDebugView); #endif // Delete our credits SAFE_DELETE(g_pCredits); // Delete our main menu SAFE_DELETE(g_pMainMenu); // Delete our gui SAFE_DELETE(g_pGUI); // Delete our streamer class SAFE_DELETE(g_pStreamer); // Delete our time class SAFE_DELETE(g_pTime); // Delete our traffic lights SAFE_DELETE(g_pTrafficLights); // Delete our client script manager SAFE_DELETE(g_pClientScriptManager); // Delete our client task manager SAFE_DELETE(g_pClientTaskManager); // Delete our events manager SAFE_DELETE(g_pEvents); // Uninstall the Cursor hook #ifdef IVMP_DEBUG CCursorHook::Uninstall(); #endif // Uninstall the DirectInput hook CDirectInputHook::Uninstall(); // Uninstall the Direct3D hook CDirect3DHook::Uninstall(); // Shutdown audio manager CAudioManager::SetAllVolume(0.0f); CAudioManager::RemoveAll(); // Shutdown our game CGame::Shutdown(); // Close the settings file CSettings::Close(); // Close the log file CLogFile::Close(); // Uninstall the XLive hook //CXLiveHook::Uninstall(); // Not needed } break; } return TRUE; }
void DownloadFinished(RakNet::BitStream * pBitStream, RakNet::Packet * pPacket) { // Read the player name RakNet::RakString _strName; pBitStream->Read(_strName); CString strName(_strName.C_String()); // Read the player serial RakNet::RakString _strSerial; pBitStream->Read(_strSerial); CString strSerial(_strSerial.C_String()); // Is the nickname already in use? // TODO: check is nick in use // Is the player banned? // TODO: check is banned // Add the player to the manager // TODO: add to player manager CPlayerEntity * pPlayer = new CPlayerEntity(); pPlayer->SetName(strName); // Do we need the id; maybe internal for easier sync but definetly not public to the scripting engine pPlayer->SetId(CServer::GetInstance()->GetPlayerManager()->Add(pPlayer)); EntityId playerId = pPlayer->GetId(); srand(time(NULL)); pPlayer->SetColor(CColor(rand() % 256, rand() % 256, rand() % 256).dwHexColor); //generate random color CLogFile::Printf("[join] %s (%i) has connected to the server. (%s)", strName.Get(), playerId, strSerial.Get()); CScriptArguments args; CScriptPlayer * pScriptPlayer = new CScriptPlayer(); pScriptPlayer->SetEntity(pPlayer); pPlayer->SetScriptPlayer(pScriptPlayer); args.push(pScriptPlayer); CEvents::GetInstance()->Call("playerJoin", &args, CEventHandler::eEventType::NATIVE_EVENT, 0); // Construct a new bitstream RakNet::BitStream bitStream; // Write the player id bitStream.Write(playerId); // Write the player colour bitStream.Write(pPlayer->GetColor()); // Write the server name bitStream.Write(RakNet::RakString("IV:Network DEV Server")); // Write the max player count bitStream.Write(CVAR_GET_INTEGER("maxplayers")); // Write the port bitStream.Write(CVAR_GET_INTEGER("port")); // Send it back to the player CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_INITIAL_DATA), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, playerId, false); for (EntityId i = 0; i < CServer::GetInstance()->GetPlayerManager()->GetMax(); ++i) { if (CServer::GetInstance()->GetPlayerManager()->DoesExists(i) && i != playerId) { bitStream.Reset(); bitStream.Write(i); bitStream.Write(CServer::GetInstance()->GetPlayerManager()->GetAt(i)->GetName().Get()); bitStream.Write(CServer::GetInstance()->GetPlayerManager()->GetAt(i)->GetColor()); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_NEW_PLAYER), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, playerId, false); } } for (EntityId i = 0; i < CServer::GetInstance()->GetPlayerManager()->GetMax(); ++i) { if (CServer::GetInstance()->GetPlayerManager()->DoesExists(i) && i != playerId) { bitStream.Reset(); bitStream.Write(playerId); bitStream.Write(pPlayer->GetName().Get()); bitStream.Write(pPlayer->GetColor()); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_NEW_PLAYER), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, i, false); } } for (EntityId i = 0; i < CServer::GetInstance()->GetVehicleManager()->GetMax(); ++i) { if (CServer::GetInstance()->GetVehicleManager()->DoesExists(i)) { bitStream.Reset(); CVehicleEntity * pVehicle = CServer::GetInstance()->GetVehicleManager()->GetAt(i); bitStream.Write(pVehicle->GetId()); bitStream.Write(pVehicle->GetModelId()); CVector3 vecPosition; pVehicle->GetPosition(vecPosition); bitStream.Write(vecPosition); CVector3 vecRotation; pVehicle->GetRotation(vecRotation); bitStream.Write(vecRotation.fX); bitStream.Write(pVehicle->GetColor(1)); bitStream.Write(pVehicle->GetColor(2)); bitStream.Write(pVehicle->GetColor(3)); bitStream.Write(pVehicle->GetColor(4)); bitStream.Write(pVehicle->GetColor(5)); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_CREATE_VEHICLE), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, playerId, false); } } for (EntityId i = 0; i < CServer::GetInstance()->GetCheckpointManager()->GetMax(); ++i) { if (CServer::GetInstance()->GetCheckpointManager()->DoesExists(i)) { bitStream.Reset(); CCheckpointEntity * pCheckpoint = CServer::GetInstance()->GetCheckpointManager()->GetAt(i); bitStream.Write(pCheckpoint->GetId()); bitStream.Write(pCheckpoint->GetType()); CVector3 vecPosition; pCheckpoint->GetPosition(vecPosition); bitStream.Write(vecPosition); CVector3 vecTargetPosition; pCheckpoint->GetTargetPosition(vecTargetPosition); bitStream.Write(vecTargetPosition); bitStream.Write(pCheckpoint->GetRadius()); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_CREATE_CHECKPOINT), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, playerId, false); // Checkpoint visibility if (!pCheckpoint->GetVisible()) { bitStream.Reset(); bitStream.Write(pCheckpoint->GetId()); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_CHECKPOINT_HIDE), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, playerId, false); } } } }
bool CClient::OnLoad() { // Install the exception handler CExceptionHandler::Install(); // Set our exception handler callback CExceptionHandler::SetCallback(ExceptionHandlerCallback); // jenksta: wtf? // Delete chatlog CLogFile::Open("Chatlog.log"); CLogFile::Printf("New chatlog created!"); CLogFile::Close(); // Open the log file CLogFile::Open("Client.log"); // Log the version CLogFile::Printf(VERSION_IDENTIFIER "| " __DATE__ " - " __TIME__ ""); // Open the settings file CSettings::Open(SharedUtility::GetAbsolutePath("clientsettings.xml")); // Parse the command line CSettings::ParseCommandLine(GetCommandLine()); // Load the global vars from the settings m_strHost = CVAR_GET_STRING("ip"); m_usPort = CVAR_GET_INTEGER("port"); m_strNick = CVAR_GET_STRING("nick"); m_strPassword = CVAR_GET_STRING("pass"); m_bWindowedMode = CVAR_GET_BOOL("windowed"); m_bFPSToggle = CVAR_GET_BOOL("fps"); m_strConnectHost = CVAR_GET_STRING("currentconnect_server"); m_usConnectPort = CVAR_GET_INTEGER("currentconnect_port"); // IE9 fix - disabled if disableie9fix is set or shift is pressed if(!CVAR_GET_BOOL("disableie9fix") || GetAsyncKeyState(VK_SHIFT) > 0) { // Get the version info DWORD dwHandle; DWORD dwSize = GetFileVersionInfoSize("wininet.dll", &dwHandle); BYTE* byteFileInfo = new BYTE[dwSize]; GetFileVersionInfo("wininet.dll", dwHandle, dwSize, byteFileInfo); unsigned int uiLen; VS_FIXEDFILEINFO* fileInfo; VerQueryValue(byteFileInfo, "\\", (LPVOID *)&fileInfo, &uiLen); delete byteFileInfo; // using IE9? if(fileInfo->dwFileVersionMS == 0x90000) { // Try and load a wininet.dll from the iv:mp directory if(!LoadLibrary(SharedUtility::GetAbsolutePath("wininet.dll"))) { // Get path to it char szFindPath[MAX_PATH] = {0}; char szWinSxsPath[MAX_PATH] = {0}; char szBuildVersion[] = "00000"; GetEnvironmentVariable("windir", szWinSxsPath, sizeof(szWinSxsPath)); strcat_s(szWinSxsPath, sizeof(szWinSxsPath), "\\WinSxS\\"); strcpy_s(szFindPath, sizeof(szFindPath), szWinSxsPath); strcat_s(szFindPath, sizeof(szFindPath), "x86_microsoft-windows-i..tocolimplementation_31bf3856ad364e35*"); // try to find a usable wininet.dll in WinSXS (basically any non-9.x version) bool bLoaded = false; WIN32_FIND_DATA lpFindFileData; HANDLE hFindFile = FindFirstFile(szFindPath, &lpFindFileData); do { if(hFindFile == INVALID_HANDLE_VALUE) break; if(strlen(lpFindFileData.cFileName) > 63) { if(lpFindFileData.cFileName[62] < '9') { char szFullPath[MAX_PATH]; sprintf_s(szFullPath, MAX_PATH, "%s%s\\wininet.dll", szWinSxsPath, lpFindFileData.cFileName); if(LoadLibrary(szFullPath)) { CLogFile::Printf("Using %s to address IE9 issue", szFullPath); bLoaded = true; break; } } } } while(FindNextFile(hFindFile, &lpFindFileData)); // Still failed, tell the user if(!bLoaded) { if(MessageBox(0, "Unfortunately, you have Internet Explorer 9 installed which is not compatible with GTA:IV. Do you want proceed anyway (and possibly crash?)", "IV:MP", MB_YESNO | MB_ICONERROR) == IDNO) { // Doesn't want to continue return false; } // Save the user's choice CVAR_SET_BOOL("disableie9fix", true); } } } } // Initialize the streamer m_pStreamer = new CStreamer(); // Initialize the time m_pTime = new CTime(); // Initialize the traffic lights m_pTrafficLights = new CTrafficLights(); // Initialize the client task manager m_pClientTaskManager = new CClientTaskManager(); // Initialize the game CGame::Initialize(); // Install the XLive hook CXLiveHook::Install(); // Install the Direct3D hook CDirect3DHook::Install(); // Install the DirectInput hook CDirectInputHook::Install(); #ifdef IVMP_DEBUG // Install the Cursor hook CCursorHook::Install(); // Create our Debug View m_pDebugView = new CDebugView(); #endif // Initialize the client script manager m_pClientScriptManager = new CClientScriptManager(); // Initialize the events manager m_pEvents = new CEvents(); // Initialize the network module, if it fails, exit if(!CNetworkModule::Init()) { CLogFile::Printf("Failed to initialize the network module!\n"); return false; } // Initialize the file transfer manager m_pFileTransfer = new CFileTransferManager(); // Initialize the http client m_pHttpClient = new CHttpClient(); m_pHttpClient->SetRequestTimeout(10000); m_pHttpClient->SetHost(MASTERLIST_ADDRESS); return true; }
// getWeather(weather) int CServerNatives::GetWeather(lua_State * pVM) { script_pushinteger(pVM, CVAR_GET_INTEGER("weather")); return 1; }
// getPlayerSlots() int CServerNatives::GetPlayerSlots(lua_State * pVM) { script_pushinteger(pVM, CVAR_GET_INTEGER("maxplayers")); return 1; }
void InitialData(RakNet::BitStream * pBitStream, RakNet::Packet * pPacket) { // Get the playerid EntityId playerId = (EntityId) pPacket->guid.systemIndex; // Read the player version DWORD dwVersion; pBitStream->Read(dwVersion); // Read the player name RakNet::RakString _strName; pBitStream->Read(_strName); CString strName(_strName.C_String()); // Read the player serial RakNet::RakString _strSerial; pBitStream->Read(_strSerial); CString strSerial(_strSerial.C_String()); // Is the network version invalid? if (dwVersion != (DWORD)/*NETWORK_VERSION*/0x0) { // TODO } // Is the nickname already in use? // TODO: check is nick in use // Is the player banned? // TODO: check is banned // Add the player to the manager // TODO: add to player manager CPlayerEntity * pPlayer = new CPlayerEntity(); pPlayer->SetName(strName); // Do we need the id; maybe internal for easier sync but definetly not public to the scripting engine pPlayer->SetId(CServer::GetInstance()->GetPlayerManager()->Add(pPlayer)); playerId = pPlayer->GetId(); CLogFile::Printf("[join] %s (%i) has connected to the server. (%s)", strName.Get(), playerId, strSerial.Get()); CScriptArguments args; CScriptPlayer * pScriptPlayer = new CScriptPlayer(); pScriptPlayer->SetEntity(pPlayer); pPlayer->SetScriptPlayer(pScriptPlayer); args.push(pScriptPlayer); CEvents::GetInstance()->Call("playerJoin", &args, CEventHandler::eEventType::GLOBAL_EVENT, 0); // Construct a new bitstream RakNet::BitStream bitStream; // Write the player id bitStream.WriteCompressed(playerId); // Write the player colour bitStream.Write(0xFFFFFF/*CServer::GetInstance()->GetPlayerManager()->GetAt(playerId)->GetColor()*/); // Write the server name bitStream.Write(RakNet::RakString("IV:Network DEV Server")); // Write the max player count bitStream.Write(CVAR_GET_INTEGER("maxplayers")); // Write the port bitStream.Write(CVAR_GET_INTEGER("port")); // Send it back to the player CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_INITIAL_DATA), &bitStream, HIGH_PRIORITY, RELIABLE, playerId, false); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_START_GAME), &bitStream, HIGH_PRIORITY, RELIABLE, playerId, false); for (EntityId i = 0; i < CServer::GetInstance()->GetPlayerManager()->GetMax(); ++i) { if (CServer::GetInstance()->GetPlayerManager()->DoesExists(i) && i != playerId) { bitStream.Reset(); bitStream.WriteCompressed(i); bitStream.Write(CServer::GetInstance()->GetPlayerManager()->GetAt(i)->GetName().Get()); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_NEW_PLAYER), &bitStream, HIGH_PRIORITY, RELIABLE, playerId, false); } } for (EntityId i = 0; i < CServer::GetInstance()->GetPlayerManager()->GetMax(); ++i) { if (CServer::GetInstance()->GetPlayerManager()->DoesExists(i) && i != playerId) { bitStream.Reset(); bitStream.WriteCompressed(playerId); bitStream.Write(strName.Get()); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_NEW_PLAYER), &bitStream, HIGH_PRIORITY, RELIABLE, i, false); } } for (EntityId i = 0; i < CServer::GetInstance()->GetVehicleManager()->GetMax(); ++i) { if (CServer::GetInstance()->GetVehicleManager()->DoesExists(i)) { bitStream.Reset(); CVehicleEntity * pVehicle = CServer::GetInstance()->GetVehicleManager()->GetAt(i); bitStream.Write(pVehicle->GetId()); bitStream.Write(/*pVehicle->GetModelId()*/90); CVector3 vecPosition; pVehicle->GetPosition(vecPosition); bitStream.Write(vecPosition); CServer::GetInstance()->GetNetworkModule()->Call(GET_RPC_CODEX(RPC_CREATE_VEHICLE), &bitStream, HIGH_PRIORITY, RELIABLE_ORDERED, -1, true); } } bitStream.Reset(); bitStream.WriteCompressed(playerId); bitStream.Write(7); bitStream.Write(3); bitStream.Write(3); bitStream.Write(1); }
void CServerRPCHandler::PlayerConnect(CBitStream * pBitStream, CPlayerSocket * pSenderSocket) { // Ensure we have a valid bit stream if(!pBitStream) return; // Read packet data EntityId playerId = pSenderSocket->playerId; int iVersion; pBitStream->Read(iVersion); String strName; pBitStream->Read(strName); CheckGTAFiles pCheckFiles; bool bGameFilesModded = false; pBitStream->Read((char *)&pCheckFiles, sizeof(CheckGTAFiles)); if(pCheckFiles.bGTAFileChecksum || pCheckFiles.bHandleFileChanged) { if(CVAR_GET_BOOL("checkGTAFiles")) CLogFile::Printf("[FileCheckSum] Warning, detected modded GTA IV files at player %s", strName.Get()); bGameFilesModded = true; } // Apply serial and ip String strIP = pSenderSocket->GetAddress(true); String strSerial = pSenderSocket->GetSerial(); // Setup our reply packet CBitStream bsSend; // Check for matching network versions if(iVersion != NETWORK_VERSION) { bsSend.Write(REFUSE_REASON_INVALID_VERSION); g_pNetworkManager->RPC(RPC_ConnectionRefused, &bsSend, PRIORITY_HIGH, RELIABILITY_RELIABLE, playerId, false); CLogFile::Printf("[Connect] Authorization for %s (%s) failed (Invalid version (Client: %x, Server: %x))!", strIP.Get(), strName.Get(), iVersion, NETWORK_VERSION); return; } // Check that their name is valid if(strName.IsEmpty() || strName.GetLength() > MAX_NAME_LENGTH) { bsSend.Write(REFUSE_REASON_NAME_INVALID); g_pNetworkManager->RPC(RPC_ConnectionRefused, &bsSend, PRIORITY_HIGH, RELIABILITY_RELIABLE, playerId, false); CLogFile::Printf("[Connect] Authorization for %s (%s) failed (name invalid).", strIP.Get(), strName.Get()); return; } // Check that their name is not already in use if(g_pPlayerManager->IsNameInUse(strName)) { bsSend.Write(REFUSE_REASON_NAME_IN_USE); g_pNetworkManager->RPC(RPC_ConnectionRefused, &bsSend, PRIORITY_HIGH, RELIABILITY_RELIABLE, playerId, false); CLogFile::Printf("[Connect] Authorization for %s (%s) failed (name in use).", strIP.Get(), strName.Get()); return; } CSquirrelArguments nameCheckArguments; nameCheckArguments.push(playerId); nameCheckArguments.push(strName); if(g_pEvents->Call("playerNameCheck", &nameCheckArguments).GetInteger() != 1) { bsSend.Write(REFUSE_REASON_NAME_INVALID); g_pNetworkManager->RPC(RPC_ConnectionRefused, &bsSend, PRIORITY_HIGH, RELIABILITY_RELIABLE, playerId, false); CLogFile::Printf("[Connect] Authorization for %s (%s) failed (name invalid).", strIP.Get(), strName.Get()); return; } // Call the playerAuth event, and process the return value CSquirrelArguments playerAuthArguments; playerAuthArguments.push(playerId); playerAuthArguments.push(strName); playerAuthArguments.push(strIP); playerAuthArguments.push(strSerial); playerAuthArguments.push(bGameFilesModded); if(g_pEvents->Call("playerAuth", &playerAuthArguments).GetInteger() != 1) { bsSend.Write(REFUSE_REASON_ABORTED_BY_SCRIPT); g_pNetworkManager->RPC(RPC_ConnectionRefused, &bsSend, PRIORITY_HIGH, RELIABILITY_RELIABLE, playerId, false); CLogFile::Printf("[Connect] Authorization for %s (%s) failed (aborted by script).", strIP.Get(), strName.Get()); return; } CLogFile::Printf("[Connect] Authorization for %s (%s) complete.", strIP.Get(), strName.Get()); // Setup the player g_pPlayerManager->Add(playerId, strName); CPlayer * pPlayer = g_pPlayerManager->GetAt(playerId); // Check player creation if(!pPlayer) { CLogFile::Printf("[Connect] Failed to create player instance for %s.", strName.Get()); return; } // Apply files pPlayer->SetFileCheck(pCheckFiles); // Let the vehicle manager handle the client join g_pVehicleManager->HandleClientJoin(playerId); // Let the player manager handle the client join g_pPlayerManager->HandleClientJoin(playerId); // Let the object manager handle the client join g_pObjectManager->HandleClientJoin(playerId); // Let the fire manager handle the client join g_pObjectManager->HandleClientJoinFire(playerId); // Let the blip manager handle the client join g_pBlipManager->HandleClientJoin(playerId); // Let the checkpoint manager handle the client join g_pCheckpointManager->HandleClientJoin(playerId); // Let the pickup manager handle the client join g_pPickupManager->HandleClientJoin(playerId); // Let the actor manager handle the client join g_pActorManager->HandleClientJoin(playerId); g_p3DLabelManager->HandleClientJoin(playerId); // Construct the reply bit stream bsSend.Write(playerId); bsSend.Write(CVAR_GET_STRING("hostname")); bsSend.WriteBit(CVAR_GET_BOOL("paynspray")); bsSend.WriteBit(CVAR_GET_BOOL("autoaim")); bsSend.Write(pPlayer->GetColor()); bsSend.Write(CVAR_GET_STRING("httpserver")); bsSend.Write((unsigned short)CVAR_GET_INTEGER("httpport")); bsSend.Write((unsigned char)CVAR_GET_INTEGER("weather")); bsSend.WriteBit(CVAR_GET_BOOL("guinametags")); bsSend.WriteBit(CVAR_GET_BOOL("vehicledamage")); bsSend.WriteBit(CVAR_GET_BOOL("vehiclewaterdeath")); bsSend.WriteBit(CVAR_GET_BOOL("headmovement")); bsSend.Write(CVAR_GET_INTEGER("maxplayers")); // Time unsigned char ucHour = 0, ucMinute = 0; g_pTime->GetTime(&ucHour, &ucMinute); bsSend.Write((unsigned char)(ucHour + (24 * (1 + g_pTime->GetDayOfWeek())))); bsSend.Write(ucMinute); if(g_pTime->GetMinuteDuration() != CTime::DEFAULT_MINUTE_DURATION) { bsSend.Write1(); bsSend.Write(g_pTime->GetMinuteDuration()); } else bsSend.Write0(); // Traffic Lights bsSend.Write((unsigned char)g_pTrafficLights->GetSetState()); bsSend.Write(g_pTrafficLights->GetTimeThisCylce()); if(g_pTrafficLights->GetSetState() != CTrafficLights::TRAFFIC_LIGHT_STATE_DISABLED_DISABLED) { if(g_pTrafficLights->IsLocked()) bsSend.Write1(); else bsSend.Write0(); if(!g_pTrafficLights->IsUsingDefaultDurations()) { bsSend.Write1(); if(g_pTrafficLights->GetSetState() >= CTrafficLights::TRAFFIC_LIGHT_STATE_FLASHING_FLASHING) bsSend.Write(g_pTrafficLights->GetYellowDuration()); else { bsSend.Write(g_pTrafficLights->GetGreenDuration()); bsSend.Write(g_pTrafficLights->GetYellowDuration()); bsSend.Write(g_pTrafficLights->GetRedDuration()); } } else bsSend.Write0(); } // Send the joined game RPC g_pNetworkManager->RPC(RPC_JoinedGame, &bsSend, PRIORITY_HIGH, RELIABILITY_RELIABLE_ORDERED, playerId, false); // Inform the resource file manager of the client join g_pClientResourceFileManager->HandleClientJoin(playerId); // Inform the script file manager of the client join g_pClientScriptFileManager->HandleClientJoin(playerId); CLogFile::Printf("[Join] %s (%d) is joining the game.", strName.Get(), playerId); CSquirrelArguments playerConnectArguments; playerConnectArguments.push(playerId); playerConnectArguments.push(strName); g_pEvents->Call("playerConnect", &playerConnectArguments); }