Kyuukyoku

Untitled

Apr 19th, 2020
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 37.61 KB | None | 0 0
  1. #include "StdAfx.h"
  2. #include "../eterBase/Error.h"
  3. #include "../eterlib/Camera.h"
  4. #include "../eterlib/AttributeInstance.h"
  5. #include "../gamelib/AreaTerrain.h"
  6. #include "../EterGrnLib/Material.h"
  7. #include "../CWebBrowser/CWebBrowser.h"
  8.  
  9. #include "resource.h"
  10. #include "PythonApplication.h"
  11. #include "PythonCharacterManager.h"
  12.  
  13. #include "ProcessScanner.h"
  14.  
  15. #include "HackShield.h"
  16. #include "NProtectGameGuard.h"
  17. #include "WiseLogicXTrap.h"
  18. #include "CheckLatestFiles.h"
  19.  
  20. extern void GrannyCreateSharedDeformBuffer();
  21. extern void GrannyDestroySharedDeformBuffer();
  22.  
  23. float MIN_FOG = 2400.0f;
  24. double g_specularSpd=0.007f;
  25.  
  26. CPythonApplication * CPythonApplication::ms_pInstance;
  27.  
  28. float c_fDefaultCameraRotateSpeed = 1.5f;
  29. float c_fDefaultCameraPitchSpeed = 1.5f;
  30. float c_fDefaultCameraZoomSpeed = 0.05f;
  31.  
  32. CPythonApplication::CPythonApplication() :
  33. m_bCursorVisible(TRUE),
  34. m_bLiarCursorOn(false),
  35. m_iCursorMode(CURSOR_MODE_HARDWARE),
  36. m_isWindowed(false),
  37. m_isFrameSkipDisable(false),
  38. m_poMouseHandler(NULL),
  39. m_dwUpdateFPS(0),
  40. m_dwRenderFPS(0),
  41. m_fAveRenderTime(0.0f),
  42. m_dwFaceCount(0),
  43. m_fGlobalTime(0.0f),
  44. m_fGlobalElapsedTime(0.0f),
  45. m_dwLButtonDownTime(0),
  46. m_dwLastIdleTime(0)
  47. {
  48. #ifndef _DEBUG
  49. SetEterExceptionHandler();
  50. #endif
  51.  
  52. CTimer::Instance().UseCustomTime();
  53. m_dwWidth = 800;
  54. m_dwHeight = 600;
  55.  
  56. ms_pInstance = this;
  57. m_isWindowFullScreenEnable = FALSE;
  58.  
  59. m_v3CenterPosition = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
  60. m_dwStartLocalTime = ELTimer_GetMSec();
  61. m_tServerTime = 0;
  62. m_tLocalStartTime = 0;
  63.  
  64. m_iPort = 0;
  65. m_iFPS = 60;
  66.  
  67. m_isActivateWnd = false;
  68. m_isMinimizedWnd = true;
  69.  
  70. m_fRotationSpeed = 0.0f;
  71. m_fPitchSpeed = 0.0f;
  72. m_fZoomSpeed = 0.0f;
  73.  
  74. m_fFaceSpd=0.0f;
  75.  
  76. m_dwFaceAccCount=0;
  77. m_dwFaceAccTime=0;
  78.  
  79. m_dwFaceSpdSum=0;
  80. m_dwFaceSpdCount=0;
  81.  
  82. m_FlyingManager.SetMapManagerPtr(&m_pyBackground);
  83.  
  84. m_iCursorNum = CURSOR_SHAPE_NORMAL;
  85. m_iContinuousCursorNum = CURSOR_SHAPE_NORMAL;
  86.  
  87. m_isSpecialCameraMode = FALSE;
  88. m_fCameraRotateSpeed = c_fDefaultCameraRotateSpeed;
  89. m_fCameraPitchSpeed = c_fDefaultCameraPitchSpeed;
  90. m_fCameraZoomSpeed = c_fDefaultCameraZoomSpeed;
  91.  
  92. m_iCameraMode = CAMERA_MODE_NORMAL;
  93. m_fBlendCameraStartTime = 0.0f;
  94. m_fBlendCameraBlendTime = 0.0f;
  95.  
  96. m_iForceSightRange = -1;
  97.  
  98. CCameraManager::Instance().AddCamera(EVENT_CAMERA_NUMBER);
  99. }
  100.  
  101. CPythonApplication::~CPythonApplication()
  102. {
  103. }
  104.  
  105. void CPythonApplication::GetMousePosition(POINT* ppt)
  106. {
  107. CMSApplication::GetMousePosition(ppt);
  108. }
  109.  
  110. void CPythonApplication::SetMinFog(float fMinFog)
  111. {
  112. MIN_FOG = fMinFog;
  113. }
  114.  
  115. void CPythonApplication::SetFrameSkip(bool isEnable)
  116. {
  117. if (isEnable)
  118. m_isFrameSkipDisable=false;
  119. else
  120. m_isFrameSkipDisable=true;
  121. }
  122.  
  123. void CPythonApplication::NotifyHack(const char* c_szFormat, ...)
  124. {
  125. char szBuf[1024];
  126.  
  127. va_list args;
  128. va_start(args, c_szFormat);
  129. _vsnprintf(szBuf, sizeof(szBuf), c_szFormat, args);
  130. va_end(args);
  131. m_pyNetworkStream.NotifyHack(szBuf);
  132. }
  133.  
  134. void CPythonApplication::GetInfo(UINT eInfo, std::string* pstInfo)
  135. {
  136. switch (eInfo)
  137. {
  138. case INFO_ACTOR:
  139. m_kChrMgr.GetInfo(pstInfo);
  140. break;
  141. case INFO_EFFECT:
  142. m_kEftMgr.GetInfo(pstInfo);
  143. break;
  144. case INFO_ITEM:
  145. m_pyItem.GetInfo(pstInfo);
  146. break;
  147. case INFO_TEXTTAIL:
  148. m_pyTextTail.GetInfo(pstInfo);
  149. break;
  150. }
  151. }
  152.  
  153. void CPythonApplication::Abort()
  154. {
  155. TraceError("============================================================================================================");
  156. TraceError("Abort!!!!\n\n");
  157.  
  158. PostQuitMessage(0);
  159. }
  160.  
  161. void CPythonApplication::Exit()
  162. {
  163. PostQuitMessage(0);
  164. }
  165.  
  166. bool PERF_CHECKER_RENDER_GAME = false;
  167.  
  168. void CPythonApplication::RenderGame()
  169. {
  170. if (!PERF_CHECKER_RENDER_GAME)
  171. {
  172. float fAspect=m_kWndMgr.GetAspect();
  173. float fFarClip=m_pyBackground.GetFarClip();
  174.  
  175. m_pyGraphic.SetPerspective(30.0f, fAspect, 100.0, fFarClip);
  176.  
  177. CCullingManager::Instance().Process();
  178.  
  179. m_kChrMgr.Deform();
  180. m_kEftMgr.Update();
  181.  
  182. m_pyBackground.RenderCharacterShadowToTexture();
  183.  
  184. m_pyGraphic.SetGameRenderState();
  185. m_pyGraphic.PushState();
  186.  
  187. {
  188. long lx, ly;
  189. m_kWndMgr.GetMousePosition(lx, ly);
  190. m_pyGraphic.SetCursorPosition(lx, ly);
  191. }
  192.  
  193. m_pyBackground.RenderSky();
  194.  
  195. m_pyBackground.RenderBeforeLensFlare();
  196.  
  197. m_pyBackground.RenderCloud();
  198.  
  199. m_pyBackground.BeginEnvironment();
  200. m_pyBackground.Render();
  201.  
  202. m_pyBackground.SetCharacterDirLight();
  203. m_kChrMgr.Render();
  204.  
  205. m_pyBackground.SetBackgroundDirLight();
  206. m_pyBackground.RenderWater();
  207. m_pyBackground.RenderSnow();
  208. m_pyBackground.RenderEffect();
  209.  
  210. m_pyBackground.EndEnvironment();
  211.  
  212. m_kEftMgr.Render();
  213. m_pyItem.Render();
  214. m_FlyingManager.Render();
  215.  
  216. m_pyBackground.BeginEnvironment();
  217. m_pyBackground.RenderPCBlocker();
  218. m_pyBackground.EndEnvironment();
  219.  
  220. m_pyBackground.RenderAfterLensFlare();
  221.  
  222. return;
  223. }
  224.  
  225. //if (GetAsyncKeyState(VK_Z))
  226. // STATEMANAGER.SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
  227.  
  228. DWORD t1=ELTimer_GetMSec();
  229. m_kChrMgr.Deform();
  230. DWORD t2=ELTimer_GetMSec();
  231. m_kEftMgr.Update();
  232. DWORD t3=ELTimer_GetMSec();
  233. m_pyBackground.RenderCharacterShadowToTexture();
  234. DWORD t4=ELTimer_GetMSec();
  235.  
  236. m_pyGraphic.SetGameRenderState();
  237. m_pyGraphic.PushState();
  238.  
  239. float fAspect=m_kWndMgr.GetAspect();
  240. float fFarClip=m_pyBackground.GetFarClip();
  241.  
  242. m_pyGraphic.SetPerspective(30.0f, fAspect, 100.0, fFarClip);
  243.  
  244. DWORD t5=ELTimer_GetMSec();
  245.  
  246. CCullingManager::Instance().Process();
  247.  
  248. DWORD t6=ELTimer_GetMSec();
  249.  
  250. {
  251. long lx, ly;
  252. m_kWndMgr.GetMousePosition(lx, ly);
  253. m_pyGraphic.SetCursorPosition(lx, ly);
  254. }
  255.  
  256. m_pyBackground.RenderSky();
  257. DWORD t7=ELTimer_GetMSec();
  258. m_pyBackground.RenderBeforeLensFlare();
  259. DWORD t8=ELTimer_GetMSec();
  260. m_pyBackground.RenderCloud();
  261. DWORD t9=ELTimer_GetMSec();
  262. m_pyBackground.BeginEnvironment();
  263. m_pyBackground.Render();
  264.  
  265. m_pyBackground.SetCharacterDirLight();
  266. DWORD t10=ELTimer_GetMSec();
  267. m_kChrMgr.Render();
  268. DWORD t11=ELTimer_GetMSec();
  269.  
  270. m_pyBackground.SetBackgroundDirLight();
  271. m_pyBackground.RenderWater();
  272. DWORD t12=ELTimer_GetMSec();
  273. m_pyBackground.RenderEffect();
  274. DWORD t13=ELTimer_GetMSec();
  275. m_pyBackground.EndEnvironment();
  276. m_kEftMgr.Render();
  277. DWORD t14=ELTimer_GetMSec();
  278. m_pyItem.Render();
  279. DWORD t15=ELTimer_GetMSec();
  280. m_FlyingManager.Render();
  281. DWORD t16=ELTimer_GetMSec();
  282. m_pyBackground.BeginEnvironment();
  283. m_pyBackground.RenderPCBlocker();
  284. m_pyBackground.EndEnvironment();
  285. DWORD t17=ELTimer_GetMSec();
  286. m_pyBackground.RenderAfterLensFlare();
  287. DWORD t18=ELTimer_GetMSec();
  288. DWORD tEnd=ELTimer_GetMSec();
  289.  
  290. if (GetAsyncKeyState(VK_Z))
  291. STATEMANAGER.SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
  292.  
  293. if (tEnd-t1<3)
  294. return;
  295.  
  296. static FILE* fp=fopen("perf_game_render.txt", "w");
  297.  
  298. fprintf(fp, "GR.Total %d (Time %d)\n", tEnd-t1, ELTimer_GetMSec());
  299. fprintf(fp, "GR.DFM %d\n", t2-t1);
  300. fprintf(fp, "GR.EFT.UP %d\n", t3-t2);
  301. fprintf(fp, "GR.SHW %d\n", t4-t3);
  302. fprintf(fp, "GR.STT %d\n", t5-t4);
  303. fprintf(fp, "GR.CLL %d\n", t6-t5);
  304. fprintf(fp, "GR.BG.SKY %d\n", t7-t6);
  305. fprintf(fp, "GR.BG.LEN %d\n", t8-t7);
  306. fprintf(fp, "GR.BG.CLD %d\n", t9-t8);
  307. fprintf(fp, "GR.BG.MAIN %d\n", t10-t9);
  308. fprintf(fp, "GR.CHR %d\n", t11-t10);
  309. fprintf(fp, "GR.BG.WTR %d\n", t12-t11);
  310. fprintf(fp, "GR.BG.EFT %d\n", t13-t12);
  311. fprintf(fp, "GR.EFT %d\n", t14-t13);
  312. fprintf(fp, "GR.ITM %d\n", t15-t14);
  313. fprintf(fp, "GR.FLY %d\n", t16-t15);
  314. fprintf(fp, "GR.BG.BLK %d\n", t17-t16);
  315. fprintf(fp, "GR.BG.LEN %d\n", t18-t17);
  316.  
  317.  
  318. fflush(fp);
  319. }
  320.  
  321. void CPythonApplication::UpdateGame()
  322. {
  323. DWORD t1=ELTimer_GetMSec();
  324. POINT ptMouse;
  325. GetMousePosition(&ptMouse);
  326.  
  327. CGraphicTextInstance::Hyperlink_UpdateMousePos(ptMouse.x, ptMouse.y);
  328.  
  329. DWORD t2=ELTimer_GetMSec();
  330.  
  331. //!@# Alt+Tab 중 SetTransfor 에서 튕김 현상 해결을 위해 - [levites]
  332. //if (m_isActivateWnd)
  333. {
  334. CScreen s;
  335. float fAspect = UI::CWindowManager::Instance().GetAspect();
  336. float fFarClip = CPythonBackground::Instance().GetFarClip();
  337.  
  338. s.SetPerspective(30.0f,fAspect, 100.0f, fFarClip);
  339. s.BuildViewFrustum();
  340. }
  341.  
  342. DWORD t3=ELTimer_GetMSec();
  343. TPixelPosition kPPosMainActor;
  344. m_pyPlayer.NEW_GetMainActorPosition(&kPPosMainActor);
  345.  
  346. DWORD t4=ELTimer_GetMSec();
  347. m_pyBackground.Update(kPPosMainActor.x, kPPosMainActor.y, kPPosMainActor.z);
  348.  
  349. DWORD t5=ELTimer_GetMSec();
  350. m_GameEventManager.SetCenterPosition(kPPosMainActor.x, kPPosMainActor.y, kPPosMainActor.z);
  351. m_GameEventManager.Update();
  352.  
  353. DWORD t6=ELTimer_GetMSec();
  354. m_kChrMgr.Update();
  355. DWORD t7=ELTimer_GetMSec();
  356. m_kEftMgr.UpdateSound();
  357. DWORD t8=ELTimer_GetMSec();
  358. m_FlyingManager.Update();
  359. DWORD t9=ELTimer_GetMSec();
  360. m_pyItem.Update(ptMouse);
  361. DWORD t10=ELTimer_GetMSec();
  362. m_pyPlayer.Update();
  363. DWORD t11=ELTimer_GetMSec();
  364.  
  365. // NOTE : Update 동안 위치 값이 바뀌므로 다시 얻어 옵니다 - [levites]
  366. // 이 부분 때문에 메인 케릭터의 Sound가 이전 위치에서 플레이 되는 현상이 있었음.
  367. m_pyPlayer.NEW_GetMainActorPosition(&kPPosMainActor);
  368. SetCenterPosition(kPPosMainActor.x, kPPosMainActor.y, kPPosMainActor.z);
  369. DWORD t12=ELTimer_GetMSec();
  370.  
  371. if (PERF_CHECKER_RENDER_GAME)
  372. {
  373. if (t12-t1>5)
  374. {
  375. static FILE* fp=fopen("perf_game_update.txt", "w");
  376.  
  377. fprintf(fp, "GU.Total %d (Time %d)\n", t12-t1, ELTimer_GetMSec());
  378. fprintf(fp, "GU.GMP %d\n", t2-t1);
  379. fprintf(fp, "GU.SCR %d\n", t3-t2);
  380. fprintf(fp, "GU.MPS %d\n", t4-t3);
  381. fprintf(fp, "GU.BG %d\n", t5-t4);
  382. fprintf(fp, "GU.GEM %d\n", t6-t5);
  383. fprintf(fp, "GU.CHR %d\n", t7-t6);
  384. fprintf(fp, "GU.EFT %d\n", t8-t7);
  385. fprintf(fp, "GU.FLY %d\n", t9-t8);
  386. fprintf(fp, "GU.ITM %d\n", t10-t9);
  387. fprintf(fp, "GU.PLR %d\n", t11-t10);
  388. fprintf(fp, "GU.POS %d\n", t12-t11);
  389. fflush(fp);
  390. }
  391. }
  392. }
  393.  
  394. void CPythonApplication::SkipRenderBuffering(DWORD dwSleepMSec)
  395. {
  396. m_dwBufSleepSkipTime=ELTimer_GetMSec()+dwSleepMSec;
  397. }
  398.  
  399. bool CPythonApplication::Process()
  400. {
  401. #if defined(CHECK_LATEST_DATA_FILES)
  402. if (CheckLatestFiles_PollEvent())
  403. return false;
  404. #endif
  405. #ifdef USE_AHNLAB_HACKSHIELD
  406. if (HackShield_PollEvent())
  407. return false;
  408. #endif
  409. #ifdef XTRAP_CLIENT_ENABLE
  410. XTrap_PollEvent();
  411. #endif
  412. ELTimer_SetFrameMSec();
  413.  
  414. // m_Profiler.Clear();
  415. DWORD dwStart = ELTimer_GetMSec();
  416.  
  417. ///////////////////////////////////////////////////////////////////////////////////////////////////
  418. static DWORD s_dwUpdateFrameCount = 0;
  419. static DWORD s_dwRenderFrameCount = 0;
  420. static DWORD s_dwFaceCount = 0;
  421. static UINT s_uiLoad = 0;
  422. static DWORD s_dwCheckTime = ELTimer_GetMSec();
  423.  
  424. if (ELTimer_GetMSec() - s_dwCheckTime > 1000)
  425. {
  426. m_dwUpdateFPS = s_dwUpdateFrameCount;
  427. m_dwRenderFPS = s_dwRenderFrameCount;
  428. m_dwLoad = s_uiLoad;
  429.  
  430. m_dwFaceCount = s_dwFaceCount / max(1, s_dwRenderFrameCount);
  431.  
  432. s_dwCheckTime = ELTimer_GetMSec();
  433.  
  434. s_uiLoad = s_dwFaceCount = s_dwUpdateFrameCount = s_dwRenderFrameCount = 0;
  435. }
  436.  
  437. // Update Time
  438. static BOOL s_bFrameSkip = false;
  439. static UINT s_uiNextFrameTime = ELTimer_GetMSec();
  440.  
  441. #ifdef __PERFORMANCE_CHECK__
  442. DWORD dwUpdateTime1=ELTimer_GetMSec();
  443. #endif
  444. CTimer& rkTimer=CTimer::Instance();
  445. rkTimer.Advance();
  446.  
  447. m_fGlobalTime = rkTimer.GetCurrentSecond();
  448. m_fGlobalElapsedTime = rkTimer.GetElapsedSecond();
  449.  
  450. UINT uiFrameTime = rkTimer.GetElapsedMilliecond();
  451. s_uiNextFrameTime += uiFrameTime; //17 - 1초당 60fps기준.
  452.  
  453. DWORD updatestart = ELTimer_GetMSec();
  454. #ifdef __PERFORMANCE_CHECK__
  455. DWORD dwUpdateTime2=ELTimer_GetMSec();
  456. #endif
  457. // Network I/O
  458. m_pyNetworkStream.Process();
  459. //m_pyNetworkDatagram.Process();
  460.  
  461. m_kGuildMarkUploader.Process();
  462.  
  463. #ifdef USE_NPROTECT_GAMEGUARD
  464. if (GameGuard_IsError())
  465. return false;
  466. #endif
  467.  
  468. m_kGuildMarkDownloader.Process();
  469. m_kAccountConnector.Process();
  470.  
  471. #ifdef __PERFORMANCE_CHECK__
  472. DWORD dwUpdateTime3=ELTimer_GetMSec();
  473. #endif
  474. //////////////////////
  475. // Input Process
  476. // Keyboard
  477. UpdateKeyboard();
  478. #ifdef __PERFORMANCE_CHECK__
  479. DWORD dwUpdateTime4=ELTimer_GetMSec();
  480. #endif
  481. // Mouse
  482. POINT Point;
  483. if (GetCursorPos(&Point))
  484. {
  485. ScreenToClient(m_hWnd, &Point);
  486. OnMouseMove(Point.x, Point.y);
  487. }
  488. //////////////////////
  489. #ifdef __PERFORMANCE_CHECK__
  490. DWORD dwUpdateTime5=ELTimer_GetMSec();
  491. #endif
  492. //!@# Alt+Tab 중 SetTransfor 에서 튕김 현상 해결을 위해 - [levites]
  493. //if (m_isActivateWnd)
  494. __UpdateCamera();
  495. #ifdef __PERFORMANCE_CHECK__
  496. DWORD dwUpdateTime6=ELTimer_GetMSec();
  497. #endif
  498. // Update Game Playing
  499. CResourceManager::Instance().Update();
  500. #ifdef __PERFORMANCE_CHECK__
  501. DWORD dwUpdateTime7=ELTimer_GetMSec();
  502. #endif
  503. OnCameraUpdate();
  504. #ifdef __PERFORMANCE_CHECK__
  505. DWORD dwUpdateTime8=ELTimer_GetMSec();
  506. #endif
  507. OnMouseUpdate();
  508. #ifdef __PERFORMANCE_CHECK__
  509. DWORD dwUpdateTime9=ELTimer_GetMSec();
  510. #endif
  511. OnUIUpdate();
  512.  
  513. #ifdef __PERFORMANCE_CHECK__
  514. DWORD dwUpdateTime10=ELTimer_GetMSec();
  515.  
  516. if (dwUpdateTime10-dwUpdateTime1>10)
  517. {
  518. static FILE* fp=fopen("perf_app_update.txt", "w");
  519.  
  520. fprintf(fp, "AU.Total %d (Time %d)\n", dwUpdateTime9-dwUpdateTime1, ELTimer_GetMSec());
  521. fprintf(fp, "AU.TU %d\n", dwUpdateTime2-dwUpdateTime1);
  522. fprintf(fp, "AU.NU %d\n", dwUpdateTime3-dwUpdateTime2);
  523. fprintf(fp, "AU.KU %d\n", dwUpdateTime4-dwUpdateTime3);
  524. fprintf(fp, "AU.MP %d\n", dwUpdateTime5-dwUpdateTime4);
  525. fprintf(fp, "AU.CP %d\n", dwUpdateTime6-dwUpdateTime5);
  526. fprintf(fp, "AU.RU %d\n", dwUpdateTime7-dwUpdateTime6);
  527. fprintf(fp, "AU.CU %d\n", dwUpdateTime8-dwUpdateTime7);
  528. fprintf(fp, "AU.MU %d\n", dwUpdateTime9-dwUpdateTime8);
  529. fprintf(fp, "AU.UU %d\n", dwUpdateTime10-dwUpdateTime9);
  530. fprintf(fp, "----------------------------------\n");
  531. fflush(fp);
  532. }
  533. #endif
  534.  
  535. //Update하는데 걸린시간.delta값
  536. m_dwCurUpdateTime = ELTimer_GetMSec() - updatestart;
  537.  
  538. DWORD dwCurrentTime = ELTimer_GetMSec();
  539. BOOL bCurrentLateUpdate = FALSE;
  540.  
  541. s_bFrameSkip = false;
  542.  
  543. if (dwCurrentTime > s_uiNextFrameTime)
  544. {
  545. int dt = dwCurrentTime - s_uiNextFrameTime;
  546. int nAdjustTime = ((float)dt / (float)uiFrameTime) * uiFrameTime;
  547.  
  548. if ( dt >= 500 )
  549. {
  550. s_uiNextFrameTime += nAdjustTime;
  551. printf("FrameSkip 보정 %d\n",nAdjustTime);
  552. CTimer::Instance().Adjust(nAdjustTime);
  553. }
  554.  
  555. s_bFrameSkip = true;
  556. bCurrentLateUpdate = TRUE;
  557. }
  558.  
  559. //s_bFrameSkip = false;
  560.  
  561. //if (dwCurrentTime > s_uiNextFrameTime)
  562. //{
  563. // int dt = dwCurrentTime - s_uiNextFrameTime;
  564.  
  565. // //너무 늦었을 경우 따라잡는다.
  566. // //그리고 m_dwCurUpdateTime는 delta인데 delta랑 absolute time이랑 비교하면 어쩌자는겨?
  567. // //if (dt >= 500 || m_dwCurUpdateTime > s_uiNextFrameTime)
  568.  
  569. // //기존코드대로 하면 0.5초 이하 차이난 상태로 update가 지속되면 계속 rendering frame skip발생
  570. // if (dt >= 500 || m_dwCurUpdateTime > s_uiNextFrameTime)
  571. // {
  572. // s_uiNextFrameTime += dt / uiFrameTime * uiFrameTime;
  573. // printf("FrameSkip 보정 %d\n", dt / uiFrameTime * uiFrameTime);
  574. // CTimer::Instance().Adjust((dt / uiFrameTime) * uiFrameTime);
  575. // s_bFrameSkip = true;
  576. // }
  577. //}
  578.  
  579. if (m_isFrameSkipDisable)
  580. s_bFrameSkip = false;
  581.  
  582. #ifdef __VTUNE__
  583. s_bFrameSkip = false;
  584. #endif
  585. /*
  586. static bool s_isPrevFrameSkip=false;
  587. static DWORD s_dwFrameSkipCount=0;
  588. static DWORD s_dwFrameSkipEndTime=0;
  589.  
  590. static DWORD ERROR_FRAME_SKIP_COUNT = 60*5;
  591. static DWORD ERROR_FRAME_SKIP_TIME = ERROR_FRAME_SKIP_COUNT*18;
  592.  
  593. //static DWORD MAX_FRAME_SKIP=0;
  594.  
  595. if (IsActive())
  596. {
  597. DWORD dwFrameSkipCurTime=ELTimer_GetMSec();
  598.  
  599. if (s_bFrameSkip)
  600. {
  601. // 이전 프레임도 스킵이라면..
  602. if (s_isPrevFrameSkip)
  603. {
  604. if (s_dwFrameSkipEndTime==0)
  605. {
  606. s_dwFrameSkipCount=0; // 프레임 체크는 로딩 대비
  607. s_dwFrameSkipEndTime=dwFrameSkipCurTime+ERROR_FRAME_SKIP_TIME; // 시간 체크는 로딩후 프레임 스킵 체크
  608.  
  609. //printf("FrameSkipCheck Start\n");
  610. }
  611. ++s_dwFrameSkipCount;
  612.  
  613. //if (MAX_FRAME_SKIP<s_dwFrameSkipCount)
  614. // MAX_FRAME_SKIP=s_dwFrameSkipCount;
  615.  
  616. //printf("u %d c %d/%d t %d\n",
  617. // dwUpdateTime9-dwUpdateTime1,
  618. // s_dwFrameSkipCount,
  619. // MAX_FRAME_SKIP,
  620. // s_dwFrameSkipEndTime);
  621.  
  622. //#ifndef _DEBUG
  623. // 일정 시간동안 계속 프레임 스킵만 한다면...
  624. if (s_dwFrameSkipCount>ERROR_FRAME_SKIP_COUNT && s_dwFrameSkipEndTime<dwFrameSkipCurTime)
  625. {
  626. s_isPrevFrameSkip=false;
  627. s_dwFrameSkipEndTime=0;
  628. s_dwFrameSkipCount=0;
  629.  
  630. //m_pyNetworkStream.AbsoluteExitGame();
  631.  
  632. /*
  633. TraceError("무한 프레임 스킵으로 접속을 종료합니다");
  634.  
  635. {
  636. FILE* fp=fopen("errorlog.txt", "w");
  637. if (fp)
  638. {
  639. fprintf(fp, "FRAMESKIP\n");
  640. fprintf(fp, "Total %d\n", dwUpdateTime9-dwUpdateTime1);
  641. fprintf(fp, "Timer %d\n", dwUpdateTime2-dwUpdateTime1);
  642. fprintf(fp, "Network %d\n", dwUpdateTime3-dwUpdateTime2);
  643. fprintf(fp, "Keyboard %d\n", dwUpdateTime4-dwUpdateTime3);
  644. fprintf(fp, "Controll %d\n", dwUpdateTime5-dwUpdateTime4);
  645. fprintf(fp, "Resource %d\n", dwUpdateTime6-dwUpdateTime5);
  646. fprintf(fp, "Camera %d\n", dwUpdateTime7-dwUpdateTime6);
  647. fprintf(fp, "Mouse %d\n", dwUpdateTime8-dwUpdateTime7);
  648. fprintf(fp, "UI %d\n", dwUpdateTime9-dwUpdateTime8);
  649. fclose(fp);
  650.  
  651. WinExec("errorlog.exe", SW_SHOW);
  652. }
  653. }
  654. }
  655. }
  656.  
  657. s_isPrevFrameSkip=true;
  658. }
  659. else
  660. {
  661. s_isPrevFrameSkip=false;
  662. s_dwFrameSkipCount=0;
  663. s_dwFrameSkipEndTime=0;
  664. }
  665. }
  666. else
  667. {
  668. s_isPrevFrameSkip=false;
  669. s_dwFrameSkipCount=0;
  670. s_dwFrameSkipEndTime=0;
  671. }
  672. */
  673. if (!s_bFrameSkip)
  674. {
  675. // static double pos=0.0f;
  676. // CGrannyMaterial::TranslateSpecularMatrix(fabs(sin(pos)*0.005), fabs(cos(pos)*0.005), 0.0f);
  677. // pos+=0.01f;
  678.  
  679. CGrannyMaterial::TranslateSpecularMatrix(g_specularSpd, g_specularSpd, 0.0f);
  680.  
  681. DWORD dwRenderStartTime = ELTimer_GetMSec();
  682.  
  683. bool canRender = true;
  684.  
  685. if (m_isMinimizedWnd)
  686. {
  687. canRender = false;
  688. }
  689. else
  690. {
  691. if (m_pyGraphic.IsLostDevice())
  692. {
  693. CPythonBackground& rkBG = CPythonBackground::Instance();
  694. rkBG.ReleaseCharacterShadowTexture();
  695.  
  696. if (m_pyGraphic.RestoreDevice())
  697. rkBG.CreateCharacterShadowTexture();
  698. else
  699. canRender = false;
  700. }
  701. }
  702.  
  703. if (!IsActive())
  704. {
  705. SkipRenderBuffering(3000);
  706. }
  707.  
  708. // 리스토어 처리때를 고려해 일정 시간동안은 버퍼링을 하지 않는다
  709. if (!canRender)
  710. {
  711. SkipRenderBuffering(3000);
  712. }
  713. else
  714. {
  715. // RestoreLostDevice
  716. CCullingManager::Instance().Update();
  717. if (m_pyGraphic.Begin())
  718. {
  719.  
  720. m_pyGraphic.ClearDepthBuffer();
  721.  
  722. #ifdef _DEBUG
  723. m_pyGraphic.SetClearColor(0.3f, 0.3f, 0.3f);
  724. m_pyGraphic.Clear();
  725. #endif
  726.  
  727. /////////////////////
  728. // Interface
  729. m_pyGraphic.SetInterfaceRenderState();
  730.  
  731. OnUIRender();
  732. OnMouseRender();
  733. /////////////////////
  734.  
  735. m_pyGraphic.End();
  736.  
  737. //DWORD t1 = ELTimer_GetMSec();
  738. m_pyGraphic.Show();
  739. //DWORD t2 = ELTimer_GetMSec();
  740.  
  741. DWORD dwRenderEndTime = ELTimer_GetMSec();
  742.  
  743. static DWORD s_dwRenderCheckTime = dwRenderEndTime;
  744. static DWORD s_dwRenderRangeTime = 0;
  745. static DWORD s_dwRenderRangeFrame = 0;
  746.  
  747. m_dwCurRenderTime = dwRenderEndTime - dwRenderStartTime;
  748. s_dwRenderRangeTime += m_dwCurRenderTime;
  749. ++s_dwRenderRangeFrame;
  750.  
  751. if (dwRenderEndTime-s_dwRenderCheckTime>1000)
  752. {
  753. m_fAveRenderTime=float(double(s_dwRenderRangeTime)/double(s_dwRenderRangeFrame));
  754.  
  755. s_dwRenderCheckTime=ELTimer_GetMSec();
  756. s_dwRenderRangeTime=0;
  757. s_dwRenderRangeFrame=0;
  758. }
  759.  
  760. DWORD dwCurFaceCount=m_pyGraphic.GetFaceCount();
  761. m_pyGraphic.ResetFaceCount();
  762. s_dwFaceCount += dwCurFaceCount;
  763.  
  764. if (dwCurFaceCount > 5000)
  765. {
  766. // 프레임 완충 처리
  767. if (dwRenderEndTime > m_dwBufSleepSkipTime)
  768. {
  769. static float s_fBufRenderTime = 0.0f;
  770.  
  771. float fCurRenderTime = m_dwCurRenderTime;
  772.  
  773. if (fCurRenderTime > s_fBufRenderTime)
  774. {
  775. float fRatio = fMAX(0.5f, (fCurRenderTime - s_fBufRenderTime) / 30.0f);
  776. s_fBufRenderTime = (s_fBufRenderTime * (100.0f - fRatio) + (fCurRenderTime + 5) * fRatio) / 100.0f;
  777. }
  778. else
  779. {
  780. float fRatio = 0.5f;
  781. s_fBufRenderTime = (s_fBufRenderTime * (100.0f - fRatio) + fCurRenderTime * fRatio) / 100.0f;
  782. }
  783.  
  784. // 한계치를 정한다
  785. if (s_fBufRenderTime > 100.0f)
  786. s_fBufRenderTime = 100.0f;
  787.  
  788. DWORD dwBufRenderTime = s_fBufRenderTime;
  789.  
  790. if (m_isWindowed)
  791. {
  792. if (dwBufRenderTime>58)
  793. dwBufRenderTime=64;
  794. else if (dwBufRenderTime>42)
  795. dwBufRenderTime=48;
  796. else if (dwBufRenderTime>26)
  797. dwBufRenderTime=32;
  798. else if (dwBufRenderTime>10)
  799. dwBufRenderTime=16;
  800. else
  801. dwBufRenderTime=8;
  802. }
  803.  
  804. // 일정 프레임 속도에 맞추어주는쪽에 눈에 편하다
  805. // 아래에서 한번 하면 ‰榮?
  806. //if (m_dwCurRenderTime<dwBufRenderTime)
  807. // Sleep(dwBufRenderTime-m_dwCurRenderTime);
  808.  
  809. m_fAveRenderTime=s_fBufRenderTime;
  810. }
  811.  
  812. m_dwFaceAccCount += dwCurFaceCount;
  813. m_dwFaceAccTime += m_dwCurRenderTime;
  814.  
  815. m_fFaceSpd=(m_dwFaceAccCount/m_dwFaceAccTime);
  816.  
  817. // 거리 자동 조절
  818. if (-1 == m_iForceSightRange)
  819. {
  820. static float s_fAveRenderTime = 16.0f;
  821. float fRatio=0.3f;
  822. s_fAveRenderTime=(s_fAveRenderTime*(100.0f-fRatio)+max(16.0f, m_dwCurRenderTime)*fRatio)/100.0f;
  823.  
  824.  
  825. float fFar=25600.0f;
  826. float fNear=MIN_FOG;
  827. double dbAvePow=double(1000.0f/s_fAveRenderTime);
  828. double dbMaxPow=60.0;
  829. float fDistance=max(fNear+(fFar-fNear)*(dbAvePow)/dbMaxPow, fNear);
  830. m_pyBackground.SetViewDistanceSet(0, fDistance);
  831. }
  832. // 거리 강제 설정시
  833. else
  834. {
  835. m_pyBackground.SetViewDistanceSet(0, float(m_iForceSightRange));
  836. }
  837. }
  838. else
  839. {
  840. // 10000 폴리곤 보다 적을때는 가장 멀리 보이게 한다
  841. m_pyBackground.SetViewDistanceSet(0, 25600.0f);
  842. }
  843.  
  844. ++s_dwRenderFrameCount;
  845. }
  846. }
  847. }
  848.  
  849. int rest = s_uiNextFrameTime - ELTimer_GetMSec();
  850.  
  851. if (rest > 0 && !bCurrentLateUpdate )
  852. {
  853. s_uiLoad -= rest; // 쉰 시간은 로드에서 뺀다..
  854. Sleep(rest);
  855. }
  856.  
  857. ++s_dwUpdateFrameCount;
  858.  
  859. s_uiLoad += ELTimer_GetMSec() - dwStart;
  860. //m_Profiler.ProfileByScreen();
  861. return true;
  862. }
  863.  
  864. void CPythonApplication::UpdateClientRect()
  865. {
  866. RECT rcApp;
  867. GetClientRect(&rcApp);
  868. OnSizeChange(rcApp.right - rcApp.left, rcApp.bottom - rcApp.top);
  869. }
  870.  
  871. void CPythonApplication::SetMouseHandler(PyObject* poMouseHandler)
  872. {
  873. m_poMouseHandler = poMouseHandler;
  874. }
  875.  
  876. int CPythonApplication::CheckDeviceState()
  877. {
  878. CGraphicDevice::EDeviceState e_deviceState = m_grpDevice.GetDeviceState();
  879.  
  880. switch (e_deviceState)
  881. {
  882. // 디바이스가 없으면 프로그램이 종료 되어야 한다.
  883. case CGraphicDevice::DEVICESTATE_NULL:
  884. return DEVICE_STATE_FALSE;
  885.  
  886. // DEVICESTATE_BROKEN일 때는 다음 루프에서 복구 될 수 있도록 리턴 한다.
  887. // 그냥 진행할 경우 DrawPrimitive 같은 것을 하면 프로그램이 터진다.
  888. case CGraphicDevice::DEVICESTATE_BROKEN:
  889. return DEVICE_STATE_SKIP;
  890.  
  891. case CGraphicDevice::DEVICESTATE_NEEDS_RESET:
  892. if (!m_grpDevice.Reset())
  893. return DEVICE_STATE_SKIP;
  894.  
  895. break;
  896. }
  897.  
  898. return DEVICE_STATE_OK;
  899. }
  900.  
  901. bool CPythonApplication::CreateDevice(int width, int height, int Windowed, int bit /* = 32*/, int frequency /* = 0*/)
  902. {
  903. int iRet;
  904.  
  905. m_grpDevice.InitBackBufferCount(2);
  906. m_grpDevice.RegisterWarningString(CGraphicDevice::CREATE_BAD_DRIVER, ApplicationStringTable_GetStringz(IDS_WARN_BAD_DRIVER, "WARN_BAD_DRIVER"));
  907. m_grpDevice.RegisterWarningString(CGraphicDevice::CREATE_NO_TNL, ApplicationStringTable_GetStringz(IDS_WARN_NO_TNL, "WARN_NO_TNL"));
  908.  
  909. iRet = m_grpDevice.Create(GetWindowHandle(), width, height, Windowed ? true : false, bit,frequency);
  910.  
  911. switch (iRet)
  912. {
  913. case CGraphicDevice::CREATE_OK:
  914. return true;
  915.  
  916. case CGraphicDevice::CREATE_REFRESHRATE:
  917. return true;
  918.  
  919. case CGraphicDevice::CREATE_ENUM:
  920. case CGraphicDevice::CREATE_DETECT:
  921. SET_EXCEPTION(CREATE_NO_APPROPRIATE_DEVICE);
  922. TraceError("CreateDevice: Enum & Detect failed");
  923. return false;
  924.  
  925. case CGraphicDevice::CREATE_NO_DIRECTX:
  926. //PyErr_SetString(PyExc_RuntimeError, "DirectX 8.1 or greater required to run game");
  927. SET_EXCEPTION(CREATE_NO_DIRECTX);
  928. TraceError("CreateDevice: DirectX 8.1 or greater required to run game");
  929. return false;
  930.  
  931. case CGraphicDevice::CREATE_DEVICE:
  932. //PyErr_SetString(PyExc_RuntimeError, "GraphicDevice create failed");
  933. SET_EXCEPTION(CREATE_DEVICE);
  934. TraceError("CreateDevice: GraphicDevice create failed");
  935. return false;
  936.  
  937. case CGraphicDevice::CREATE_FORMAT:
  938. SET_EXCEPTION(CREATE_FORMAT);
  939. TraceError("CreateDevice: Change the screen format");
  940. return false;
  941.  
  942. /*case CGraphicDevice::CREATE_GET_ADAPTER_DISPLAY_MODE:
  943. //PyErr_SetString(PyExc_RuntimeError, "GetAdapterDisplayMode failed");
  944. SET_EXCEPTION(CREATE_GET_ADAPTER_DISPLAY_MODE);
  945. TraceError("CreateDevice: GetAdapterDisplayMode failed");
  946. return false;*/
  947.  
  948. case CGraphicDevice::CREATE_GET_DEVICE_CAPS:
  949. PyErr_SetString(PyExc_RuntimeError, "GetDevCaps failed");
  950. TraceError("CreateDevice: GetDevCaps failed");
  951. return false;
  952.  
  953. case CGraphicDevice::CREATE_GET_DEVICE_CAPS2:
  954. PyErr_SetString(PyExc_RuntimeError, "GetDevCaps2 failed");
  955. TraceError("CreateDevice: GetDevCaps2 failed");
  956. return false;
  957.  
  958. default:
  959. if (iRet & CGraphicDevice::CREATE_OK)
  960. {
  961. //if (iRet & CGraphicDevice::CREATE_BAD_DRIVER)
  962. //{
  963. // LogBox(ApplicationStringTable_GetStringz(IDS_WARN_BAD_DRIVER), NULL, GetWindowHandle());
  964. //}
  965. if (iRet & CGraphicDevice::CREATE_NO_TNL)
  966. {
  967. CGrannyLODController::SetMinLODMode(true);
  968. //LogBox(ApplicationStringTable_GetStringz(IDS_WARN_NO_TNL), NULL, GetWindowHandle());
  969. }
  970. return true;
  971. }
  972.  
  973. //PyErr_SetString(PyExc_RuntimeError, "Unknown Error!");
  974. SET_EXCEPTION(UNKNOWN_ERROR);
  975. TraceError("CreateDevice: Unknown Error!");
  976. return false;
  977. }
  978. }
  979.  
  980. void CPythonApplication::Loop()
  981. {
  982. while (1)
  983. {
  984. if (IsMessage())
  985. {
  986. if (!MessageProcess())
  987. break;
  988. }
  989. else
  990. {
  991. if (!Process())
  992. break;
  993.  
  994. m_dwLastIdleTime=ELTimer_GetMSec();
  995. }
  996. }
  997. }
  998.  
  999. // SUPPORT_NEW_KOREA_SERVER
  1000. bool LoadLocaleData(const char* localePath)
  1001. {
  1002. NANOBEGIN
  1003. CPythonNonPlayer& rkNPCMgr = CPythonNonPlayer::Instance();
  1004. CItemManager& rkItemMgr = CItemManager::Instance();
  1005. CPythonSkill& rkSkillMgr = CPythonSkill::Instance();
  1006. CPythonNetworkStream& rkNetStream = CPythonNetworkStream::Instance();
  1007.  
  1008. char szItemList[256];
  1009. char szItemProto[256];
  1010. char szItemDesc[256];
  1011. char szMobProto[256];
  1012. char szSkillDescFileName[256];
  1013. char szSkillTableFileName[256];
  1014. char szInsultList[256];
  1015. snprintf(szItemList, sizeof(szItemList) , "%s/item_list.txt", localePath);
  1016. snprintf(szItemProto, sizeof(szItemProto), "%s/item_proto", localePath);
  1017. snprintf(szItemDesc, sizeof(szItemDesc), "%s/itemdesc.txt", localePath);
  1018. snprintf(szMobProto, sizeof(szMobProto), "%s/mob_proto", localePath);
  1019. snprintf(szSkillDescFileName, sizeof(szSkillDescFileName), "%s/SkillDesc.txt", localePath);
  1020. snprintf(szSkillTableFileName, sizeof(szSkillTableFileName), "%s/SkillTable.txt", localePath);
  1021. snprintf(szInsultList, sizeof(szInsultList), "%s/insult.txt", localePath);
  1022.  
  1023. rkNPCMgr.Destroy();
  1024. rkItemMgr.Destroy();
  1025. rkSkillMgr.Destroy();
  1026.  
  1027. if (!rkItemMgr.LoadItemList(szItemList))
  1028. {
  1029. TraceError("LoadLocaleData - LoadItemList(%s) Error", szItemList);
  1030. }
  1031.  
  1032. if (!rkItemMgr.LoadItemTable(szItemProto))
  1033. {
  1034. TraceError("LoadLocaleData - LoadItemProto(%s) Error", szItemProto);
  1035. return false;
  1036. }
  1037.  
  1038. if (!rkItemMgr.LoadItemDesc(szItemDesc))
  1039. {
  1040. Tracenf("LoadLocaleData - LoadItemDesc(%s) Error", szItemDesc);
  1041. }
  1042.  
  1043. if (!rkNPCMgr.LoadNonPlayerData(szMobProto))
  1044. {
  1045. TraceError("LoadLocaleData - LoadMobProto(%s) Error", szMobProto);
  1046. return false;
  1047. }
  1048.  
  1049. if (!rkSkillMgr.RegisterSkillDesc(szSkillDescFileName))
  1050. {
  1051. TraceError("LoadLocaleData - RegisterSkillDesc(%s) Error", szMobProto);
  1052. return false;
  1053. }
  1054.  
  1055. if (!rkSkillMgr.RegisterSkillTable(szSkillTableFileName))
  1056. {
  1057. TraceError("LoadLocaleData - RegisterSkillTable(%s) Error", szMobProto);
  1058. return false;
  1059. }
  1060.  
  1061. if (!rkNetStream.LoadInsultList(szInsultList))
  1062. {
  1063. Tracenf("CPythonApplication - CPythonNetworkStream::LoadInsultList(%s)", szInsultList);
  1064. }
  1065.  
  1066. if (LocaleService_IsYMIR())
  1067. {
  1068. char szEmpireTextConvFile[256];
  1069. for (DWORD dwEmpireID=1; dwEmpireID<=3; ++dwEmpireID)
  1070. {
  1071. sprintf(szEmpireTextConvFile, "%s/lang%d.cvt", localePath, dwEmpireID);
  1072. if (!rkNetStream.LoadConvertTable(dwEmpireID, szEmpireTextConvFile))
  1073. {
  1074. TraceError("LoadLocaleData - CPythonNetworkStream::LoadConvertTable(%d, %s) FAILURE", dwEmpireID, szEmpireTextConvFile);
  1075. }
  1076. }
  1077. }
  1078. #ifdef ENABLE_SASH_SYSTEM
  1079. char szItemScale[256];
  1080. snprintf(szItemScale, sizeof(szItemScale), "%s/item_scale.txt", localePath);
  1081. if (!rkItemMgr.LoadItemScale(szItemScale))
  1082. Tracenf("LoadLocaleData: error while loading %s.", szItemScale);
  1083. #endif
  1084. NANOEND
  1085. return true;
  1086. }
  1087. // END_OF_SUPPORT_NEW_KOREA_SERVER
  1088.  
  1089. unsigned __GetWindowMode(bool windowed)
  1090. {
  1091. if (windowed)
  1092. return WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;
  1093.  
  1094. return WS_POPUP;
  1095. }
  1096.  
  1097. bool CPythonApplication::Create(PyObject * poSelf, const char * c_szName, int width, int height, int Windowed)
  1098. {
  1099. NANOBEGIN
  1100. Windowed = CPythonSystem::Instance().IsWindowed() ? 1 : 0;
  1101.  
  1102. bool bAnotherWindow = false;
  1103.  
  1104. if (FindWindow(NULL, c_szName))
  1105. bAnotherWindow = true;
  1106.  
  1107. m_dwWidth = width;
  1108. m_dwHeight = height;
  1109.  
  1110. // Window
  1111. UINT WindowMode = __GetWindowMode(Windowed ? true : false);
  1112.  
  1113. if (!CMSWindow::Create(c_szName, 4, 0, WindowMode, ::LoadIcon( GetInstance(), MAKEINTRESOURCE( IDI_METIN2 ) ), IDC_CURSOR_NORMAL))
  1114. {
  1115. //PyErr_SetString(PyExc_RuntimeError, "CMSWindow::Create failed");
  1116. TraceError("CMSWindow::Create failed");
  1117. SET_EXCEPTION(CREATE_WINDOW);
  1118. return false;
  1119. }
  1120.  
  1121. #ifdef USE_NPROTECT_GAMEGUARD
  1122. if (!GameGuard_Run(CMSWindow::GetWindowHandle()))
  1123. return false;
  1124. #endif
  1125. #ifdef XTRAP_CLIENT_ENABLE
  1126. if (!XTrap_CheckInit())
  1127. return false;
  1128. #endif
  1129.  
  1130. if (m_pySystem.IsUseDefaultIME())
  1131. {
  1132. CPythonIME::Instance().UseDefaultIME();
  1133. }
  1134.  
  1135. // 풀스크린 모드이고
  1136. // 디폴트 IME 를 사용하거나 유럽 버전이면
  1137. // 윈도우 풀스크린 모드를 사용한다
  1138. if (!m_pySystem.IsWindowed() && (m_pySystem.IsUseDefaultIME() || LocaleService_IsEUROPE()))
  1139. {
  1140. m_isWindowed = false;
  1141. m_isWindowFullScreenEnable = TRUE;
  1142. __SetFullScreenWindow(GetWindowHandle(), width, height, m_pySystem.GetBPP());
  1143.  
  1144. Windowed = true;
  1145. }
  1146. else
  1147. {
  1148. AdjustSize(m_pySystem.GetWidth(), m_pySystem.GetHeight());
  1149.  
  1150. if (Windowed)
  1151. {
  1152. m_isWindowed = true;
  1153.  
  1154. if (bAnotherWindow)
  1155. {
  1156. RECT rc;
  1157.  
  1158. GetClientRect(&rc);
  1159.  
  1160. int windowWidth = rc.right - rc.left;
  1161. int windowHeight = (rc.bottom - rc.top);
  1162.  
  1163. CMSApplication::SetPosition(GetScreenWidth() - windowWidth, GetScreenHeight() - 60 - windowHeight);
  1164. }
  1165. }
  1166. else
  1167. {
  1168. m_isWindowed = false;
  1169. SetPosition(0, 0);
  1170. }
  1171. }
  1172.  
  1173. NANOEND
  1174. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1175. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1176.  
  1177. // Cursor
  1178. if (!CreateCursors())
  1179. {
  1180. //PyErr_SetString(PyExc_RuntimeError, "CMSWindow::Cursors Create Error");
  1181. TraceError("CMSWindow::Cursors Create Error");
  1182. SET_EXCEPTION("CREATE_CURSOR");
  1183. return false;
  1184. }
  1185.  
  1186. if (!m_pySystem.IsNoSoundCard())
  1187. {
  1188. // Sound
  1189. if (!m_SoundManager.Create())
  1190. {
  1191. // NOTE : 중국측의 요청으로 생략
  1192. // LogBox(ApplicationStringTable_GetStringz(IDS_WARN_NO_SOUND_DEVICE));
  1193. }
  1194. }
  1195.  
  1196. extern bool GRAPHICS_CAPS_SOFTWARE_TILING;
  1197.  
  1198. if (!m_pySystem.IsAutoTiling())
  1199. GRAPHICS_CAPS_SOFTWARE_TILING = m_pySystem.IsSoftwareTiling();
  1200.  
  1201. // Device
  1202. if (!CreateDevice(m_pySystem.GetWidth(), m_pySystem.GetHeight(), Windowed, m_pySystem.GetBPP(), m_pySystem.GetFrequency()))
  1203. return false;
  1204.  
  1205. GrannyCreateSharedDeformBuffer();
  1206.  
  1207. if (m_pySystem.IsAutoTiling())
  1208. {
  1209. if (m_grpDevice.IsFastTNL())
  1210. {
  1211. m_pyBackground.ReserveSoftwareTilingEnable(false);
  1212. }
  1213. else
  1214. {
  1215. m_pyBackground.ReserveSoftwareTilingEnable(true);
  1216. }
  1217. }
  1218. else
  1219. {
  1220. m_pyBackground.ReserveSoftwareTilingEnable(m_pySystem.IsSoftwareTiling());
  1221. }
  1222.  
  1223. SetVisibleMode(true);
  1224.  
  1225. if (m_isWindowFullScreenEnable) //m_pySystem.IsUseDefaultIME() && !m_pySystem.IsWindowed())
  1226. {
  1227. SetWindowPos(GetWindowHandle(), HWND_TOP, 0, 0, width, height, SWP_SHOWWINDOW);
  1228. }
  1229.  
  1230. if (!InitializeKeyboard(GetWindowHandle()))
  1231. return false;
  1232.  
  1233. m_pySystem.GetDisplaySettings();
  1234.  
  1235. // Mouse
  1236. if (m_pySystem.IsSoftwareCursor())
  1237. SetCursorMode(CURSOR_MODE_SOFTWARE);
  1238. else
  1239. SetCursorMode(CURSOR_MODE_HARDWARE);
  1240.  
  1241. // Network
  1242. if (!m_netDevice.Create())
  1243. {
  1244. //PyErr_SetString(PyExc_RuntimeError, "NetDevice::Create failed");
  1245. TraceError("NetDevice::Create failed");
  1246. SET_EXCEPTION("CREATE_NETWORK");
  1247. return false;
  1248. }
  1249.  
  1250. if (!m_grpDevice.IsFastTNL())
  1251. CGrannyLODController::SetMinLODMode(true);
  1252.  
  1253. m_pyItem.Create();
  1254.  
  1255. // Other Modules
  1256. DefaultFont_Startup();
  1257.  
  1258. CPythonIME::Instance().Create(GetWindowHandle());
  1259. CPythonIME::Instance().SetText("", 0);
  1260. CPythonTextTail::Instance().Initialize();
  1261.  
  1262. // Light Manager
  1263. m_LightManager.Initialize();
  1264.  
  1265. CGraphicImageInstance::CreateSystem(32);
  1266.  
  1267. // 백업
  1268. STICKYKEYS sStickKeys;
  1269. memset(&sStickKeys, 0, sizeof(sStickKeys));
  1270. sStickKeys.cbSize = sizeof(sStickKeys);
  1271. SystemParametersInfo( SPI_GETSTICKYKEYS, sizeof(sStickKeys), &sStickKeys, 0 );
  1272. m_dwStickyKeysFlag = sStickKeys.dwFlags;
  1273.  
  1274. // 설정
  1275. sStickKeys.dwFlags &= ~(SKF_AVAILABLE|SKF_HOTKEYACTIVE);
  1276. SystemParametersInfo( SPI_SETSTICKYKEYS, sizeof(sStickKeys), &sStickKeys, 0 );
  1277.  
  1278. // SphereMap
  1279. CGrannyMaterial::CreateSphereMap(0, "d:/ymir work/special/spheremap.jpg");
  1280. CGrannyMaterial::CreateSphereMap(1, "d:/ymir work/special/spheremap01.jpg");
  1281. return true;
  1282. }
  1283.  
  1284. void CPythonApplication::SetGlobalCenterPosition(LONG x, LONG y)
  1285. {
  1286. CPythonBackground& rkBG=CPythonBackground::Instance();
  1287. rkBG.GlobalPositionToLocalPosition(x, y);
  1288.  
  1289. float z = CPythonBackground::Instance().GetHeight(x, y);
  1290.  
  1291. CPythonApplication::Instance().SetCenterPosition(x, y, z);
  1292. }
  1293.  
  1294. void CPythonApplication::SetCenterPosition(float fx, float fy, float fz)
  1295. {
  1296. m_v3CenterPosition.x = +fx;
  1297. m_v3CenterPosition.y = -fy;
  1298. m_v3CenterPosition.z = +fz;
  1299. }
  1300.  
  1301. void CPythonApplication::GetCenterPosition(TPixelPosition * pPixelPosition)
  1302. {
  1303. pPixelPosition->x = +m_v3CenterPosition.x;
  1304. pPixelPosition->y = -m_v3CenterPosition.y;
  1305. pPixelPosition->z = +m_v3CenterPosition.z;
  1306. }
  1307.  
  1308.  
  1309. void CPythonApplication::SetServerTime(time_t tTime)
  1310. {
  1311. m_dwStartLocalTime = ELTimer_GetMSec();
  1312. m_tServerTime = tTime;
  1313. m_tLocalStartTime = time(0);
  1314. }
  1315.  
  1316. time_t CPythonApplication::GetServerTime()
  1317. {
  1318. return (ELTimer_GetMSec() - m_dwStartLocalTime) + m_tServerTime;
  1319. }
  1320.  
  1321. // 2005.03.28 - MALL 아이템에 들어있는 시간의 단위가 서버에서 time(0) 으로 만들어지는
  1322. // 값이기 때문에 단위를 맞추기 위해 시간 관련 처리를 별도로 추가
  1323. time_t CPythonApplication::GetServerTimeStamp()
  1324. {
  1325. return (time(0) - m_tLocalStartTime) + m_tServerTime;
  1326. }
  1327.  
  1328. float CPythonApplication::GetGlobalTime()
  1329. {
  1330. return m_fGlobalTime;
  1331. }
  1332.  
  1333. float CPythonApplication::GetGlobalElapsedTime()
  1334. {
  1335. return m_fGlobalElapsedTime;
  1336. }
  1337.  
  1338. void CPythonApplication::SetFPS(int iFPS)
  1339. {
  1340. m_iFPS = iFPS;
  1341. }
  1342.  
  1343. int CPythonApplication::GetWidth()
  1344. {
  1345. return m_dwWidth;
  1346. }
  1347.  
  1348. int CPythonApplication::GetHeight()
  1349. {
  1350. return m_dwHeight;
  1351. }
  1352.  
  1353. void CPythonApplication::SetConnectData(const char * c_szIP, int iPort)
  1354. {
  1355. m_strIP = c_szIP;
  1356. m_iPort = iPort;
  1357. }
  1358.  
  1359. void CPythonApplication::GetConnectData(std::string & rstIP, int & riPort)
  1360. {
  1361. rstIP = m_strIP;
  1362. riPort = m_iPort;
  1363. }
  1364.  
  1365. void CPythonApplication::EnableSpecialCameraMode()
  1366. {
  1367. m_isSpecialCameraMode = TRUE;
  1368. }
  1369.  
  1370. void CPythonApplication::SetCameraSpeed(int iPercentage)
  1371. {
  1372. m_fCameraRotateSpeed = c_fDefaultCameraRotateSpeed * float(iPercentage) / 100.0f;
  1373. m_fCameraPitchSpeed = c_fDefaultCameraPitchSpeed * float(iPercentage) / 100.0f;
  1374. m_fCameraZoomSpeed = c_fDefaultCameraZoomSpeed * float(iPercentage) / 100.0f;
  1375. }
  1376.  
  1377. void CPythonApplication::SetForceSightRange(int iRange)
  1378. {
  1379. m_iForceSightRange = iRange;
  1380. }
  1381.  
  1382. void CPythonApplication::Clear()
  1383. {
  1384. m_pySystem.Clear();
  1385. }
  1386.  
  1387. void CPythonApplication::Destroy()
  1388. {
  1389. WebBrowser_Destroy();
  1390.  
  1391. // SphereMap
  1392. CGrannyMaterial::DestroySphereMap();
  1393.  
  1394. m_kWndMgr.Destroy();
  1395.  
  1396. CPythonSystem::Instance().SaveConfig();
  1397.  
  1398. DestroyCollisionInstanceSystem();
  1399.  
  1400. m_pySystem.SaveInterfaceStatus();
  1401.  
  1402. m_pyEventManager.Destroy();
  1403. m_FlyingManager.Destroy();
  1404.  
  1405. m_pyMiniMap.Destroy();
  1406.  
  1407. m_pyTextTail.Destroy();
  1408. m_pyChat.Destroy();
  1409. m_kChrMgr.Destroy();
  1410. m_RaceManager.Destroy();
  1411.  
  1412. m_pyItem.Destroy();
  1413. m_kItemMgr.Destroy();
  1414.  
  1415. m_pyBackground.Destroy();
  1416.  
  1417. m_kEftMgr.Destroy();
  1418. m_LightManager.Destroy();
  1419.  
  1420. // DEFAULT_FONT
  1421. DefaultFont_Cleanup();
  1422. // END_OF_DEFAULT_FONT
  1423.  
  1424. GrannyDestroySharedDeformBuffer();
  1425.  
  1426. m_pyGraphic.Destroy();
  1427. //m_pyNetworkDatagram.Destroy();
  1428.  
  1429. m_pyRes.Destroy();
  1430.  
  1431. m_kGuildMarkDownloader.Disconnect();
  1432.  
  1433. CGrannyModelInstance::DestroySystem();
  1434. CGraphicImageInstance::DestroySystem();
  1435.  
  1436.  
  1437. m_SoundManager.Destroy();
  1438. m_grpDevice.Destroy();
  1439.  
  1440. // FIXME : 만들어져 있지 않음 - [levites]
  1441. //CSpeedTreeForestDirectX8::Instance().Clear();
  1442.  
  1443. CAttributeInstance::DestroySystem();
  1444. CTextFileLoader::DestroySystem();
  1445. DestroyCursors();
  1446.  
  1447. CMSApplication::Destroy();
  1448.  
  1449. STICKYKEYS sStickKeys;
  1450. memset(&sStickKeys, 0, sizeof(sStickKeys));
  1451. sStickKeys.cbSize = sizeof(sStickKeys);
  1452. sStickKeys.dwFlags = m_dwStickyKeysFlag;
  1453. SystemParametersInfo( SPI_SETSTICKYKEYS, sizeof(sStickKeys), &sStickKeys, 0 );
  1454. }
Add Comment
Please, Sign In to add comment