⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mhautopatchdlg.cpp

📁 墨香最新私服
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				bConnecting = TRUE;
				m_bVersionChecking = FALSE;
//				MessageBox( "Try to Reconnect!", g_szMBErrCap, MB_OK );
//				MessageBox( "橇肺弊伐阑 促矫 角青秦 林技夸." );
//				QuitPatchDialog(TRUE);

				return TRUE;
*/
//---------------------------------------
			}

			switch( *((DWORD*)pvdata) )
			{
			case FM_CONNECTED:
				{
					OnConnected( pvdata );
				}
				return TRUE;

			case FM_GET_CURRENT_DIRECTORY:
				{
					OnGetCurrentDirectory( pvdata );
				}
				return TRUE;
				
			case FM_GETFILELIST:
				{
					OnGetFileList( pvdata );
				}
				return TRUE;
				
			case FM_CONFIRM:
				{
					OnConfirm( pvdata );
				}
				return TRUE;
				
			case FM_DOWNLOAD:
				{
					OnDownLoad( pvdata );
				}
				return TRUE;
			}
		}
		return TRUE;

	case WM_RUNPROGRAM:
		{
			OnRunProgram();
		}
		return TRUE;
	}

	return CDialog::WindowProc(message, wParam, lParam);
}

void CMHAutoPatchDlg::OnConnected( LPVOID pvdata )
{
	bConnecting = FALSE;
	Connect_data* pcd = (Connect_data*)pvdata;
	
// FM_GET_CURRENT_DIRECTORY
	dd.pvExcuteContext			= (PVOID) FM_GET_CURRENT_DIRECTORY;
	iR = g_pFtp->GetCurrentDirectory( g_hSession, &dd);
	_ASSERTE( iR == 0);	

//滚怜眉农 甸绢皑.
	m_bVersionChecking = TRUE;
}

/*
//1. 泅犁 滚怜阑 罐绰促.
void CMHAutoPatchDlg::OnGetCurVersion( LPVOID pvdata )
{
	
}
*/

void CMHAutoPatchDlg::OnGetCurrentDirectory( LPVOID pvdata )
{
	Connect_data* pcd = (Connect_data*)pvdata;

/*	//000
// FM_GETFILELIST
	ld_zip.pvExcuteContext		= (PVOID) FM_GETFILELIST;
	ld_zip.dwFileMax			= FIND_DATA_MAX;
	ld_zip.pFile				= pwfd;
	ld_zip.pszSearchFile		= MHFile;
	
	iR = g_pFtp->GetList( g_hSession, &ld_zip);
	_ASSERTE( iR == 0);
*/

/*
//捞芭 泪矫 林籍
//刚历 滚怜颇老阑 促款罐绰促.
//---
	fd_newversion.pvExcuteContext	= (PVOID) FM_CONFIRM;
	fd_newversion.bResume			= FALSE;
	lstrcpy( fd_newversion.szRemoteFile, newverFilename);
	lstrcpy( fd_newversion.szLocalFile, newverFilename);
	iR = g_pFtp->DownloadFile( g_hSession, &fd_newversion);
	_ASSERTE( iR == 0);		
//---
*/
	ld_zip.pvExcuteContext		= (PVOID) FM_GETFILELIST;
	ld_zip.dwFileMax			= FIND_DATA_MAX;
	ld_zip.pFile				= pwfd;
	ld_zip.pszSearchFile		= newverFilename;//MH_VERSION_INFO_FILE;
	
	iR = g_pFtp->GetList( g_hSession, &ld_zip);
	_ASSERTE( iR == 0);
}

void CMHAutoPatchDlg::OnGetFileList( LPVOID pvdata )
{
	List_data* pld = (List_data*)pvdata;
	
	if( pld->dwFileNum == 0 )
	{
/*	//000
		/////////////////////////////////////////////////////	SC_DOWNLOAD_NOTICE
		fd_newversion.pvExcuteContext	= (PVOID) FM_CONFIRM;
		fd_newversion.bResume			= FALSE;
		lstrcpy( fd_newversion.szRemoteFile, newverFilename);
		lstrcpy( fd_newversion.szLocalFile, newverFilename);
		MessageBox(newverFilename,0,0);

		iR = g_pFtp->DownloadFile( g_hSession, &fd_newversion);
		_ASSERTE( iR == 0);
		return;
*/
// 啊厘 烤朝 滚怜 何磐 罐绰促.
//---

		if( m_bVersionChecking )
		{
			MessageBox( "Now Uploading Patch Files. Try Again Later.", g_szMBErrCap );
			g_pFtp->Shutdown(g_hSession);
			QuitPatchDialog( TRUE );
			return;
		}

		FILE* fporn = fopen( MH_VERSION_INFO_FILE, "r" );
		if(fporn == NULL)
		{
			MessageBox( "Failed to Open Version File", g_szMBErrCap, MB_OK );
			g_pFtp->Shutdown(g_hSession);
			QuitPatchDialog( TRUE );
			return;
		}
	
		char Version[64];
		fscanf( fporn, "%s", Version );
		fclose( fporn );
		
		memcpy( szOldestFile, Version, VERSION_HEADER_TEXT_LENGTH);
		sprintf( &szOldestFile[VERSION_HEADER_TEXT_LENGTH], "00000000.zip" );
		
		/////////////////////////////////////////////////////	FM_GETFILELIST
		ld_zip.pvExcuteContext		= (PVOID) FM_GETFILELIST;
		ld_zip.dwFileMax			= FIND_DATA_MAX;
		ld_zip.pFile				= pwfd;
		ld_zip.pszSearchFile		= szOldestFile;
		
		iR = g_pFtp->GetList( g_hSession, &ld_zip);
		_ASSERTE( iR == 0);
		return;
//---

	}

	if( m_bVersionChecking )
	{
		fd_newversion.pvExcuteContext	= (PVOID) FM_CONFIRM;
		fd_newversion.bResume			= FALSE;
		lstrcpy( fd_newversion.szRemoteFile, newverFilename);
		lstrcpy( fd_newversion.szLocalFile, newverFilename);
		iR = g_pFtp->DownloadFile( g_hSession, &fd_newversion);
		_ASSERTE( iR == 0);	
		return;
	}
	
	dwFileSizeMax = pld->pFile->nFileSizeLow;
	
	/////////////////////////////////////////////////////	SC_DOWNLOAD_ZIP
	fd_zip.pvExcuteContext		= (PVOID) FM_DOWNLOAD;
	fd_zip.bResume				= FALSE;
	lstrcpy( fd_zip.szRemoteFile, ld_zip.pszSearchFile);
	lstrcpy( fd_zip.szLocalFile, g_szMHpatchFile);
	
// Download MHFile
	iR = g_pFtp->DownloadFile( g_hSession, &fd_zip);
	_ASSERTE( iR == 0);

#ifndef _FOR_CHINA_
	SetStatusText( "Downloading Files" );
#else
	SetStatusText( "正在下载文件" );
#endif
}

void CMHAutoPatchDlg::OnConfirm( LPVOID pvdata )
{
	File_data* pfd = (File_data*)pvdata;
	
	
	if( pfd->CompletionError == CE_DOWNLOAD_PROGRESS )
	{
		return;
	}
	
	if( pfd->CompletionError != CE_SUCCEED  )
		return;

	FILE* fpnew = fopen( newverFilename, "r" );
	FILE* fpown = fopen( MH_VERSION_INFO_FILE, "r" );
	if(fpnew == NULL || fpown == NULL)
	{
		MessageBox( "Failed to Check New Version", g_szMBErrCap, MB_OK );
		g_pFtp->Shutdown(g_hSession);
		QuitPatchDialog( TRUE );
		
		if(fpnew)
			fclose(fpnew);
		if(fpown)
			fclose(fpown);
		
		return;
	}
	
	char temp1[256], temp2[256];
	fscanf( fpnew, "%s", temp1 );
	fscanf( fpown, "%s", temp2 );
	fclose( fpnew );
	fclose( fpown );
	
	DeleteFile( newverFilename );
	
	m_bVersionChecking = FALSE;

	if( strcmp( temp1, temp2 ) == 0 )	// 弥脚滚怜牢啊?
	{			
		g_pFtp->Shutdown(g_hSession);

		SetReadyToStart();	
	}
	else
	{	// 备滚怜, 啊厘 烤朝 滚怜阑 罐绰促.		
		/////////////////////////////////////////////////////	SC_DOWNLOAD_ZIP
/*	//00
		memcpy( szOldestFile, temp2, VERSION_HEADER_TEXT_LENGTH);
		sprintf( &szOldestFile[VERSION_HEADER_TEXT_LENGTH], "00000000.zip" );
		
		/////////////////////////////////////////////////////	FM_GETFILELIST
		ld_zip.pvExcuteContext		= (PVOID) FM_GETFILELIST;
		ld_zip.dwFileMax			= FIND_DATA_MAX;
		ld_zip.pFile				= pwfd;
		ld_zip.pszSearchFile		= szOldestFile;
		
		iR = g_pFtp->GetList( g_hSession, &ld_zip);
		_ASSERTE( iR == 0);
*/
//泅犁 滚怜捞 乐绰瘤 犬牢
//---
// FM_GETFILELIST
		ld_zip.pvExcuteContext		= (PVOID) FM_GETFILELIST;
		ld_zip.dwFileMax			= FIND_DATA_MAX;
		ld_zip.pFile				= pwfd;
		ld_zip.pszSearchFile		= MHFile;
	
		iR = g_pFtp->GetList( g_hSession, &ld_zip);
		_ASSERTE( iR == 0);		
//---

	}
}

void CMHAutoPatchDlg::OnDownLoad( LPVOID pvdata )
{
	File_data* pfd = (File_data*)pvdata;
	
	if( pfd->CompletionError == CE_DOWNLOAD_PROGRESS )		// ZIP 颇老 傈价 柳青惑炔篮 包缴 乐促.
	{	
		DWORD dwCurrentSize = pfd->dwTransferBytes;
		DWORD dwProLv = DWORD(PRO_RANGE_DN * ((float)(dwCurrentSize) / (float)(dwFileSizeMax)) );
		SetProgressBar( dwProLv );
	}
	
	if( pfd->CompletionError == CE_SUCCEED )
	{
		g_pFtp->Shutdown(g_hSession);
		
//	拘绵阑 钱磊.
#ifndef _FOR_CHINA_
		SetStatusText( "Extracting Files" );
#else
		SetStatusText( "正在解压文件" );
#endif
		SetProgressBar( 0 );

		BOOL bReturn = Extract_DownloadFile( g_szMHpatchFile );

		DeleteFile( g_szMHpatchFile );
		
		if( !bReturn )
		{
//	拘绵 钱扁 角菩.			
			MessageBox( "Failed To Extract", g_szMBErrCap, MB_OK );
			QuitPatchDialog( TRUE );
			return;
		}
		
		// yh
		// 颇老阑 菩虐隆茄促.
		if(g_bUsingEnginePack)
		{
			StartPack3DData();
		}
		else
		{
			bReturn = UpdateVersionInfoFile( MH_VERSION_INFO_FILE, newverFilename);
			
			// jsd			// resource 弃歹狼 filelist历厘
			((CMHAutoPatchApp*)AfxGetApp())->SaveFileList();

			SetReadyToStart();
		}
	}
}

BOOL CMHAutoPatchDlg::RunMH()
{
/*
	{
		FILE* fp = fopen("MHAutoPatch.new","rb");
		if(fp != NULL)
		{
			fclose(fp);
			_execl("MHExecuter.exe","a",NULL);
		}
	}
	{
		FILE* fp = fopen("SS3DGFunc.new","rb");
		if(fp != NULL)
		{
			fclose(fp);
			_execl("MHExecuter.exe","a",NULL);
		}
	}
*/
	SelectGFunc();
	
	BOOL		bReturn;
	
	STARTUPINFO	sp;
	
	memset( &sp, 0, sizeof(STARTUPINFO));
	sp.cb = sizeof(STARTUPINFO);
	sp.dwFlags = STARTF_USEPOSITION | STARTF_USESIZE | STARTF_USESTDHANDLES; //STARTF_USESHOWWINDOW 
	sp.wShowWindow = SW_SHOW; 
	
	PROCESS_INFORMATION pi;
	
	if(strlen(g_ExecutableFileName) == 0)
		return TRUE;
	else
	{
  		bReturn = CreateProcess( g_ExecutableFileName,		// name of executable module
//#ifdef _MANUAL_PATCH_
//								" anrgiddlatl",                // command line string									
//#else
								" anrgideoqkr",                // command line string
//#endif
								NULL, // SD
								NULL,  // SD
								FALSE,                      // handle inheritance option
								CREATE_DEFAULT_ERROR_MODE | NORMAL_PRIORITY_CLASS,                     // creation flags
								NULL,                      // new environment block
								NULL,                // current directory name
								&sp,               // startup information
								&pi // process information
								);
	}
	
	if( !bReturn )
		return FALSE;
	
	CloseHandle( pi.hProcess );
	CloseHandle( pi.hThread );
	
	return TRUE;
}


BOOL CMHAutoPatchDlg::Extract_DownloadFile( char* lpFileName )
{
	DWORD	dwi;
	int		iMax;
	bool	bReturn;
	
	g_pZip->Open( g_szMHpatchFile, CZipArchive::zipOpen);
	iMax = g_pZip->GetCount();
	bReturn = TRUE;
	
	CZipFileHeader head;
	for ( dwi = 0; (int)dwi < iMax; dwi++)
	{
		if( g_pZip->GetFileInfo( head, dwi)  == false )
		{
			bReturn = FALSE;
			break;
		}
		CZipString filename = head.GetFileName();
		SetFileAttributes(filename,FILE_ATTRIBUTE_NORMAL);
		
		if( g_pZip->ExtractFile( dwi, NULL ) == false )
		{
			bReturn = FALSE;
			break;
		}
		//
		//	柳青惑炔 焊咯林扁.
		DWORD dwProLv = (DWORD)(PRO_RANGE_EX * ((float)(dwi + 1) / (float)iMax));
		SetProgressBar( dwProLv );

#ifdef _FOR_CLIENT_
		MSG msg;
		if( GetMessage(&msg, NULL, 0, 0) ) 
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
#endif
	}
	
	g_pZip->Close();
	
	return bReturn;
}

void CMHAutoPatchDlg::StartPack3DData()
{	
	SetProgressBar( 0 );
#ifndef _FOR_CHINA_
	SetStatusText( "Packing Files" );
#else
	SetStatusText( "正在打包文件" );
#endif

	_beginthread( Pack3DData, 0, m_hWnd );
}


BOOL CMHAutoPatchDlg::UpdateVersionInfoFile( char* lpszOldVerInfoFile, char* lpszNewVerInfoFile )
{
	HANDLE			hFind;
	WIN32_FIND_DATA wfd;
	BOOL			bReturn;
	
	hFind = FindFirstFile( lpszNewVerInfoFile, &wfd);
	if( hFind == INVALID_HANDLE_VALUE )
		return FALSE;
	
	bReturn = DeleteFile( lpszOldVerInfoFile);
	if( !bReturn )
	{
		MessageBox( "Failed To Delete VersionFile", g_szMBErrCap, MB_OK );
		return FALSE;
	}
	
	bReturn = MoveFile( lpszNewVerInfoFile, lpszOldVerInfoFile); // for win2000 later ==> , MOVEFILE_REPLACE_EXISTING);
	if( !bReturn )
	{
		MessageBox( "Failed To Rename VersionFile", g_szMBErrCap, MB_OK );
		return FALSE;
	}
	
	return TRUE;
}


BOOL IsSupportSSE()
{
	BOOL	bResult = TRUE;
	__try 
	{
		// 	xorps	xmm0,xmm0
        __asm _emit 0x0f 
		__asm _emit 0x57 
		__asm _emit 0xc0

    }
	__except ( EXCEPTION_EXECUTE_HANDLER) 
	{
		bResult = FALSE;
		
	}
	return bResult;
}

BOOL CMHAutoPatchDlg::SelectGFunc()
{
	if (IsSupportSSE())
		CopyFile("SS3DGFuncSSE.dll","SS3DGFunc.dll",FALSE);
	else
		CopyFile("SS3DGFuncN.dll","SS3DGFunc.dll",FALSE);
	return TRUE;
}

BOOL CMHAutoPatchDlg::InitEngine()
{
	SelectGFunc();

	HRESULT hr;
	
	g_hExecutiveHandle = LoadLibrary("SS3DExecutiveForMuk.dll");
	if( g_hExecutiveHandle == NULL )
		return FALSE;
	
	CREATE_INSTANCE_FUNC        pFunc;
	pFunc = (CREATE_INSTANCE_FUNC)GetProcAddress(g_hExecutiveHandle,"DllCreateInstance");
	hr = pFunc((void**)&g_pExecutive);
	if (hr != S_OK)
	{		
		::MessageBox( m_sHWnd, "Failed To Create Executive", g_szMBErrCap, MB_OK );
		return FALSE;
	}
	
	// geometry DLL狼 捞抚, renderer DLL狼 捞抚阑 持绢林搁 executive啊 舅酒辑 积己,檬扁拳秦霖促.
	if(g_pExecutive->InitializeFileStorageWithoutRegistry("SS3DFileStorage.dll",
		12000,4096,128,FILE_ACCESS_METHOD_ONLY_FILE,NULL,0) == FALSE)
		return FALSE;

	return TRUE;
}


BOOL AddDataToPackFile( CStrClass pakname, CStrClass dir )
{
	I4DyuchiFileStorage* pFS;
	g_pExecutive->GetFileStorage(&pFS);
	
	void* pPakFile = pFS->MapPackFile((char*)(LPCTSTR)pakname);
	if(pPakFile == NULL)
		return FALSE;
	
	BOOL rt = pFS->LockPackFile(pPakFile,0);
	if(rt == FALSE)
		return FALSE;

	char CurDir[MAX_PATH];
	GetCurrentDirectory(MAX_PATH,CurDir);
	BOOL bSD = SetCurrentDirectory(dir);
	
	CDirectoryName dirname(NULL,NULL);
	dirname.LoadChild();
	SetCurrentDirectory(CurDir);

	dirname.SetPositionHead();
	DWORD kind;
	CStrClass filename;
	CStrClass tname;
	while((kind=dirname.GetNextFileName(&filename)) != GETNEXTFILENAME_END)
	{
		if(kind != GETNEXTFILENAME_FILE)
			continue;
		if(filename == "")
			continue;

		tname = dir + "\\" + filename;
				
		if(pFS->InsertFileToPackFile(pPakFile,(char*)(LPCTSTR)tname) == FALSE)
			return FALSE;
	}
	BOOL unlock = pFS->UnlockPackFile(pPakFile,PackingCallBackFunc);
	if(unlock == FALSE)
		return FALSE;
	pFS->UnmapPackFile(pPakFile);
	pFS->Release();

	return TRUE;

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -