Guest User

pythontextail.cpp

a guest
Dec 26th, 2020
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 41.29 KB | None | 0 0
  1. //
  2. // 캐릭터를 따라다니는 텍스트 관련 소스 (이름, 길드이름, 길드마크 등)
  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. #include "PythonPlayer.h"
  13. #include <boost\algorithm\string\replace.hpp>
  14.  
  15. const D3DXCOLOR c_TextTail_Player_Color = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
  16. const D3DXCOLOR c_TextTail_Monster_Color = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);
  17. const D3DXCOLOR c_TextTail_Item_Color = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
  18. const D3DXCOLOR c_TextTail_Chat_Color = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
  19. const D3DXCOLOR c_TextTail_Info_Color = D3DXCOLOR(1.0f, 0.785f, 0.785f, 1.0f);
  20. const D3DXCOLOR c_TextTail_Guild_Name_Color = 0xFFEFD3FF;
  21. const float c_TextTail_Name_Position = -10.0f;
  22. const float c_fxMarkPosition = 1.5f;
  23. const float c_fyGuildNamePosition = 15.0f;
  24. const float c_fyMarkPosition = 15.0f + 11.0f;
  25. BOOL bPKTitleEnable = TRUE;
  26.  
  27. // TEXTTAIL_LIVINGTIME_CONTROL
  28. long gs_TextTail_LivingTime = 5000;
  29.  
  30. long TextTail_GetLivingTime()
  31. {
  32. assert(gs_TextTail_LivingTime>1000);
  33. return gs_TextTail_LivingTime;
  34. }
  35.  
  36. void TextTail_SetLivingTime(long livingTime)
  37. {
  38. gs_TextTail_LivingTime = livingTime;
  39. }
  40. // END_OF_TEXTTAIL_LIVINGTIME_CONTROL
  41.  
  42. CGraphicText * ms_pFont = NULL;
  43.  
  44. void CPythonTextTail::GetInfo(std::string* pstInfo)
  45. {
  46. char szInfo[256];
  47. sprintf(szInfo, "TextTail: ChatTail %d, ChrTail (Map %d, List %d), ItemTail (Map %d, List %d), Pool %d",
  48. m_ChatTailMap.size(),
  49. m_CharacterTextTailMap.size(), m_CharacterTextTailList.size(),
  50. m_ItemTextTailMap.size(), m_ItemTextTailList.size(),
  51. m_TextTailPool.GetCapacity());
  52.  
  53. pstInfo->append(szInfo);
  54. }
  55.  
  56. void CPythonTextTail::UpdateAllTextTail()
  57. {
  58. CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetMainInstancePtr();
  59. if (pInstance)
  60. {
  61. TPixelPosition pixelPos;
  62. pInstance->NEW_GetPixelPosition(&pixelPos);
  63.  
  64. TTextTailMap::iterator itorMap;
  65.  
  66. for (itorMap = m_CharacterTextTailMap.begin(); itorMap != m_CharacterTextTailMap.end(); ++itorMap)
  67. {
  68. UpdateDistance(pixelPos, itorMap->second);
  69. }
  70.  
  71. for (itorMap = m_ItemTextTailMap.begin(); itorMap != m_ItemTextTailMap.end(); ++itorMap)
  72. {
  73. UpdateDistance(pixelPos, itorMap->second);
  74. }
  75.  
  76. for (TChatTailMap::iterator itorChat=m_ChatTailMap.begin(); itorChat!=m_ChatTailMap.end(); ++itorChat)
  77. {
  78. UpdateDistance(pixelPos, itorChat->second);
  79.  
  80. // NOTE : Chat TextTail이 있으면 캐릭터 이름도 출력한다.
  81. if (itorChat->second->bNameFlag)
  82. {
  83. DWORD dwVID = itorChat->first;
  84. ShowCharacterTextTail(dwVID);
  85. }
  86. }
  87. }
  88. }
  89.  
  90. void CPythonTextTail::UpdateShowingTextTail()
  91. {
  92. TTextTailList::iterator itor;
  93.  
  94. for (itor = m_ItemTextTailList.begin(); itor != m_ItemTextTailList.end(); ++itor)
  95. {
  96. UpdateTextTail(*itor);
  97. }
  98.  
  99. for (TChatTailMap::iterator itorChat=m_ChatTailMap.begin(); itorChat!=m_ChatTailMap.end(); ++itorChat)
  100. {
  101. UpdateTextTail(itorChat->second);
  102. }
  103.  
  104. for (itor = m_CharacterTextTailList.begin(); itor != m_CharacterTextTailList.end(); ++itor)
  105. {
  106. TTextTail * pTextTail = *itor;
  107. UpdateTextTail(pTextTail);
  108.  
  109. // NOTE : Chat TextTail이 있을 경우 위치를 바꾼다.
  110. TChatTailMap::iterator itor = m_ChatTailMap.find(pTextTail->dwVirtualID);
  111. if (m_ChatTailMap.end() != itor)
  112. {
  113. TTextTail * pChatTail = itor->second;
  114. if (pChatTail->bNameFlag)
  115. {
  116. pTextTail->y = pChatTail->y - 17.0f;
  117. }
  118. }
  119. }
  120. }
  121.  
  122. void CPythonTextTail::UpdateTextTail(TTextTail * pTextTail)
  123. {
  124. if (!pTextTail->pOwner)
  125. return;
  126.  
  127. /////
  128.  
  129. CPythonGraphic & rpyGraphic = CPythonGraphic::Instance();
  130. rpyGraphic.Identity();
  131.  
  132. const D3DXVECTOR3 & c_rv3Position = pTextTail->pOwner->GetPosition();
  133. rpyGraphic.ProjectPosition(c_rv3Position.x,
  134. c_rv3Position.y,
  135. c_rv3Position.z + pTextTail->fHeight,
  136. &pTextTail->x,
  137. &pTextTail->y,
  138. &pTextTail->z);
  139.  
  140. pTextTail->x = floorf(pTextTail->x);
  141. pTextTail->y = floorf(pTextTail->y);
  142.  
  143. // NOTE : 13m 밖에 있을때만 깊이를 넣습니다 - [levites]
  144. if (pTextTail->fDistanceFromPlayer < 1300.0f)
  145. {
  146. pTextTail->z = 0.0f;
  147. }
  148. else
  149. {
  150. pTextTail->z = pTextTail->z * CPythonGraphic::Instance().GetOrthoDepth() * -1.0f;
  151. pTextTail->z += 10.0f;
  152. }
  153. }
  154.  
  155. void CPythonTextTail::ArrangeTextTail()
  156. {
  157. TTextTailList::iterator itor;
  158. TTextTailList::iterator itorCompare;
  159.  
  160. DWORD dwTime = CTimer::Instance().GetCurrentMillisecond();
  161.  
  162. for (itor = m_ItemTextTailList.begin(); itor != m_ItemTextTailList.end(); ++itor)
  163. {
  164. TTextTail * pInsertTextTail = *itor;
  165.  
  166. int yTemp = 5;
  167. int LimitCount = 0;
  168.  
  169. for (itorCompare = m_ItemTextTailList.begin(); itorCompare != m_ItemTextTailList.end();)
  170. {
  171. TTextTail * pCompareTextTail = *itorCompare;
  172.  
  173. if (*itorCompare == *itor)
  174. {
  175. ++itorCompare;
  176. continue;
  177. }
  178.  
  179. if (LimitCount >= 20)
  180. break;
  181.  
  182. if (isIn(pInsertTextTail, pCompareTextTail))
  183. {
  184. pInsertTextTail->y = (pCompareTextTail->y + pCompareTextTail->yEnd + yTemp);
  185.  
  186. itorCompare = m_ItemTextTailList.begin();
  187. ++LimitCount;
  188. continue;
  189. }
  190.  
  191. ++itorCompare;
  192. }
  193.  
  194.  
  195. if (pInsertTextTail->pOwnerTextInstance)
  196. {
  197. pInsertTextTail->pOwnerTextInstance->SetPosition(pInsertTextTail->x, pInsertTextTail->y, pInsertTextTail->z);
  198. pInsertTextTail->pOwnerTextInstance->Update();
  199.  
  200. pInsertTextTail->pTextInstance->SetColor(pInsertTextTail->Color.r, pInsertTextTail->Color.g, pInsertTextTail->Color.b);
  201. pInsertTextTail->pTextInstance->SetPosition(pInsertTextTail->x, pInsertTextTail->y + 15.0f, pInsertTextTail->z);
  202. pInsertTextTail->pTextInstance->Update();
  203.  
  204. }
  205. else
  206. {
  207. pInsertTextTail->pTextInstance->SetColor(pInsertTextTail->Color.r, pInsertTextTail->Color.g, pInsertTextTail->Color.b);
  208. pInsertTextTail->pTextInstance->SetPosition(pInsertTextTail->x, pInsertTextTail->y, pInsertTextTail->z);
  209. pInsertTextTail->pTextInstance->Update();
  210.  
  211. }
  212. }
  213.  
  214. for (itor = m_CharacterTextTailList.begin(); itor != m_CharacterTextTailList.end(); ++itor)
  215. {
  216. TTextTail * pTextTail = *itor;
  217.  
  218. float fxAdd = 0.0f;
  219.  
  220. // Mark 위치 업데이트
  221. CGraphicMarkInstance * pMarkInstance = pTextTail->pMarkInstance;
  222. CGraphicTextInstance * pGuildNameInstance = pTextTail->pGuildNameTextInstance;
  223. #ifdef ENABLE_TITLE_SYSTEM
  224. CGraphicTextInstance * pMrVegaS_Titan2 = pTextTail->pVegaS_TitleText_tInstance;
  225. #endif
  226. #ifdef ENABLE_REBORN_SYSTEM
  227. float szGlobal_type = 0.0f;
  228. CGraphicTextInstance * pMrVegaS_Reborn = pTextTail->pReborn_TitleText_tInstance;
  229. #endif
  230.  
  231. if (pMarkInstance && pGuildNameInstance)
  232. {
  233. int iWidth, iHeight;
  234. int iImageHalfSize = pMarkInstance->GetWidth()/2 + c_fxMarkPosition;
  235. pGuildNameInstance->GetTextSize(&iWidth, &iHeight);
  236.  
  237. #ifdef ENABLE_TITLE_SYSTEM
  238. pMarkInstance->SetPosition(pTextTail->x - iWidth/2 - iImageHalfSize, pTextTail->y - c_fyMarkPosition-15); // 21.04.2016 [VegaS Fix]
  239. pGuildNameInstance->SetPosition(pTextTail->x + iImageHalfSize, pTextTail->y - c_fyGuildNamePosition-15, pTextTail->z);
  240. pGuildNameInstance->Update();
  241. #else
  242. pMarkInstance->SetPosition(pTextTail->x - iWidth/2 - iImageHalfSize, pTextTail->y - c_fyMarkPosition);
  243. pGuildNameInstance->SetPosition(pTextTail->x + iImageHalfSize, pTextTail->y - c_fyGuildNamePosition, pTextTail->z);
  244. pGuildNameInstance->Update();
  245. #endif
  246. #ifdef ENABLE_TITLE_SYSTEM
  247. if (!pMrVegaS_Titan2)
  248. {
  249. int iWidth, iHeight;
  250. int iImageHalfSize = pMarkInstance->GetWidth()/2 + c_fxMarkPosition;
  251.  
  252. pGuildNameInstance->GetTextSize(&iWidth, &iHeight);
  253.  
  254. pMarkInstance->SetPosition(pTextTail->x - iWidth/2 - iImageHalfSize, pTextTail->y - c_fyMarkPosition);
  255. pGuildNameInstance->SetPosition(pTextTail->x + iImageHalfSize, pTextTail->y - c_fyGuildNamePosition, pTextTail->z);
  256. pGuildNameInstance->Update();
  257. }
  258. #endif
  259. }
  260. #ifdef ENABLE_TITLE_SYSTEM
  261. if (pMrVegaS_Titan2)
  262. {
  263. int iImageHalfSize = 0+c_fxMarkPosition;
  264. int iLevelWidth, iLevelHeight;
  265. pMrVegaS_Titan2->GetTextSize(&iLevelWidth, &iLevelHeight);
  266. if (pMarkInstance && pGuildNameInstance)
  267. {
  268. pMrVegaS_Titan2->SetPosition(pTextTail->x + iImageHalfSize, pTextTail->y - c_fyGuildNamePosition, pTextTail->z);
  269. }
  270. else
  271. {
  272. pMrVegaS_Titan2->SetPosition(pTextTail->x + iImageHalfSize, pTextTail->y - c_fyGuildNamePosition, pTextTail->z);
  273. }
  274. pMrVegaS_Titan2->Update();
  275. }
  276. #endif
  277.  
  278. #ifdef ENABLE_REBORN_SYSTEM
  279. if (pMrVegaS_Reborn)
  280. {
  281. int iVWidth, iVHeight;
  282. pMrVegaS_Reborn->GetTextSize(&iVWidth,&iVHeight);
  283. szGlobal_type += iVWidth;
  284. }
  285. #endif
  286.  
  287. int iNameWidth, iNameHeight;
  288. pTextTail->pTextInstance->GetTextSize(&iNameWidth, &iNameHeight);
  289.  
  290. // Title 위치 업데이트
  291. CGraphicTextInstance * pTitle = pTextTail->pTitleTextInstance;
  292. if (pTitle)
  293. {
  294. int iTitleWidth, iTitleHeight;
  295. pTitle->GetTextSize(&iTitleWidth, &iTitleHeight);
  296.  
  297. fxAdd = 8.0f;
  298.  
  299. if (LocaleService_IsEUROPE()) // 독일어는 명칭이 길어 오른정렬
  300. {
  301. if( GetDefaultCodePage() == CP_ARABIC )
  302. {
  303. #ifdef ENABLE_REBORN_SYSTEM
  304. pTitle->SetPosition(pTextTail->x - (iNameWidth / 2) - iTitleWidth - 4.0f - szGlobal_type, pTextTail->y, pTextTail->z);
  305. #else
  306. pTitle->SetPosition(pTextTail->x - (iNameWidth / 2) - iTitleWidth - 4.0f, pTextTail->y, pTextTail->z);
  307. #endif
  308. }
  309. else
  310. {
  311. #ifdef ENABLE_REBORN_SYSTEM
  312. pTitle->SetPosition(pTextTail->x - (iNameWidth / 2) - szGlobal_type, pTextTail->y, pTextTail->z);
  313. #else
  314. pTitle->SetPosition(pTextTail->x - (iNameWidth / 2), pTextTail->y, pTextTail->z);
  315. #endif
  316. }
  317. }
  318. else
  319. {
  320. pTitle->SetPosition(pTextTail->x - (iNameWidth / 2) - fxAdd, pTextTail->y, pTextTail->z);
  321. }
  322. pTitle->Update();
  323.  
  324. // Level 위치 업데이트
  325. CGraphicTextInstance * pLevel = pTextTail->pLevelTextInstance;
  326. if (pLevel)
  327. {
  328. int iLevelWidth, iLevelHeight;
  329. pLevel->GetTextSize(&iLevelWidth, &iLevelHeight);
  330.  
  331. if (LocaleService_IsEUROPE()) // 독일어는 명칭이 길어 오른정렬
  332. {
  333. if( GetDefaultCodePage() == CP_ARABIC )
  334. {
  335. #ifdef ENABLE_REBORN_SYSTEM
  336. pLevel->SetPosition(pTextTail->x - (iNameWidth / 2) - iLevelWidth - iTitleWidth - 8.0f - szGlobal_type, pTextTail->y, pTextTail->z);
  337. #else
  338. pLevel->SetPosition(pTextTail->x - (iNameWidth / 2) - iLevelWidth - iTitleWidth - 8.0f, pTextTail->y, pTextTail->z);
  339. #endif
  340. }
  341. else
  342. {
  343. #ifdef ENABLE_REBORN_SYSTEM
  344. pLevel->SetPosition(pTextTail->x - (iNameWidth / 2) - iTitleWidth - szGlobal_type, pTextTail->y, pTextTail->z);
  345. #else
  346. pLevel->SetPosition(pTextTail->x - (iNameWidth / 2) - iTitleWidth, pTextTail->y, pTextTail->z);
  347. #endif
  348. }
  349. }
  350. else
  351. {
  352. pLevel->SetPosition(pTextTail->x - (iNameWidth / 2) - fxAdd - iTitleWidth, pTextTail->y, pTextTail->z);
  353. }
  354.  
  355. pLevel->Update();
  356. }
  357. }
  358. else
  359. {
  360. fxAdd = 4.0f;
  361.  
  362. // Level 위치 업데이트
  363. CGraphicTextInstance * pLevel = pTextTail->pLevelTextInstance;
  364. if (pLevel)
  365. {
  366. int iLevelWidth, iLevelHeight;
  367. pLevel->GetTextSize(&iLevelWidth, &iLevelHeight);
  368.  
  369. if (LocaleService_IsEUROPE()) // 독일어는 명칭이 길어 오른정렬
  370. {
  371. if( GetDefaultCodePage() == CP_ARABIC )
  372. {
  373. pLevel->SetPosition(pTextTail->x - (iNameWidth / 2) - iLevelWidth - 4.0f, pTextTail->y, pTextTail->z);
  374. }
  375. else
  376. {
  377. pLevel->SetPosition(pTextTail->x - (iNameWidth / 2), pTextTail->y, pTextTail->z);
  378. }
  379. }
  380. else
  381. {
  382. pLevel->SetPosition(pTextTail->x - (iNameWidth / 2) - fxAdd, pTextTail->y, pTextTail->z);
  383. }
  384.  
  385. pLevel->Update();
  386. }
  387. }
  388.  
  389. #ifdef ENABLE_REBORN_SYSTEM
  390. if (pMrVegaS_Reborn) // If prestige grade is active
  391. {
  392. CGraphicTextInstance * pTitle = pTextTail->pTitleTextInstance;
  393. CGraphicTextInstance * pLevel = pTextTail->pLevelTextInstance;
  394.  
  395. if (!pTitle) // If not exist alignment make other position for reborn
  396. {
  397. pLevel->SetPosition(pTextTail->x - (iNameWidth / 2)-szGlobal_type+15, pTextTail->y, pTextTail->z);
  398. pLevel->Update();
  399.  
  400. int iVWidth, iVHeight;
  401. pMrVegaS_Reborn->GetTextSize(&iVWidth,&iVHeight);
  402. szGlobal_type += iVWidth;
  403. pMrVegaS_Reborn->SetPosition(pTextTail->x-(iVWidth/2) - fxAdd-69, pTextTail->y, pTextTail->z); // Set reborn text positions
  404. pMrVegaS_Reborn->Update();
  405. }
  406. else if (pTitle && pLevel) // If alignment and level is active make a other positions for reborn
  407. {
  408. int iTitleWidth, iTitleHeight;
  409. pTitle->GetTextSize(&iTitleWidth, &iTitleHeight);
  410.  
  411. pTitle->SetPosition(pTextTail->x - (iNameWidth / 2) - iTitleWidth + 24.0f-szGlobal_type+7, pTextTail->y, pTextTail->z); // Set alignment positions
  412. pTitle->SetPosition(pTextTail->x - (iNameWidth / 2) - fxAdd+4, pTextTail->y, pTextTail->z);
  413. pTitle->Update();
  414.  
  415. pLevel->SetPosition(pTextTail->x - (iNameWidth / 2)-szGlobal_type-37, pTextTail->y, pTextTail->z); // Change positions text for level
  416. pLevel->Update();
  417.  
  418. int iVWidth, iVHeight;
  419. pMrVegaS_Reborn->GetTextSize(&iVWidth,&iVHeight);
  420. szGlobal_type += iVWidth;
  421. pMrVegaS_Reborn->SetPosition(pTextTail->x - (iNameWidth / 2) - fxAdd-96, pTextTail->y, pTextTail->z); // Set reborn text positions
  422. pMrVegaS_Reborn->Update();
  423. }
  424. }
  425. #endif
  426.  
  427. pTextTail->pTextInstance->SetColor(pTextTail->Color.r, pTextTail->Color.g, pTextTail->Color.b);
  428. pTextTail->pTextInstance->SetPosition(pTextTail->x + fxAdd, pTextTail->y, pTextTail->z);
  429. pTextTail->pTextInstance->Update();
  430. }
  431.  
  432. for (TChatTailMap::iterator itorChat=m_ChatTailMap.begin(); itorChat!=m_ChatTailMap.end();)
  433. {
  434. TTextTail * pTextTail = itorChat->second;
  435.  
  436. if (pTextTail->LivingTime < dwTime)
  437. {
  438. DeleteTextTail(pTextTail);
  439. itorChat = m_ChatTailMap.erase(itorChat);
  440. continue;
  441. }
  442. else
  443. ++itorChat;
  444.  
  445. pTextTail->pTextInstance->SetColor(pTextTail->Color);
  446. pTextTail->pTextInstance->SetPosition(pTextTail->x, pTextTail->y, pTextTail->z);
  447. pTextTail->pTextInstance->Update();
  448. }
  449. }
  450.  
  451. void CPythonTextTail::Render()
  452. {
  453. TTextTailList::iterator itor;
  454.  
  455. for (itor = m_CharacterTextTailList.begin(); itor != m_CharacterTextTailList.end(); ++itor)
  456. {
  457. TTextTail * pTextTail = *itor;
  458. pTextTail->pTextInstance->Render();
  459. if (pTextTail->pMarkInstance && pTextTail->pGuildNameTextInstance)
  460. {
  461. pTextTail->pMarkInstance->Render();
  462. pTextTail->pGuildNameTextInstance->Render();
  463. }
  464. if (pTextTail->pTitleTextInstance)
  465. {
  466. pTextTail->pTitleTextInstance->Render();
  467. }
  468. if (pTextTail->pLevelTextInstance)
  469. {
  470. pTextTail->pLevelTextInstance->Render();
  471. }
  472. #ifdef ENABLE_TITLE_SYSTEM
  473. if (pTextTail->pVegaS_TitleText_tInstance)
  474. {
  475. pTextTail->pVegaS_TitleText_tInstance->Render();
  476. }
  477. #endif
  478. #ifdef ENABLE_REBORN_SYSTEM
  479. if (pTextTail->pReborn_TitleText_tInstance)
  480. {
  481. pTextTail->pReborn_TitleText_tInstance->Render();
  482. }
  483. #endif
  484. }
  485.  
  486. for (itor = m_ItemTextTailList.begin(); itor != m_ItemTextTailList.end(); ++itor)
  487. {
  488. TTextTail * pTextTail = *itor;
  489.  
  490. RenderTextTailBox(pTextTail);
  491. pTextTail->pTextInstance->Render();
  492. if (pTextTail->pOwnerTextInstance)
  493. pTextTail->pOwnerTextInstance->Render();
  494. }
  495.  
  496. for (TChatTailMap::iterator itorChat = m_ChatTailMap.begin(); itorChat!=m_ChatTailMap.end(); ++itorChat)
  497. {
  498. TTextTail * pTextTail = itorChat->second;
  499. if (pTextTail->pOwner->isShow())
  500. RenderTextTailName(pTextTail);
  501. }
  502. }
  503.  
  504. void CPythonTextTail::RenderTextTailBox(TTextTail * pTextTail)
  505. {
  506. // 검은색 테두리
  507. CPythonGraphic::Instance().SetDiffuseColor(0.0f, 0.0f, 0.0f, 1.0f);
  508. CPythonGraphic::Instance().RenderBox2d(pTextTail->x + pTextTail->xStart,
  509. pTextTail->y + pTextTail->yStart,
  510. pTextTail->x + pTextTail->xEnd,
  511. pTextTail->y + pTextTail->yEnd,
  512. pTextTail->z);
  513.  
  514. // 검은색 투명박스
  515. CPythonGraphic::Instance().SetDiffuseColor(0.0f, 0.0f, 0.0f, 0.3f);
  516. CPythonGraphic::Instance().RenderBar2d(pTextTail->x + pTextTail->xStart,
  517. pTextTail->y + pTextTail->yStart,
  518. pTextTail->x + pTextTail->xEnd,
  519. pTextTail->y + pTextTail->yEnd,
  520. pTextTail->z);
  521. }
  522.  
  523. void CPythonTextTail::RenderTextTailName(TTextTail * pTextTail)
  524. {
  525. pTextTail->pTextInstance->Render();
  526. }
  527.  
  528. void CPythonTextTail::HideAllTextTail()
  529. {
  530. // NOTE : Show All을 해준뒤 Hide All을 해주지 않으면 문제 발생 가능성 있음
  531. // 디자인 자체가 그렇게 깔끔하게 되지 않았음 - [levites]
  532. m_CharacterTextTailList.clear();
  533. m_ItemTextTailList.clear();
  534. }
  535.  
  536. void CPythonTextTail::UpdateDistance(const TPixelPosition & c_rCenterPosition, TTextTail * pTextTail)
  537. {
  538. const D3DXVECTOR3 & c_rv3Position = pTextTail->pOwner->GetPosition();
  539. D3DXVECTOR2 v2Distance(c_rv3Position.x - c_rCenterPosition.x, -c_rv3Position.y - c_rCenterPosition.y);
  540. pTextTail->fDistanceFromPlayer = D3DXVec2Length(&v2Distance);
  541. }
  542.  
  543. void CPythonTextTail::ShowAllTextTail()
  544. {
  545. TTextTailMap::iterator itor;
  546. for (itor = m_CharacterTextTailMap.begin(); itor != m_CharacterTextTailMap.end(); ++itor)
  547. {
  548. TTextTail * pTextTail = itor->second;
  549. if (pTextTail->fDistanceFromPlayer < 3500.0f)
  550. ShowCharacterTextTail(itor->first);
  551. }
  552. for (itor = m_ItemTextTailMap.begin(); itor != m_ItemTextTailMap.end(); ++itor)
  553. {
  554. TTextTail * pTextTail = itor->second;
  555. if (pTextTail->fDistanceFromPlayer < 3500.0f)
  556. ShowItemTextTail(itor->first);
  557. }
  558. }
  559.  
  560. void CPythonTextTail::ShowCharacterTextTail(DWORD VirtualID)
  561. {
  562. TTextTailMap::iterator itor = m_CharacterTextTailMap.find(VirtualID);
  563.  
  564. if (m_CharacterTextTailMap.end() == itor)
  565. return;
  566.  
  567. TTextTail * pTextTail = itor->second;
  568.  
  569. if (m_CharacterTextTailList.end() != std::find(m_CharacterTextTailList.begin(), m_CharacterTextTailList.end(), pTextTail))
  570. {
  571. //Tracef("이미 리스트에 있음 : %d\n", VirtualID);
  572. return;
  573. }
  574.  
  575. // NOTE : ShowAll 시에는 모든 Instance 의 Pointer 를 찾아서 체크하므로 부하가 걸릴 가능성도 있다.
  576. // CInstanceBase 가 TextTail 을 직접 가지고 있는 것이 가장 좋은 형태일 듯..
  577. if (!pTextTail->pOwner->isShow())
  578. return;
  579.  
  580. CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(pTextTail->dwVirtualID);
  581. if (!pInstance)
  582. return;
  583.  
  584. if (pInstance->IsGuildWall())
  585. return;
  586.  
  587. if (pInstance->CanPickInstance())
  588. m_CharacterTextTailList.push_back(pTextTail);
  589. }
  590.  
  591. void CPythonTextTail::ShowItemTextTail(DWORD VirtualID)
  592. {
  593. TTextTailMap::iterator itor = m_ItemTextTailMap.find(VirtualID);
  594.  
  595. if (m_ItemTextTailMap.end() == itor)
  596. return;
  597.  
  598. TTextTail * pTextTail = itor->second;
  599.  
  600. if (m_ItemTextTailList.end() != std::find(m_ItemTextTailList.begin(), m_ItemTextTailList.end(), pTextTail))
  601. {
  602. //Tracef("이미 리스트에 있음 : %d\n", VirtualID);
  603. return;
  604. }
  605.  
  606. m_ItemTextTailList.push_back(pTextTail);
  607. }
  608.  
  609. bool CPythonTextTail::isIn(CPythonTextTail::TTextTail * pSource, CPythonTextTail::TTextTail * pTarget)
  610. {
  611. float x1Source = pSource->x + pSource->xStart;
  612. float y1Source = pSource->y + pSource->yStart;
  613. float x2Source = pSource->x + pSource->xEnd;
  614. float y2Source = pSource->y + pSource->yEnd;
  615. float x1Target = pTarget->x + pTarget->xStart;
  616. float y1Target = pTarget->y + pTarget->yStart;
  617. float x2Target = pTarget->x + pTarget->xEnd;
  618. float y2Target = pTarget->y + pTarget->yEnd;
  619.  
  620. if (x1Source <= x2Target && x2Source >= x1Target &&
  621. y1Source <= y2Target && y2Source >= y1Target)
  622. {
  623. return true;
  624. }
  625.  
  626. return false;
  627. }
  628.  
  629. void CPythonTextTail::RegisterCharacterTextTail(DWORD dwGuildID, DWORD dwVirtualID, const D3DXCOLOR & c_rColor, float fAddHeight)
  630. {
  631. CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetInstancePtr(dwVirtualID);
  632.  
  633. if (!pCharacterInstance)
  634. return;
  635.  
  636. TTextTail * pTextTail = RegisterTextTail(dwVirtualID,
  637. pCharacterInstance->GetNameString(),
  638. pCharacterInstance->GetGraphicThingInstancePtr(),
  639. pCharacterInstance->GetGraphicThingInstanceRef().GetHeight() + fAddHeight,
  640. c_rColor);
  641.  
  642. CGraphicTextInstance * pTextInstance = pTextTail->pTextInstance;
  643. pTextInstance->SetOutline(true);
  644. pTextInstance->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
  645.  
  646. pTextTail->pMarkInstance=NULL;
  647. pTextTail->pGuildNameTextInstance=NULL;
  648. pTextTail->pTitleTextInstance=NULL;
  649. pTextTail->pLevelTextInstance=NULL;
  650. #ifdef ENABLE_TITLE_SYSTEM
  651. pTextTail->pVegaS_TitleText_tInstance=NULL;
  652. #endif
  653. #ifdef ENABLE_REBORN_SYSTEM
  654. pTextTail->pReborn_TitleText_tInstance=NULL;
  655. #endif
  656.  
  657. if (0 != dwGuildID)
  658. {
  659. pTextTail->pMarkInstance = CGraphicMarkInstance::New();
  660.  
  661. DWORD dwMarkID = CGuildMarkManager::Instance().GetMarkID(dwGuildID);
  662.  
  663. if (dwMarkID != CGuildMarkManager::INVALID_MARK_ID)
  664. {
  665. std::string markImagePath;
  666.  
  667. if (CGuildMarkManager::Instance().GetMarkImageFilename(dwMarkID / CGuildMarkImage::MARK_TOTAL_COUNT, markImagePath))
  668. {
  669. pTextTail->pMarkInstance->SetImageFileName(markImagePath.c_str());
  670. pTextTail->pMarkInstance->Load();
  671. pTextTail->pMarkInstance->SetIndex(dwMarkID % CGuildMarkImage::MARK_TOTAL_COUNT);
  672. }
  673. }
  674.  
  675. std::string strGuildName;
  676. if (!CPythonGuild::Instance().GetGuildName(dwGuildID, &strGuildName))
  677. strGuildName = "Noname";
  678.  
  679. CGraphicTextInstance *& prGuildNameInstance = pTextTail->pGuildNameTextInstance;
  680. prGuildNameInstance = CGraphicTextInstance::New();
  681. prGuildNameInstance->SetTextPointer(ms_pFont);
  682. prGuildNameInstance->SetOutline(true);
  683. prGuildNameInstance->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
  684. prGuildNameInstance->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
  685. prGuildNameInstance->SetValue(strGuildName.c_str());
  686. prGuildNameInstance->SetColor(c_TextTail_Guild_Name_Color.r, c_TextTail_Guild_Name_Color.g, c_TextTail_Guild_Name_Color.b);
  687. prGuildNameInstance->Update();
  688. }
  689.  
  690. m_CharacterTextTailMap.insert(TTextTailMap::value_type(dwVirtualID, pTextTail));
  691. }
  692.  
  693. void CPythonTextTail::RegisterItemTextTail(DWORD VirtualID, const char * c_szText, CGraphicObjectInstance * pOwner)
  694. {
  695. #ifdef __DEBUG
  696. char szName[256];
  697. spritnf(szName, "%s[%d]", c_szText, VirtualID);
  698.  
  699. TTextTail * pTextTail = RegisterTextTail(VirtualID, c_szText, pOwner, c_TextTail_Name_Position, c_TextTail_Item_Color);
  700. m_ItemTextTailMap.insert(TTextTailMap::value_type(VirtualID, pTextTail));
  701. #else
  702. TTextTail * pTextTail = RegisterTextTail(VirtualID, c_szText, pOwner, c_TextTail_Name_Position, c_TextTail_Item_Color);
  703. m_ItemTextTailMap.insert(TTextTailMap::value_type(VirtualID, pTextTail));
  704. #endif
  705. }
  706.  
  707. void CPythonTextTail::RegisterChatTail(DWORD VirtualID, const char * c_szChat)
  708. {
  709. CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetInstancePtr(VirtualID);
  710.  
  711. if (!pCharacterInstance)
  712. return;
  713.  
  714. TChatTailMap::iterator itor = m_ChatTailMap.find(VirtualID);
  715.  
  716. std::string strContent = c_szChat;
  717.  
  718. char text[69][69] = {":**", "O:)", "~X(", "=D>", ">3", "X(", ";;)",
  719. ";))", "\:D/", ":^>", ">:/", "=((", ":-c", ":-@",
  720. ":O)", ":-/", ":((", ":D", "8->", ">:)", ":o3",
  721. ":-<", ":-$", "=P~", "(pow)", ":-L", ">:P", ";)",
  722. "<3", ":!!", "@-)", "^#(^", ":*", ":))", ":^o",
  723. ":X", ":-SS", ":-B", "%-(", "[-(", "^:)^", ":-j",
  724. ":)]", "<:-P", ":P", ":ar!", "[-o<", "\m/", "8-/",
  725. "=))", "@};-", ":(", "[-x", ":-&", ":-^", "8-}",
  726. "/-)", ":)", ":>", ":/", "B-)", ":O", "=;",
  727. ":-?", ":-t", ":-w", ":-h"};
  728. char emoji[69][69] = {"|Eemoji/yahoo/2love|e", "|Eemoji/yahoo/angel|e", "|Eemoji/yahoo/at-wits-end|e", "|Eemoji/yahoo/applause|e", "|Eemoji/yahoo/arrow|e", "|Eemoji/yahoo/angry-or-grumpy|e", "|Eemoji/yahoo/batting-eyelashes|e",
  729. "|Eemoji/yahoo/giggle-or-hee-hee|e", "|Eemoji/yahoo/dancing|e", "|Eemoji/yahoo/blushing|e", "|Eemoji/yahoo/bring-it-on|e", "|Eemoji/yahoo/broken-heart|e", "|Eemoji/yahoo/call-me|e", "|Eemoji/yahoo/chatterbox|e",
  730. "|Eemoji/yahoo/clown|e", "|Eemoji/yahoo/confused|e", "|Eemoji/yahoo/crying|e", "|Eemoji/yahoo/big-grin|e", "|Eemoji/yahoo/daydreaming|e", "|Eemoji/yahoo/devil|e", "|Eemoji/yahoo/dog|e",
  731. "|Eemoji/yahoo/doh!|e", "|Eemoji/yahoo/do-not-tell-anyone|e", "|Eemoji/yahoo/drooling|e", "|Eemoji/yahoo/fortziki|e", "|Eemoji/yahoo/frustrated|e", "|Eemoji/yahoo/phbbbbt-or-upset|e", "|Eemoji/yahoo/beat-up|e",
  732. "|Eemoji/yahoo/heart|e", "|Eemoji/yahoo/hurry-up|e", "|Eemoji/yahoo/hypnotized|e", "|Eemoji/yahoo/it-was-not-me|e", "|Eemoji/yahoo/kiss|e", "|Eemoji/yahoo/laughing|e", "|Eemoji/yahoo/liar-liar|e",
  733. "|Eemoji/yahoo/love-struck|e", "|Eemoji/yahoo/nail-biting|e", "|Eemoji/yahoo/nerd|e", "|Eemoji/yahoo/not-listening|e", "|Eemoji/yahoo/not-talking|e", "|Eemoji/yahoo/not-worthy|e", "|Eemoji/yahoo/oh-go-on|e",
  734. "|Eemoji/yahoo/on-the-phone|e", "|Eemoji/yahoo/party|e", "|Eemoji/yahoo/frustrated-or-sticking-tongue-out|e", "|Eemoji/yahoo/pirate|e", "|Eemoji/yahoo/praying|e", "|Eemoji/yahoo/rocking|e", "|Eemoji/yahoo/rolling-eyes|e",
  735. "|Eemoji/yahoo/rolling-on-the-floor-laughing|e", "|Eemoji/yahoo/rose|e", "|Eemoji/yahoo/sad-or-frown-face|e", "|Eemoji/yahoo/shame-on-you|e", "|Eemoji/yahoo/sick|e", "|Eemoji/yahoo/whistling|e", "|Eemoji/yahoo/silly|e",
  736. "|Eemoji/yahoo/sleepy|e", "|Eemoji/yahoo/smile-or-happy-face|e", "|Eemoji/yahoo/smug|e", "|Eemoji/yahoo/straight-face|e", "|Eemoji/yahoo/sunglasses-or-cool|e", "|Eemoji/yahoo/surprised|e", "|Eemoji/yahoo/talk-to-the-hand|e",
  737. "|Eemoji/yahoo/thinking|e", "|Eemoji/yahoo/time-out|e", "|Eemoji/yahoo/waiting|e", "|Eemoji/yahoo/wave|e"};
  738.  
  739. if (strContent.find("http") == std::string::npos)
  740. for (int i = 0; i < 69; i++)
  741. boost::algorithm::replace_all(strContent, text[i], emoji[i]);
  742.  
  743. if (m_ChatTailMap.end() != itor)
  744. {
  745. TTextTail * pTextTail = itor->second;
  746.  
  747. pTextTail->pTextInstance->SetValue(strContent.c_str());
  748. pTextTail->pTextInstance->Update();
  749. pTextTail->Color = c_TextTail_Chat_Color;
  750. pTextTail->pTextInstance->SetColor(c_TextTail_Chat_Color);
  751.  
  752. // TEXTTAIL_LIVINGTIME_CONTROL
  753. pTextTail->LivingTime = CTimer::Instance().GetCurrentMillisecond() + TextTail_GetLivingTime();
  754. // END_OF_TEXTTAIL_LIVINGTIME_CONTROL
  755.  
  756. pTextTail->bNameFlag = TRUE;
  757.  
  758. return;
  759. }
  760.  
  761. //TTextTail * pTextTail = RegisterTextTail(VirtualID,
  762. // c_szChat,
  763. // pCharacterInstance->GetGraphicThingInstancePtr(),
  764. // pCharacterInstance->GetGraphicThingInstanceRef().GetHeight() + 10.0f,
  765. // c_TextTail_Chat_Color);
  766. TTextTail * pTextTail = RegisterTextTail(VirtualID,
  767. strContent.c_str(),
  768. pCharacterInstance->GetGraphicThingInstancePtr(),
  769. pCharacterInstance->GetGraphicThingInstanceRef().GetHeight() + 10.0f,
  770. c_TextTail_Chat_Color);
  771.  
  772. // TEXTTAIL_LIVINGTIME_CONTROL
  773. pTextTail->LivingTime = CTimer::Instance().GetCurrentMillisecond() + TextTail_GetLivingTime();
  774. // END_OF_TEXTTAIL_LIVINGTIME_CONTROL
  775.  
  776. pTextTail->bNameFlag = TRUE;
  777. pTextTail->pTextInstance->SetOutline(true);
  778. pTextTail->pTextInstance->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
  779. m_ChatTailMap.insert(TTextTailMap::value_type(VirtualID, pTextTail));
  780. }
  781.  
  782. void CPythonTextTail::RegisterInfoTail(DWORD VirtualID, const char * c_szChat)
  783. {
  784. CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetInstancePtr(VirtualID);
  785.  
  786. if (!pCharacterInstance)
  787. return;
  788.  
  789. TChatTailMap::iterator itor = m_ChatTailMap.find(VirtualID);
  790.  
  791. if (m_ChatTailMap.end() != itor)
  792. {
  793. TTextTail * pTextTail = itor->second;
  794.  
  795. pTextTail->pTextInstance->SetValue(c_szChat);
  796. pTextTail->pTextInstance->Update();
  797. pTextTail->Color = c_TextTail_Info_Color;
  798. pTextTail->pTextInstance->SetColor(c_TextTail_Info_Color);
  799.  
  800. // TEXTTAIL_LIVINGTIME_CONTROL
  801. pTextTail->LivingTime = CTimer::Instance().GetCurrentMillisecond() + TextTail_GetLivingTime();
  802. // END_OF_TEXTTAIL_LIVINGTIME_CONTROL
  803.  
  804. pTextTail->bNameFlag = FALSE;
  805.  
  806. return;
  807. }
  808.  
  809. TTextTail * pTextTail = RegisterTextTail(VirtualID,
  810. c_szChat,
  811. pCharacterInstance->GetGraphicThingInstancePtr(),
  812. pCharacterInstance->GetGraphicThingInstanceRef().GetHeight() + 10.0f,
  813. c_TextTail_Info_Color);
  814.  
  815. // TEXTTAIL_LIVINGTIME_CONTROL
  816. pTextTail->LivingTime = CTimer::Instance().GetCurrentMillisecond() + TextTail_GetLivingTime();
  817. // END_OF_TEXTTAIL_LIVINGTIME_CONTROL
  818.  
  819. pTextTail->bNameFlag = FALSE;
  820. pTextTail->pTextInstance->SetOutline(true);
  821. pTextTail->pTextInstance->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
  822. m_ChatTailMap.insert(TTextTailMap::value_type(VirtualID, pTextTail));
  823. }
  824.  
  825. bool CPythonTextTail::GetTextTailPosition(DWORD dwVID, float* px, float* py, float* pz)
  826. {
  827. TTextTailMap::iterator itorCharacter = m_CharacterTextTailMap.find(dwVID);
  828.  
  829. if (m_CharacterTextTailMap.end() == itorCharacter)
  830. {
  831. return false;
  832. }
  833.  
  834. TTextTail * pTextTail = itorCharacter->second;
  835. *px=pTextTail->x;
  836. *py=pTextTail->y;
  837. *pz=pTextTail->z;
  838.  
  839. return true;
  840. }
  841.  
  842. bool CPythonTextTail::IsChatTextTail(DWORD dwVID)
  843. {
  844. TChatTailMap::iterator itorChat = m_ChatTailMap.find(dwVID);
  845.  
  846. if (m_ChatTailMap.end() == itorChat)
  847. return false;
  848.  
  849. return true;
  850. }
  851.  
  852. void CPythonTextTail::SetCharacterTextTailColor(DWORD VirtualID, const D3DXCOLOR & c_rColor)
  853. {
  854. TTextTailMap::iterator itorCharacter = m_CharacterTextTailMap.find(VirtualID);
  855.  
  856. if (m_CharacterTextTailMap.end() == itorCharacter)
  857. return;
  858.  
  859. TTextTail * pTextTail = itorCharacter->second;
  860. pTextTail->pTextInstance->SetColor(c_rColor);
  861. pTextTail->Color = c_rColor;
  862. }
  863.  
  864. void CPythonTextTail::SetItemTextTailOwner(DWORD dwVID, const char * c_szName)
  865. {
  866. TTextTailMap::iterator itor = m_ItemTextTailMap.find(dwVID);
  867. if (m_ItemTextTailMap.end() == itor)
  868. return;
  869.  
  870. TTextTail * pTextTail = itor->second;
  871.  
  872. if (strlen(c_szName) > 0)
  873. {
  874. if (!pTextTail->pOwnerTextInstance)
  875. {
  876. pTextTail->pOwnerTextInstance = CGraphicTextInstance::New();
  877. }
  878.  
  879. std::string strName = c_szName;
  880. static const string & strOwnership = ApplicationStringTable_GetString(IDS_POSSESSIVE_MORPHENE) == "" ? "'s" : ApplicationStringTable_GetString(IDS_POSSESSIVE_MORPHENE);
  881. strName += strOwnership;
  882.  
  883.  
  884. pTextTail->pOwnerTextInstance->SetTextPointer(ms_pFont);
  885. pTextTail->pOwnerTextInstance->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
  886. pTextTail->pOwnerTextInstance->SetValue(strName.c_str());
  887. pTextTail->pOwnerTextInstance->SetColor(1.0f, 1.0f, 0.0f);
  888. pTextTail->pOwnerTextInstance->Update();
  889.  
  890. int xOwnerSize, yOwnerSize;
  891. pTextTail->pOwnerTextInstance->GetTextSize(&xOwnerSize, &yOwnerSize);
  892. pTextTail->yStart = -2.0f;
  893. pTextTail->yEnd += float(yOwnerSize + 4);
  894. pTextTail->xStart = fMIN(pTextTail->xStart, float(-xOwnerSize / 2 - 1));
  895. pTextTail->xEnd = fMAX(pTextTail->xEnd, float(xOwnerSize / 2 + 1));
  896. }
  897. else
  898. {
  899. if (pTextTail->pOwnerTextInstance)
  900. {
  901. CGraphicTextInstance::Delete(pTextTail->pOwnerTextInstance);
  902. pTextTail->pOwnerTextInstance = NULL;
  903. }
  904.  
  905. int xSize, ySize;
  906. pTextTail->pTextInstance->GetTextSize(&xSize, &ySize);
  907. pTextTail->xStart = (float) (-xSize / 2 - 2);
  908. pTextTail->yStart = -2.0f;
  909. pTextTail->xEnd = (float) (xSize / 2 + 2);
  910. pTextTail->yEnd = (float) ySize;
  911. }
  912. }
  913.  
  914. void CPythonTextTail::DeleteCharacterTextTail(DWORD VirtualID)
  915. {
  916. TTextTailMap::iterator itorCharacter = m_CharacterTextTailMap.find(VirtualID);
  917. TTextTailMap::iterator itorChat = m_ChatTailMap.find(VirtualID);
  918.  
  919. if (m_CharacterTextTailMap.end() != itorCharacter)
  920. {
  921. DeleteTextTail(itorCharacter->second);
  922. m_CharacterTextTailMap.erase(itorCharacter);
  923. }
  924. else
  925. {
  926. Tracenf("CPythonTextTail::DeleteCharacterTextTail - Find VID[%d] Error", VirtualID);
  927. }
  928.  
  929. if (m_ChatTailMap.end() != itorChat)
  930. {
  931. DeleteTextTail(itorChat->second);
  932. m_ChatTailMap.erase(itorChat);
  933. }
  934. }
  935.  
  936. void CPythonTextTail::DeleteItemTextTail(DWORD VirtualID)
  937. {
  938. TTextTailMap::iterator itor = m_ItemTextTailMap.find(VirtualID);
  939.  
  940. if (m_ItemTextTailMap.end() == itor)
  941. {
  942. Tracef(" CPythonTextTail::DeleteItemTextTail - None Item Text Tail\n");
  943. return;
  944. }
  945.  
  946. DeleteTextTail(itor->second);
  947. m_ItemTextTailMap.erase(itor);
  948. }
  949.  
  950. CPythonTextTail::TTextTail * CPythonTextTail::RegisterTextTail(DWORD dwVirtualID, const char * c_szText, CGraphicObjectInstance * pOwner, float fHeight, const D3DXCOLOR & c_rColor)
  951. {
  952. TTextTail * pTextTail = m_TextTailPool.Alloc();
  953.  
  954. pTextTail->dwVirtualID = dwVirtualID;
  955. pTextTail->pOwner = pOwner;
  956. pTextTail->pTextInstance = CGraphicTextInstance::New();
  957. pTextTail->pOwnerTextInstance = NULL;
  958. pTextTail->fHeight = fHeight;
  959.  
  960. pTextTail->pTextInstance->SetTextPointer(ms_pFont);
  961. pTextTail->pTextInstance->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
  962. pTextTail->pTextInstance->SetValue(c_szText);
  963. pTextTail->pTextInstance->SetColor(c_rColor.r, c_rColor.g, c_rColor.b);
  964. pTextTail->pTextInstance->Update();
  965.  
  966. int xSize, ySize;
  967. pTextTail->pTextInstance->GetTextSize(&xSize, &ySize);
  968. pTextTail->xStart = (float) (-xSize / 2 - 2);
  969. pTextTail->yStart = -2.0f;
  970. pTextTail->xEnd = (float) (xSize / 2 + 2);
  971. pTextTail->yEnd = (float) ySize;
  972. pTextTail->Color = c_rColor;
  973. pTextTail->fDistanceFromPlayer = 0.0f;
  974. pTextTail->x = -100.0f;
  975. pTextTail->y = -100.0f;
  976. pTextTail->z = 0.0f;
  977. pTextTail->pMarkInstance = NULL;
  978. pTextTail->pGuildNameTextInstance = NULL;
  979. pTextTail->pTitleTextInstance = NULL;
  980. pTextTail->pLevelTextInstance = NULL;
  981. #ifdef ENABLE_TITLE_SYSTEM
  982. pTextTail->pVegaS_TitleText_tInstance = NULL;
  983. #endif
  984. #ifdef ENABLE_REBORN_SYSTEM
  985. pTextTail->pReborn_TitleText_tInstance = NULL;
  986. #endif
  987. return pTextTail;
  988. }
  989.  
  990. void CPythonTextTail::DeleteTextTail(TTextTail * pTextTail)
  991. {
  992. if (pTextTail->pTextInstance)
  993. {
  994. CGraphicTextInstance::Delete(pTextTail->pTextInstance);
  995. pTextTail->pTextInstance = NULL;
  996. }
  997. if (pTextTail->pOwnerTextInstance)
  998. {
  999. CGraphicTextInstance::Delete(pTextTail->pOwnerTextInstance);
  1000. pTextTail->pOwnerTextInstance = NULL;
  1001. }
  1002. if (pTextTail->pMarkInstance)
  1003. {
  1004. CGraphicMarkInstance::Delete(pTextTail->pMarkInstance);
  1005. pTextTail->pMarkInstance = NULL;
  1006. }
  1007. if (pTextTail->pGuildNameTextInstance)
  1008. {
  1009. CGraphicTextInstance::Delete(pTextTail->pGuildNameTextInstance);
  1010. pTextTail->pGuildNameTextInstance = NULL;
  1011. }
  1012. if (pTextTail->pTitleTextInstance)
  1013. {
  1014. CGraphicTextInstance::Delete(pTextTail->pTitleTextInstance);
  1015. pTextTail->pTitleTextInstance = NULL;
  1016. }
  1017. if (pTextTail->pLevelTextInstance)
  1018. {
  1019. CGraphicTextInstance::Delete(pTextTail->pLevelTextInstance);
  1020. pTextTail->pLevelTextInstance = NULL;
  1021. }
  1022. #ifdef ENABLE_TITLE_SYSTEM
  1023. if (pTextTail->pVegaS_TitleText_tInstance)
  1024. {
  1025. CGraphicTextInstance::Delete(pTextTail->pVegaS_TitleText_tInstance);
  1026. pTextTail->pVegaS_TitleText_tInstance = NULL;
  1027. }
  1028. #endif
  1029. #ifdef ENABLE_REBORN_SYSTEM
  1030. if (pTextTail->pReborn_TitleText_tInstance)
  1031. {
  1032. CGraphicTextInstance::Delete(pTextTail->pReborn_TitleText_tInstance);
  1033. pTextTail->pReborn_TitleText_tInstance = NULL;
  1034. }
  1035. #endif
  1036.  
  1037. m_TextTailPool.Free(pTextTail);
  1038. }
  1039.  
  1040. int CPythonTextTail::Pick(int ixMouse, int iyMouse)
  1041. {
  1042. for (TTextTailMap::iterator itor = m_ItemTextTailMap.begin(); itor != m_ItemTextTailMap.end(); ++itor)
  1043. {
  1044. TTextTail * pTextTail = itor->second;
  1045.  
  1046. if (ixMouse >= pTextTail->x + pTextTail->xStart && ixMouse <= pTextTail->x + pTextTail->xEnd &&
  1047. iyMouse >= pTextTail->y + pTextTail->yStart && iyMouse <= pTextTail->y + pTextTail->yEnd)
  1048. {
  1049. SelectItemName(itor->first);
  1050. return (itor->first);
  1051. }
  1052. }
  1053.  
  1054. return -1;
  1055. }
  1056.  
  1057. void CPythonTextTail::SelectItemName(DWORD dwVirtualID)
  1058. {
  1059. TTextTailMap::iterator itor = m_ItemTextTailMap.find(dwVirtualID);
  1060.  
  1061. if (m_ItemTextTailMap.end() == itor)
  1062. return;
  1063.  
  1064. TTextTail * pTextTail = itor->second;
  1065. pTextTail->pTextInstance->SetColor(0.1f, 0.9f, 0.1f);
  1066. }
  1067.  
  1068. void CPythonTextTail::AttachTitle(DWORD dwVID, const char * c_szName, const D3DXCOLOR & c_rColor)
  1069. {
  1070. if (!bPKTitleEnable)
  1071. return;
  1072.  
  1073. TTextTailMap::iterator itor = m_CharacterTextTailMap.find(dwVID);
  1074. if (m_CharacterTextTailMap.end() == itor)
  1075. return;
  1076.  
  1077. TTextTail * pTextTail = itor->second;
  1078.  
  1079. CGraphicTextInstance *& prTitle = pTextTail->pTitleTextInstance;
  1080. if (!prTitle)
  1081. {
  1082. prTitle = CGraphicTextInstance::New();
  1083. prTitle->SetTextPointer(ms_pFont);
  1084. prTitle->SetOutline(true);
  1085.  
  1086. if (LocaleService_IsEUROPE())
  1087. prTitle->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_RIGHT);
  1088. else
  1089. prTitle->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
  1090. prTitle->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
  1091. }
  1092.  
  1093. prTitle->SetValue(c_szName);
  1094. prTitle->SetColor(c_rColor.r, c_rColor.g, c_rColor.b);
  1095. prTitle->Update();
  1096. }
  1097.  
  1098. void CPythonTextTail::DetachTitle(DWORD dwVID)
  1099. {
  1100. if (!bPKTitleEnable)
  1101. return;
  1102.  
  1103. TTextTailMap::iterator itor = m_CharacterTextTailMap.find(dwVID);
  1104. if (m_CharacterTextTailMap.end() == itor)
  1105. return;
  1106.  
  1107. TTextTail * pTextTail = itor->second;
  1108.  
  1109. if (pTextTail->pTitleTextInstance)
  1110. {
  1111. CGraphicTextInstance::Delete(pTextTail->pTitleTextInstance);
  1112. pTextTail->pTitleTextInstance = NULL;
  1113. }
  1114. }
  1115.  
  1116. #ifdef ENABLE_TITLE_SYSTEM
  1117. void CPythonTextTail::AttachPrestige_(DWORD dwVID, const char * c_szName, const D3DXCOLOR & c_rColor)
  1118. {
  1119. if (!bPKTitleEnable)
  1120. return;
  1121.  
  1122. TTextTailMap::iterator itor = m_CharacterTextTailMap.find(dwVID);
  1123. if (m_CharacterTextTailMap.end() == itor)
  1124. return;
  1125.  
  1126. TTextTail * pTextTail = itor->second;
  1127.  
  1128. CGraphicTextInstance *& prMrVegaS = pTextTail->pVegaS_TitleText_tInstance;
  1129. if (!prMrVegaS)
  1130. {
  1131. prMrVegaS = CGraphicTextInstance::New();
  1132. prMrVegaS->SetTextPointer(ms_pFont);
  1133. prMrVegaS->SetOutline(true);
  1134.  
  1135. prMrVegaS->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
  1136. prMrVegaS->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
  1137. }
  1138.  
  1139. prMrVegaS->SetValue(c_szName);
  1140. prMrVegaS->SetColor(c_rColor.r, c_rColor.g, c_rColor.b);
  1141. prMrVegaS->Update();
  1142. }
  1143.  
  1144. void CPythonTextTail::DetachPrestige_(DWORD dwVID)
  1145. {
  1146. if (!bPKTitleEnable)
  1147. return;
  1148.  
  1149. TTextTailMap::iterator itor = m_CharacterTextTailMap.find(dwVID);
  1150. if (m_CharacterTextTailMap.end() == itor)
  1151. return;
  1152.  
  1153. TTextTail * pTextTail = itor->second;
  1154.  
  1155. if (pTextTail->pVegaS_TitleText_tInstance)
  1156. {
  1157. CGraphicTextInstance::Delete(pTextTail->pVegaS_TitleText_tInstance);
  1158. pTextTail->pVegaS_TitleText_tInstance = NULL;
  1159. }
  1160. }
  1161. #endif
  1162.  
  1163. #ifdef ENABLE_REBORN_SYSTEM
  1164. void CPythonTextTail::AttachReborn_(DWORD dwVID, const char * c_szName, const D3DXCOLOR & c_rColor)
  1165. {
  1166. if (!bPKTitleEnable)
  1167. return;
  1168.  
  1169. TTextTailMap::iterator itor = m_CharacterTextTailMap.find(dwVID);
  1170. if (m_CharacterTextTailMap.end() == itor)
  1171. return;
  1172.  
  1173. TTextTail * pTextTail = itor->second;
  1174.  
  1175. CGraphicTextInstance *& prReborn = pTextTail->pReborn_TitleText_tInstance;
  1176. if (!prReborn)
  1177. {
  1178. prReborn = CGraphicTextInstance::New();
  1179. prReborn->SetTextPointer(ms_pFont);
  1180. prReborn->SetOutline(true);
  1181.  
  1182. prReborn->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
  1183. prReborn->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
  1184. }
  1185.  
  1186. prReborn->SetValue(c_szName);
  1187. prReborn->SetColor(c_rColor.r, c_rColor.g, c_rColor.b);
  1188. prReborn->Update();
  1189. }
  1190.  
  1191. void CPythonTextTail::DetachReborn_(DWORD dwVID)
  1192. {
  1193. if (!bPKTitleEnable)
  1194. return;
  1195.  
  1196. TTextTailMap::iterator itor = m_CharacterTextTailMap.find(dwVID);
  1197. if (m_CharacterTextTailMap.end() == itor)
  1198. return;
  1199.  
  1200. TTextTail * pTextTail = itor->second;
  1201.  
  1202. if (pTextTail->pReborn_TitleText_tInstance)
  1203. {
  1204. CGraphicTextInstance::Delete(pTextTail->pReborn_TitleText_tInstance);
  1205. pTextTail->pReborn_TitleText_tInstance = NULL;
  1206. }
  1207. }
  1208. #endif
  1209.  
  1210. void CPythonTextTail::EnablePKTitle(BOOL bFlag)
  1211. {
  1212. bPKTitleEnable = bFlag;
  1213. }
  1214.  
  1215. void CPythonTextTail::AttachLevel(DWORD dwVID, const char * c_szText, const D3DXCOLOR & c_rColor)
  1216. {
  1217. if (!bPKTitleEnable)
  1218. return;
  1219.  
  1220. TTextTailMap::iterator itor = m_CharacterTextTailMap.find(dwVID);
  1221. if (m_CharacterTextTailMap.end() == itor)
  1222. return;
  1223.  
  1224. TTextTail * pTextTail = itor->second;
  1225.  
  1226. CGraphicTextInstance *& prLevel = pTextTail->pLevelTextInstance;
  1227. if (!prLevel)
  1228. {
  1229. prLevel = CGraphicTextInstance::New();
  1230. prLevel->SetTextPointer(ms_pFont);
  1231. prLevel->SetOutline(true);
  1232.  
  1233. prLevel->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_RIGHT);
  1234. prLevel->SetVerticalAlign(CGraphicTextInstance::VERTICAL_ALIGN_BOTTOM);
  1235. }
  1236.  
  1237. prLevel->SetValue(c_szText);
  1238. prLevel->SetColor(c_rColor.r, c_rColor.g, c_rColor.b);
  1239. prLevel->Update();
  1240. }
  1241.  
  1242. void CPythonTextTail::DetachLevel(DWORD dwVID)
  1243. {
  1244. if (!bPKTitleEnable)
  1245. return;
  1246.  
  1247. TTextTailMap::iterator itor = m_CharacterTextTailMap.find(dwVID);
  1248. if (m_CharacterTextTailMap.end() == itor)
  1249. return;
  1250.  
  1251. TTextTail * pTextTail = itor->second;
  1252.  
  1253. if (pTextTail->pLevelTextInstance)
  1254. {
  1255. CGraphicTextInstance::Delete(pTextTail->pLevelTextInstance);
  1256. pTextTail->pLevelTextInstance = NULL;
  1257. }
  1258. }
  1259.  
  1260.  
  1261. void CPythonTextTail::Initialize()
  1262. {
  1263. // DEFAULT_FONT
  1264. //ms_pFont = (CGraphicText *)CResourceManager::Instance().GetTypeResourcePointer(g_strDefaultFontName.c_str());
  1265.  
  1266. CGraphicText* pkDefaultFont = static_cast<CGraphicText*>(DefaultFont_GetResource());
  1267. if (!pkDefaultFont)
  1268. {
  1269. TraceError("CPythonTextTail::Initialize - CANNOT_FIND_DEFAULT_FONT");
  1270. return;
  1271. }
  1272.  
  1273. ms_pFont = pkDefaultFont;
  1274. // END_OF_DEFAULT_FONT
  1275. }
  1276.  
  1277. void CPythonTextTail::Destroy()
  1278. {
  1279. m_TextTailPool.Clear();
  1280. }
  1281.  
  1282. void CPythonTextTail::Clear()
  1283. {
  1284. m_CharacterTextTailMap.clear();
  1285. m_CharacterTextTailList.clear();
  1286. m_ItemTextTailMap.clear();
  1287. m_ItemTextTailList.clear();
  1288. m_ChatTailMap.clear();
  1289.  
  1290. m_TextTailPool.Clear();
  1291. }
  1292.  
  1293. CPythonTextTail::CPythonTextTail()
  1294. {
  1295. Clear();
  1296. }
  1297.  
  1298. CPythonTextTail::~CPythonTextTail()
  1299. {
  1300. Destroy();
  1301. }
  1302.  
Advertisement
Add Comment
Please, Sign In to add comment