Esempio n. 1
0
// (John) TODO: Only SAFE_DELETE and re-instantiate things that really need it, otherwise give them a Reset() method.
void CClient::InternalResetGame(bool bAutoConnect)
{
	CLogFile::Printf("Initializing game for multiplayer activities");

	// Remove local player from vehicle
	if(m_pLocalPlayer)
		m_pLocalPlayer->RemoveFromVehicle();

	// Remove all current GUIs
	// CClientScriptManager destructor will take care of this
	//m_pClientScriptManager->RemoveAll();
	//m_pClientScriptManager->GetGUIManager()->DeleteAll();

	SAFE_DELETE(m_pClientScriptManager);
	m_pClientScriptManager = new CClientScriptManager();
	m_pEvents->clear();
	m_pGUI->SetScriptedCursorVisible(false);
	CLogFile::Printf("Reset clientside scripting stuff");

	SAFE_DELETE(m_pModelManager);
	m_pModelManager = new CModelManager();
	CLogFile::Printf("Created model manager instance");

	SAFE_DELETE(m_pPickupManager);
	m_pPickupManager = new CPickupManager();
	CLogFile::Printf("Created pickup manager instance");

	SAFE_DELETE(m_pCheckpointManager);
	m_pCheckpointManager = new CCheckpointManager();
	CLogFile::Printf("Created checkpoint manager instance");

	SAFE_DELETE(m_pBlipManager);
	m_pBlipManager = new CBlipManager();
	CLogFile::Printf("Created blip manager instance");

	SAFE_DELETE(m_pObjectManager);
	m_pObjectManager = new CObjectManager();
	CLogFile::Printf("Created object manager instance");

	SAFE_DELETE(m_pFireManager);
	m_pFireManager = new CFireManager();
	CLogFile::Printf("Created fire manager instance");

	SAFE_DELETE(m_p3DLabelManager);
	m_p3DLabelManager = new C3DLabelManager();
	CLogFile::Printf("Created 3d label manager instance");

	// Set all vehicles to destroyable
	if(m_pVehicleManager)
	{
		for(EntityId i = 0; i < MAX_PLAYERS; i++)
		{
			CNetworkVehicle * pVehicle = m_pVehicleManager->Get(i);

			if(pVehicle)
				pVehicle->MarkAsActorVehicle(false);
		}
	}

	SAFE_DELETE(m_pVehicleManager);
	m_pVehicleManager = new CVehicleManager();
	CLogFile::Printf("Created vehicle manager instance");

	SAFE_DELETE(m_pActorManager);
	m_pActorManager = new CActorManager();
	CLogFile::Printf("Created actor manager instance");

	// Reset the streamer
	m_pStreamer->Reset();
	CLogFile::Printf("Reset streamer instance");

	if(!m_pLocalPlayer)
	{
		m_pLocalPlayer = new CLocalPlayer();
		CLogFile::Printf("Created local player instance");
	}

	m_pLocalPlayer->Reset();
	m_pLocalPlayer->SetPlayerId(INVALID_ENTITY_ID);
	m_pLocalPlayer->SetModel(Scripting::MODEL_PLAYER);
	m_pLocalPlayer->Teleport(CVector3());
	m_pLocalPlayer->SetPlayerControlAdvanced(false, false);
	m_pLocalPlayer->RemoveAllWeapons();
	m_pLocalPlayer->ResetMoney();
	m_pLocalPlayer->SetHealth(200);
	m_pLocalPlayer->SetControl(true);
	CLogFile::Printf("Reset local player instance");

	SAFE_DELETE(m_pPlayerManager);
	m_pPlayerManager = new CPlayerManager();
	CLogFile::Printf("Created player manager instance");


	// Create network manager if it doesn't exist
	if(!m_pNetworkManager)
	{
		m_pNetworkManager = new CNetworkManager();
		m_pNetworkManager->Startup(GetHost(), GetPort(), GetPassword());
		CLogFile::Printf("Created network manager instance");
	}
	else
	{
		// Reset network manager
		m_pNetworkManager->Reset();
		CLogFile::Printf("Reset network manager instance");
	}

	// Clear our file transfer list
	m_pFileTransfer->Clear(true);

	// Reset game world
	m_pTime->SetDayOfWeek(2);
	m_pTime->SetMinuteDuration(0);
	m_pTrafficLights->Reset();
	m_pNameTags->SetEnabled(true);
	CGame::SetWantedLevel(0);
	CGame::SetHudVisible(false);
	CGame::SetRadarVisible(false);
	CGame::SetAreaNamesEnabled(false);
	CGame::ResetScrollBars();
	CGame::SetScrollBarColor();
	CGame::ToggleLazlowStation(true);

	//
	Scripting::SetScenarioPedDensityMultiplier(0, 0);
	Scripting::SetPedDensityMultiplier(0);
	Scripting::SetParkedCarDensityMultiplier(0);
	Scripting::SetRandomCarDensityMultiplier(0);

	// Set the time and weather after the camera set, one of the camera stuff changes the time and the weather
	CGame::GetWeather()->SetWeather(WEATHER_SUNNY);
	m_pTime->SetTime(0, 0);
	CGame::SetTime(0, 0);
	// SetCanBurstCarTyres(bool canburst);
	Scripting::SetMaxWantedLevel(0);
	Scripting::SetCreateRandomCops(false);
	// Test if this is needed (Script is unloaded, so it shouldn't be)
	Scripting::AllowStuntJumpsToTrigger(false);
	CLogFile::Printf("Reset world");

	// Destroy the camera and create it again
	SAFE_DELETE(m_pCamera);
	m_pCamera = new CCamera();

	// Mark the game as loaded.
	if(!m_bGameLoaded)
		m_bGameLoaded = true;

	CGame::SetGameLoaded(m_bGameLoaded);

	// Reset the network stats
	m_pMainMenu->ResetNetworkStats();

	// Auto-connect if needed, otherwise show the main menu.
	if(m_pNetworkManager && bAutoConnect)
		m_pNetworkManager->Connect();
	else
		m_pMainMenu->SetVisible(true);

	CLogFile::Printf("Sucessfully (re)initialized game for multiplayer activities");
}