Guest User

pythonbackground

a guest
Nov 12th, 2024
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 24.47 KB | None | 0 0
  1. // PythonBackground.cpp: implementation of the CPythonBackground class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4.  
  5. #include "stdafx.h"
  6. #include "../eterlib/CullingManager.h"
  7. #include "../eterlib/Camera.h"
  8. #include "../eterPack/EterPackManager.h"
  9. #include "../gamelib/MapOutDoor.h"
  10. #include "../gamelib/PropertyLoader.h"
  11.  
  12. #include "PythonBackground.h"
  13. #include "PythonCharacterManager.h"
  14. #include "PythonNetworkStream.h"
  15. #include "PythonMiniMap.h"
  16. #include "PythonSystem.h"
  17.  
  18. std::string g_strEffectName = "d:/ymir work/effect/etc/direction/direction_land.mse";
  19.  
  20. #if defined(BL_PRIVATESHOP_SEARCH_SYSTEM)
  21. std::string g_strShopSearchEffectName = "d:/ymir work/effect/etc/direction/direction_land2.mse";
  22. #endif
  23.  
  24. DWORD CPythonBackground::GetRenderShadowTime()
  25. {
  26. return m_dwRenderShadowTime;
  27. }
  28.  
  29. bool CPythonBackground::SetVisiblePart(int eMapOutDoorPart, bool isVisible)
  30. {
  31. if (!m_pkMap)
  32. return false;
  33.  
  34. CMapOutdoor& rkMap=GetMapOutdoorRef();
  35. rkMap.SetVisiblePart(eMapOutDoorPart, isVisible);
  36. return true;
  37. }
  38.  
  39. void CPythonBackground::EnableTerrainOnlyForHeight()
  40. {
  41. if (!m_pkMap)
  42. return;
  43.  
  44. CMapOutdoor& rkMap=GetMapOutdoorRef();
  45. rkMap.EnableTerrainOnlyForHeight(TRUE);
  46. }
  47.  
  48. bool CPythonBackground::SetSplatLimit(int iSplatNum)
  49. {
  50. if (!m_pkMap)
  51. return false;
  52.  
  53. CMapOutdoor& rkMap = GetMapOutdoorRef();
  54. rkMap.SetSplatLimit(iSplatNum);
  55. return true;
  56. }
  57.  
  58. void CPythonBackground::CreateCharacterShadowTexture()
  59. {
  60. if (!m_pkMap)
  61. return;
  62.  
  63. CMapOutdoor& rkMap = GetMapOutdoorRef();
  64. rkMap.CreateCharacterShadowTexture();
  65. }
  66.  
  67. void CPythonBackground::ReleaseCharacterShadowTexture()
  68. {
  69. if (!m_pkMap)
  70. return;
  71.  
  72. CMapOutdoor& rkMap = GetMapOutdoorRef();
  73. rkMap.ReleaseCharacterShadowTexture();
  74. }
  75.  
  76. void CPythonBackground::RefreshShadowLevel()
  77. {
  78. SetShadowLevel(CPythonSystem::Instance().GetShadowLevel());
  79. }
  80.  
  81. bool CPythonBackground::SetShadowLevel(int eLevel)
  82. {
  83. if (!m_pkMap)
  84. return false;
  85.  
  86. if (m_eShadowLevel == eLevel)
  87. return true;
  88.  
  89. CMapOutdoor& rkMap = GetMapOutdoorRef();
  90.  
  91. m_eShadowLevel = eLevel;
  92.  
  93. switch (m_eShadowLevel)
  94. {
  95. case SHADOW_NONE:
  96. rkMap.SetDrawShadow(false);
  97. rkMap.SetShadowTextureSize(512);
  98. break;
  99.  
  100. case SHADOW_GROUND:
  101. rkMap.SetDrawShadow(true);
  102. rkMap.SetDrawCharacterShadow(false);
  103. rkMap.SetShadowTextureSize(512);
  104. break;
  105.  
  106. case SHADOW_GROUND_AND_SOLO:
  107. rkMap.SetDrawShadow(true);
  108. rkMap.SetDrawCharacterShadow(true);
  109. rkMap.SetShadowTextureSize(512);
  110. break;
  111.  
  112. case SHADOW_ALL:
  113. rkMap.SetDrawShadow(true);
  114. rkMap.SetDrawCharacterShadow(true);
  115. rkMap.SetShadowTextureSize(512);
  116. break;
  117.  
  118. case SHADOW_ALL_HIGH:
  119. rkMap.SetDrawShadow(true);
  120. rkMap.SetDrawCharacterShadow(true);
  121. rkMap.SetShadowTextureSize(1024);
  122. break;
  123.  
  124. case SHADOW_ALL_MAX:
  125. rkMap.SetDrawShadow(true);
  126. rkMap.SetDrawCharacterShadow(true);
  127. rkMap.SetShadowTextureSize(2048);
  128. break;
  129. }
  130.  
  131. return true;
  132. }
  133.  
  134. void CPythonBackground::SelectViewDistanceNum(int eNum)
  135. {
  136. if (!m_pkMap)
  137. return;
  138.  
  139. CMapOutdoor& rkMap=GetMapOutdoorRef();
  140.  
  141. if (!mc_pcurEnvironmentData)
  142. {
  143. TraceError("CPythonBackground::SelectViewDistanceNum(int eNum=%d) mc_pcurEnvironmentData is NULL", eNum);
  144. return;
  145. }
  146.  
  147. m_eViewDistanceNum = eNum;
  148.  
  149. TEnvironmentData * env = ((TEnvironmentData *) mc_pcurEnvironmentData);
  150.  
  151. // 게임 분위기를 바꿔놓을 수 있으므로 reserve로 되어있으면 고치지 않는다.
  152. if (env->bReserve)
  153. {
  154. env->m_fFogNearDistance = m_ViewDistanceSet[m_eViewDistanceNum].m_fFogStart;
  155. env->m_fFogFarDistance = m_ViewDistanceSet[m_eViewDistanceNum].m_fFogEnd;
  156. env->v3SkyBoxScale = m_ViewDistanceSet[m_eViewDistanceNum].m_v3SkyBoxScale;
  157. rkMap.SetEnvironmentSkyBox();
  158. }
  159. }
  160.  
  161. void CPythonBackground::SetViewDistanceSet(int eNum, float fFarClip)
  162. {
  163. if (!m_pkMap)
  164. return;
  165.  
  166. m_ViewDistanceSet[eNum].m_fFogStart = fFarClip * 0.5f;//0.3333333f;
  167. m_ViewDistanceSet[eNum].m_fFogEnd = fFarClip * 0.7f;//0.6666667f;
  168.  
  169. float fSkyBoxScale = fFarClip * 0.6f;//0.5773502f;
  170. m_ViewDistanceSet[eNum].m_v3SkyBoxScale = D3DXVECTOR3(fSkyBoxScale, fSkyBoxScale, fSkyBoxScale);
  171. m_ViewDistanceSet[eNum].m_fFarClip = fFarClip;
  172.  
  173. if (eNum == m_eViewDistanceNum)
  174. SelectViewDistanceNum(eNum);
  175. }
  176.  
  177. float CPythonBackground::GetFarClip()
  178. {
  179. if (!m_pkMap)
  180. return 50000.0f;
  181.  
  182. if (m_ViewDistanceSet[m_eViewDistanceNum].m_fFarClip==0.0f)
  183. {
  184. TraceError("CPythonBackground::GetFarClip m_eViewDistanceNum=%d", m_eViewDistanceNum);
  185. m_ViewDistanceSet[m_eViewDistanceNum].m_fFarClip=25600.0f;
  186. }
  187.  
  188. return m_ViewDistanceSet[m_eViewDistanceNum].m_fFarClip;
  189. }
  190.  
  191. void CPythonBackground::GetDistanceSetInfo(int * peNum, float * pfStart, float * pfEnd, float * pfFarClip)
  192. {
  193. if (!m_pkMap)
  194. {
  195. *peNum = 4;
  196. *pfStart= 10000.0f;
  197. *pfEnd= 15000.0f;
  198. *pfFarClip = 50000.0f;
  199. return;
  200. }
  201. *peNum = m_eViewDistanceNum;
  202. *pfStart = m_ViewDistanceSet[m_eViewDistanceNum].m_fFogStart;
  203. *pfEnd= m_ViewDistanceSet[m_eViewDistanceNum].m_fFogEnd;
  204. *pfFarClip = m_ViewDistanceSet[m_eViewDistanceNum].m_fFarClip;
  205. }
  206.  
  207. //////////////////////////////////////////////////////////////////////
  208. // Construction/Destruction
  209. //////////////////////////////////////////////////////////////////////
  210.  
  211. CPythonBackground::CPythonBackground()
  212. {
  213. m_dwRenderShadowTime=0;
  214. m_eViewDistanceNum=0;
  215. m_eViewDistanceNum=0;
  216. m_eViewDistanceNum=0;
  217. m_eShadowLevel=SHADOW_NONE;
  218. m_dwBaseX=0;
  219. m_dwBaseY=0;
  220. m_strMapName="";
  221. m_iDayMode = DAY_MODE_LIGHT;
  222. m_iXMasTreeGrade = 0;
  223. m_bVisibleGuildArea = FALSE;
  224.  
  225. SetViewDistanceSet(4, 25600.0f);
  226. SetViewDistanceSet(3, 25600.0f);
  227. SetViewDistanceSet(2, 25600.0f);
  228. SetViewDistanceSet(1, 25600.0f);
  229. SetViewDistanceSet(0, 25600.0f);
  230. Initialize();
  231. }
  232.  
  233. CPythonBackground::~CPythonBackground()
  234. {
  235. Tracen("CPythonBackground Clear");
  236. }
  237.  
  238. void CPythonBackground::Initialize()
  239. {
  240. std::string stAtlasInfoFileName (LocaleService_GetLocalePath());
  241. stAtlasInfoFileName += "/AtlasInfo.txt";
  242. SetAtlasInfoFileName(stAtlasInfoFileName.c_str());
  243. CMapManager::Initialize();
  244. }
  245.  
  246. void CPythonBackground::__CreateProperty()
  247. {
  248. if (CEterPackManager::SEARCH_FILE_FIRST == CEterPackManager::Instance().GetSearchMode() &&
  249. _access("property", 0) == 0)
  250. {
  251. m_PropertyManager.Initialize(NULL);
  252.  
  253. CPropertyLoader PropertyLoader;
  254. PropertyLoader.SetPropertyManager(&m_PropertyManager);
  255. PropertyLoader.Create("*.*", "Property");
  256. }
  257. else
  258. {
  259. m_PropertyManager.Initialize("pack/property");
  260. }
  261. }
  262.  
  263. //////////////////////////////////////////////////////////////////////
  264. // Normal Functions
  265. //////////////////////////////////////////////////////////////////////
  266.  
  267. bool CPythonBackground::GetPickingPoint(D3DXVECTOR3 * v3IntersectPt)
  268. {
  269. CMapOutdoor& rkMap=GetMapOutdoorRef();
  270. return rkMap.GetPickingPoint(v3IntersectPt);
  271. }
  272.  
  273. bool CPythonBackground::GetPickingPointWithRay(const CRay & rRay, D3DXVECTOR3 * v3IntersectPt)
  274. {
  275. CMapOutdoor& rkMap=GetMapOutdoorRef();
  276. return rkMap.GetPickingPointWithRay(rRay, v3IntersectPt);
  277. }
  278.  
  279. bool CPythonBackground::GetPickingPointWithRayOnlyTerrain(const CRay & rRay, D3DXVECTOR3 * v3IntersectPt)
  280. {
  281. CMapOutdoor& rkMap=GetMapOutdoorRef();
  282. return rkMap.GetPickingPointWithRayOnlyTerrain(rRay, v3IntersectPt);
  283. }
  284.  
  285. BOOL CPythonBackground::GetLightDirection(D3DXVECTOR3 & rv3LightDirection)
  286. {
  287. if (!mc_pcurEnvironmentData)
  288. return FALSE;
  289.  
  290. rv3LightDirection.x = mc_pcurEnvironmentData->DirLights[ENV_DIRLIGHT_BACKGROUND].Direction.x;
  291. rv3LightDirection.y = mc_pcurEnvironmentData->DirLights[ENV_DIRLIGHT_BACKGROUND].Direction.y;
  292. rv3LightDirection.z = mc_pcurEnvironmentData->DirLights[ENV_DIRLIGHT_BACKGROUND].Direction.z;
  293. return TRUE;
  294. }
  295.  
  296. //////////////////////////////////////////////////////////////////////
  297. // Construction/Destruction
  298. //////////////////////////////////////////////////////////////////////
  299. void CPythonBackground::Destroy()
  300. {
  301. CMapManager::Destroy();
  302. m_SnowEnvironment.Destroy();
  303. m_bVisibleGuildArea = FALSE;
  304. }
  305.  
  306. void CPythonBackground::Create()
  307. {
  308. static int s_isCreateProperty=false;
  309.  
  310. if (!s_isCreateProperty)
  311. {
  312. s_isCreateProperty=true;
  313. __CreateProperty();
  314. }
  315.  
  316. CMapManager::Create();
  317.  
  318. m_SnowEnvironment.Create();
  319. }
  320.  
  321. struct FGetPortalID
  322. {
  323. float m_fRequestX, m_fRequestY;
  324. std::set<int> m_kSet_iPortalID;
  325. FGetPortalID(float fRequestX, float fRequestY)
  326. {
  327. m_fRequestX=fRequestX;
  328. m_fRequestY=fRequestY;
  329. }
  330. void operator () (CGraphicObjectInstance * pObject)
  331. {
  332. for (int i = 0; i < PORTAL_ID_MAX_NUM; ++i)
  333. {
  334. int iID = pObject->GetPortal(i);
  335. if (0 == iID)
  336. break;
  337.  
  338. m_kSet_iPortalID.insert(iID);
  339. }
  340. }
  341. };
  342.  
  343. void CPythonBackground::Update(float fCenterX, float fCenterY, float fCenterZ)
  344. {
  345. if (!IsMapReady())
  346. return;
  347. #ifdef __PERFORMANCE_CHECKER__
  348. DWORD t1=ELTimer_GetMSec();
  349. #endif
  350. UpdateMap(fCenterX, fCenterY, fCenterZ);
  351. #ifdef __PERFORMANCE_CHECKER__
  352. DWORD t2=ELTimer_GetMSec();
  353. #endif
  354. UpdateAroundAmbience(fCenterX, fCenterY, fCenterZ);
  355. #ifdef __PERFORMANCE_CHECKER__
  356. DWORD t3=ELTimer_GetMSec();
  357. #endif
  358. m_SnowEnvironment.Update(D3DXVECTOR3(fCenterX, -fCenterY, fCenterZ));
  359.  
  360. #ifdef __PERFORMANCE_CHECKER__
  361. {
  362. static FILE* fp=fopen("perf_bg_update.txt", "w");
  363. if (t3-t1>5)
  364. {
  365. fprintf(fp, "BG.Total %d (Time %f)\n", t3-t1, ELTimer_GetMSec()/1000.0f);
  366. fprintf(fp, "BG.UpdateMap %d\n", t2-t1);
  367. fprintf(fp, "BG.UpdateAmb %d\n", t3-t2);
  368. fflush(fp);
  369. }
  370. }
  371. #endif
  372.  
  373. // Portal Process
  374. CMapOutdoor& rkMap=GetMapOutdoorRef();
  375. if (rkMap.IsEnablePortal())
  376. {
  377. CCullingManager & rkCullingMgr = CCullingManager::Instance();
  378. FGetPortalID kGetPortalID(fCenterX, -fCenterY);
  379.  
  380. Vector3d aVector3d;
  381. aVector3d.Set(fCenterX, -fCenterY, fCenterZ);
  382.  
  383. Vector3d toTop;
  384. toTop.Set(0, 0, 25000.0f);
  385.  
  386. rkCullingMgr.ForInRay(aVector3d, toTop, &kGetPortalID);
  387.  
  388. std::set<int>::iterator itor = kGetPortalID.m_kSet_iPortalID.begin();
  389. if (!__IsSame(kGetPortalID.m_kSet_iPortalID, m_kSet_iShowingPortalID))
  390. {
  391. ClearPortal();
  392. std::set<int>::iterator itor=kGetPortalID.m_kSet_iPortalID.begin();
  393. for (; itor!=kGetPortalID.m_kSet_iPortalID.end(); ++itor)
  394. {
  395. AddShowingPortalID(*itor);
  396. }
  397. RefreshPortal();
  398.  
  399. m_kSet_iShowingPortalID = kGetPortalID.m_kSet_iPortalID;
  400. }
  401. }
  402.  
  403. // Target Effect Process
  404. {
  405. std::map<DWORD, DWORD>::iterator itor = m_kMap_dwTargetID_dwChrID.begin();
  406. for (; itor != m_kMap_dwTargetID_dwChrID.end(); ++itor)
  407. {
  408. DWORD dwTargetID = itor->first;
  409. DWORD dwChrID = itor->second;
  410.  
  411. CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(dwChrID);
  412.  
  413. if (!pInstance)
  414. continue;
  415.  
  416. TPixelPosition kPixelPosition;
  417. pInstance->NEW_GetPixelPosition(&kPixelPosition);
  418.  
  419. CreateSpecialEffect(dwTargetID,
  420. +kPixelPosition.x,
  421. -kPixelPosition.y,
  422. +kPixelPosition.z,
  423. g_strEffectName.c_str());
  424. }
  425. }
  426.  
  427. // Reserve Target Effect
  428. {
  429. std::map<DWORD, SReserveTargetEffect>::iterator itor = m_kMap_dwID_kReserveTargetEffect.begin();
  430. for (; itor != m_kMap_dwID_kReserveTargetEffect.end();)
  431. {
  432. DWORD dwID = itor->first;
  433. SReserveTargetEffect & rReserveTargetEffect = itor->second;
  434.  
  435. float ilx = float(rReserveTargetEffect.ilx);
  436. float ily = float(rReserveTargetEffect.ily);
  437.  
  438. float fHeight = rkMap.GetHeight(ilx, ily);
  439. if (0.0f == fHeight)
  440. {
  441. ++itor;
  442. continue;
  443. }
  444.  
  445. CreateSpecialEffect(dwID, ilx, ily, fHeight, g_strEffectName.c_str());
  446.  
  447. itor = m_kMap_dwID_kReserveTargetEffect.erase(itor);
  448. }
  449. }
  450. #if defined(BL_PRIVATESHOP_SEARCH_SYSTEM)
  451. for (const auto& itor : m_kMap_dwTargetID_dwChrIDShopSearch)
  452. {
  453. CInstanceBase* pInstance = CPythonCharacterManager::Instance().GetInstancePtr(itor.second);
  454. if (!pInstance)
  455. continue;
  456. TPixelPosition kPixelPosition;
  457. pInstance->NEW_GetPixelPosition(&kPixelPosition);
  458. CreateSpecialEffect(itor.first, +kPixelPosition.x, -kPixelPosition.y, +kPixelPosition.z, g_strShopSearchEffectName.c_str());
  459. }
  460. for (auto itor = m_kMap_dwID_kReserveTargetEffectShopSearch.begin(); itor != m_kMap_dwID_kReserveTargetEffectShopSearch.end();)
  461. {
  462. const SReserveTargetEffect& rReserveTargetEffect = itor->second;
  463. const auto ilx = static_cast<float>(rReserveTargetEffect.ilx);
  464. const auto ily = static_cast<float>(rReserveTargetEffect.ily);
  465. const auto fHeight = rkMap.GetHeight(ilx, ily);
  466. if (0.0f == fHeight) {
  467. ++itor;
  468. continue;
  469. }
  470. CreateSpecialEffect(itor->first, ilx, ily, fHeight, g_strShopSearchEffectName.c_str());
  471. itor = m_kMap_dwID_kReserveTargetEffectShopSearch.erase(itor);
  472. }
  473. #endif
  474. }
  475.  
  476. bool CPythonBackground::__IsSame(std::set<int> & rleft, std::set<int> & rright)
  477. {
  478. std::set<int>::iterator itor_l;
  479. std::set<int>::iterator itor_r;
  480.  
  481. for (itor_l=rleft.begin(); itor_l!=rleft.end(); ++itor_l)
  482. {
  483. if (rright.end() == rright.find(*itor_l))
  484. return false;
  485. }
  486.  
  487. for (itor_r=rright.begin(); itor_r!=rright.end(); ++itor_r)
  488. {
  489. if (rleft.end() == rleft.find(*itor_r))
  490. return false;
  491. }
  492.  
  493. return true;
  494. }
  495.  
  496. void CPythonBackground::Render()
  497. {
  498. if (!IsMapReady())
  499. return;
  500.  
  501. m_SnowEnvironment.Deform();
  502.  
  503. CMapOutdoor& rkMap=GetMapOutdoorRef();
  504. rkMap.Render();
  505. if (m_bVisibleGuildArea)
  506. rkMap.RenderMarkedArea();
  507. }
  508.  
  509. void CPythonBackground::RenderSnow()
  510. {
  511. m_SnowEnvironment.Render();
  512. }
  513.  
  514. void CPythonBackground::RenderPCBlocker()
  515. {
  516. if (!IsMapReady())
  517. return;
  518.  
  519. CMapOutdoor& rkMap=GetMapOutdoorRef();
  520. rkMap.RenderPCBlocker();
  521. }
  522.  
  523. void CPythonBackground::RenderCollision()
  524. {
  525. if (!IsMapReady())
  526. return;
  527.  
  528. CMapOutdoor& rkMap=GetMapOutdoorRef();
  529. rkMap.RenderCollision();
  530. }
  531.  
  532. void CPythonBackground::RenderCharacterShadowToTexture()
  533. {
  534. extern bool GRAPHICS_CAPS_CAN_NOT_DRAW_SHADOW;
  535. if (GRAPHICS_CAPS_CAN_NOT_DRAW_SHADOW)
  536. return;
  537.  
  538. if (!IsMapReady())
  539. return;
  540.  
  541. CMapOutdoor& rkMap=GetMapOutdoorRef();
  542. DWORD t1=ELTimer_GetMSec();
  543.  
  544. if (m_eShadowLevel == SHADOW_ALL ||
  545. m_eShadowLevel == SHADOW_ALL_HIGH ||
  546. m_eShadowLevel == SHADOW_ALL_MAX ||
  547. m_eShadowLevel == SHADOW_GROUND_AND_SOLO)
  548. {
  549. D3DXMATRIX matWorld;
  550. STATEMANAGER.GetTransform(D3DTS_WORLD, &matWorld);
  551.  
  552. bool canRender=rkMap.BeginRenderCharacterShadowToTexture();
  553. if (canRender)
  554. {
  555. CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
  556.  
  557. if (m_eShadowLevel == SHADOW_GROUND_AND_SOLO)
  558. rkChrMgr.RenderShadowMainInstance();
  559. else
  560. rkChrMgr.RenderShadowAllInstances();
  561. }
  562. rkMap.EndRenderCharacterShadowToTexture();
  563.  
  564. STATEMANAGER.SetTransform(D3DTS_WORLD, &matWorld);
  565. }
  566.  
  567. DWORD t2=ELTimer_GetMSec();
  568.  
  569. m_dwRenderShadowTime=t2-t1;
  570. }
  571.  
  572. inline float Interpolate(float fStart, float fEnd, float fPercent)
  573. {
  574. return fStart + (fEnd - fStart) * fPercent;
  575. }
  576. struct CollisionChecker
  577. {
  578. bool isBlocked;
  579. CInstanceBase* pInstance;
  580. CollisionChecker(CInstanceBase* pInstance) : pInstance(pInstance), isBlocked(false) {}
  581. void operator () (CGraphicObjectInstance* pOpponent)
  582. {
  583. if (isBlocked)
  584. return;
  585.  
  586. if (!pOpponent)
  587. return;
  588.  
  589. if (pInstance->IsBlockObject(*pOpponent))
  590. isBlocked=true;
  591. }
  592. };
  593.  
  594. struct CollisionAdjustChecker
  595. {
  596. bool isBlocked;
  597. CInstanceBase* pInstance;
  598. CollisionAdjustChecker(CInstanceBase* pInstance) : pInstance(pInstance), isBlocked(false) {}
  599. void operator () (CGraphicObjectInstance* pOpponent)
  600. {
  601. if (!pOpponent)
  602. return;
  603.  
  604. if (pInstance->AvoidObject(*pOpponent))
  605. isBlocked=true;
  606. }
  607. };
  608.  
  609. bool CPythonBackground::CheckAdvancing(CInstanceBase * pInstance)
  610. {
  611. if (!IsMapReady())
  612. return true;
  613.  
  614. Vector3d center;
  615. float radius;
  616. pInstance->GetGraphicThingInstanceRef().GetBoundingSphere(center,radius);
  617.  
  618. CCullingManager & rkCullingMgr = CCullingManager::Instance();
  619.  
  620. CollisionAdjustChecker kCollisionAdjustChecker(pInstance);
  621. rkCullingMgr.ForInRange(center, radius, &kCollisionAdjustChecker);
  622. if (kCollisionAdjustChecker.isBlocked)
  623. {
  624. CollisionChecker kCollisionChecker(pInstance);
  625. rkCullingMgr.ForInRange(center, radius, &kCollisionChecker);
  626. if (kCollisionChecker.isBlocked)
  627. {
  628. pInstance->BlockMovement();
  629. return true;
  630. }
  631. else
  632. {
  633. pInstance->NEW_MoveToDestPixelPositionDirection(pInstance->NEW_GetDstPixelPositionRef());
  634. }
  635. return false;
  636. }
  637. return false;
  638. }
  639.  
  640. void CPythonBackground::RenderSky()
  641. {
  642. if (!IsMapReady())
  643. return;
  644.  
  645. CMapOutdoor& rkMap=GetMapOutdoorRef();
  646. rkMap.RenderSky();
  647. }
  648.  
  649. void CPythonBackground::RenderCloud()
  650. {
  651. if (!IsMapReady())
  652. return;
  653.  
  654. CMapOutdoor& rkMap=GetMapOutdoorRef();
  655. rkMap.RenderCloud();
  656. }
  657.  
  658. void CPythonBackground::RenderWater()
  659. {
  660. if (!IsMapReady())
  661. return;
  662.  
  663. CMapOutdoor& rkMap=GetMapOutdoorRef();
  664. rkMap.RenderWater();
  665. }
  666.  
  667. void CPythonBackground::RenderEffect()
  668. {
  669. if (!IsMapReady())
  670. return;
  671.  
  672. CMapOutdoor& rkMap=GetMapOutdoorRef();
  673. rkMap.RenderEffect();
  674. }
  675.  
  676. void CPythonBackground::RenderBeforeLensFlare()
  677. {
  678. if (!IsMapReady())
  679. return;
  680.  
  681. CMapOutdoor& rkMap=GetMapOutdoorRef();
  682. rkMap.RenderBeforeLensFlare();
  683. }
  684.  
  685. void CPythonBackground::RenderAfterLensFlare()
  686. {
  687. if (!IsMapReady())
  688. return;
  689.  
  690. CMapOutdoor& rkMap=GetMapOutdoorRef();
  691. rkMap.RenderAfterLensFlare();
  692. }
  693.  
  694. void CPythonBackground::ClearGuildArea()
  695. {
  696. if (!IsMapReady())
  697. return;
  698.  
  699. CMapOutdoor& rkMap=GetMapOutdoorRef();
  700. rkMap.ClearGuildArea();
  701. }
  702.  
  703. void CPythonBackground::RegisterGuildArea(int isx, int isy, int iex, int iey)
  704. {
  705. if (!IsMapReady())
  706. return;
  707.  
  708. CMapOutdoor& rkMap=GetMapOutdoorRef();
  709. rkMap.RegisterGuildArea(isx, isy, iex, iey);
  710. }
  711.  
  712. void CPythonBackground::SetCharacterDirLight()
  713. {
  714. if (!IsMapReady())
  715. return;
  716.  
  717. if (!mc_pcurEnvironmentData)
  718. return;
  719.  
  720. STATEMANAGER.SetLight(0, &mc_pcurEnvironmentData->DirLights[ENV_DIRLIGHT_CHARACTER]);
  721. }
  722.  
  723. void CPythonBackground::SetBackgroundDirLight()
  724. {
  725. if (!IsMapReady())
  726. return;
  727. if (!mc_pcurEnvironmentData)
  728. return;
  729.  
  730. STATEMANAGER.SetLight(0, &mc_pcurEnvironmentData->DirLights[ENV_DIRLIGHT_BACKGROUND]);
  731. }
  732.  
  733. void CPythonBackground::GlobalPositionToLocalPosition(LONG& rGlobalX, LONG& rGlobalY)
  734. {
  735. rGlobalX-=m_dwBaseX;
  736. rGlobalY-=m_dwBaseY;
  737. }
  738.  
  739. void CPythonBackground::LocalPositionToGlobalPosition(LONG& rLocalX, LONG& rLocalY)
  740. {
  741. rLocalX+=m_dwBaseX;
  742. rLocalY+=m_dwBaseY;
  743. }
  744.  
  745. void CPythonBackground::RegisterDungeonMapName(const char * c_szMapName)
  746. {
  747. m_kSet_strDungeonMapName.insert(c_szMapName);
  748. }
  749.  
  750. CPythonBackground::TMapInfo* CPythonBackground::GlobalPositionToMapInfo(DWORD dwGlobalX, DWORD dwGlobalY)
  751. {
  752. TMapInfoVector::iterator f = std::find_if(m_kVct_kMapInfo.begin(), m_kVct_kMapInfo.end(), FFindWarpMapName(dwGlobalX, dwGlobalY));
  753. if (f == m_kVct_kMapInfo.end())
  754. return NULL;
  755.  
  756. return &(*f);
  757. }
  758.  
  759. void CPythonBackground::Warp(DWORD dwX, DWORD dwY)
  760. {
  761. TMapInfo* pkMapInfo = GlobalPositionToMapInfo(dwX, dwY);
  762. if (!pkMapInfo)
  763. {
  764. TraceError("NOT_FOUND_GLOBAL_POSITION(%d, %d)", dwX, dwY);
  765. return;
  766. }
  767.  
  768. RefreshShadowLevel();
  769. TMapInfo & rMapInfo = *pkMapInfo;
  770. assert( (dwX >= rMapInfo.m_dwBaseX) && (dwY >= rMapInfo.m_dwBaseY) );
  771.  
  772. if (!LoadMap(rMapInfo.m_strName, float(dwX - rMapInfo.m_dwBaseX), float(dwY - rMapInfo.m_dwBaseY), 0))
  773. {
  774. // LOAD_MAP_ERROR_HANDLING
  775. PostQuitMessage(0);
  776. // END_OF_LOAD_MAP_ERROR_HANDLING
  777. return;
  778. }
  779.  
  780. CPythonMiniMap::Instance().LoadAtlas();
  781.  
  782. m_dwBaseX=rMapInfo.m_dwBaseX;
  783. m_dwBaseY=rMapInfo.m_dwBaseY;
  784.  
  785. m_strMapName = rMapInfo.m_strName;
  786.  
  787. SetXMaxTree(m_iXMasTreeGrade);
  788.  
  789. if (m_kSet_strDungeonMapName.end() != m_kSet_strDungeonMapName.find(m_strMapName))
  790. {
  791. EnableTerrainOnlyForHeight();
  792.  
  793. CMapOutdoor& rkMap=GetMapOutdoorRef();
  794. rkMap.EnablePortal(TRUE);
  795. }
  796.  
  797. m_kSet_iShowingPortalID.clear();
  798. m_kMap_dwTargetID_dwChrID.clear();
  799. m_kMap_dwID_kReserveTargetEffect.clear();
  800. #if defined(BL_PRIVATESHOP_SEARCH_SYSTEM)
  801. m_kMap_dwTargetID_dwChrIDShopSearch.clear();
  802. m_kMap_dwID_kReserveTargetEffectShopSearch.clear();
  803. #endif
  804. }
  805.  
  806. void CPythonBackground::VisibleGuildArea()
  807. {
  808. if (!IsMapReady())
  809. return;
  810.  
  811. CMapOutdoor& rkMap=GetMapOutdoorRef();
  812. rkMap.VisibleMarkedArea();
  813.  
  814. m_bVisibleGuildArea = TRUE;
  815. }
  816.  
  817. void CPythonBackground::DisableGuildArea()
  818. {
  819. if (!IsMapReady())
  820. return;
  821.  
  822. CMapOutdoor& rkMap=GetMapOutdoorRef();
  823. rkMap.DisableMarkedArea();
  824.  
  825. m_bVisibleGuildArea = FALSE;
  826. }
  827.  
  828. const char * CPythonBackground::GetWarpMapName()
  829. {
  830. return m_strMapName.c_str();
  831. }
  832.  
  833. void CPythonBackground::ChangeToDay()
  834. {
  835. m_iDayMode = DAY_MODE_LIGHT;
  836. }
  837.  
  838. void CPythonBackground::ChangeToNight()
  839. {
  840. m_iDayMode = DAY_MODE_DARK;
  841. }
  842.  
  843. void CPythonBackground::EnableSnowEnvironment()
  844. {
  845. m_SnowEnvironment.Enable();
  846. }
  847.  
  848. void CPythonBackground::DisableSnowEnvironment()
  849. {
  850. m_SnowEnvironment.Disable();
  851. }
  852.  
  853. const D3DXVECTOR3 c_v3TreePos = D3DXVECTOR3(76500.0f, -60900.0f, 20215.0f);
  854.  
  855. void CPythonBackground::SetXMaxTree(int iGrade)
  856. {
  857. if (!m_pkMap)
  858. return;
  859.  
  860. assert(iGrade >= 0 && iGrade <= 3);
  861. m_iXMasTreeGrade = iGrade;
  862.  
  863. CMapOutdoor& rkMap=GetMapOutdoorRef();
  864.  
  865. if ("map_n_snowm_01" != m_strMapName)
  866. {
  867. rkMap.XMasTree_Destroy();
  868. return;
  869. }
  870.  
  871. if (0 == iGrade)
  872. {
  873. rkMap.XMasTree_Destroy();
  874. return;
  875. }
  876.  
  877. //////////////////////////////////////////////////////////////////////
  878.  
  879. iGrade -= 1;
  880. iGrade = max(iGrade, 0);
  881. iGrade = min(iGrade, 2);
  882.  
  883. static std::string s_strTreeName[3] = {
  884. "d:/ymir work/tree/christmastree1.spt",
  885. "d:/ymir work/tree/christmastree2.spt",
  886. "d:/ymir work/tree/christmastree3.spt"
  887. };
  888. static std::string s_strEffectName[3] = {
  889. "d:/ymir work/effect/etc/christmas_tree/tree_1s.mse",
  890. "d:/ymir work/effect/etc/christmas_tree/tree_2s.mse",
  891. "d:/ymir work/effect/etc/christmas_tree/tree_3s.mse",
  892. };
  893. rkMap.XMasTree_Set(c_v3TreePos.x, c_v3TreePos.y, c_v3TreePos.z, s_strTreeName[iGrade].c_str(), s_strEffectName[iGrade].c_str());
  894. }
  895.  
  896. void CPythonBackground::CreateTargetEffect(DWORD dwID, DWORD dwChrVID)
  897. {
  898. m_kMap_dwTargetID_dwChrID.insert(std::make_pair(dwID, dwChrVID));
  899. }
  900.  
  901. void CPythonBackground::CreateTargetEffect(DWORD dwID, long lx, long ly)
  902. {
  903. if (m_kMap_dwTargetID_dwChrID.end() != m_kMap_dwTargetID_dwChrID.find(dwID))
  904. return;
  905.  
  906. CMapOutdoor& rkMap=GetMapOutdoorRef();
  907.  
  908. DWORD dwBaseX;
  909. DWORD dwBaseY;
  910. rkMap.GetBaseXY(&dwBaseX, &dwBaseY);
  911.  
  912. int ilx = +(lx-int(dwBaseX));
  913. int ily = -(ly-int(dwBaseY));
  914.  
  915. float fHeight = rkMap.GetHeight(float(ilx), float(ily));
  916.  
  917. if (0.0f == fHeight)
  918. {
  919. SReserveTargetEffect ReserveTargetEffect;
  920. ReserveTargetEffect.ilx = ilx;
  921. ReserveTargetEffect.ily = ily;
  922. m_kMap_dwID_kReserveTargetEffect.insert(std::make_pair(dwID, ReserveTargetEffect));
  923. return;
  924. }
  925.  
  926. CreateSpecialEffect(dwID, ilx, ily, fHeight, g_strEffectName.c_str());
  927. }
  928.  
  929. void CPythonBackground::DeleteTargetEffect(DWORD dwID)
  930. {
  931. if (m_kMap_dwID_kReserveTargetEffect.end() != m_kMap_dwID_kReserveTargetEffect.find(dwID))
  932. {
  933. m_kMap_dwID_kReserveTargetEffect.erase(dwID);
  934. }
  935. if (m_kMap_dwTargetID_dwChrID.end() != m_kMap_dwTargetID_dwChrID.find(dwID))
  936. {
  937. m_kMap_dwTargetID_dwChrID.erase(dwID);
  938. }
  939. #if defined(BL_PRIVATESHOP_SEARCH_SYSTEM)
  940. if (m_kMap_dwID_kReserveTargetEffectShopSearch.end() != m_kMap_dwID_kReserveTargetEffectShopSearch.find(dwID))
  941. m_kMap_dwID_kReserveTargetEffectShopSearch.erase(dwID);
  942. if (m_kMap_dwTargetID_dwChrIDShopSearch.end() != m_kMap_dwTargetID_dwChrIDShopSearch.find(dwID))
  943. m_kMap_dwTargetID_dwChrIDShopSearch.erase(dwID);
  944. #endif
  945. DeleteSpecialEffect(dwID);
  946. }
  947.  
  948. void CPythonBackground::CreateSpecialEffect(DWORD dwID, float fx, float fy, float fz, const char * c_szFileName)
  949. {
  950. CMapOutdoor& rkMap=GetMapOutdoorRef();
  951. rkMap.SpecialEffect_Create(dwID, fx, fy, fz, c_szFileName);
  952. }
  953.  
  954. void CPythonBackground::DeleteSpecialEffect(DWORD dwID)
  955. {
  956. CMapOutdoor& rkMap=GetMapOutdoorRef();
  957. rkMap.SpecialEffect_Delete(dwID);
  958. }
  959.  
  960. #if defined(BL_PRIVATESHOP_SEARCH_SYSTEM)
  961. void CPythonBackground::CreateShopSearchTargetEffect(DWORD dwID, DWORD dwChrVID)
  962. {
  963. m_kMap_dwTargetID_dwChrIDShopSearch.emplace(dwID, dwChrVID);
  964. }
  965. void CPythonBackground::CreateShopSearchTargetEffect(DWORD dwID, long lx, long ly)
  966. {
  967. if (m_kMap_dwTargetID_dwChrIDShopSearch.end() != m_kMap_dwTargetID_dwChrIDShopSearch.find(dwID))
  968. return;
  969.  
  970. CMapOutdoor& rkMap = GetMapOutdoorRef();
  971. DWORD dwBaseX, dwBaseY;
  972. rkMap.GetBaseXY(&dwBaseX, &dwBaseY);
  973.  
  974. const auto ilx = +static_cast<float>(lx - static_cast<decltype(lx)>(dwBaseX));
  975. const auto ily = -static_cast<float>(ly - static_cast<decltype(ly)>(dwBaseY));
  976. const auto fHeight = rkMap.GetHeight(ilx, ily);
  977.  
  978. if (0.0f == fHeight) {
  979. SReserveTargetEffect ReserveTargetEffect{ static_cast<int>(ilx), static_cast<int>(ily) };
  980. m_kMap_dwID_kReserveTargetEffectShopSearch.emplace(dwID, ReserveTargetEffect);
  981. return;
  982. }
  983.  
  984. CreateSpecialEffect(dwID, ilx, ily, fHeight, g_strShopSearchEffectName.c_str());
  985. }
  986. #endif
Advertisement
Add Comment
Please, Sign In to add comment