1. //
  2. // ij¸¯Å͸¦ µû¶ó´Ù´Ï´Â ÅؽºÆ® °ü·Ã ¼Ò½º (À̸§, ±æµåÀ̸§, ±æµå¸¶Å© µî)
  3. //
  4. #include "stdafx.h"
  5. #include "InstanceBase.h"
  6. #include "resource.h"
  7. #include "PythonTextTail.h"
  8. #include "PythonCharacterManager.h"
  9. #include "PythonGuild.h"
  10. #include "Locale.h"
  11. #include "MarkManager.h"
  12. const D3DXCOLOR c_TextTail_Player_Color = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
  13. const D3DXCOLOR c_TextTail_Monster_Color = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);
  14. const D3DXCOLOR c_TextTail_Item_Color = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
  15. const D3DXCOLOR c_TextTail_Chat_Color = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
  16. const D3DXCOLOR c_TextTail_Info_Color = D3DXCOLOR(1.0f, 0.785f, 0.785f, 1.0f);
  17. const D3DXCOLOR c_TextTail_Guild_Name_Color = 0xFFEFD3FF;
  18. const float c_TextTail_Name_Position = -10.0f;
  19. const float c_fxMarkPosition = 1.5f;
  20. const float c_fyGuildNamePosition = 15.0f;
  21. const float c_fyMarkPosition = 15.0f + 11.0f;
  22. BOOL bPKTitleEnable = TRUE;
  23. // TEXTTAIL_LIVINGTIME_CONTROL
  24. long gs_TextTail_LivingTime = 5000;
  25. long TextTail_GetLivingTime()
  26. {
  27. assert(gs_TextTail_LivingTime>1000);
  28. return gs_TextTail_LivingTime;
  29. }
  30. void TextTail_SetLivingTime(long livingTime)
  31. {
  32. gs_TextTail_LivingTime = livingTime;
  33. }
  34. // END_OF_TEXTTAIL_LIVINGTIME_CONTROL
  35. CGraphicText * ms_pFont = NULL;
  36. void CPythonTextTail::GetInfo(std::string* pstInfo)
  37. {
  38. char szInfo[256];
  39. sprintf(szInfo, "TextTail: ChatTail %d, ChrTail (Map %d, List %d), ItemTail (Map %d, List %d), Pool %d",
  40. m_ChatTailMap.size(),
  41. m_CharacterTextTailMap.size(), m_CharacterTextTailList.size(),
  42. m_ItemTextTailMap.size(), m_ItemTextTailList.size(),
  43. m_TextTailPool.GetCapacity());
  44. pstInfo->append(szInfo);
  45. }
  46. void CPythonTextTail::UpdateAllTextTail()
  47. {
  48. CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetMainInstancePtr();
  49. if (pInstance)
  50. {
  51. TPixelPosition pixelPos;
  52. pInstance->NEW_GetPixelPosition(&pixelPos);
  53. TTextTailMap::iterator itorMap;
  54. for (itorMap = m_CharacterTextTailMap.begin(); itorMap != m_CharacterTextTailMap.end(); ++itorMap)
  55. {
  56. UpdateDistance(pixelPos, itorMap->second);
  57. }
  58. for (itorMap = m_ItemTextTailMap.begin(); itorMap != m_ItemTextTailMap.end(); ++itorMap)
  59. {
  60. UpdateDistance(pixelPos, itorMap->second);
  61. }
  62. for (TChatTailMap::iterator itorChat=m_ChatTailMap.begin(); itorChat!=m_ChatTailMap.end(); ++itorChat)
  63. {
  64. UpdateDistance(pixelPos, itorChat->second);
  65. // NOTE : Chat TextTailÀÌ ÀÖÀ¸¸é ij¸¯ÅÍ À̸§µµ Ãâ·ÂÇÑ´Ù.
  66. if (itorChat->second->bNameFlag)
  67. {
  68. DWORD dwVID = itorChat->first;
  69. ShowCharacterTextTail(dwVID);
  70. }
  71. }
  72. }
  73. }
  74. void CPythonTextTail::UpdateShowingTextTail()
  75. {
  76. TTextTailList::iterator itor;
  77. for (itor = m_ItemTextTailList.begin(); itor != m_ItemTextTailList.end(); ++itor)
  78. {
  79. UpdateTextTail(*itor);
  80. }
  81. for (TChatTailMap::iterator itorChat=m_ChatTailMap.begin(); itorChat!=m_ChatTailMap.end(); ++itorChat)
  82. {
  83. UpdateTextTail(itorChat->second);
  84. }
  85. for (itor = m_CharacterTextTailList.begin(); itor != m_CharacterTextTailList.end(); ++itor)
  86. {
  87. TTextTail * pTextTail = *itor;
  88. UpdateTextTail(pTextTail);
  89. // NOTE : Chat TextTailÀÌ ÀÖÀ» °æ¿ì À§Ä¡¸¦ ¹Ù²Û´Ù.
  90. TChatTailMap::iterator itor = m_ChatTailMap.find(pTextTail->dwVirtualID);
  91. if (m_ChatTailMap.end() != itor)
  92. {
  93. TTextTail * pChatTail = itor->second;
  94. if (pChatTail->bNameFlag)
  95. {
  96. pTextTail->y = pChatTail->y - 17.0f;
  97. }
  98. }
  99. }
  100. }
  101. void CPythonTextTail::UpdateTextTail(TTextTail * pTextTail)
  102. {
  103. if (!pTextTail->pOwner)
  104. return;
  105. /////
  106. CPythonGraphic & rpyGraphic = CPythonGraphic::Instance();
  107. rpyGraphic.Identity();
  108. const D3DXVECTOR3 & c_rv3Position = pTextTail->pOwner->GetPosition();
  109. rpyGraphic.ProjectPosition(c_rv3Position.x,
  110. c_rv3Position.y,
  111. c_rv3Position.z + pTextTail->fHeight,
  112. &pTextTail->x,
  113. &pTextTail->y,
  114. &pTextTail->z);
  115. pTextTail->x = floorf(pTextTail->x);
  116. pTextTail->y = floorf(pTextTail->y);
  117. // NOTE : 13m ¹Û¿¡ ÀÖÀ»¶§¸¸ ±íÀ̸¦ ³Ö½À´Ï´Ù - [levites]
  118. if (pTextTail->fDistanceFromPlayer < 1300.0f)
  119. {
  120. pTextTail->z = 0.0f;
  121. }
  122. else
  123. {
  124. pTextTail->z = pTextTail->z * CPythonGraphic::Instance().GetOrthoDepth() * -1.0f;
  125. pTextTail->z += 10.0f;
  126. }
  127. }
  128. void CPythonTextTail::ArrangeTextTail()
  129. {
  130. TTextTailList::iterator itor;
  131. TTextTailList::iterator itorCompare;
  132. DWORD dwTime = CTimer::Instance().GetCurrentMillisecond();
  133. for (itor = m_ItemTextTailList.begin(); itor != m_ItemTextTailList.end(); ++itor)
  134. {
  135. TTextTail * pInsertTextTail = *itor;
  136. int yTemp = 5;
  137. int LimitCount = 0;
  138. for (itorCompare = m_ItemTextTailList.begin(); itorCompare != m_ItemTextTailList.end();)
  139. {
  140. TTextTail * pCompareTextTail = *itorCompare;
  141. if (*itorCompare == *itor)
  142. {
  143. ++itorCompare;
  144. continue;
  145. }
  146. if (LimitCount >= 20)
  147. break;
  148. if (isIn(pInsertTextTail, pCompareTextTail))
  149. {
  150. pInsertTextTail->y = (pCompareTextTail->y + pCompareTextTail->yEnd + yTemp);
  151. itorCompare = m_ItemTextTailList.begin();
  152. ++LimitCount;
  153. continue;
  154. }
  155. ++itorCompare;
  156. }
  157. if (pInsertTextTail->pOwnerTextInstance)
  158. {
  159. pInsertTextTail->pOwnerTextInstance->SetPosition(pInsertTextTail->x, pInsertTextTail->y, pInsertTextTail->z);
  160. pInsertTextTail->pOwnerTextInstance->Update();
  161. pInsertTextTail->pTextInstance->SetColor(pInsertTextTail->Color.r, pInsertTextTail->Color.g, pInsertTextTail->Color.b);
  162. pInsertTextTail->pTextInstance->SetPosition(pInsertTextTail->x, pInsertTextTail->y + 15.0f, pInsertTextTail->z);
  163. pInsertTextTail->pTextInstance->Update();
  164. }
  165. else
  166. {
  167. pInsertTextTail->pTextInstance->SetColor(pInsertTextTail->Color.r, pInsertTextTail->Color.g, pInsertTextTail->Color.b);
  168. pInsertTextTail->pTextInstance->SetPosition(pInsertTextTail->x, pInsertTextTail->y, pInsertTextTail->z);
  169. pInsertTextTail->pTextInstance->Update();
  170. }
  171. }
  172. for (itor = m_CharacterTextTailList.begin(); itor != m_CharacterTextTailList.end(); ++itor)
  173. {
  174. TTextTail * pTextTail = *itor;
  175. float fxAdd = 0.0f;
  176. // Mark À§Ä¡ ¾÷µ¥ÀÌÆ®
  177. CGraphicMarkInstance * pMarkInstance = pTextTail->pMarkInstance;
  178. CGraphicTextInstance * pGuildNameInstance = pTextTail->pGuildNameTextInstance;
  179. if (pMarkInstance && pGuildNameInstance)
  180. {
  181. int iWidth, iHeight;
  182. int iImageHalfSize = pMarkInstance->GetWidth()/2 + c_fxMarkPosition;
  183. pGuildNameInstance->GetTextSize(&iWidth, &iHeight);
  184. pMarkInstance->SetPosition(pTextTail->x - iWidth/2 - iImageHalfSize, pTextTail->y - c_fyMarkPosition);
  185. pGuildNameInstance->SetPosition(pTextTail->x + iImageHalfSize, pTextTail->y - c_fyGuildNamePosition, pTextTail->z);
  186. pGuildNameInstance->Update();
  187. }
  188. int iNameWidth, iNameHeight;
  189. pTextTail->pTextInstance->GetTextSize(&iNameWidth, &iNameHeight);
  190. // Title À§Ä¡ ¾÷µ¥ÀÌÆ®
  191. CGraphicTextInstance * pTitle = pTextTail->pTitleTextInstance;
  192. if (pTitle)
  193. {
  194. int iTitleWidth, iTitleHeight;
  195. pTitle->GetTextSize(&iTitleWidth, &iTitleHeight);
  196. fxAdd = 8.0f;
  197. if (LocaleService_IsEUROPE()) // µ¶ÀϾî´Â ¸íĪÀÌ ±æ¾î ¿À¸¥Á¤·Ä
  198. {
  199. if( GetDefaultCodePage() == CP_ARABIC )
  200. {
  201. pTitle->SetPosition(pTextTail->x - (iNameWidth / 2) - iTitleWidth - 4.0f, pTextTail->y, pTextTail->z);
  202. }
  203. else
  204. {
  205. pTitle->SetPosition(pTextTail->x - (iNameWidth / 2), pTextTail->y, pTextTail->z);
  206. }
  207. }
  208. else
  209. {
  210. pTitle->SetPosition(pTextTail->x - (iNameWidth / 2) - fxAdd, pTextTail->y, pTextTail->z);
  211. }
  212. pTitle->Update();
  213. // Level À§Ä¡ ¾÷µ¥ÀÌÆ®
  214. CGraphicTextInstance * pLevel = pTextTail->pLevelTextInstance;
  215. if (pLevel)
  216. {
  217. int iLevelWidth, iLevelHeight;
  218. pLevel->GetTextSize(&iLevelWidth, &iLevelHeight);
  219. if (LocaleService_IsEUROPE()) // µ¶ÀϾî´Â ¸íĪÀÌ ±æ¾î ¿À¸¥Á¤·Ä
  220. {
  221. if( GetDefaultCodePage() == CP_ARABIC )
  222. {
  223. pLevel->SetPosition(pTextTail->x - (iNameWidth / 2) - iLevelWidth - iTitleWidth - 8.0f, pTextTail->y, pTextTail->z);
  224. }
  225. else
  226. {
  227. pLevel->SetPosition(pTextTail->x - (iNameWidth / 2) - iTitleWidth, pTextTail->y, pTextTail->z);
  228. }
  229. }
  230. else
  231. {
  232. pLevel->SetPosition(pTextTail->x - (iNameWidth / 2) - fxAdd - iTitleWidth, pTextTail->y, pTextTail->z);
  233. }
  234. pLevel->Update();
  235. }
  236. }
  237. else
  238. {
  239. fxAdd = 4.0f;
  240. // Level À§Ä¡ ¾÷µ¥ÀÌÆ®
  241. CGraphicTextInstance * pLevel = pTextTail->pLevelTextInstance;
  242. if (pLevel)
  243. {
  244. int iLevelWidth, iLevelHeight;
  245. pLevel->GetTextSize(&iLevelWidth, &iLevelHeight);
  246. if (LocaleService_IsEUROPE()) // µ¶ÀϾî´Â ¸íĪÀÌ ±æ¾î ¿À¸¥Á¤·Ä
  247. {
  248. if( GetDefaultCodePage() == CP_ARABIC )
  249. {
  250. pLevel->SetPosition(pTextTail->x - (iNameWidth / 2) - iLevelWidth - 4.0f, pTextTail->y, pTextTail->z);
  251. }
  252. else
  253. {
  254. pLevel->SetPosition(pTextTail->x - (iNameWidth / 2), pTextTail->y, pTextTail->z);
  255. }
  256. }
  257. else
  258. {
  259. pLevel->SetPosition(pTextTail->x - (iNameWidth / 2) - fxAdd, pTextTail->y, pTextTail->z);
  260. }
  261. pLevel->Update();
  262. }
  263. }
  264. pTextTail->pTextInstance->SetColor(pTextTail->Color.r, pTextTail->Color.g, pTextTail->Color.b);
  265. pTextTail->pTextInstance->SetPosition(pTextTail->x + fxAdd, pTextTail->y, pTextTail->z);
  266. pTextTail->pTextInstance->Update();
  267. }
  268. for (TChatTailMap::iterator itorChat=m_ChatTailMap.begin(); itorChat!=m_ChatTailMap.end();)
  269. {
  270. TTextTail * pTextTail = itorChat->second;
  271. if (pTextTail->LivingTime < dwTime)
  272. {
  273. DeleteTextTail(pTextTail);
  274. itorChat = m_ChatTailMap.erase(itorChat);
  275. continue;
  276. }
  277. else
  278. ++itorChat;
  279. pTextTail->pTextInstance->SetColor(pTextTail->Color);
  280. pTextTail->pTextInstance->SetPosition(pTextTail->x, pTextTail->y, pTextTail->z);
  281. pTextTail->pTextInstance->Update();
  282. }
  283. }
  284. void CPythonTextTail::Render()
  285. {
  286. TTextTailList::iterator itor;
  287. for (itor = m_CharacterTextTailList.begin(); itor != m_CharacterTextTailList.end(); ++itor)
  288. {
  289. TTextTail * pTextTail = *itor;
  290. pTextTail->pTextInstance->Render();
  291. if (pTextTail->pMarkInstance && pTextTail->pGuildNameTextInstance)
  292. {
  293. pTextTail->pMarkInstance->Render();
  294. pTextTail->pGuildNameTextInstance->Render();
  295. }
  296. if (pTextTail->pTitleTextInstance)
  297. {
  298. pTextTail->pTitleTextInstance->Render();
  299. }
  300. if (pTextTail->pLevelTextInstance)
  301. {
  302. pTextTail->pLevelTextInstance->Render();
  303. }
  304. }
  305. for (itor = m_ItemTextTailList.begin(); itor != m_ItemTextTailList.end(); ++itor)
  306. {
  307. TTextTail * pTextTail = *itor;
  308. RenderTextTailBox(pTextTail);
  309. pTextTail->pTextInstance->Render();
  310. if (pTextTail->pOwnerTextInstance)
  311. pTextTail->pOwnerTextInstance->Render();
  312. }
  313. for (TChatTailMap::iterator itorChat = m_ChatTailMap.begin(); itorChat!=m_ChatTailMap.end(); ++itorChat)
  314. {
  315. TTextTail * pTextTail = itorChat->second;
  316. if (pTextTail->pOwner->isShow())
  317. RenderTextTailName(pTextTail);
  318. }
  319. }
  320. void CPythonTextTail::RenderTextTailBox(TTextTail * pTextTail)
  321. {
  322. // °ËÀº»ö Å׵θ®
  323. CPythonGraphic::Instance().SetDiffuseColor(0.0f, 0.0f, 0.0f, 1.0f);
  324. CPythonGraphic::Instance().RenderBox2d(pTextTail->x + pTextTail->xStart,
  325. pTextTail->y + pTextTail->yStart,
  326. pTextTail->x + pTextTail->xEnd,
  327. pTextTail->y + pTextTail->yEnd,
  328. pTextTail->z);
  329. // °ËÀº»ö Åõ¸í¹Ú½º
  330. CPythonGraphic::Instance().SetDiffuseColor(0.0f, 0.0f, 0.0f, 0.3f);
  331. CPythonGraphic::Instance().RenderBar2d(pTextTail->x + pTextTail->xStart,
  332. pTextTail->y + pTextTail->yStart,
  333. pTextTail->x + pTextTail->xEnd,
  334. pTextTail->y + pTextTail->yEnd,
  335. pTextTail->z);
  336. }
  337. void CPythonTextTail::RenderTextTailName(TTextTail * pTextTail)
  338. {
  339. pTextTail->pTextInstance->Render();
  340. }
  341. void CPythonTextTail::HideAllTextTail()
  342. {
  343. // NOTE : Show AllÀ» ÇØÁØµÚ Hide AllÀ» ÇØÁÖÁö ¾ÊÀ¸¸é ¹®Á¦ ¹ß»ı °¡´É¼º ÀÖÀ½
  344. // µğÀÚÀÎ ÀÚü°¡ ±×·¸°Ô ±ò²ûÇÏ°Ô µÇÁö ¾Ê¾ÒÀ½ - [levites]
  345. m_CharacterTextTailList.clear();
  346. m_ItemTextTailList.clear();
  347. }
  348. void CPythonTextTail::UpdateDistance(const TPixelPosition & c_rCenterPosition, TTextTail * pTextTail)
  349. {
  350. const D3DXVECTOR3 & c_rv3Position = pTextTail->pOwner->GetPosition();
  351. D3DXVECTOR2 v2Distance(c_rv3Position.x - c_rCenterPosition.x, -c_rv3Position.y - c_rCenterPosition.y);
  352. pTextTail->fDistanceFromPlayer = D3DXVec2Length(&v2Distance);
  353. }
  354. void CPythonTextTail::ShowAllTextTail()
  355. {
  356. TTextTailMap::iterator itor;
  357. for (itor = m_CharacterTextTailMap.begin(); itor != m_CharacterTextTailMap.end(); ++itor)
  358. {
  359. TTextTail * pTextTail = itor->second;
  360. if (pTextTail->fDistanceFromPlayer < 3500.0f)
  361. ShowCharacterTextTail(itor->first);
  362. }
  363. for (itor = m_ItemTextTailMap.begin(); itor != m_ItemTextTailMap.end(); ++itor)
  364. {
  365. TTextTail * pTextTail = itor->second;
  366. if (pTextTail->fDistanceFromPlayer < 3500.0f)
  367. ShowItemTextTail(itor->first);
  368. }
  369. }
  370. void CPythonTextTail::ShowCharacterTextTail(DWORD VirtualID)
  371. {
  372. TTextTailMap::iterator itor = m_CharacterTextTailMap.find(VirtualID);
  373. if (m_CharacterTextTailMap.end() == itor)
  374. return;
  375. TTextTail * pTextTail = itor->second;
  376. if (m_CharacterTextTailList.end() != std::find(m_CharacterTextTailList.begin(), m_CharacterTextTailList.end(), pTextTail))
  377. {
  378. //Tracef("ÀÌ¹Ì ¸®½ºÆ®¿¡ ÀÖÀ½ : %d\n", VirtualID);
  379. return;
  380. }
  381. // NOTE : ShowAll ½Ã¿¡´Â ¸ğµç Instance ÀÇ Pointer ¸¦ ã¾Æ¼­ üũÇϹǷΠºÎÇÏ°¡ °É¸± °¡´É¼ºµµ ÀÖ´Ù.
  382. // CInstanceBase °¡ TextTail À» Á÷Á¢ °¡Áö°í ÀÖ´Â °ÍÀÌ °¡Àå ÁÁÀº ÇüÅÂÀÏ µí..
  383. if (!pTextTail->pOwner->isShow())
  384. return;
  385. CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(pTextTail->dwVirtualID);
  386. if (!pInstance)
  387. return;
  388. if (pInstance->IsGuildWall())
  389. return;
  390. if (pInstance->CanPickInstance())
  391. m_CharacterTextTailList.push_back(pTextTail);
  392. }
  393. void CPythonTextTail::ShowItemTextTail(DWORD VirtualID)
  394. {
  395. TTextTailMap::iterator itor = m_ItemTextTailMap.find(VirtualID);
  396. if (m_ItemTextTailMap.end() == itor)
  397. return;
  398. TTextTail * pTextTail = itor->second;
  399. if (m_ItemTextTailList.end() != std::find(m_ItemTextTailList.begin(), m_ItemTextTailList.end(), pTextTail))
  400. {
  401. //Tracef("ÀÌ¹Ì ¸®½ºÆ®¿¡ ÀÖÀ½ : %d\n", VirtualID);
  402. return;
  403. }
  404. m_ItemTextTailList.push_back(pTextTail);
  405. }
  406. bool CPythonTextTail::isIn(CPythonTextTail::TTextTail * pSource, CPythonTextTail::TTextTail * pTarget)
  407. {
  408. float x1Source = pSource->x + pSource->xStart;
  409. float y1Source = pSource->y + pSource->yStart;
  410. float x2Source = pSource->x + pSource->xEnd;
  411. float y2Source = pSource->y + pSource->yEnd;
  412. float x1Target = pTarget->x + pTarget->xStart;
  413. float y1Target = pTarget->y + pTarget->yStart;
  414. float x2Target = pTarget->x + pTarget->xEnd;
  415. float y2Target = pTarget->y + pTarget->yEnd;
  416. if (x1Source <= x2Target && x2Source >= x1Target &&
  417. y1Source <= y2Target && y2Source >= y1Target)
  418. {
  419. return true;
  420. }
  421. return false;
  422. }
  423. void CPythonTextTail::RegisterCharacterTextTail(DWORD dwGuildID, DWORD dwVirtualID, const D3DXCOLOR & c_rColor, float fAddHeight)
  424. {
  425. CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetInstancePtr(dwVirtualID);
  426. if (!pCharacterInstance)
  427. return;
  428. TTextTail * pTextTail = RegisterTextTail(dwVirtualID,
  429. pCharacterInstance->GetNameString(),
  430. pCharacterInstance->GetGraphicThingInstancePtr(),
  431. pCharacterInstance->GetGraphicThingInstanceRef().GetHeight() + fAddHeight,
  432. c_rColor);
  433. CGraphicTextInstance * pTextInstance = pTextTail->pTextInstance;
  434. pTextInstance->SetOutline(true);
  435. pTextInstance->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
  436. pTextTail->pMarkInstance=NULL;
  437. pTextTail->pGuildNameTextInstance=NULL;
  438. pTextTail->pTitleTextInstance=NULL;
  439. pTextTail->pLevelTextInstance=NULL;
  440. if (0 != dwGuildID)
  441. {
  442. pTextTail->pMarkInstance = CGraphicMarkInstance::New();
  443. DWORD dwMarkID = CGuildMarkManager::Instance().GetMarkID(dwGuildID);
  444. if (dwMarkID != CGuildMarkManager::INVALID_MARK_ID)
  445. {
  446. std::string markImagePath;
  447. if (CGuildMarkManager::Instance().GetMarkImageFilename(dwMarkID / CGuildMarkImage::MARK_TOTAL_COUNT, markImagePath))
  448. {
  449. pTextTail->pMarkInstance->SetImageFileName(markImagePath.c_str());
  450. pTextTail->pMarkInstance->Load();
  451. pTextTail->pMarkInstance->SetIndex(dwMarkID % CGuildMarkImage::MARK_TOTAL_COUNT);
  452. }
  453. }
  454. std::string strGuildName;
  455. if (!CPythonGuild::Instance().GetGuildName(dwGuildID, &strGuildName))
  456. strGuildName = ".......";
  457. CGraphicTextInstance *& prGuildNameInstance = pTextTail->pGuildNameTextInstance;
  458. prGuildNameInstance = CGraphicTextInstance::New();
  459. prGuildNameInstance->SetTextPointer(ms_pFont);
  460. prGuildNameInstance->SetOutline(true);
  461. prGuildNameInstance->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
  462. prGuildNameInstance->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
  463. prGuildNameInstance->SetValue(strGuildName.c_str());
  464. prGuildNameInstance->SetColor(c_TextTail_Guild_Name_Color.r, c_TextTail_Guild_Name_Color.g, c_TextTail_Guild_Name_Color.b);
  465. prGuildNameInstance->Update();
  466. }
  467. m_CharacterTextTailMap.insert(TTextTailMap::value_type(dwVirtualID, pTextTail));
  468. }
  469. void CPythonTextTail::RegisterItemTextTail(DWORD VirtualID, const char * c_szText, CGraphicObjectInstance * pOwner)
  470. {
  471. #ifdef __DEBUG
  472. char szName[256];
  473. spritnf(szName, "%s[%d]", c_szText, VirtualID);
  474. TTextTail * pTextTail = RegisterTextTail(VirtualID, c_szText, pOwner, c_TextTail_Name_Position, c_TextTail_Item_Color);
  475. m_ItemTextTailMap.insert(TTextTailMap::value_type(VirtualID, pTextTail));
  476. #else
  477. TTextTail * pTextTail = RegisterTextTail(VirtualID, c_szText, pOwner, c_TextTail_Name_Position, c_TextTail_Item_Color);
  478. m_ItemTextTailMap.insert(TTextTailMap::value_type(VirtualID, pTextTail));
  479. #endif
  480. }
  481. void CPythonTextTail::RegisterChatTail(DWORD VirtualID, const char * c_szChat)
  482. {
  483. CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetInstancePtr(VirtualID);
  484. if (!pCharacterInstance)
  485. return;
  486. TChatTailMap::iterator itor = m_ChatTailMap.find(VirtualID);
  487. if (m_ChatTailMap.end() != itor)
  488. {
  489. TTextTail * pTextTail = itor->second;
  490. pTextTail->pTextInstance->SetValue(c_szChat);
  491. pTextTail->pTextInstance->Update();
  492. pTextTail->Color = c_TextTail_Chat_Color;
  493. pTextTail->pTextInstance->SetColor(c_TextTail_Chat_Color);
  494. // TEXTTAIL_LIVINGTIME_CONTROL
  495. pTextTail->LivingTime = CTimer::Instance().GetCurrentMillisecond() + TextTail_GetLivingTime();
  496. // END_OF_TEXTTAIL_LIVINGTIME_CONTROL
  497. pTextTail->bNameFlag = TRUE;
  498. return;
  499. }
  500. TTextTail * pTextTail = RegisterTextTail(VirtualID,
  501. c_szChat,
  502. pCharacterInstance->GetGraphicThingInstancePtr(),
  503. pCharacterInstance->GetGraphicThingInstanceRef().GetHeight() + 10.0f,
  504. c_TextTail_Chat_Color);
  505. // TEXTTAIL_LIVINGTIME_CONTROL
  506. pTextTail->LivingTime = CTimer::Instance().GetCurrentMillisecond() + TextTail_GetLivingTime();
  507. // END_OF_TEXTTAIL_LIVINGTIME_CONTROL
  508. pTextTail->bNameFlag = TRUE;
  509. pTextTail->pTextInstance->SetOutline(true);
  510. pTextTail->pTextInstance->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
  511. m_ChatTailMap.insert(TTextTailMap::value_type(VirtualID, pTextTail));
  512. }
  513. void CPythonTextTail::RegisterInfoTail(DWORD VirtualID, const char * c_szChat)
  514. {
  515. CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetInstancePtr(VirtualID);
  516. if (!pCharacterInstance)
  517. return;
  518. TChatTailMap::iterator itor = m_ChatTailMap.find(VirtualID);
  519. if (m_ChatTailMap.end() != itor)
  520. {
  521. TTextTail * pTextTail = itor->second;
  522. pTextTail->pTextInstance->SetValue(c_szChat);
  523. pTextTail->pTextInstance->Update();
  524. pTextTail->Color = c_TextTail_Info_Color;
  525. pTextTail->pTextInstance->SetColor(c_TextTail_Info_Color);
  526. // TEXTTAIL_LIVINGTIME_CONTROL
  527. pTextTail->LivingTime = CTimer::Instance().GetCurrentMillisecond() + TextTail_GetLivingTime();
  528. // END_OF_TEXTTAIL_LIVINGTIME_CONTROL
  529. pTextTail->bNameFlag = FALSE;
  530. return;
  531. }
  532. TTextTail * pTextTail = RegisterTextTail(VirtualID,
  533. c_szChat,
  534. pCharacterInstance->GetGraphicThingInstancePtr(),
  535. pCharacterInstance->GetGraphicThingInstanceRef().GetHeight() + 10.0f,
  536. c_TextTail_Info_Color);
  537. // TEXTTAIL_LIVINGTIME_CONTROL
  538. pTextTail->LivingTime = CTimer::Instance().GetCurrentMillisecond() + TextTail_GetLivingTime();
  539. // END_OF_TEXTTAIL_LIVINGTIME_CONTROL
  540. pTextTail->bNameFlag = FALSE;
  541. pTextTail->pTextInstance->SetOutline(true);
  542. pTextTail->pTextInstance->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
  543. m_ChatTailMap.insert(TTextTailMap::value_type(VirtualID, pTextTail));
  544. }
  545. bool CPythonTextTail::GetTextTailPosition(DWORD dwVID, float* px, float* py, float* pz)
  546. {
  547. TTextTailMap::iterator itorCharacter = m_CharacterTextTailMap.find(dwVID);
  548. if (m_CharacterTextTailMap.end() == itorCharacter)
  549. {
  550. return false;
  551. }
  552. TTextTail * pTextTail = itorCharacter->second;
  553. *px=pTextTail->x;
  554. *py=pTextTail->y;
  555. *pz=pTextTail->z;
  556. return true;
  557. }
  558. bool CPythonTextTail::IsChatTextTail(DWORD dwVID)
  559. {
  560. TChatTailMap::iterator itorChat = m_ChatTailMap.find(dwVID);
  561. if (m_ChatTailMap.end() == itorChat)
  562. return false;
  563. return true;
  564. }
  565. void CPythonTextTail::SetCharacterTextTailColor(DWORD VirtualID, const D3DXCOLOR & c_rColor)
  566. {
  567. TTextTailMap::iterator itorCharacter = m_CharacterTextTailMap.find(VirtualID);
  568. if (m_CharacterTextTailMap.end() == itorCharacter)
  569. return;
  570. TTextTail * pTextTail = itorCharacter->second;
  571. pTextTail->pTextInstance->SetColor(c_rColor);
  572. pTextTail->Color = c_rColor;
  573. }
  574. void CPythonTextTail::SetItemTextTailOwner(DWORD dwVID, const char * c_szName)
  575. {
  576. TTextTailMap::iterator itor = m_ItemTextTailMap.find(dwVID);
  577. if (m_ItemTextTailMap.end() == itor)
  578. return;
  579. TTextTail * pTextTail = itor->second;
  580. if (strlen(c_szName) > 0)
  581. {
  582. if (!pTextTail->pOwnerTextInstance)
  583. {
  584. pTextTail->pOwnerTextInstance = CGraphicTextInstance::New();
  585. }
  586. std::string strName = c_szName;
  587. static const string & strOwnership = ApplicationStringTable_GetString(IDS_POSSESSIVE_MORPHENE) == "" ? "'s" : ApplicationStringTable_GetString(IDS_POSSESSIVE_MORPHENE);
  588. strName += strOwnership;
  589. pTextTail->pOwnerTextInstance->SetTextPointer(ms_pFont);
  590. pTextTail->pOwnerTextInstance->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
  591. pTextTail->pOwnerTextInstance->SetValue(strName.c_str());
  592. pTextTail->pOwnerTextInstance->SetColor(1.0f, 1.0f, 0.0f);
  593. pTextTail->pOwnerTextInstance->Update();
  594. int xOwnerSize, yOwnerSize;
  595. pTextTail->pOwnerTextInstance->GetTextSize(&xOwnerSize, &yOwnerSize);
  596. pTextTail->yStart = -2.0f;
  597. pTextTail->yEnd += float(yOwnerSize + 4);
  598. pTextTail->xStart = fMIN(pTextTail->xStart, float(-xOwnerSize / 2 - 1));
  599. pTextTail->xEnd = fMAX(pTextTail->xEnd, float(xOwnerSize / 2 + 1));
  600. }
  601. else
  602. {
  603. if (pTextTail->pOwnerTextInstance)
  604. {
  605. CGraphicTextInstance::Delete(pTextTail->pOwnerTextInstance);
  606. pTextTail->pOwnerTextInstance = NULL;
  607. }
  608. int xSize, ySize;
  609. pTextTail->pTextInstance->GetTextSize(&xSize, &ySize);
  610. pTextTail->xStart = (float) (-xSize / 2 - 2);
  611. pTextTail->yStart = -2.0f;
  612. pTextTail->xEnd = (float) (xSize / 2 + 2);
  613. pTextTail->yEnd = (float) ySize;
  614. }
  615. }
  616. void CPythonTextTail::DeleteCharacterTextTail(DWORD VirtualID)
  617. {
  618. TTextTailMap::iterator itorCharacter = m_CharacterTextTailMap.find(VirtualID);
  619. TTextTailMap::iterator itorChat = m_ChatTailMap.find(VirtualID);
  620. if (m_CharacterTextTailMap.end() != itorCharacter)
  621. {
  622. DeleteTextTail(itorCharacter->second);
  623. m_CharacterTextTailMap.erase(itorCharacter);
  624. }
  625. else
  626. {
  627. Tracenf("CPythonTextTail::DeleteCharacterTextTail - Find VID[%d] Error", VirtualID);
  628. }
  629. if (m_ChatTailMap.end() != itorChat)
  630. {
  631. DeleteTextTail(itorChat->second);
  632. m_ChatTailMap.erase(itorChat);
  633. }
  634. }
  635. void CPythonTextTail::DeleteItemTextTail(DWORD VirtualID)
  636. {
  637. TTextTailMap::iterator itor = m_ItemTextTailMap.find(VirtualID);
  638. if (m_ItemTextTailMap.end() == itor)
  639. {
  640. Tracef(" CPythonTextTail::DeleteItemTextTail - None Item Text Tail\n");
  641. return;
  642. }
  643. DeleteTextTail(itor->second);
  644. m_ItemTextTailMap.erase(itor);
  645. }
  646. CPythonTextTail::TTextTail * CPythonTextTail::RegisterTextTail(DWORD dwVirtualID, const char * c_szText, CGraphicObjectInstance * pOwner, float fHeight, const D3DXCOLOR & c_rColor)
  647. {
  648. TTextTail * pTextTail = m_TextTailPool.Alloc();
  649. pTextTail->dwVirtualID = dwVirtualID;
  650. pTextTail->pOwner = pOwner;
  651. pTextTail->pTextInstance = CGraphicTextInstance::New();
  652. pTextTail->pOwnerTextInstance = NULL;
  653. pTextTail->fHeight = fHeight;
  654. pTextTail->pTextInstance->SetTextPointer(ms_pFont);
  655. pTextTail->pTextInstance->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
  656. pTextTail->pTextInstance->SetValue(c_szText);
  657. pTextTail->pTextInstance->SetColor(c_rColor.r, c_rColor.g, c_rColor.b);
  658. pTextTail->pTextInstance->Update();
  659. int xSize, ySize;
  660. pTextTail->pTextInstance->GetTextSize(&xSize, &ySize);
  661. pTextTail->xStart = (float) (-xSize / 2 - 2);
  662. pTextTail->yStart = -2.0f;
  663. pTextTail->xEnd = (float) (xSize / 2 + 2);
  664. pTextTail->yEnd = (float) ySize;
  665. pTextTail->Color = c_rColor;
  666. pTextTail->fDistanceFromPlayer = 0.0f;
  667. pTextTail->x = -100.0f;
  668. pTextTail->y = -100.0f;
  669. pTextTail->z = 0.0f;
  670. pTextTail->pMarkInstance = NULL;
  671. pTextTail->pGuildNameTextInstance = NULL;
  672. pTextTail->pTitleTextInstance = NULL;
  673. pTextTail->pLevelTextInstance = NULL;
  674. return pTextTail;
  675. }
  676. void CPythonTextTail::DeleteTextTail(TTextTail * pTextTail)
  677. {
  678. if (pTextTail->pTextInstance)
  679. {
  680. CGraphicTextInstance::Delete(pTextTail->pTextInstance);
  681. pTextTail->pTextInstance = NULL;
  682. }
  683. if (pTextTail->pOwnerTextInstance)
  684. {
  685. CGraphicTextInstance::Delete(pTextTail->pOwnerTextInstance);
  686. pTextTail->pOwnerTextInstance = NULL;
  687. }
  688. if (pTextTail->pMarkInstance)
  689. {
  690. CGraphicMarkInstance::Delete(pTextTail->pMarkInstance);
  691. pTextTail->pMarkInstance = NULL;
  692. }
  693. if (pTextTail->pGuildNameTextInstance)
  694. {
  695. CGraphicTextInstance::Delete(pTextTail->pGuildNameTextInstance);
  696. pTextTail->pGuildNameTextInstance = NULL;
  697. }
  698. if (pTextTail->pTitleTextInstance)
  699. {
  700. CGraphicTextInstance::Delete(pTextTail->pTitleTextInstance);
  701. pTextTail->pTitleTextInstance = NULL;
  702. }
  703. if (pTextTail->pLevelTextInstance)
  704. {
  705. CGraphicTextInstance::Delete(pTextTail->pLevelTextInstance);
  706. pTextTail->pLevelTextInstance = NULL;
  707. }
  708. m_TextTailPool.Free(pTextTail);
  709. }
  710. int CPythonTextTail::Pick(int ixMouse, int iyMouse)
  711. {
  712. for (TTextTailMap::iterator itor = m_ItemTextTailMap.begin(); itor != m_ItemTextTailMap.end(); ++itor)
  713. {
  714. TTextTail * pTextTail = itor->second;
  715. if (ixMouse >= pTextTail->x + pTextTail->xStart && ixMouse <= pTextTail->x + pTextTail->xEnd &&
  716. iyMouse >= pTextTail->y + pTextTail->yStart && iyMouse <= pTextTail->y + pTextTail->yEnd)
  717. {
  718. SelectItemName(itor->first);
  719. return (itor->first);
  720. }
  721. }
  722. return -1;
  723. }
  724. void CPythonTextTail::SelectItemName(DWORD dwVirtualID)
  725. {
  726. TTextTailMap::iterator itor = m_ItemTextTailMap.find(dwVirtualID);
  727. if (m_ItemTextTailMap.end() == itor)
  728. return;
  729. TTextTail * pTextTail = itor->second;
  730. pTextTail->pTextInstance->SetColor(0.1f, 0.9f, 0.1f);
  731. }
  732. void CPythonTextTail::AttachTitle(DWORD dwVID, const char * c_szName, const D3DXCOLOR & c_rColor)
  733. {
  734. if (!bPKTitleEnable)
  735. return;
  736. TTextTailMap::iterator itor = m_CharacterTextTailMap.find(dwVID);
  737. if (m_CharacterTextTailMap.end() == itor)
  738. return;
  739. TTextTail * pTextTail = itor->second;
  740. CGraphicTextInstance *& prTitle = pTextTail->pTitleTextInstance;
  741. if (!prTitle)
  742. {
  743. prTitle = CGraphicTextInstance::New();
  744. prTitle->SetTextPointer(ms_pFont);
  745. prTitle->SetOutline(true);
  746. if (LocaleService_IsEUROPE())
  747. prTitle->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_RIGHT);
  748. else
  749. prTitle->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
  750. prTitle->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
  751. }
  752. prTitle->SetValue(c_szName);
  753. prTitle->SetColor(c_rColor.r, c_rColor.g, c_rColor.b);
  754. prTitle->Update();
  755. }
  756. void CPythonTextTail::DetachTitle(DWORD dwVID)
  757. {
  758. if (!bPKTitleEnable)
  759. return;
  760. TTextTailMap::iterator itor = m_CharacterTextTailMap.find(dwVID);
  761. if (m_CharacterTextTailMap.end() == itor)
  762. return;
  763. TTextTail * pTextTail = itor->second;
  764. if (pTextTail->pTitleTextInstance)
  765. {
  766. CGraphicTextInstance::Delete(pTextTail->pTitleTextInstance);
  767. pTextTail->pTitleTextInstance = NULL;
  768. }
  769. }
  770. void CPythonTextTail::EnablePKTitle(BOOL bFlag)
  771. {
  772. bPKTitleEnable = bFlag;
  773. }
  774. void CPythonTextTail::AttachLevel(DWORD dwVID, const char * c_szText, const D3DXCOLOR & c_rColor)
  775. {
  776. if (!bPKTitleEnable)
  777. return;
  778. TTextTailMap::iterator itor = m_CharacterTextTailMap.find(dwVID);
  779. if (m_CharacterTextTailMap.end() == itor)
  780. return;
  781. TTextTail * pTextTail = itor->second;
  782. CGraphicTextInstance *& prLevel = pTextTail->pLevelTextInstance;
  783. if (!prLevel)
  784. {
  785. prLevel = CGraphicTextInstance::New();
  786. prLevel->SetTextPointer(ms_pFont);
  787. prLevel->SetOutline(true);
  788. prLevel->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_RIGHT);
  789. prLevel->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
  790. }
  791. prLevel->SetValue(c_szText);
  792. prLevel->SetColor(c_rColor.r, c_rColor.g, c_rColor.b);
  793. prLevel->Update();
  794. }
  795. void CPythonTextTail::DetachLevel(DWORD dwVID)
  796. {
  797. if (!bPKTitleEnable)
  798. return;
  799. TTextTailMap::iterator itor = m_CharacterTextTailMap.find(dwVID);
  800. if (m_CharacterTextTailMap.end() == itor)
  801. return;
  802. TTextTail * pTextTail = itor->second;
  803. if (pTextTail->pLevelTextInstance)
  804. {
  805. CGraphicTextInstance::Delete(pTextTail->pLevelTextInstance);
  806. pTextTail->pLevelTextInstance = NULL;
  807. }
  808. }
  809. void CPythonTextTail::Initialize()
  810. {
  811. // DEFAULT_FONT
  812. //ms_pFont = (CGraphicText *)CResourceManager::Instance().GetTypeResourcePointer(g_strDefaultFontName.c_str());
  813. CGraphicText* pkDefaultFont = static_cast<CGraphicText*>(DefaultFont_GetResource());
  814. if (!pkDefaultFont)
  815. {
  816. TraceError("CPythonTextTail::Initialize - CANNOT_FIND_DEFAULT_FONT");
  817. return;
  818. }
  819. ms_pFont = pkDefaultFont;
  820. // END_OF_DEFAULT_FONT
  821. }
  822. void CPythonTextTail::Destroy()
  823. {
  824. m_TextTailPool.Clear();
  825. }
  826. void CPythonTextTail::Clear()
  827. {
  828. m_CharacterTextTailMap.clear();
  829. m_CharacterTextTailList.clear();
  830. m_ItemTextTailMap.clear();
  831. m_ItemTextTailList.clear();
  832. m_ChatTailMap.clear();
  833. m_TextTailPool.Clear();
  834. }
  835. CPythonTextTail::CPythonTextTail()
  836. {
  837. Clear();
  838. }
  839. CPythonTextTail::~CPythonTextTail()
  840. {
  841. Destroy();
  842. }