/** * @file Application.cpp * @brief Application class * @author Unknown * @version Unknown */ // AppSample.cpp: implementation of the Application class. // ////////////////////////////////////////////////////////////////////// #include "SunClientPrecompiledHeader.h" #include #ifndef _WIN32_DCOM #define _WIN32_DCOM #endif #include #include "Application.h" #include "DllManager.h" #include "GameFramework.h" #include "varpacket.h" #include "Resource.h" #include "ResourceManager.h" #include "MouseHandler.h" #include "Camera.h" #include "Mouse.h" #include "SoundBGM.h" #include #include #include #include #include "ItemManager.h" #include "Map.h" #include "ObjectManager.h" #include "InterfaceManager.h" #include "MapInfoParser.h" #include "ShopInfoParser.h" #include "GraphicResourceList.h" #include "message.h" #include "ProjectileManagerEx.h" #include "MapResMgr.h" #include "StateInfoParser.h" #include "ItemcompositeParser.h" #include "MissionRewardParser.h" #include "HotkeyManager.h" #include "appearanceManager.h" #include "SlotKeyGenerator.h" #include "CharSoundInfoParser.h" #include "CharInfoParser.h" #include "Hero.h" #include "dlgPosInfoParser.h" #include "BGMSoundInfoParser.h" #include "RequireFieldLevelInfoParser.h" #include "StyleQuickRegistInfoParser.h" #include "EnvironmentInfoParser.h" #include "ProjectileInfoParser.h" #include "uiLoginAccount/uiLoginAccount.h" #include "RadarInfoParser.h" #include "NPCVoiceInfoParser.h" #include "HeroVariationInfoParser.h" #include "HeroHeightInfoParser.h" #include "MonsterVoiceInfoParser.h" #include "EventInfoParser.h" #include "ItemSoundInfoParser.h" #include "LimitedMapPortParser.h" #include "HeadMeshInfoParser.h" #include "EnchantParser.h" #include "uiLoginMan/uiLoginMan.h" #include "WrapArmorKit.h" #include "KeyMapMgr.h" #include "CursorChangeTransact.h" #include "globalfunc.h" #include "SceneBase.h" #include "HeroActionInput.h" #include "OptimizationManager.h" #include "CharacterScene.h" #include "LoadScene.h" #include "SkillTextInfoParser.h" #include "HelpInfoParser.h" #include "ItemComposeListParser.h" #include "ItemCrystalizeListParser.h" #include "CompositeNPCInfoParser.h" #include "QuestInfoManagerEx.h" #include "QuestTextInfoParser.h" #include "QuestManager_Concrete.h" #include "MissionManager_Concrete.h" #include "ExpValueInfoParser.h" #include "ItemTypeList.h" #include "RewardInfoList.h" #include "SunEventInfoParser.h" #include "OptionListParser.h" #include "SkillEffectInfoParser.h" #include "AttachmentOffsetInfoParser.h" #include "PacketRequestManager.h" #include "cLua.h" #include "GameCheckMananger.h" //增加外挂检测 by:十里坡剑神 2021-06-30 #include "SpecialTexutureInfoParser.h" #ifdef _RU_0000_20120312_RUSSIA_CHECK_RESOURCE_VERSION_SCRIPT #include "ResourceVersionParser.h" #endif //_RU_0000_20120312_RUSSIA_CHECK_RESOURCE_VERSION_SCRIPT #include "BattleScene.h" #include //#ifdef HAIR_COLOR_VARIATION //#include "HeadColorInfoParser.h" //#endif #include "uiSystemMan/uiSystemMan.h" #ifdef GGUO_CRASH_DUMP #ifdef _DH_DEBUG_REPORT #include "CrashReporter.h" #include "MD5Encrypt.h" #else #include "Tlhelp32.h" #endif #endif//GGUO_CRASH_DUMP #include "ClientVer.h" #include "SolarDateTime.h" #include "uiSystemVerify/uiSystemVerify.h" #ifdef __NA_000678_20071023_MEMORY_OPTIMIZATION_SLOTCONTAINER #include "SCSlotFactory.h" #endif #include "ScreenShotSaver.h" #ifdef __NA001334_090420_SERVER_SELECT_FACILITY__ #include "uiPartyMan/uiPartyMan.h" #endif //__NA001334_090420_SERVER_SELECT_FACILITY__ #include "DelayLoadManager.h" #include "ItemCooltimeManager.h" #if defined(_DEBUG) || defined(_GAMECLIENT_VER) #include "AutoTestManager.h" #endif #ifdef _YMS_AUTOBOT_GAME #include "Autobot/Autobot.h" #include "Autobot/Condition/AutobotConditionManager.h" #include "Autobot/Passpoint/AutobotPasspointManager.h" #endif //_YMS_AUTOBOT_GAME #ifdef _DEBUG //#ifdef _LTJ_PACKET_SHOW_FOR_DEBUG CPShowFNTable* g_pPacketShow = NULL; #endif //_LTJ_PACKET_SHOW_FOR_DEBUG #ifdef __NA000000_070913_HACKSHIELD_INSTALLATION__ #include "HShield/HackShield.h" #endif //__NA000000_070913_HACKSHIELD_INSTALLATION__ #include "TreeMenuGroup.h" #include "TextureListInfoHandleManager.h" #include "XignCode/XignCodeApi.h" #include "KBMoveCheckManagerInClient.h" #include #include "HeroData.h" #include "CooltimeManager.h" #define MULTI_LOAD_COUNT_PER_SECOND 30 #pragma warning ( push ) #pragma warning(disable : 4995) #pragma warning ( push ) #pragma warning(disable : 4800) //#define ID_H1 0x7777 //热键注册,用于判断是否多开 by:十里坡剑神 20201-06-13 //--------------------------------------------------------------------------------------- int g_iUpdateFrameCount = 0; int g_iRenderFrameCount = 0; WORD g_wFrameSkipping = 0; #ifdef _NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_TEMP #include "uiCreateCharacterMan/uiCreateCharacterMan.h" #include "CreateCharCustomDialog.h" bool is_slow_ = false; #endif //_NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_TEMP VOID NetworkRecv( DWORD dwIndex, BYTE * pData, DWORD dwSize ); VOID NetworkDisconnect( DWORD dwIndex ); VOID NetworkError( char * pszMsg ); ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// DWORD WINAPI ThreadFunc(LPVOID p) { return 0; } namespace CheckMultiClient { HANDLE m_hSemaphore = NULL; BOOL CreateHandle() { #if defined(_SUNGAME_VER) || defined(_SUNGAME_DUMP_VER) LONG s_max_client_count = 2; #else // defined(DEBUG) || defined(CLIENT_VER) LONG s_max_client_count = 10; #endif m_hSemaphore = CreateSemaphore( NULL, s_max_client_count, s_max_client_count, _T("SUN_GAME") ); if ( m_hSemaphore == NULL ) { return FALSE; } DWORD dwWaitResult = WaitForSingleObject( m_hSemaphore, 100 ); if( dwWaitResult == WAIT_TIMEOUT ) { m_hSemaphore = NULL; return FALSE; } if( dwWaitResult == WAIT_OBJECT_0 ) { return TRUE; } return FALSE; } void ReleaseHandle() { if( m_hSemaphore != NULL ) { LONG previous_count; ReleaseSemaphore( m_hSemaphore, 1, &previous_count ); } } }; Application::Application() { #ifdef GGUO_CRASH_DUMP ::_set_new_handler(NewHandler); ::_set_purecall_handler(PureCallHandler); #if _MSC_VER == 1310 // vs2003 傈侩 ::_set_security_error_handler(BufferOverflowHandler); #endif // 1310 ::SetUnhandledExceptionFilter( ExceptionFilter ); #endif Clear(); m_hConsole = INVALID_HANDLE_VALUE; #ifdef _NA_005039_20120703_ENABLE_MULTI_CLIENT_COUNT #else // _NA_005039_20120703_ENABLE_MULTI_CLIENT_COUNT m_hSemaphore = NULL; #endif // _NA_005039_20120703_ENABLE_MULTI_CLIENT_COUNT m_iDebugInfo = 0; m_bRunningGame = FALSE; m_dwInitialWndStyle = m_dwInitialWndStyle & (~(WS_SYSMENU |WS_MAXIMIZE | WS_MINIMIZE | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_THICKFRAME)); for(int i = 0; i < 100; i++) { m_iProfile[i] = 0; ZeroMemory(m_szProfile[i], 100); } for(int i = 0; i < MAX_PRELOAD_RESOURCE; ++i) { l_pPreloadResource[i] = NULL; } l_dwPreloadResource[0] = 59051 + ENGINE_RESOURCE_ID_OFFSET; l_dwPreloadResource[1] = 59001 + ENGINE_RESOURCE_ID_OFFSET; l_dwPreloadResource[2] = 59002 + ENGINE_RESOURCE_ID_OFFSET; l_dwPreloadResource[3] = 59003 + ENGINE_RESOURCE_ID_OFFSET; //预先装入角色的基本皮肤 ResourceManager* load_mgr = ResourceManager::Instance(); if (load_mgr == NULL) { return; } int offset_index = 4; //步骤1:角色PreLoad for(int index = 0; index < 5; ++index) { // 类型 eCHAR_TYPE class_type = (eCHAR_TYPE)(index + eCHAR_BERSERKER); // 男 l_dwPreloadResource[offset_index] = load_mgr->GetCharacterBoneResourceCode(class_type, GenderType::kMale); ++offset_index; // 女 l_dwPreloadResource[offset_index] = load_mgr->GetCharacterBoneResourceCode(class_type, GenderType::kFemale); ++offset_index; } //步骤2:坐骑PreLoad for(int index = 0; index < 10; ++index) { l_dwPreloadResource[offset_index] = 5301 + index + ENGINE_RESOURCE_ID_OFFSET; ++offset_index; } } Application::~Application() { } int Application::NewHandler(size_t) { //SASSERT(NULL, "Memory allocate is fail."); int* break_point = NULL; *break_point = 200; return 0; } void Application::PureCallHandler() { //SASSERT(NULL, "Pure function is called."); int* break_point = NULL; *break_point = 100; } void Application::BufferOverflowHandler(int code, void* unused) { //SASSERT(NULL, "Buffer is overflow."); int* break_point = NULL; *break_point = 300; } void Application::Clear( void ) { m_VirtualPacket.clear(); m_RecvVirtualPacket.clear(); m_GameFramework = NULL; m_bGameInput = FALSE; } void Application::InitSound() { GlobalFunc::WriteLoadingTimeLog(_T("Application::InitSound Start")); DWORD dwStartTime = GlobalFunc::StartTimeCheck(); //------------------------------------------------------------------------- // 重置Web Geon声音引擎 //------------------------------------------------------------------------- WZSNDINFO info; info.use_secure_filesystem = (bool)GENERALPARAM->IsUsePackFile(); // 是否使用压缩加密文件系统 info.enable_debugLog = FALSE; if (GENERALPARAM->GetSoundLogFlag()) { info.enable_debugLog = TRUE; // 视觉工作室调试窗口或bin文件夹中的DebugView // 指定是否使用调试输出日志(true or false) } // 正式系列推荐使用false。 const int c_iVeryLongPathLength = 65536; char szCurDir[c_iVeryLongPathLength]; ::GetCurrentDirectoryA( c_iVeryLongPathLength, szCurDir ); if (info.use_secure_filesystem) { sprintf(info.pszSecureFileSystem, "%s", "data\\sound\\sound.wpk"); sprintf(info.pszConfigFile, "%s", "wzsound_config.txt"); sprintf(info.pszMusicFile, "%s", "wzsound_music.txt"); sprintf(info.pszSoundFile, "%s", "wzsound_sound.txt"); sprintf(info.pszVoiceFile, "%s", "wzsound_voice.txt"); } else { sprintf(info.pszLocalFileSystem, "%s\\%s", szCurDir, "data\\sound\\"); sprintf(info.pszConfigFile, "%s\\%s", szCurDir, "data\\sound\\wzsound_config.txt"); sprintf(info.pszMusicFile, "%s\\%s", szCurDir, "data\\sound\\wzsound_music.txt"); sprintf(info.pszSoundFile, "%s\\%s", szCurDir, "data\\sound\\wzsound_sound.txt"); sprintf(info.pszVoiceFile, "%s\\%s", szCurDir, "data\\sound\\wzsound_voice.txt"); } Sound::Instance()->SetUseSoundLibrary(FALSE); BOOL bUseEffectSound = GENERALPARAM->ReadInt(_T("SOUND_EFFECT"), 1); BOOL bUseBGMSound = GENERALPARAM->ReadInt(_T("SOUND_BGM"), 1); Sound::Instance()->SetUseEffectSound(bUseEffectSound ); Sound::Instance()->SetUseBGMSound(bUseBGMSound); if (bUseEffectSound || bUseBGMSound) { Sound::Instance()->SetUseSoundLibrary(TRUE); } BOOL bRet = Sound::Instance()->Create(&info); if (bRet) { _asm nop; } GlobalFunc::EndTimeCheck(dwStartTime, true, _T("Application::InitSound End")); } void Application::ReleaseSound() { // Web建设声音库解除 Sound::Instance()->Destroy(); Sound::Instance()->DestroyInstance(); } BOOL Application::LoadGameInfo() { char PACK_FILE_NAME[MAX_PATH] = {0,}; if( GENERALPARAM->IsUsePackFile() ) { strcpy( PACK_FILE_NAME, "Data\\Resource.wpk" ); PACKER_MANAGER()->OpenPackFile("Data\\Resource.wpk"); } else { ZeroMemory( PACK_FILE_NAME, MAX_PATH ); } g_pQMGR_Real = new QuestManager_Concrete(&g_QuestInfoManager); g_pQMGR_Temp = new QuestManager_Concrete(&g_QuestInfoManager); g_pQMGR_Real->Init(100); g_pQMGR_Temp->Init(100); g_pMission_Concrete = new MissionManager_Concrete; return TRUE; } void Application::LoadGameInfoForSriptParserMng() { GlobalFunc::WriteLoadingTimeLog(_T("Script(For ScriptVerCheck) Loding Start")); DWORD dwStartTime = GlobalFunc::StartTimeCheck(); g_pClientScriptParserManager = new ClientScriptParserManager; g_pClientScriptParserManager->RegisterParser(); g_pClientScriptParserManager->InitParserPool( NULL ); g_pClientScriptParserManager->Load(); #ifdef _RU_0000_20120312_RUSSIA_CHECK_RESOURCE_VERSION_SCRIPT #if defined( _KOREA ) TCHAR* nation_code_string = "KOREA"; #elif defined( _JAPAN ) TCHAR* nation_code_string = "JAPAN"; #elif defined( _CHINA ) || defined( _TAIWAN ) TCHAR* nation_code_string = "CHINA"; #elif defined( _GLOBAL ) TCHAR* nation_code_string = "GLOBAL"; #elif defined( _RUSSIA ) TCHAR* nation_code_string = "RUSSIA"; #endif if (StrnCmp(nation_code_string, ResourceVersionParser::Instance()->nation_code().c_str(), 6) != 0) { MessageBox(g_hWndMain, "Invalid Client Data Files", NULL, MB_OK); exit(0); } #endif //_RU_0000_20120312_RUSSIA_CHECK_RESOURCE_VERSION_SCRIPT GlobalFunc::EndTimeCheck(dwStartTime, true, _T("Script(For ScriptVerCheck) Loding End")); // 读取脚本后,根据脚本内容创建内存池。.. xGetCooltimeManager()->InitializeCooltimeTable(); } void Application::UnloadGameInfo() { ResourceManager::Instance()->Release(); ResourceManager::Instance()->DestroyInstance(); ItemManager::Instance()->Release(); ItemManager::Instance()->DestroyInstance(); if (g_pQMGR_Temp) { g_pQMGR_Temp->DestroyAll(); } if (g_pQMGR_Real) { g_pQMGR_Real->DestroyAll(); } SAFE_DELETE( g_pQMGR_Temp ); SAFE_DELETE( g_pQMGR_Real ); SAFE_DELETE( g_pMission_Concrete ); if( g_pClientScriptParserManager ) { g_pClientScriptParserManager->Release(); g_pClientScriptParserManager->DestroyInstanceEx(); SAFE_DELETE( g_pClientScriptParserManager ); } } //------------------------------------------------------------------------------ // Method : Create // [2010-1-28 by i4u4me] 修复:重新排序功能(先读取游戏选项,然后加载资源) // 原因:通过参考游戏选项中的国家特定变量来加载资源 // 定义 : _YMS_GAMEOPTION_LANGUAGETYPE // 现存 : // ResourceManager::Instance()->Init(); // g_InterfaceManager.LoadFontAndStringTable(); // m_GameFramework = new GameFramework; // GAMEOPTION->Load(); //------------------------------------------------------------------------------ BOOL Application::Create( HINSTANCE hInstance, LPCTSTR lpszAppName, WNDPROC WndProc, LPCTSTR lpszIconName, int nCmdShow ) { //#ifdef _DEBUG // _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); // _CrtSetBreakAlloc(3801); //#endif #ifndef _GMTOOL_ GameCheckMananger::Instance()->InitGameCheck(); //增加外挂检测 by:十里坡剑神 2021-06-30 #endif #ifdef _NA_005039_20120703_ENABLE_MULTI_CLIENT_COUNT if( CheckMultiClient::CreateHandle() == FALSE ) { return FALSE; } #else //_NA_005039_20120703_ENABLE_MULTI_CLIENT_COUNT #ifdef _NA_20120109_KIKI_ENABLE_MULTI_CLIENT // no operation // 激活此定义时,不执行多客户端相关检查。(多客户端允许状态) #else if (GENERALPARAM->GetSpecialMode() == eSPECIAL_MODE_NONE) { if ( !CheckOverlapExecute() ) { #ifdef _DEV_VER MessageBox( g_hWndMain, "CheckOverlapExecute failed", NULL, MB_OK ); #endif return FALSE; } } #endif #endif //_NA_005039_20120703_ENABLE_MULTI_CLIENT_COUNT m_bRunningGame = TRUE; this->m_dwCurrentTick = 0; this->m_bCheckToWorldServerReconnect = false; #ifdef _DEV_VER g_Profiler.Init(); g_ProcessProfiler.Init(); #endif //------------------------------------------------------------------------- // 文件系统初始化 //------------------------------------------------------------------------- m_pDiscAccess = new CDiscAccess; m_pDiscAccess->Create(); if( GENERALPARAM->IsSystemPackFileName() ) { DWORD dwStart = GlobalFunc::StartTimeCheck(); GlobalFunc::WriteLoadingTimeLog(_T("OpenDisc_Packer Start [System.wpk]")); // 必须输入密码!! - 如果没有密码则为 NULL if( !m_pDiscAccess->OpenDisc_Packer( ePFN_SYSTEM, "System\\System.wpk" , NULL ) ) { GlobalFunc::WriteLoadingTimeLog(_T("System\\System.wpk 文件加载错误")); assert( !"System\\System.wpk 文件加载错误" ); #ifdef _DEV_VER MessageBox( g_hWndMain, "System\\System.wpk 文件加载错误!", NULL, MB_OK ); #endif return FALSE; } GlobalFunc::EndTimeCheck(dwStart, true, _T("OpenDisc_Packer End [System.wpk]")); } if( GENERALPARAM->IsUsePackFile() ) { DWORD dwStart = GlobalFunc::StartTimeCheck(); GlobalFunc::WriteLoadingTimeLog(_T("OpenDisc_Packer Start [Resource.wpk]")); // 必须输入密码!! - 如果没有密码则为 NULL if( !m_pDiscAccess->OpenDisc_Packer( ePFN_RESOURCE, "Data\\Resource.wpk" , NULL ) ) { GlobalFunc::WriteLoadingTimeLog(_T("Data\\Resource.wpk 文件加载错误")); assert( !"Data\\Resource.wpk 文件加载错误" ); #ifdef _DEV_VER MessageBox( g_hWndMain, "Data\\Resource.wpk 文件加载错误!", NULL, MB_OK ); #endif return FALSE; } GlobalFunc::EndTimeCheck(dwStart, true, _T("OpenDisc_Packer End [Resource.wpk]")); } //------------------------------------------------------------------------- // 初始化框架,创建渲染器 //------------------------------------------------------------------------- St_AppCreateParam AppCreateParam; if(strlen(GENERALPARAM->GetEngineRoot()) > 0) { sprintf(AppCreateParam.m_lpszDllPath,"%s\\dll\\",GENERALPARAM->GetEngineRoot()); } else { memset( AppCreateParam.m_lpszDllPath, 0, sizeof( AppCreateParam.m_lpszDllPath ) ); } strcpy(AppCreateParam.m_lpszShaderPath, "System\\"); strcpy(AppCreateParam.m_lpszIrradiancePath, "System" ); AppCreateParam.m_dwDrawCreateOption = DCO_USE_PHYSICS | DCO_SET_IRRADIANCE_PATH; AppCreateParam.m_pDiscAccess = m_pDiscAccess; if( GENERALPARAM->IsSystemPackFileName() ) { m_pDiscAccess->SetActiveDisc(ePFN_SYSTEM); } //! 保存屏幕尺寸 set_desktop_screen_size(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)); if( !CAppLast::Create( hInstance, lpszAppName, WndProc, lpszIconName, nCmdShow, &AppCreateParam)) { /*MessageBox( g_hWndMain, "请使用登陆器启动游戏.", NULL, MB_OK ); return ( FALSE );*/ } #ifdef _HACKSHIELD_CHECK_TIMER_API_FUNCTION_ m_pDraw->x_Clock.SetClockFunction(_AhnHS_QueryPerformanceCounter, _AhnHS_QueryPerformanceFrequency, _AhnHS_GetTickCount); #endif //_HACKSHIELD_CHECK_TIMER_API_FUNCTION_ #ifdef _APPLY_JAPAN_GAMECHU_CHANNELING if (uiLoginMan::IsUseParameterAuthInfo() == true) { if (web_in_client.Initialize() == TRUE) { web_in_client.SetHGame(m_hWnd); BOOL return_value = web_in_client.TransferMyHWND(); if (return_value == FALSE) { MessageBox(NULL, "传输 HWND 失败", NULL, MB_OK); } } } #endif //_APPLY_JAPAN_GAMECHU_CHANNELING if( GENERALPARAM->IsUsePackFile() ) { m_pDiscAccess->SetActiveDisc(ePFN_RESOURCE); } else { m_pDiscAccess->SetActiveDisc(ePFN_NOT_USE_PACKFILE); } //------------------------------------------------------------------------- // 窗口句柄和渲染器初始化 //------------------------------------------------------------------------- g_hWndMain = m_hWnd; g_pSunRenderer = m_pDraw; g_pSunRenderer->SetClearColor(0,0,0); //if (!RegisterHotKey(m_hWnd, ID_H1, MOD_CONTROL, '+')) // return FALSE;//热键注册,用于判断是否多开 by:十里坡剑神 20201-06-13 // 屏幕分辨率调整 float fRate = (float)m_ScreenParam.m_ScreenFormat.m_dwWidth / (float)m_ScreenParam.m_ScreenFormat.m_dwHeight; g_Camera.SetAspectRatio(SR_AUTO); POINT pt = Get2DModeMapping(); float fWidth = pt.x / (float)m_ScreenParam.m_ScreenFormat.m_dwWidth; float fHeight = pt.y / (float)m_ScreenParam.m_ScreenFormat.m_dwHeight; //------------------------------------------------------------------------- // 加载除 SUN 渲染器以外的引擎 //------------------------------------------------------------------------- if( !DllManager::Instance()->LoadSeDlls() ) { MessageBox( g_hWndMain, "Dll Load failed!", NULL, MB_OK ); return FALSE; } // 定时器复位 #ifdef _DEV_VER g_pSunRenderer->x_Clock.SetFramePerSecond( 200, FALSE , 10 , FALSE ); #else g_pSunRenderer->x_Clock.SetFramePerSecond( 100, FALSE , 10 , FALSE ); #endif if(g_pSunRenderer->x_pManagerMultiLoader) { g_pSunRenderer->x_pManagerMultiLoader->SetLoadCountPerSecond( MULTI_LOAD_COUNT_PER_SECOND ); } // LOD处理 // 关闭 60 米以外物体的法线贴图 // 对 30 米以外的物体禁用蒙皮 #ifdef _PERF_DEBUG float fNormalMapDistance[2] = {10.0f,11.0f}; float fSkinningDistance[2] = {10.0f,11.0f}; #else float fNormalMapDistance[2] = {50.0f,51.0f}; float fSkinningDistance[2] = {40.0f,41.0f}; #endif g_pSunRenderer->x_pManagerUnitLOD->AutoInvalidNormalMap(TRUE,fNormalMapDistance); g_pSunRenderer->x_pManagerUnitLOD->AutoInvalidSkinning(TRUE,fSkinningDistance); g_pSunRenderer->x_pManagerUnitLOD->EnableUnitLOD(TRUE); #ifdef _PERF_DEBUG float fLODDistance[4] = { 5.0f, 6.0f, 10.0f, 11.0f}; WzColor shadowcolor = WzColor_RGBA(155,155,155,255); g_pSunRenderer->SetColor(200,200,200,255,WRIC_AMBIENT); g_pSunRenderer->SetShadowColor(shadowcolor); g_pSunRenderer->x_pManagerUnitLOD->SetDistanceOfLOD( fLODDistance, 4); //g_pSunRenderer->x_pManagerShadowMap->SetDepthBias(2.0e-04f); g_pSunRenderer->x_pManagerUnitLOD->EnableUnitSubTypeLOD(FALSE); g_pSunRenderer->EnableOcclusionCulling(FALSE); g_pSunRenderer->x_pManagerShadowMap->SetShadowRange(30.0f); #else float fLODDistance[4] = { 20.0f, 21.0f, 40.0f, 41.0f}; WzColor shadowcolor = WzColor_RGBA(155,155,155,255); g_pSunRenderer->SetColor(200,200,200,255,WRIC_AMBIENT); g_pSunRenderer->SetShadowColor(shadowcolor); g_pSunRenderer->x_pManagerUnitLOD->SetDistanceOfLOD( fLODDistance, 4); g_pSunRenderer->x_pManagerUnitLOD->EnableUnitSubTypeLOD(TRUE); g_pSunRenderer->EnableOcclusionCulling(FALSE); g_pSunRenderer->x_pManagerShadowMap->SetShadowRange(30.0f); #endif // 加载和初始化游戏选项( GameData.Dat ) GAMEOPTION->Load(); // 项目 3d 渲染器 ResourceManager::Instance()->Init(); g_InterfaceManager.LoadFontAndStringTable(); // 创建主框架 m_GameFramework = new GameFramework; bool bSkipMoviePlay = false; #if defined(_DEBUG) || defined(_GAMECLIENT_VER) // 调试/开发部署模式 if( AutoTestManagerEx::Instance()->IsActive() == true ) { bSkipMoviePlay = true; } //#ifdef _KIKI_AUTOTEST // if(AutoTestManager::Instance()->IsEnable()) // bSkipMoviePlay = true; // 激活自动测试模式时跳过视频 //#endif #endif SCENE_TYPE iSceneType; if(bSkipMoviePlay) { iSceneType = SCENE_TYPE_START; } else { if( GAMEOPTION->GetShowMoviePlay() ) iSceneType = SCENE_TYPE_MOVIEPLAY; else iSceneType = SCENE_TYPE_START; } if( FALSE == m_GameFramework->Create( iSceneType) ) { #ifdef _DEV_VER MessageBox( g_hWndMain, "m_GameFramework->Create() failed", NULL, MB_OK ); #endif return FALSE; } // 直接输入 if( FAILED( g_Input.Create( m_hWnd ) ) ) { // 无法创建直接输入 #ifdef _DEV_VER MessageBox( g_hWndMain, "g_Input.Create() failed", NULL, MB_OK ); #endif return FALSE; } // 初始化测试变量 InitializeTempVariable(); #ifdef _USE_LUA_SCRIPT // Lua 单例对象的创建和初始化 new cLuaMain(); cLuaMain::instance()->InitLua(); #ifdef _DEV_VER if ( GENERALPARAM->IsStartLuaConsole() ) { cLuaMain::instance()->OpenLuaConsole(); } #endif //_DEV_VER #endif //_USE_LUA_SCRIPT Mouse::Instance()->Init( m_hWnd ); Mouse::Instance()->SetScreenRes( fWidth, fHeight ); m_ScreenSize.x = (LONG)m_ScreenParam.m_ScreenFormat.m_dwWidth; m_ScreenSize.y = (LONG)m_ScreenParam.m_ScreenFormat.m_dwHeight; #ifdef __NA_000678_20071023_MEMORY_OPTIMIZATION_SLOTCONTAINER SCSlotFactory::Instance()->Init( 1, 1, 1, 1, 1 ); #endif new cHeroData(); xGetHeroData()->Initialize(); new cCooltimeManager(); xGetCooltimeManager()->Initialize(); ItemManager::Instance()->Init(); ICONMGR()->Create(MAX_ICON_IMAGE, g_pSunRenderer); MAPRESMGR()->Create(MAX_MAP_OBJECT); g_SlotKeyGenerator.Init(); RECT rcWindow; rcWindow.left = 0; rcWindow.top = 0; rcWindow.right = m_ScreenParam.m_ScreenFormat.m_dwWidth; rcWindow.bottom = m_ScreenParam.m_ScreenFormat.m_dwHeight; g_InterfaceManager.SetWindowRC(&rcWindow); CheckScreenSize(); g_pSunRenderer->GetGammaRamp(g_D3dGammaRamp.red,g_D3dGammaRamp.green,g_D3dGammaRamp.blue); for(int i=0;i<256;i++) { g_D3dGammaRamp.red[i]*=(65535/255); g_D3dGammaRamp.green[i]*=(65535/255); g_D3dGammaRamp.blue[i]*=(65535/255); } m_hTextureOnHead = g_pSunRenderer->x_pManagerTexture->LoadTexture( "Data\\Interface\\guild_back.tga" ,TLS_ORIGINAL_SIZE | TLS_NO_MIPMAP | TLS_NO_MULTITHREAD); if(INVALID_HANDLE_VALUE == m_hTextureOnHead) { assert(!"INVALID_HANDLE_VALUE == m_hTextureOnHead"); } #ifdef _DEBUG //#ifdef _LTJ_PACKET_SHOW_FOR_DEBUG if (g_pPacketShow == NULL) { g_pPacketShow = (CPShowFNTable*)GetCPShowHandler(); g_pPacketShow->fnInit(C2S_HIGH_VERSION_NO, C2S_MIDDLE_VERSION_NO, CATEGORY_ODD_NUMBER, PROTOCOL_ODD_NUMBER); } #endif #ifdef _NA_000000_20120410_SPEEDHACK WGPL::SetCallbackWGPL(BattleScene::CallbackWGPL); #endif //_NA_000000_20120410_SPEEDHACK #ifdef _NA_008316_20150604_DEV_VER_SHOW_DAMAGE_INFO #ifdef _DEV_VER TestModule::Instance()->SetModuleName(TestModule::TestMode_Show_Damage_info, "show_damage_info"); TestModule::Instance()->SetTestMode(TestModule::TestMode_Show_Damage_info, false); #endif //_DEV_VER #endif //_NA_008316_20150604_DEV_VER_SHOW_DAMAGE_INFO return TRUE; } //------------------------------------------------------------------------------ /** GS_BUG_FIX:无法在特定分辨率下更改您想要的确切大小. */ BOOL Application::CheckScreenSize() { if(!g_pSunRenderer || g_pSunRenderer->IsFullScreen()) return FALSE; //设置区域大小 St_ScreenFormat ScreenFormat; g_pSunRenderer->GetScreenFormat( &ScreenFormat ); GAMEOPTION->SetExceptionFlag(FALSE); //客户区检查 RECT rcRealRect; GetClientRect(this->GetHWnd(),&rcRealRect); DWORD dwWidth = (rcRealRect.right-rcRealRect.left); DWORD dwHeight = (rcRealRect.bottom-rcRealRect.top); //如果与实际尺寸相比没有正常变化 if(ScreenFormat.m_dwWidth != dwWidth || ScreenFormat.m_dwHeight != dwHeight) { //在选项中单独保存的原始尺寸 GAMEOPTION->SetExceptionSize(ScreenFormat); GAMEOPTION->SetExceptionFlag(TRUE); //如果不同,请重新设置。 ScreenFormat.m_dwWidth = dwWidth; ScreenFormat.m_dwHeight = dwHeight; g_pSunRenderer->SelectMode( ScreenFormat ); POINT pt = {(LONG)dwWidth,(LONG)dwHeight}; OnChangeRes( &pt ); RECT rcWindow = {0,0,(LONG)dwWidth,(LONG)dwHeight}; g_InterfaceManager.SetWindowRC(&rcWindow); return TRUE; } return FALSE; } //------------------------------------------------------------------------------ /** */ void Application::InitRegistry(HINSTANCE hInstance) { //----------------------------------------------------------------------------------- // 设置游戏数据路径 // * 改为注册表管理 //----------------------------------------------------------------------------------- // 执行路径是为每个国家定义的,但执行路径设置为_bin以统一工作。 LoadStringA( hInstance, IDS_GAME_PATH, g_szRunPath, MAX_PATH ); // 运行文件夹设置 SetCurrentDirectoryA( g_szRunPath ); } //------------------------------------------------------------------------------ /** */ void Application::InitNet() { if( GENERALPARAM->IsNet() ) { // 创建网络对象 g_pNetwork = new Network(); if (g_pNetwork) { g_pNetwork->Init(NetworkRecv, NetworkDisconnect, NetworkError); } } else { g_pNetwork = NULL; } } //------------------------------------------------------------------------------ /** */ BOOL Application::ConnectToAuthServer() { if (GENERALPARAM->IsNet()) { if (g_pNetwork == NULL) { return FALSE; } GlobalFunc::InitRandom(); // 验证服务器连接 BOOL bConnectRet = FALSE; int i; if (LOGINPARAM->GetLoginServerType() == 2) { const int c_iMAX_LOGIN_SEREVR_NUM = LOGINPARAM->GetServiceLoginServerNum(); std::vector tryidx; for (i=0; ination_type() == kLanguageTaiwan) { //! 以台湾为例 TCHAR szLoginServer[128]; Sprintf (szLoginServer, _T("%s%d.%s"), LOGINPARAM->GetServiceLoginServerIP_Head(), tryidx[i] + 1, LOGINPARAM->GetServiceLoginServerIP_Tail()); // connect1.sunonline.co.kr 以格式保存ip LOGINPARAM->SetSelectedServiceLoginServerIP(szLoginServer); LOGINPARAM->SetSelectedServiceLoginPort(LOGINPARAM->GetServiceLoginServerPort()); } #elif defined(_APPLY_JAPAN_GAMECHU_CHANNELING) // no operation #else TCHAR szLoginServer[128]; Sprintf (szLoginServer, _T("%s%d.%s"), LOGINPARAM->GetServiceLoginServerIP_Head(), tryidx[i] + 1, LOGINPARAM->GetServiceLoginServerIP_Tail()); // connect1.sunonline.co.kr 以格式保存ip LOGINPARAM->SetSelectedServiceLoginServerIP(szLoginServer); LOGINPARAM->SetSelectedServiceLoginPort(LOGINPARAM->GetServiceLoginServerPort()); #endif bConnectRet = g_pNetwork->Connect( CI_AUTHSERVERIDX, LOGINPARAM->GetSelectedServiceLoginServerIP(), LOGINPARAM->GetSelectedServiceLoginServerPort() ); if (bConnectRet) { break; } } } if (FALSE == bConnectRet) { bConnectRet = g_pNetwork->Connect( CI_AUTHSERVERIDX, LOGINPARAM->GetLoginServerIP(), LOGINPARAM->GetLoginServerPort() ); } uiLoginMan* loginMan = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_LOGIN)); if (loginMan && bConnectRet) loginMan->UnsetTryReconnect(); return bConnectRet; } else { // 单模无条件返回 TRUE return TRUE; } } //#endif //------------------------------------------------------------------------------ /** */ void Application::ReleaseNet() { // socket close if (g_pNetwork && (GENERALPARAM->IsNet() == TRUE) && (g_pNetwork->IsConnected(CI_GAMESERVERIDX) == TRUE)) { g_pNetwork->Disconnect(CI_GAMESERVERIDX); } #if !defined(_NA002676_WORLD_SERVER_RENEWAL) if (g_pNetwork && (GENERALPARAM->IsNet() == TRUE) && (g_pNetwork->IsConnected(CI_CHATSERVERIDX) == TRUE)) { g_pNetwork->Disconnect(CI_CHATSERVERIDX); } #endif if (g_pNetwork && (GENERALPARAM->IsNet() == TRUE)) { // 断开网络 g_pNetwork->Disconnect(CI_GAMESERVERIDX); g_pNetwork->Release(); } SAFE_DELETE(g_pNetwork); LOGINPARAM->DestroyInstance(); } void Application::Destroy() { // 将当前使用的设置放在 CAppLast::m_ScreenParam 中,该参数存储在 3dsetup.ini 中的 CAppLast::Destroy g_pSunRenderer->GetScreenFormat( &m_ScreenParam.m_ScreenFormat ); g_pSunRenderer->GetRenderOption( &m_ScreenParam.m_RenderOption ); #ifdef _NA_005039_20120703_ENABLE_MULTI_CLIENT_COUNT CheckMultiClient::ReleaseHandle(); #else //_NA_005039_20120703_ENABLE_MULTI_CLIENT_COUNT if (m_hSemaphore) { LONG previous_count; ReleaseSemaphore( m_hSemaphore, 1, &previous_count ); m_hSemaphore = NULL; } #endif //_NA_005039_20120703_ENABLE_MULTI_CLIENT_COUNT if (!m_bRunningGame) { return; } g_KeyQueueManager.Release(); InitializeVirtualPacket(); //// socket close if (g_pNetwork && (GENERALPARAM->IsNet() == TRUE) && (g_pNetwork->IsConnected(CI_GAMESERVERIDX) == TRUE)) { g_pNetwork->Disconnect(CI_GAMESERVERIDX); } #if !defined(_NA002676_WORLD_SERVER_RENEWAL) if (g_pNetwork && (GENERALPARAM->IsNet() == TRUE) && (g_pNetwork->IsConnected(CI_CHATSERVERIDX) == TRUE)) { g_pNetwork->Disconnect(CI_CHATSERVERIDX); } #endif if (g_pNetwork && (GENERALPARAM->IsNet() == TRUE)) { // 断开网络 g_pNetwork->Disconnect( CI_GAMESERVERIDX ); g_pNetwork->Release(); } if (g_pSunRenderer && g_pSunRenderer->x_pManagerMultiLoader) { g_pSunRenderer->x_pManagerMultiLoader->ExitMultiThreadedLoading(); } UnloadPreloadResource(); g_ProjectileManagerEx.Destroy(); // 销毁当前场景 m_GameFramework->Destroy(); SAFE_DELETE( m_GameFramework ); // 销毁相机 g_Camera.Destroy(); #ifdef _MOD_CHAGNE_DELETE_HERO g_ObjectManager.DeleteHero(); #endif // 退出界面管理器 g_InterfaceManager.Release(); if ( g_pMap ) { g_pMap->Destroy(); SAFE_DELETE(g_pMap); } // 删除对象.. g_ObjectManager.Destroy(); g_SlotKeyGenerator.Release(); ResourceManager::Instance()->FreeAllCachedData(); // 鼠标指针释放 MouseHandler::Instance()->ReleaseUnitRenderer(); MouseHandler::Instance()->DestroyInstance(); MouseCursor::Instance()->Release(); MouseCursor::Instance()->DestroyInstance(); CursorChangeTransact::Instance()->Release(); CursorChangeTransact::Instance()->DestroyInstance(); Mouse::Instance()->Release(); Mouse::Instance()->DestroyInstance(); KeyMapMgr::Instance()->DestroyInstance(); // 声音 ReleaseSound(); #ifdef _USE_LUA_SCRIPT delete cLuaMain::instance(); #endif //_USE_LUA_SCRIPT // 删除其他实例 ReleaseManager(); // 解析数据清理 UnloadGameInfo(); #ifdef _NA_008016_20150202_OLD_RANKING_SYSTEM m_RankManager.Release(); #endif // _NA_008016_20150202_OLD_RANKING_SYSTEM if (m_pDiscAccess) { if( GENERALPARAM->IsSystemPackFileName() ) { m_pDiscAccess->CloseDisc( ePFN_SYSTEM ); } if( GENERALPARAM->IsUsePackFile() ) { m_pDiscAccess->CloseDisc( ePFN_RESOURCE ); } m_pDiscAccess->Destroy(); SAFE_DELETE(m_pDiscAccess); } PACKER_MANAGER()->Release(); PACKER_MANAGER()->DestroyInstance(); // 效果管理器已禁用 if ( g_pEffectManager) { g_pEffectManager->Destroy(); Func_ContactEffect( CW_DELETE_EFFECT_MANAGER, g_pEffectManager); g_pEffectManager = NULL; } if(g_pPathExplorer) { // 销毁寻路功能 Func_ContactTerrain( CT_DELETE_PATH_EXPLORER, g_pPathExplorer ); g_pPathExplorer = NULL; } // 解锁 SUN 3D 引擎库 DllManager::Instance()->FreeSeDlls(); m_bRunningGame = FALSE; GENERALPARAM->DestroyInstance(); GAMEOPTION->DestroyInstance(); LOGINPARAM->DestroyInstance(); CLIENTINFO->DestroyInstance(); GRAPHICPARAM->DestroyInstance(); PROGRAMPARAM->DestroyInstance(); TIMERPARAM->DestroyInstance(); SAFE_DELETE(g_pNetwork); #ifdef MAKE_TEST_MODULE_MACRO TestModule::Instance()->DestroyInstance(); #endif HotKeyManager::Instance()->DestroyInstance(); ScreenShotSaver::Instance()->DestroyInstance(); //#if defined(_DEBUG) || defined(_GAMECLIENT_VER) //#ifdef _KIKI_AUTOTEST // AutoTestManager::Instance()->CompleteCurTestCase(); // AutoTestManager::Instance()->DestroyInstance(); //#endif //#endif g_pSunRenderer->x_pManagerTexture->DestroyTexture( m_hTextureOnHead ); m_hTextureOnHead = INVALID_HANDLE_VALUE; DelayLoadManager::Instance()->DestroyInstance(); ItemCooltimeManager::Instance()->DestroyInstance(); #ifdef _DEV_VER CustomAssertion::Instance()->DestroyInstance(); #endif PacketRequestManager::Instance()->DestroyInstance(); #ifdef _YMS_AUTOBOT_GAME Autobot::Instance()->DestroyInstance(); AutobotConditionManager::Instance()->DestroyInstance(); AutobotPasspointManager::Instance()->DestroyInstance(); #endif //_YMS_AUTOBOT_GAME KBMoveCheckManagerInClient::Instance()->DestroyInstance(); xGetCooltimeManager()->Release(); delete xGetCooltimeManager(); xGetHeroData()->Release(); delete xGetHeroData(); #if defined(_DEBUG) || defined(_GAMECLIENT_VER) AutoTestManagerEx::DestroyInstance(); #endif // defined(_DEBUG) || defined(_GAMECLIENT_VER) // 关闭SUN引擎框架 CAppLast::Destroy(); } LRESULT Application::WindowProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ) { if (!m_bRunningGame) { return TRUE; } #ifndef _DEV_VER //强制必须登陆器启动 by:十里坡剑神 2021-06-08 HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, _T("173Sun2_RemoteDll")); if (!hMutex) { GlobalFunc::DoSystemDialog(0, 0); return 0; } else { CloseHandle(hMutex); hMutex = NULL; } #endif Mouse::Instance()->MouseMessageProc( hWnd, iMessage, wParam, lParam ); // 接口处理 SI_MESSAGE stMessage; ZeroMemory(&stMessage,sizeof(stMessage)); BOOL bPreCheck = FALSE; BOOL bRet = FALSE; if (GameFramework::GetCurrentScene()) { bPreCheck = GameFramework::GetCurrentScene()->SceneWndProc(hWnd, iMessage, wParam, lParam ,&stMessage); } if ( FALSE == bPreCheck ) { bRet = g_InterfaceManager.InterfaceWndProc( hWnd, iMessage, wParam, lParam ,&stMessage); } #ifdef _YMS_AUTOBOT_GAME Autobot::Instance()->MessageProc(hWnd, iMessage, wParam, lParam); #endif //_YMS_AUTOBOT_GAME // 窗口消息处理 switch( iMessage ) { case WM_NCRBUTTONDOWN: case WM_NCRBUTTONUP: case WM_NCRBUTTONDBLCLK: case WM_NCMBUTTONDOWN: case WM_NCMBUTTONUP: case WM_NCMBUTTONDBLCLK: //case WM_WINDOWPOSCHANGING: //case WM_WINDOWPOSCHANGED: // 当您右键单击标题栏时 return 0; case WM_INITMENUPOPUP: case 0x0313: // 右键单击任务栏时 return 0; case WM_SYSCOMMAND: { // return 0; switch (wParam) { case SC_PREVWINDOW: case SC_NEXTWINDOW: case SC_KEYMENU: return 0; case SC_CLOSE: #if WZENGINEVER >= 380 SCENE_TYPE scene_type = GameFramework::GetCurScene(); if (scene_type == SCENE_TYPE_NONE || scene_type == SCENE_TYPE_MOVIEPLAY || scene_type == SCENE_TYPE_START || scene_type == SCENE_TYPE_CHARSELECT || scene_type == SCENE_TYPE_LOGIN || scene_type == SCENE_TYPE_LOAD) { } else { if (g_InterfaceManager.IsLockDlg() == FALSE) { //! 如果界面未锁定,则显示菜单。. GlobalFunc::DoSystemDialog(0, 0); } } #endif //WZENGINEVER >= 380 return 0; } } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); // TODO: 在此处添加您的绘图代码. EndPaint(hWnd, &ps); return TRUE; } break; //----------------------------------------------------------------------------------- // 鼠标输入 //----------------------------------------------------------------------------------- case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: case WM_MOUSEMOVE: { if ( iMessage != WM_MOUSEMOVE) { _asm nop; } POINT Point; Point.x = (int)LOWORD( lParam ); Point.y = (int)HIWORD( lParam ); Mouse::Instance()->SetPoint(Point); POINT res = Mouse::Instance()->ConvertPoint(Point); g_Input.m_bUIMouseInput = g_InterfaceManager.IsIntersectRect( res ); } break; //----------------------------------------------------------------------------------- // 键盘输入 //----------------------------------------------------------------------------------- case WM_KEYDOWN: { } break; case WM_KEYUP: { } break; case WM_SETCURSOR: { MouseCursor::Instance()->Update(); } return 0; case WM_SETFOCUS: { MouseCursor::Instance()->Update(); m_bFocus = TRUE; ::UpdateWindow(g_hWndMain); } break; case WM_KILLFOCUS: { m_bFocus = FALSE; } break; case WM_ACTIVATE: { switch (wParam) { case WA_INACTIVE: break; } } break; case WM_CANCELMODE: { if ( g_pHero ) { // 移动时停止移动。 保持另一个 if (g_pHero->IsMove() == TRUE) { g_HeroInput.SetAutoRun(FALSE); g_pHero->StopMove(); g_pHero->SendStopMovePacket(); } } } break; case WM_ACTIVATEAPP: { if(wParam == TRUE) { g_Input.Reset(); } else { g_Input.Reset(); } } break; case WM_SYSKEYDOWN: { switch ( wParam ) { case VK_F4: { return 0; } break; case VK_MENU: { return 0; } break; case VK_TAB: { _asm nop; } break; } } break; } // 引擎更新文档说只有在返回 true 时才调用默认的 wndproc. if (bRet) { if( iMessage == WM_KEYDOWN && (int)wParam == VK_RETURN && GetKeyState( VK_CONTROL ) & 0x8000 ) { CGameOption::Instance()->ToggleFullScreenMode(); return 0; } else { return ( CAppLast::WindowProc( hWnd, iMessage, wParam, lParam ) ); } } else { return 0; } } void Application::SendToChatHeartbeatSyn() { MSG_CW_HEARTBEAT m_CW_HeartbeatMsg; GlobalFunc::SendPacket(CI_CHATSERVERIDX, &m_CW_HeartbeatMsg, sizeof(m_CW_HeartbeatMsg)); } int Application::HeartBeat( void ) { //感知核武器黑客工具时,时钟结束 if (g_bExitFlag) { xxWriteSceneLog("Application Exit Code: 3280"); return HBR_EXIT; } #ifndef _GMTOOL_ GameCheckMananger::Instance()->Process(); //增加外挂检测 by:十里坡剑神 2021-06-30 #endif // 网络更新 // LoadScene时不能调用网络更新 // LoadScene不处理数据包。因此,不能拿出包装袋进行挖掘。 // LOAD_SCENE_BLOCK_NETWORK_UPDATE if ( SCENE_TYPE_LOAD != m_GameFramework->GetCurScene()) { if (g_pNetwork && (GENERALPARAM->IsNet() == TRUE)) { g_pNetwork->Update(); } else { ParseVirtualPacket(); } } #ifdef _APPLY_JAPAN_GAMECHU_CHANNELING if ((uiLoginMan::IsUseParameterAuthInfo() == true) && (IsInitWIC() == TRUE)) { web_in_client.CheckCBEvent(); } #endif //_APPLY_JAPAN_GAMECHU_CHANNELING #ifdef _HACKSHIELD_CHECK_TIMER_API_FUNCTION_ if ((DWORD)g_pSunRenderer->x_Clock.GetFuncPerformanceCount() != (DWORD)_AhnHS_QueryPerformanceCounter) { xxWriteSceneLog("Application Exit Code: 3281"); return HBR_EXIT; } else if ((DWORD)g_pSunRenderer->x_Clock.GetFuncPerformanceFrequency() != (DWORD)_AhnHS_QueryPerformanceFrequency) { xxWriteSceneLog("Application Exit Code: 3282"); return HBR_EXIT; } else if ((DWORD)g_pSunRenderer->x_Clock.GetFuncGetTickCount() != (DWORD)_AhnHS_GetTickCount) { xxWriteSceneLog("Application Exit Code: 3283"); return HBR_EXIT; } #endif //_HACKSHIELD_CHECK_TIMER_API_FUNCTION_ DWORD dwTick; g_wFrameSkipping = g_pSunRenderer->x_Clock.CheckFrameSkipping( &dwTick ); this->m_dwCurrentTick = clock_function::GetTickCount(); this->CheckReconnectToWorldServer(); //#if defined(_DEBUG) || defined(_GAMECLIENT_VER) // #ifdef _KIKI_AUTOTEST // if(GENERALPARAM->IsNet() && AutoTestManager::Instance()->IsEnable()) // { // AutoTestManager::Instance()->Run(dwTick); // } // #endif //#endif //------------------------------------------------------------------------- // Animate, 有关计算的东西都要放在这里面。!!!! taiyo //------------------------------------------------------------------------- if( g_wFrameSkipping & CFS_MOVE ) { // 测试代码 ++g_iUpdateFrameCount; SUNPROCESSPROFILE_BEGIN( _T("Process") ); UpdateGlobalVariable(); MouseHandler::Instance()->Update(); // 直接输入状态更新 g_Input.Update( g_Input.m_bUIMouseInput ); #ifdef MAP_EDIT_MODE // no operation #else #ifdef _DEV_VER if (GENERALPARAM->GetSpecialMode()) { ProcessDebugInput(); } #endif #endif g_InterfaceManager.Process(dwTick); g_OptimizationManager.Process(dwTick); ResourceManager::Instance()->Process(dwTick); SUNPROCESSPROFILE_BEGIN(_T("ProessCamera")); g_Camera.Process(dwTick); SUNPROCESSPROFILE_END(_T("ProessCamera")); #ifdef MAKE_TEST_MODULE_MACRO TestModule::Instance()->ProceeInput(dwTick); #endif //MAKE_TEST_MODULE_MACRO #ifdef _YMS_AUTOBOT_GAME if ((g_Input.GetState(MOUSE_LBUTTON, KS_MOUSE_DOWN) == FALSE) && (g_Input.GetState(MOUSE_LBUTTON, KS_MOUSE_KEY) == FALSE) && (g_Input.GetState(MOUSE_LBUTTON, KS_MOUSE_UP) == FALSE) && (g_Input.IsPressAnyKey() == FALSE)) { Autobot::Instance()->Update(dwTick); } #endif //_YMS_AUTOBOT_GAME // 各Scene处理 if( FALSE == m_GameFramework->Update( dwTick ) ) { xxWriteSceneLog("Application Exit Code: 3284"); WRITELOG(eLOG_LEVEL_ERR, c_wOUTPUT_LOG_FILE, _T("HBR_EXIT: 将从引擎中退出,客户端也将同时退出")); assert (!"HBR_EXIT: 将从引擎中退出,客户端也将同时退出"); return HBR_EXIT; } SUNPROCESSPROFILE_BEGIN(_T("InterfaceUpdate")); // 界面更新 g_InterfaceManager.Update(); SUNPROCESSPROFILE_END(_T("InterfaceUpdate")); SUNPROCESSPROFILE_BEGIN( _T("EffectSound") ); ProcessEffectSound(); SUNPROCESSPROFILE_END( _T("EffectSound") ); Sound::Instance()->Update(); SUNPROCESSPROFILE_END( _T("Process") ); } //------------------------------------------------------------------------- // Scene局域网 //------------------------------------------------------------------------- if( g_wFrameSkipping & CFS_RENDER ) { ++g_iRenderFrameCount; SUNPROFILE_BEGIN( _T("Render") ); SUNPROFILE_BEGIN(_T("SetViewport")); m_GameFramework->SetViewport(); SUNPROFILE_END(_T("SetViewport")); // 每帧Render处理 SUNPROFILE_BEGIN(_T("BeginRender")); if( TRUE == g_pSunRenderer->BeginRender() ) { if (g_pSunRenderer->IsReseted()) { m_GameFramework->OnDeviceReset(); } SUNPROFILE_END(_T("BeginRender")); // Scene局域网 m_GameFramework->Render( dwTick ); m_GameFramework->PreInterfaceRender( dwTick ); SUNPROFILE_BEGIN( _T("RenderInterface") ); // 接口局域网 g_InterfaceManager.Render(); // Mouse Item Render MouseHandler::Instance()->Render(); m_GameFramework->PostInterfaceRender( dwTick ); SUNPROFILE_END( _T("RenderInterface") ); #ifdef MAKE_TEST_MODULE_MACRO TestModule::Instance()->TestStatusTextOut(); #endif //MAKE_TEST_MODULE_MACRO #ifdef _DEV_VER _renderPerfInfo(); CustomAssertion::Instance()->RenderAssertMessage(); #endif BOOL b2D,bRealSize; g_pSunRenderer->Check2DMode( &b2D, &bRealSize); if( b2D) { g_pSunRenderer->Set2DMode( FALSE); } g_pSunRenderer->SetAlphaTestMode(0); SUNPROFILE_BEGIN(_T("EndRender")); g_pSunRenderer->EndRender(); SUNPROFILE_END(_T("EndRender")); m_GameFramework->OnEndRendering( dwTick ); } else { SUNPROFILE_END(_T("BeginRender")); } SUNPROFILE_END( _T("Render") ); } #ifdef __NA_0_20080415_PROCESS_END_PROECSS if( g_wFrameSkipping & CFS_MOVE ) { m_GameFramework->OnEndProcess( dwTick ); } #endif //do { ISecureWorkNode* pWorkNode = CryptManager::GetISecureWorkNode(); BYTE* pSendMsg; WORD wSendSize; if( pWorkNode ) { pWorkNode->DoEarlyProcess( pSendMsg, wSendSize ); if( wSendSize ) GlobalFunc::SendPacket( CI_GAMESERVERIDX, pSendMsg, wSendSize ); pWorkNode->DoLatelyProcess( pSendMsg, wSendSize ); if( wSendSize ) GlobalFunc::SendPacket( CI_GAMESERVERIDX, pSendMsg, wSendSize ); } pWorkNode = NULL; pSendMsg = NULL; wSendSize = 0; }// while(0); ISecureWorkNode::Update( dwTick ); #ifdef _NA000000_SPEED_HACK_PREVENTION_SUPPORT { ////! KBMoveCheckManagerInClient::Instance()->CheckLocalTestRequest ////! 因为函数内的edge自己计算tick,所以不特别计算tick。 ////! 调用为间隔(间隔) //MSG_CG_CONNECTION_CLIENT_TICK_TEST_SYN syn; //if (KBMoveCheckManagerInClient::Instance()->CheckLocalTestRequest<1>(&syn) == true) //{ // GlobalFunc::SendPacketToGameServer(&syn, sizeof(syn)); //} } #endif //_NA000000_SPEED_HACK_PREVENTION_SUPPORT return ( 0 ); } void Application::PreloadResource() { #ifdef _DEBUG return; #endif for (int a = 0; a < MAX_PRELOAD_RESOURCE; a++) { l_pPreloadResource[a] = ResourceManager::Instance()->AllocResourceUnitDraw(l_dwPreloadResource[a], -1.0f, false); } TextureTable& rTable = SpecialTexutureInfoParser::Instance()->GetTextrueInfo(); TextureTable::iterator it = rTable.begin(); for(;it!=rTable.end();++it) { Specail_Texture& dest = it->second; dest.hSpecialTexture = g_pSunRenderer->x_pManagerTexture->LoadTexture(dest.szFilename,TLS_ORIGINAL_SIZE | TLS_NO_MULTITHREAD); if (dest.hSpecialTexture != INVALID_HANDLE_VALUE) { g_pSunRenderer->x_pManagerTexture->AddSpecialTexture(dest.m_TextureID,dest.hSpecialTexture); } } } void Application::UnloadPreloadResource() { #ifdef _DEBUG return; #endif for (int a = 0; a < MAX_PRELOAD_RESOURCE; a++) { if (l_pPreloadResource[a]) { ResourceManager::Instance()->FreeResourceUnitDraw(l_pPreloadResource[a]); l_pPreloadResource[a] = NULL; } } TextureTable& rTable = SpecialTexutureInfoParser::Instance()->GetTextrueInfo(); TextureTable::iterator it = rTable.begin(); for(;it!=rTable.end();++it) { Specail_Texture& dest = it->second; if (dest.hSpecialTexture != INVALID_HANDLE_VALUE) { g_pSunRenderer->x_pManagerTexture->RemoveSpecialTexture(dest.m_TextureID); g_pSunRenderer->x_pManagerTexture->DestroyTexture(dest.hSpecialTexture); } } } CDiscAccess * Application::GetDiscAccess() { return m_pDiscAccess; } //------------------------------------------------------------------------------ /** Network recv callback function CI GAMESERVERIDX:从游戏服务器收到的分组 CI CHATSERVERIDX:从聊天服务器收到的分组 CI AUTHSERIDX:从认证服务器收到的包 FIXME:我知道包装是不同的种类,但是区分收到的理由是? */ VOID NetworkRecv( DWORD dwIndex, BYTE * pData, DWORD dwSize ) { //#if _DEV_VER // if(GlobalFunc::IsShowNetRecvLog()) // { // TCHAR szText[1024] = {0,}; // // Sprintf(szText, _T("RECV : Server Idx : %d, Catagory : %d, Protocol : %d, Size: %d\n\r"), // dwIndex, ((MSG_BASE *)pData)->m_byCategory, ((MSG_BASE *)pData)->m_byProtocol, dwSize ); // // OutputDebugString(szText); // } // #ifdef _DEBUG //#ifdef _LTJ_PACKET_SHOW_FOR_DEBUG if ((g_pPacketShow) && GlobalFunc::IsShowPacketLog()) { MSG_BASE* packet = (MSG_BASE*)pData; if( const CHAR* msg_str = g_pPacketShow->fnQuery(packet->m_byCategory, packet->m_byProtocol, NULL) ) { // 不要显示过于频繁的数据包 if( (packet->m_byCategory == CG_SYNC && packet->m_byProtocol == CG_SYNC_COMPOSED_STREAM_CMD ) == false && (packet->m_byCategory == CG_STATUS && packet->m_byProtocol == CG_STATUS_CHANGE_HP_BRD ) == false ) GlobalFunc::Write_Packet_Log("[RECV] %s\n", msg_str); #if (WZENGINEVER >= 480) WZLOG( WZPKT1, msg_str ); #endif } } #endif //_LTJ_PACKET_SHOW_FOR_DEBUG switch( dwIndex ) { // NOTE: f110914.1L, CI_GAMESERVERIDX value same with CI_CHATSERVERIDX //since _NA002676_WORLD_SERVER_RENEWAL case CI_GAMESERVERIDX: //CI_CHATSERVERIDX (_NA002676_WORLD_SERVER_RENEWAL) { g_pApplication->m_GameFramework->ParsePacket( (MSG_BASE * )pData ); } break; #if !defined(_NA002676_WORLD_SERVER_RENEWAL) case CI_CHATSERVERIDX: { g_pApplication->m_GameFramework->ParsePacketInChat( (MSG_BASE *)pData ); } break; #endif case CI_AUTHSERVERIDX: { g_pApplication->m_GameFramework->ParsePacket ((MSG_BASE*)pData); } break; } } void CallBackLogOutChoice( bool b ) { if( b ) { GlobalFunc::GoToServerList(); } else { GlobalFunc::LogOutGame(); } } VOID NetworkDisconnect( DWORD dwIndex ) { TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; switch( dwIndex ) { case CI_GAMESERVERIDX: if (g_isChangeServer == false) { g_InterfaceManager.GetInterfaceString( eST_GAMESERVER_DISCONNECT_MSG, szMessage, INTERFACE_STRING_LENGTH ); #ifdef _COMMON_CHANNELING_LOGIC_DEFINE GlobalFunc::SysMessageBox(szMessage, TRUE); #else #ifdef _JAPAN_GAMECHU_SUPPORT_DOUBLE_AUTH_FLOW_ if (uiLoginMan::IsUseParameterAuthInfo() == true) { GlobalFunc::SysMessageBox(szMessage, TRUE); } else #endif _JAPAN_GAMECHU_SUPPORT_DOUBLE_AUTH_FLOW_ { GlobalFunc::SysConfirmBox( szMessage, CallBackLogOutChoice, NULL, NULL, 99, 3, true ); } #endif //_COMMON_CHANNELING_LOGIC_DEFINE WRITELOG(eLOG_LEVEL_ERR, c_wOUTPUT_LOG_FILE, _T("NetworkDisconnect Callback - GameServer")); } #ifdef __NA001334_090420_SERVER_SELECT_FACILITY__ else { if (g_pNetwork) { g_pNetwork->SetEnableSendChatHeartBeat(FALSE); g_pNetwork->SetEnableSendHeartBeat(FALSE); } g_LoadScene.SetNextSceneAfterLoaded(SCENE_TYPE_LOGIN, 11001, 0); GameFramework::ChangeScene( SCENE_TYPE_LOAD ); uiPartyMan* partyMan = GET_DIALOG_MANAGER( uiPartyMan, UIMAN_PARTY); if(partyMan && partyMan->IsParty()) { partyMan->DestroyParty(); } } #endif //__NA001334_090420_SERVER_SELECT_FACILITY__ break; #if !defined(_NA002676_WORLD_SERVER_RENEWAL) case CI_CHATSERVERIDX: { // 初始化世界服务器协议加密信息 if (g_pNetwork) { g_pNetwork->InitCryptographyInfo( CI_CHATSERVERIDX ); } // 服务器重新连接 if (g_isChangeServer == false) { g_pApplication->OnReconnectToWorldServer(); } } break; #endif case CI_AUTHSERVERIDX: { uiLoginMan* loginMan = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_LOGIN)); if (loginMan && g_pNetwork && (g_pNetwork->IsRqstDisconnectAuth() == FALSE)) { loginMan->SetTryReconnect(); } } break; } } VOID NetworkError( char * pszMsg ) { #if defined _DEV_VER && !defined _DEBUG FILE * fp = fopen( "networkErrorMsg.txt", "a+t" ); if( fp ) { fwrite( pszMsg, strlen(pszMsg), 1, fp ); fclose( fp ); } #endif } void Application::AddVirtualPacket(DWORD dwServerIndex,BYTE *pPacket,int iSize) { VIRTUAL_PACKET *pVirtualPacket = new VIRTUAL_PACKET; pVirtualPacket->dwServerIndex = dwServerIndex; memcpy(pVirtualPacket->byData,pPacket,iSize); m_RecvVirtualPacket.push_back(pVirtualPacket); } void Application::ParseVirtualPacket() { m_VirtualPacket.clear(); std::copy(m_RecvVirtualPacket.begin(),m_RecvVirtualPacket.end(),std::back_insert_iterator< std::vector >(m_VirtualPacket)); m_RecvVirtualPacket.clear(); vector::iterator iter = m_VirtualPacket.begin(); while (iter != m_VirtualPacket.end()) { VIRTUAL_PACKET *pVirtualPacket = *iter; NetworkRecv(pVirtualPacket->dwServerIndex,pVirtualPacket->byData, 0); delete pVirtualPacket; iter++; }; m_VirtualPacket.clear(); } void Application::InitializeVirtualPacket() { vector::iterator iter = m_VirtualPacket.begin(); while (iter != m_VirtualPacket.end()) { VIRTUAL_PACKET *pVirtualPacket = *iter; delete pVirtualPacket; iter++; }; m_VirtualPacket.clear(); } void Application::ReleaseManager() { TextureListInfoHandleManager::Instance()->RemoveAll(); TextureListInfoHandleManager::Instance()->DestroyInstance(); APPEARANCEMGR->DestroyInstance(); ICONMGR()->Destroy(); ICONMGR()->DestroyInstance(); MAPRESMGR()->Destory(); MAPRESMGR()->DestroyInstance(); } #ifdef _NA_005039_20120703_ENABLE_MULTI_CLIENT_COUNT #else //_NA_005039_20120703_ENABLE_MULTI_CLIENT_COUNT BOOL Application::CheckOverlapExecute() { m_hSemaphore = CreateSemaphore(NULL, 0, 1, _T("SUN_GAME") ); if ( m_hSemaphore != NULL && GetLastError() & ERROR_ALREADY_EXISTS ) { CloseHandle( m_hSemaphore ); m_hSemaphore = NULL; return FALSE; } else { return TRUE; } } #endif //_NA_005039_20120703_ENABLE_MULTI_CLIENT_COUNT void Application::ProcessEffectSound() { if (g_pEffectManager) { CSoundInfoManager* pSndMan = g_pEffectManager->GetSoundInfoManager(); SUN_ASSERT(pSndMan); if (!pSndMan) { return; } while (!pSndMan->IsEmpty()) { St_SoundInfo* pSound = pSndMan->Pop(); if (pSound) { switch (pSound->m_eSMassage) { case ENUM_START_EVENT: { #if !defined(_DEBUG) // 在调试中玩这个试试吧. if (2550 != pSound->m_nSoundID) #endif { pSound->m_nResultHandle = g_SoundEffect.Play(pSound->m_nSoundID,&pSound->m_wvPos); } } break; case ENUM_STOP_EVENT: { wzsnd_stop(pSound->m_nResultHandle); } break; case ENUM_UPDATE_POS_EVENT: { D3DVECTOR VecPos, VecVeclocity; VecPos.x = pSound->m_wvPos.x; VecPos.y = pSound->m_wvPos.z; VecPos.z = pSound->m_wvPos.y; VecVeclocity.x = 0.0f; VecVeclocity.y = 0.0f; VecVeclocity.z = 0.0f; wzsnd_update_3d_source( pSound->m_nResultHandle, &VecPos, &VecVeclocity ); } break; } } } } } void Application::CreateConsole() { #ifdef _DEBUG AllocConsole(); DWORD fdwMode, fdwSaveOldMode; m_hConsole = GetStdHandle(STD_INPUT_HANDLE); if (m_hConsole != INVALID_HANDLE_VALUE) { if (! GetConsoleMode(m_hConsole, &fdwSaveOldMode) ) { fdwMode = ENABLE_WINDOW_INPUT; SetConsoleMode(m_hConsole, fdwMode); } } #endif } void Application::ProcessConsole() { DWORD cNumRead, i; INPUT_RECORD irInBuf[128]; if (m_hConsole == INVALID_HANDLE_VALUE) { return; } if (ReadConsoleInput(m_hConsole,irInBuf,128, &cNumRead) ) { _cprintf("%d\n",cNumRead); for (i = 0; i < cNumRead; i++) { switch(irInBuf[i].EventType) { case KEY_EVENT: // keyboard input __asm nop; break; case MOUSE_EVENT: // mouse input break; case WINDOW_BUFFER_SIZE_EVENT: break; case FOCUS_EVENT: // disregard focus events case MENU_EVENT: // disregard menu events break; default: break; } } } } void Application::_renderPerformanceStatus() { #ifdef _DEV_VER if (!g_pSunRenderer) { return; } g_pSunRenderer->x_pManagerTextOut->StartToUseFont( "mi16" ); LARGE_INTEGER Freq; QueryPerformanceFrequency(&Freq); int y = 50; int x = 600; // FPS DWORD dwTick; DWORD dwTicks2; DWORD dwTick3; LONG lCount, lPpsCount, lDcpsCount; g_pSunRenderer->GetFpsValues( &dwTick, &lCount ); g_pSunRenderer->GetPpsValues( &dwTicks2, &lPpsCount); g_pSunRenderer->GetDcpsValues( &dwTick3, &lDcpsCount); TCHAR lpszText[512] = {0,}; Snprintf( lpszText, 512-1, _T("%ld(M) Availabletexmem"),g_pSunRenderer->GetAvailableTextureMem() / (1024*1024)); g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) ); y += 20; Snprintf( lpszText, 512-1, _T("%ld(M) UsedTextureMem"),g_pSunRenderer->GetUsedTextureMem() / (1024*1024)); g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) ); y += 20; float fUsedMem=( float)g_pSunRenderer->GetUsedTextureMem() / 1024.0f; float fRemainMem=( float)g_pSunRenderer->GetAvailableTextureMem()/ 1024.0f; float fTotalMem= fRemainMem+fUsedMem; float fPercent=(fUsedMem/fTotalMem)*100.0f; TCHAR string[INTERFACE_STRING_LENGTH]; // 总内存:%d%:%d6301 g_InterfaceManager.GetInterfaceString( 6301, string, INTERFACE_STRING_LENGTH ); Snprintf( lpszText, 512-1, string, (DWORD)fTotalMem/(1024*1024),(DWORD)fPercent ); g_pSunRenderer->x_pManagerTextOut->DrawText( lpszText, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) ); if(fTotalMem<=300000.0f) { y += 20; // 视频内存128MB 6302 g_InterfaceManager.GetInterfaceString( 6302, string, INTERFACE_STRING_LENGTH ); g_pSunRenderer->x_pManagerTextOut->DrawText( string, x, y, WzColor_RGB( 0x0F, 255, 0x0f ) ); } g_pSunRenderer->x_pManagerTextOut->EndUseFont(); #endif } void Application::_renderProfile() { #ifdef _DEV_VER if (!g_pSunRenderer) { return; } g_pSunRenderer->x_pManagerTextOut->StartToUseFont( "mi16" ); g_Profiler.GenerateResult(); // 剖面结果 for ( int i = 0; i < g_Profiler.GetNumSample(); ++i) { if(0 == m_iProfile[i]) { g_Profiler.GetResultText( i, m_szProfile[i]); } int iDepth = g_Profiler.GetDepth(i); g_pSunRenderer->x_pManagerTextOut->DrawText( m_szProfile[i], 600 + 20 * iDepth, 50 + i * 20, WzColor_RGB( 0x0F, 255, 0x0f )); if(5 < m_iProfile[i]) m_iProfile[i] = 0; else m_iProfile[i]++; } g_pSunRenderer->x_pManagerTextOut->EndUseFont(); #endif } void Application::_renderProcessProfile() { #ifdef _DEV_VER if (!g_pSunRenderer) { return; } g_pSunRenderer->x_pManagerTextOut->StartToUseFont( "mi16" ); g_ProcessProfiler.GenerateResult(); // 剖面结果 for ( int i = 0; i < g_ProcessProfiler.GetNumSample(); ++i) { if(0 == m_iProfile[i]) { g_ProcessProfiler.GetResultText( i, m_szProfile[i]); } int iDepth = g_ProcessProfiler.GetDepth(i); g_pSunRenderer->x_pManagerTextOut->DrawText( m_szProfile[i], 600 + 20 * iDepth, 50 + i * 20, WzColor_RGB( 0x0F, 255, 0x0f )); if(5 < m_iProfile[i]) m_iProfile[i] = 0; else m_iProfile[i]++; } g_pSunRenderer->x_pManagerTextOut->EndUseFont(); #endif } void Application::_renderPerfInfo() { if (GENERALPARAM->GetSpecialMode() >= eSPECIAL_MODE_STEP2) { switch(m_iDebugInfo) { case 1: _renderPerformanceStatus(); break; case 2: _renderProfile(); break; case 3: _renderProcessProfile(); break; } return; } } //------------------------------------------------------------------------------ POINT Application::Get2DModeMapping( void ) { POINT pt; #if WZENGINEVER >= 620 pt.x = g_pSunRenderer->Get2DModeWidth(); pt.y = g_pSunRenderer->Get2DModeHeight(); #else // WZENGINEVER >= 620 if (screen_ratio() == SR_4_3) { pt.x = static_cast(STD_2D_WIDTH); pt.y = static_cast(STD_2D_HEIGHT); } else if (screen_ratio() == SR_16_9) { pt.x = static_cast(STD_2D_WIDTH_WIDE); pt.y = static_cast(STD_2D_HEIGHT_WIDE); } else //if (screen_ratio() == SR_16_10) { pt.x = static_cast(STD_2D_WIDTH_HALF_WIDE); pt.y = static_cast(STD_2D_HEIGHT_HALF_WIDE); } #endif // WZENGINEVER >= 620 return pt; } void Application::OnChangeRes(POINT *newsize) { POINT pt = Get2DModeMapping(); m_ScreenSize.x = newsize->x; m_ScreenSize.y = newsize->y; float fWidth = pt.x / (float)m_ScreenSize.x; float fHeight = pt.y / (float)m_ScreenSize.y; Mouse::Instance()->SetScreenRes( fWidth, fHeight ); } //------------------------------------------------------------------------------ /** 如果从世界服务器断开,则在c iRECONNECTINVERVAL后尝试重新连接. */ void Application::OnReconnectToWorldServer() { if (this->m_bCheckToWorldServerReconnect) return; if (g_pNetwork && (g_pNetwork->IsConnected(CI_GAMESERVERIDX) == FALSE)) { return; } #if !defined(_NA002676_WORLD_SERVER_RENEWAL) if (g_pNetwork && (g_pNetwork->IsConnected(CI_CHATSERVERIDX) == TRUE)) { return; } this->m_iTryCountToWroldServerReconnect = 0; if (g_pNetwork) { g_pNetwork->SetEnableSendChatHeartBeat(FALSE); } this->m_bCheckToWorldServerReconnect = true; this->m_dwStartTickToWorldServerReconnect = this->m_dwCurrentTick; this->m_dwOverTickToWorldServerReconnect = this->m_dwStartTickToWorldServerReconnect + GENERALPARAM->GetIntervalToWorldServerReconnect(); #endif } //------------------------------------------------------------------------------ /** */ void Application::OffReconnectToWorldServer() { this->m_bCheckToWorldServerReconnect = false; } //------------------------------------------------------------------------------ /** */ void Application::CheckReconnectToWorldServer() { if (!this->m_bCheckToWorldServerReconnect) { return; } if (g_CharSelectScene.m_bConnected == false) { return; } if (g_pNetwork && (g_pNetwork->IsConnected(CI_GAMESERVERIDX) == FALSE)) { return; } #if !defined(_NA002676_WORLD_SERVER_RENEWAL) if (g_pNetwork && (g_pNetwork->IsConnected(CI_CHATSERVERIDX) == TRUE)) { this->OffReconnectToWorldServer(); return; } if (this->m_dwCurrentTick >= this->m_dwOverTickToWorldServerReconnect) { this->m_dwStartTickToWorldServerReconnect = this->m_dwCurrentTick; this->m_dwOverTickToWorldServerReconnect = this->m_dwStartTickToWorldServerReconnect + GENERALPARAM->GetIntervalToWorldServerReconnect(); MSG_CG_PREPARE_WORLD_CONNECT_SYN SendPacket; GlobalFunc::SendPacket(CI_GAMESERVERIDX, &SendPacket, sizeof(SendPacket) ); this->m_iTryCountToWroldServerReconnect++; } #endif } //------------------------------------------------------------------------------ /** */ void Application::ForceReconnectToWorldServer() { #if !defined(_NA002676_WORLD_SERVER_RENEWAL) if (g_pNetwork) { g_pNetwork->Disconnect(CI_CHATSERVERIDX,TRUE); } #endif } //------------------------------------------------------------------------------ /** */ void Application::ProcessDebugInput() { #ifdef _DEV_VER if (g_Input.GetState(DIK_F3, KS_DOWN)) { m_iDebugInfo++; if (m_iDebugInfo >= 4) { m_iDebugInfo = 0; } } if (g_Input.GetState(DIK_F4, KS_DOWN)) { CustomAssertion::Instance()->ToggleAssertMssage(); } #ifdef _NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_TEMP #ifdef _NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT float pitch = 0.0f; if (is_slow_) { pitch = 0.001f; } else { pitch = 0.01f; } if (g_Input.GetState(DIK_F6, KS_DOWN)) { is_slow_ = !is_slow_; } //else if ((!is_slow_ && g_Input.GetState(DIK_HOME, KS_KEY)) || // (is_slow_ && g_Input.GetState(DIK_HOME, KS_DOWN))) //{ // g_CharSelectScene.m_camera.y += pitch; // g_CharSelectScene.m_target.y += pitch; //} //else if ((!is_slow_ && g_Input.GetState(DIK_END, KS_KEY)) || // (is_slow_ && g_Input.GetState(DIK_END, KS_DOWN))) //{ // g_CharSelectScene.m_camera.y -= pitch; // g_CharSelectScene.m_target.y -= pitch; //} //else if ((!is_slow_ && g_Input.GetState(DIK_NEXT, KS_KEY)) || // (is_slow_ && g_Input.GetState(DIK_NEXT, KS_DOWN))) //{ // g_CharSelectScene.m_camera.x += pitch; // g_CharSelectScene.m_target.x += pitch; //} //else if ((!is_slow_ && g_Input.GetState(DIK_DELETE, KS_KEY)) || // (is_slow_ && g_Input.GetState(DIK_DELETE, KS_DOWN))) //{ // g_CharSelectScene.m_camera.x -= pitch; // g_CharSelectScene.m_target.x -= pitch; //} //else if ((!is_slow_ && g_Input.GetState(DIK_PRIOR, KS_KEY)) || // (is_slow_ && g_Input.GetState(DIK_PRIOR, KS_DOWN))) //{ // g_CharSelectScene.m_camera.z += pitch; // g_CharSelectScene.m_target.z += pitch; //} //else if ((!is_slow_ && g_Input.GetState(DIK_INSERT, KS_KEY)) || // (is_slow_ && g_Input.GetState(DIK_INSERT, KS_DOWN))) //{ // g_CharSelectScene.m_camera.z -= pitch; // g_CharSelectScene.m_target.z -= pitch; //} //else if ((!is_slow_ && g_Input.GetState(DIK_W, KS_KEY)) || // (is_slow_ && g_Input.GetState(DIK_W, KS_DOWN))) //{ // g_CharSelectScene.m_character.y += pitch; //} //else if ((!is_slow_ && g_Input.GetState(DIK_S, KS_KEY)) || // (is_slow_ && g_Input.GetState(DIK_S, KS_DOWN))) //{ // g_CharSelectScene.m_character.y -= pitch; //} //else if ((!is_slow_ && g_Input.GetState(DIK_D, KS_KEY)) || // (is_slow_ && g_Input.GetState(DIK_D, KS_DOWN))) //{ // g_CharSelectScene.m_character.x += pitch; //} //else if ((!is_slow_ && g_Input.GetState(DIK_A, KS_KEY)) || // (is_slow_ && g_Input.GetState(DIK_A, KS_DOWN))) //{ // g_CharSelectScene.m_character.x -= pitch; //} //else if ((!is_slow_ && g_Input.GetState(DIK_Q, KS_KEY)) || // (is_slow_ && g_Input.GetState(DIK_Q, KS_DOWN))) //{ // g_CharSelectScene.m_character.z += pitch; //} //else if ((!is_slow_ && g_Input.GetState(DIK_Z, KS_KEY)) || // (is_slow_ && g_Input.GetState(DIK_Z, KS_DOWN))) //{ // g_CharSelectScene.m_character.z -= pitch; //} //else if ((!is_slow_ && g_Input.GetState(DIK_NUMPAD8, KS_KEY)) || // (is_slow_ && g_Input.GetState(DIK_NUMPAD8, KS_DOWN))) //{ // g_CharSelectScene.m_target.y += pitch; //} //else if ((!is_slow_ && g_Input.GetState(DIK_NUMPAD2, KS_KEY)) || // (is_slow_ && g_Input.GetState(DIK_NUMPAD2, KS_DOWN))) //{ // g_CharSelectScene.m_target.y -= pitch; //} //else if ((!is_slow_ && g_Input.GetState(DIK_NUMPAD6, KS_KEY)) || // (is_slow_ && g_Input.GetState(DIK_NUMPAD6, KS_DOWN))) //{ // g_CharSelectScene.m_target.x += pitch; //} //else if ((!is_slow_ && g_Input.GetState(DIK_NUMPAD4, KS_KEY)) || // (is_slow_ && g_Input.GetState(DIK_NUMPAD4, KS_DOWN))) //{ // g_CharSelectScene.m_target.x -= pitch; //} //else if ((!is_slow_ && g_Input.GetState(DIK_NUMPAD9, KS_KEY)) || // (is_slow_ && g_Input.GetState(DIK_HOME, KS_DOWN))) //{ // g_CharSelectScene.m_target.z += pitch; //} //else if ((!is_slow_ && g_Input.GetState(DIK_NUMPAD3, KS_KEY)) || // (is_slow_ && g_Input.GetState(DIK_NUMPAD3, KS_DOWN))) //{ // g_CharSelectScene.m_target.z -= pitch; //} #endif //_NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_CLIENT #endif //_NA_005003_20120612_NEW_CHARACTER_MYSTIC_FOR_TEMP #ifdef _DEBUG if (g_Input.GetState(DIK_PAUSE, KS_DOWN)) { GlobalFunc::TogglePacketLog(); } #endif #endif } void Application::UpdateGlobalVariable() { g_fSpecularVariation = 1.0f + sin(g_CurTime * 0.003f); } void Application::Set2DMode(BOOL bFlag) { g_pSunRenderer->Set2DMode(bFlag); } //------------------------------------------------------------------------------ BOOL Application::IsWideModeFlag() { return (screen_ratio() != SR_4_3); } //------------------------------------------------------------------------------ ENUM_SCREEN_RATIO Application::screen_ratio() { //!< SR_4_3 : 0.75f : 1.3333333333333333333333333333333f //!< SR_16_10 : 0.625f : 1.6f //!< SR_16_9 : 0.5625f : 1.7777777777777777777777777777778f if (g_pSunRenderer->GetCameraInfo()->m_fAspect <= 1.4f) { return SR_4_3; } else if (g_pSunRenderer->GetCameraInfo()->m_fAspect <= 1.65f) { return SR_16_10; } return SR_16_9; } #ifdef GGUO_CRASH_DUMP #ifdef _DH_DEBUG_REPORT typedef BOOL (WINAPI * fnMINIDUMPWRITEDUMP)( HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType, CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam ); MINIDUMP_TYPE Application::s_eDumpType = MiniDumpNormal; TCHAR Application::s_pszDumpFileDir[] = {0,}; TCHAR Application::s_pszFilePrefix[] = {0,}; TCHAR Application::s_pszBuildVersion[] = _T("0000"); TCHAR szFile1[256], szFile2[256], szFile3[256], szFile4[256], szFile5[256],szFile6[256]; char szDumpPath[MAX_PATH*2] = {0,}; char szDumpIamgePath[MAX_PATH*2] = {0,}; TCHAR crash_message[3][1024] = {0,}; static _EXCEPTION_POINTERS* exception_info_ptr = NULL; _TCHAR version_string[64] = {0,}; _TCHAR* GetVersion(_TCHAR* filename) { _TCHAR* string_buffer; const int kVersion_Depth = 15; //strlen("120104_0410.dmp") string_buffer = _tcsstr(_tcslwr(filename), "sungame_"); if (string_buffer) { int string_length = _tcslen(string_buffer); if (string_length - kVersion_Depth >= 0) { _TCHAR* string_pointer = string_buffer + (string_length - kVersion_Depth); sprintf(version_string, "webzen@%d", _tstoi(string_pointer)); return version_string; } //::MessageBox(NULL, _T(version_string), _T("Message"), MB_OK); //printf(version_string); /*printf("Version (%s)\n", version_string);*/ } sprintf(version_string, "webzen@version"); return version_string; } static INT CreateMiniDump( struct _EXCEPTION_POINTERS * pExceptionInfo ) { LONG rt = EXCEPTION_CONTINUE_SEARCH; if (exception_info_ptr == NULL) { return rt; } // 从当前路径加载dll const TCHAR* dbghelp_name = _T("dbghelp.dll"); HANDLE hDLL = ::LoadLibrary(dbghelp_name); if( NULL == hDLL ) { assert(!"DBGHELP.DLL无法加载." ); return rt; } fnMINIDUMPWRITEDUMP pfnMiniDumpWriteDump = (fnMINIDUMPWRITEDUMP)GetProcAddress( (HMODULE)hDLL, "MiniDumpWriteDump" ); if( NULL == pfnMiniDumpWriteDump ) { assert(!"旧版本的DBGHELP.DLL。请更新到最新版本." ); return rt; } HANDLE hFile = CreateFile( szDumpPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); if( INVALID_HANDLE_VALUE == hFile ) { assert(!"[dump]无法打开文件."); return rt; } MINIDUMP_EXCEPTION_INFORMATION eInfo; eInfo.ThreadId = GetCurrentThreadId(); eInfo.ExceptionPointers = pExceptionInfo; eInfo.ClientPointers = FALSE; MINIDUMP_TYPE dump_type = MiniDumpNormal; if (GENERALPARAM->GetSendDumpType() == 1) { dump_type = MiniDumpWithDataSegs; } BOOL bResult = pfnMiniDumpWriteDump( GetCurrentProcess(), GetCurrentProcessId(), hFile, dump_type, (pExceptionInfo?&eInfo:NULL), NULL, NULL); if( !bResult ) { assert(!"MiniDumpWriteDump() 调用失败." ); CloseHandle(hFile); return ( rt = EXCEPTION_EXECUTE_HANDLER ); } FlushFileBuffers(hFile); CloseHandle(hFile); hFile = CreateFile(szDumpPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if( INVALID_HANDLE_VALUE == hFile) { assert(!"[dump]无法打开文件."); return rt; } DWORD file_size = 0; DWORD read_size = 0; DWORD write_size = 0; file_size = GetFileSize(hFile, NULL); char* buffer = new char[file_size]; SetFilePointer(hFile, 0, NULL, FILE_BEGIN); ReadFile(hFile, buffer, file_size, &read_size, NULL); FlushFileBuffers(hFile); CloseHandle(hFile); TCHAR pass_key[64] = "webzen@version";//使用这样的文件名 sprintf(pass_key, GetVersion(szDumpPath)); MD5Encrypt* md5 = new MD5Encrypt(); md5->EncryptString(pass_key, buffer, (unsigned int)file_size); if (md5 != NULL) { delete md5; md5 = NULL; } hFile = CreateFile(szDumpPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); SetFilePointer(hFile, 0, NULL, FILE_BEGIN); if( INVALID_HANDLE_VALUE == hFile) { assert(!"[dump]无法打开文件."); if (buffer != NULL) { delete [] buffer; } return rt; } WriteFile(hFile, buffer, file_size, &write_size, NULL); CloseHandle(hFile); //CloseHandle(hMD5File); if (buffer != NULL) { delete [] buffer; } return rt; } static INT CreateFullDump( struct _EXCEPTION_POINTERS * pExceptionInfo ) { LONG rt = EXCEPTION_CONTINUE_SEARCH; if (pExceptionInfo == NULL) { return rt; } // 从当前路径加载dll const TCHAR* dbghelp_name = _T("dbghelp.dll"); HANDLE hDLL = ::LoadLibrary(dbghelp_name); if( NULL == hDLL ) { assert(!"DBGHELP.DLL无法加载." ); return rt; } fnMINIDUMPWRITEDUMP pfnMiniDumpWriteDump = (fnMINIDUMPWRITEDUMP)GetProcAddress( (HMODULE)hDLL, "MiniDumpWriteDump" ); if( NULL == pfnMiniDumpWriteDump ) { assert(!"旧版本的DBGHELP.DLL。请更新到最新版本." ); return rt; } TCHAR file_prefix[MAX_PATH] = {0,}; TCHAR file_name[MAX_PATH] = {0,}; GetModuleFileName(NULL, file_name, MAX_PATH); TCHAR* slash = strrchr(file_name, '\\'); TCHAR* dot = strrchr(slash+1, '.'); lstrcpyn(file_prefix, slash+1, (int)(dot - slash)); TCHAR build_version[MAX_PATH] = _T("0000"); lstrcpyn(build_version, c_tcBUILD_VERSION, MAX_PATH); struct tm* today; time_t ltime; time(<ime); today = localtime(<ime); char dump_path[MAX_PATH*2]; wsprintf(dump_path, ".\\%s%02d-%02d-%02d=%02dh%02dm%02ds_%s.dmp", file_prefix, today->tm_year+1900, today->tm_mon+1, today->tm_mday, today->tm_hour, today->tm_min, today->tm_sec, build_version); if( FILE* fp = fopen("naklutest.txt","a+") ) { fprintf(fp,"%s\n",dump_path); fclose(fp); } HANDLE hFile = CreateFile( dump_path, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); if( INVALID_HANDLE_VALUE == hFile ) { assert(!"[dump]无法打开文件."); return rt; } MINIDUMP_EXCEPTION_INFORMATION eInfo; eInfo.ThreadId = GetCurrentThreadId(); eInfo.ExceptionPointers = pExceptionInfo; eInfo.ClientPointers = FALSE; BOOL bResult = pfnMiniDumpWriteDump( GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpWithFullMemory, (pExceptionInfo?&eInfo:NULL), NULL, NULL); if( !bResult ) { assert(!"MiniDumpWriteDump() 调用失败." ); CloseHandle(hFile); return ( rt = EXCEPTION_EXECUTE_HANDLER ); } FlushFileBuffers(hFile); CloseHandle(hFile); return rt; } DWORD crash_report_strings[3] = { IDS_REPORT_STRING_FOREIGN, 0, 0 }; BOOL WINAPI CrashCallbackBefore() { #ifdef _KOREA crash_report_strings[0] = IDS_REPORT_STRING_KOR; LoadString( NULL, crash_report_strings[0], crash_message[0], 1024 ); #elif defined(_JAPAN) //crash_report_strings[0] = IDS_REPORT_STRING_JP; //LoadString( NULL, crash_report_strings[0], crash_message[0], 1024 ); //修改日本多字节被打破,强制输入并输出到滑雪代码 //5641 const char japan_text[] = {83,111,117,108,32,111,102,32,116,104,101,32,85,108,116,105,109,97,116,101, 32,78,97,116,105,111,110,-126,-55,-106,-30,-111,-24,-126,-86,-108,-83,-112,-74,-126,-75,-127, 65,-125,118,-125,-115,-125,79,-125,-119,-125,-128,-126,-16,-113,73,-105,-71,-126,-75,-126,-36, -126,-73,-127,66,13,10,-126,-78,-106,-64,-104,102,-126,-16,-126,-88,-126,-87,-126,-81, -126,-75,-112,-67,-126,-55,-112,92,-126,-75,-106,-13,-126,-96,-126,-24,-126,-36,-126,-71,-126, -15,-127,66,13,10,13,10,-125,71,-125,-119,-127,91,-126,-16,-111,-105,-112,77, -126,-73,-126,-23,-126,-58,-106,-30,-111,-24,-119,-16,-116,-120,-126,-55,-106,-16,-105,-89, -126,-65,-126,-36,-126,-73,-127,66,13,10,-125,71,-125,-119,-127,91,-126,-16,-111, -105,-112,77,-126,-75,-126,-36,-126,-73,-126,-87,-127,66,0}; sprintf(crash_message[0], japan_text); /*5642 -125,71,-125,-119,-127,91,-126,-52,-111,-105,-112,77,-112,-67,-126,-55,-126,-96,-126,-24,-126,-86,-126,-58,-126,-92,-126,-78,-126,-76,-126,-94,-126,-36,-126,-73,-127,66,92,114,92,110,-111,-127,-126,-94,-119,-16,-116,-120,-126,-52,-126,-67,-126,-33,-126,-55,-115,-59,-111,80,-126,-16,-112,115,-126,-83,-126,-75,-126,-36,-126,-73,-127,66,92,114,92,110,92,114,92,110,60,83,111,117,108,32,111,102,32,116,104,101,32,85,108,116,105,109,97,116,101,32,78,97,116,105,111,110,62, */ /*5643 -125,71,-125,-119,-127,91,-126,-86,-108,-83,-112,-74,-126,-75,-126,-67,-113,-13,-117,-75,-126,-55,-126,-62,-126,-94,-126,-60,-113,-38,-126,-75,-126,-94,-109,-32,-105,101,-126,-16,-113,-111,-126,-94,-126,-60,-126,-83,-126,-66,-126,-77,-126,-94,-127,66,92,114,92,110,-113,-38,-115,-41,-126,-56,-109,-32,-105,101,-126,-16,-113,-111,-126,-94,-126,-60,-126,-94,-126,-67,-126,-66,-126,-81,-126,-23,-126,-58,-111,-127,-126,-94,-119,-16,-116,-120,-126,-55,-116,113,-126,-86,-126,-24,-126,-36,-126,-73,-127,66, */ #else crash_report_strings[0] = IDS_REPORT_STRING_FOREIGN; LoadString( NULL, crash_report_strings[0], crash_message[0], 1024 ); #endif int result = ::MessageBox(NULL, _T(crash_message[0]), _T("Sungame.exe"), MB_YESNO|MB_ICONERROR); #ifdef _CREATE_DUMP_ if (result == IDYES) { //CreateMiniDump(exception_info_ptr); //::MessageBox(NULL, _T(crash_message[1]), _T("Message"), MB_OK); Crash::AddFile(szFile1); Crash::AddFile(szFile2); Crash::AddFile(szFile3); Crash::AddFile(szFile4); Crash::AddFile(szFile5); Crash::AddFile(szFile6); } #endif return TRUE; } BOOL WINAPI CrashCallbackAfter() { //::MessageBox(NULL, _T("After handle exception"), _T("Message"), MB_OK); //删除生成的文件 //remove(szDumpPath); return TRUE; } typedef union _BYTES { DWORD dowrd; BYTE bytes[4]; }DWORD_TO_BYTES; LONG WINAPI Application::ExceptionFilter( struct _EXCEPTION_POINTERS * pExceptionInfo ) { LONG rt = EXCEPTION_CONTINUE_SEARCH; // 通过version.ini设置是否生成完整的转储 TCHAR ini_file_path[MAX_PATH] = {0, }; TCHAR string_value[MAX_PATH] = {0, }; GetCurrentDirectory(MAX_PATH, ini_file_path); _tcscat(ini_file_path, _T("\\version.ini")); GetPrivateProfileString("DUMPTYPE", "DUMP_TYPE", "none", string_value, MAX_PATH, ini_file_path); if (_tcscmp(string_value, _T("MAKE_FULL_DUMP")) == 0) { CreateFullDump(pExceptionInfo); return 1; } exception_info_ptr = pExceptionInfo; // 创建临时文件夹地址 ================================= LPSTR path_string_ptr; TCHAR string[1024] = {0,}; DWORD_TO_BYTES data[2]; DWORD string_address = (DWORD)(void*)string; data[0].dowrd = string_address; string_address = (DWORD)(void*)exception_info_ptr; data[1].dowrd = string_address; path_string_ptr = string; GetTempPath(1024, path_string_ptr); Snprintf(s_pszDumpFileDir, MAX_PATH-1, "%s{%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X}\\", path_string_ptr, data[0].bytes[0], data[1].bytes[0], data[0].bytes[1], data[1].bytes[1], data[0].bytes[2], data[1].bytes[2], data[0].bytes[3], data[1].bytes[3]); //======================================================== //lstrcpyn(s_pszDumpFileDir, "%s", MAX_PATH); //lstrcpyn(s_pszDumpFileDir, ".", MAX_PATH); TCHAR szFilename[MAX_PATH]; GetModuleFileName( NULL, szFilename, MAX_PATH); TCHAR * slash = strrchr( szFilename, '\\' ); TCHAR * dot = strrchr( slash+1, '.' ); ::lstrcpyn( s_pszFilePrefix, slash+1, (int)(dot - slash) ); TCHAR szClientVersion[64], szHttpUrl[256], szFtpUrl[256], szFtpID[256], szFtpPW[256]; int nFtpPort, nProjectID, nCount; bool bCumulative = true; bool bDeleteDumpfile = true; bool bStackTrace = false; sprintf(szClientVersion, TEXT(s_pszBuildVersion)); sprintf(szHttpUrl, TEXT("202.14.103.223:10080")); sprintf(szFtpUrl, TEXT("202.14.103.223")); sprintf(szFtpID, TEXT("webzen")); sprintf(szFtpPW, TEXT("webFTP!34")); nFtpPort = 10021; nProjectID = 14; nCount = 3; struct tm * today; time_t ltime; time( <ime ); today = localtime( <ime ); wsprintf(s_pszBuildVersion, c_tcBUILD_VERSION); wsprintf(szDumpPath, "%s%s_%s.dmp", s_pszDumpFileDir, s_pszFilePrefix, s_pszBuildVersion); sprintf(szFile1, szDumpPath);//添加dmp文件 // addfile使用的不是\\而是/. int i = 0; while(szFile1[i] != '\0') { if (szFile1[i] == '\\') { szFile1[i] = '/'; } ++i; } //sprintf(szFile1, "CrashReport.dmp");//添加dmp文件 CreateDirectory(s_pszDumpFileDir, NULL); CreateMiniDump(exception_info_ptr); #ifdef _CREATE_DUMP_ if (!Crash::Install( CrashCallbackBefore, CrashCallbackAfter, nProjectID, szClientVersion, MiniDumpNormal, szHttpUrl, szFtpUrl, nFtpPort, szFtpID, szFtpPW, nCount, bCumulative, bDeleteDumpfile, bStackTrace, szDumpPath)) { return 1; } #endif #ifdef _NA_000000_20130426_DUMPTOSCREENSHOT wsprintf(szFile6, "%s%s_%s.jpg", s_pszDumpFileDir, s_pszFilePrefix, s_pszBuildVersion); //将文件保存到相应的转储文件名. if(g_pSunRenderer) { g_pSunRenderer->SaveScreen( szFile6 ); } i = 0; while(szFile6[i] != '\0') { if (szFile6[i] == '\\') { szFile6[i] = '/'; } ++i; } #endif static BOOL first = FALSE; if (first) { return rt; } first = TRUE; #ifdef _CREATE_DUMP_ __try { RaiseException( STILL_ACTIVE, 0, 0, NULL ); } __except( Crash::HandleExceptionWithInfo(GetExceptionInformation()) ) { Crash::Uninstall(); remove("CrashLog.txt"); remove(szDumpPath); remove(szFile6); remove(szDumpIamgePath); RemoveDirectory(s_pszDumpFileDir); return 1;// 错误报告不显示窗口 } #endif return rt; } #else//_DH_DEBUG_REPORT LONG WINAPI Application::ExceptionFilter( struct _EXCEPTION_POINTERS * pExceptionInfo ) { LONG rt = EXCEPTION_CONTINUE_SEARCH; if( pExceptionInfo == NULL ) { static BOOL first = FALSE; if( first ) return rt; first = TRUE; __try { RaiseException( EXCEPTION_BREAKPOINT, 0, 0, NULL ); } __except( ExceptionFilter( GetExceptionInformation() ), EXCEPTION_CONTINUE_EXECUTION ) { } return rt; } else { St_SystemAndDriverInfo sysInfo; GetSystemAndDriverInfo("3DRendererD3D.dll", &sysInfo); TCHAR szFileName[INTERFACE_STRING_LENGTH] = {0,}; GlobalFunc::GetCrashReportFileName(szFileName); SetFileAttributes( szFileName, FILE_ATTRIBUTE_NORMAL ); TCHAR lpszParamBuffer[16] = {0,}; //0:发送前,1:发送,-1:不想发送,-2:Default WritePrivateProfileString( _T("SEND_REPORT"), _T("Send"), ParamInt2Str( 0, lpszParamBuffer), szFileName); FILE *fp = fopen("MiniCrashDump.txt","wt"); if (fp) { DWORD exceptionAddress = (DWORD)pExceptionInfo->ExceptionRecord->ExceptionAddress; TCHAR szValue[MAX_PATH] = {0,}; Sprintf(szValue, _T("%ld"), exceptionAddress); WritePrivateProfileString( _T("CRASH_INFO"), _T("CrashAddress"), szValue, szFileName); // 首先记录延伸的地址~ fprintf(fp,"Crash Address : %X\n",exceptionAddress); MODULEENTRY32 me32; ZeroMemory(&me32,sizeof(me32)); me32.dwSize = sizeof(me32); // 如果能找到哪个模块,还会记录模块信息. HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,GetCurrentProcessId()); if (hModuleSnap != (HANDLE)-1) { if (Module32First(hModuleSnap,&me32)) { do { DWORD dwModStart = (DWORD)me32.modBaseAddr; DWORD dwModEnd = (DWORD)me32.modBaseAddr + me32.modBaseSize; // 找到了模块~ if (exceptionAddress >= dwModStart && exceptionAddress < dwModEnd) { //CRASH_INFO ZeroMemory(szValue, sizeof(szValue)); Sprintf(szValue, _T("%ld"), dwModStart); WritePrivateProfileString( _T("CRASH_INFO"), _T("ModuleStartAddress"), szValue, szFileName); ZeroMemory(szValue, sizeof(szValue)); Sprintf(szValue, _T("%ld"), dwModEnd); WritePrivateProfileString( _T("CRASH_INFO"), _T("ModuleEndAddress"), szValue, szFileName); ZeroMemory(szValue, sizeof(szValue)); Sprintf(szValue, _T("%ld"), exceptionAddress - dwModStart); WritePrivateProfileString( _T("CRASH_INFO"), _T("ModuleCrashOffset"), szValue, szFileName); ZeroMemory(szValue, sizeof(szValue)); Sprintf(szValue, _T("%s"), me32.szModule); WritePrivateProfileString( _T("CRASH_INFO"), _T("ModuleName"), szValue, szFileName); ZeroMemory(szValue, sizeof(szValue)); Sprintf(szValue, _T("%s"), c_tcBUILD_VERSION); WritePrivateProfileString( _T("CRASH_INFO"), _T("CompileVer"), szValue, szFileName); ZeroMemory(szValue, sizeof(szValue)); DWORD64 sysTime; util::GetDateTime_YYYYMMDDHHMMSS(sysTime); _ui64tot(sysTime, szValue, 10); WritePrivateProfileString( _T("CRASH_INFO"), _T("CrashTime"), szValue, szFileName); //PC_INFO ZeroMemory(szValue, sizeof(szValue)); Sprintf(szValue, _T("%s"), sysInfo.m_szOSEnglish); WritePrivateProfileString( _T("PC_INFO"), _T("OS"), szValue, szFileName); ZeroMemory(szValue, sizeof(szValue)); Sprintf(szValue, _T("%s"), sysInfo.m_szProcessorEnglish); WritePrivateProfileString( _T("PC_INFO"), _T("Process"), szValue, szFileName); ZeroMemory(szValue, sizeof(szValue)); Sprintf(szValue, _T("%s"), sysInfo.m_szPhysicalMemoryEnglish); WritePrivateProfileString( _T("PC_INFO"), _T("PhysicalMemory"), szValue, szFileName); ZeroMemory(szValue, sizeof(szValue)); Sprintf(szValue, _T("%s"), sysInfo.m_szDirectXVersionLongEnglish); WritePrivateProfileString( _T("PC_INFO"), _T("DirectXVersion"), szValue, szFileName); ZeroMemory(szValue, sizeof(szValue)); Sprintf(szValue, _T("%s"), sysInfo.m_szDescription); WritePrivateProfileString( _T("PC_INFO"), _T("VGADescription"), szValue, szFileName); ZeroMemory(szValue, sizeof(szValue)); Sprintf(szValue, _T("%s"), sysInfo.m_szDisplayMemoryEnglish); WritePrivateProfileString( _T("PC_INFO"), _T("DisplayMemory"), szValue, szFileName); ZeroMemory(szValue, sizeof(szValue)); Sprintf(szValue, _T("%s"), sysInfo.m_szDriverVersion); WritePrivateProfileString( _T("PC_INFO"), _T("DriverVersion"), szValue, szFileName); // 记录名字、映射地址和偏移量 fprintf(fp,"Module Name : %s\n",me32.szModule); fprintf(fp,"Module Base Address : %X - %X\n",dwModStart,dwModEnd); fprintf(fp,"Module Crash Offset : %X\n",exceptionAddress - dwModStart); break; } } while(Module32Next(hModuleSnap,&me32)); } } fclose(fp); } } return rt; } #endif//_DH_DEBUG_REPORT #endif//GGUO_CRASH_DUMP #pragma warning ( pop ) #pragma warning ( pop )