1. #include "StdAfx.h"
  2. #include "InstanceBase.h"
  3. #include "PythonTextTail.h"
  4. #include "AbstractApplication.h"
  5. #include "AbstractPlayer.h"
  6. #include "PythonPlayer.h"
  7. #include "PythonSystem.h"
  8. #include "../EffectLib/EffectManager.h"
  9. #include "../EffectLib/ParticleSystemData.h"
  10. #include "../EterLib/Camera.h"
  11. float CInstanceBase::ms_fDustGap;
  12. float CInstanceBase::ms_fHorseDustGap;
  13. DWORD CInstanceBase::ms_adwCRCAffectEffect[CInstanceBase::EFFECT_NUM];
  14. std::string CInstanceBase::ms_astAffectEffectAttachBone[EFFECT_NUM];
  15. #define BYTE_COLOR_TO_D3DX_COLOR(r, g, b) D3DXCOLOR(float(r)/255.0f, float(g)/255.0f, float(b)/255.0f, 1.0f)
  16. /*
  17. D3DXCOLOR CInstanceBase::ms_kD3DXClrPC(0xFFFFD84D);//1.0f, 0.8470f, 0.3f, 1.0f
  18. D3DXCOLOR CInstanceBase::ms_kD3DXClrNPC(0xFF7BE85E);//0.4823f, 0.9098f, 0.3686f, 1.0f
  19. D3DXCOLOR CInstanceBase::ms_kD3DXClrMOB(0xFFEC170a);//0.9254f, 0.0901f, 0.0392f, 1.0f
  20. D3DXCOLOR CInstanceBase::ms_kD3DXClrPVP(0xFF8532D9);
  21. D3DXCOLOR CInstanceBase::ms_kD3DXClrPVPSelf(0xFFEE36DF);
  22. D3DXCOLOR CInstanceBase::ms_kD3DXClrKiller = BYTE_COLOR_TO_D3DX_COLOR(180, 100, 0);
  23. D3DXCOLOR CInstanceBase::ms_kD3DXClrTitle[CInstanceBase::TITLE_MAX_NUM] =
  24. {
  25. BYTE_COLOR_TO_D3DX_COLOR( 0, 204, 255),
  26. BYTE_COLOR_TO_D3DX_COLOR( 0, 144, 255),
  27. BYTE_COLOR_TO_D3DX_COLOR( 92, 110, 255),
  28. BYTE_COLOR_TO_D3DX_COLOR(155, 155, 255),
  29. 0xFFFFFFFF, // None
  30. BYTE_COLOR_TO_D3DX_COLOR(207, 117, 0),
  31. BYTE_COLOR_TO_D3DX_COLOR(235, 83, 0),
  32. BYTE_COLOR_TO_D3DX_COLOR(227, 0, 0),
  33. BYTE_COLOR_TO_D3DX_COLOR(255, 0, 0),
  34. };
  35. */
  36. D3DXCOLOR g_akD3DXClrTitle[CInstanceBase::TITLE_NUM];
  37. D3DXCOLOR g_akD3DXClrName[CInstanceBase::NAMECOLOR_NUM];
  38. std::map<int, std::string> g_TitleNameMap;
  39. std::set<DWORD> g_kSet_dwPVPReadyKey;
  40. std::set<DWORD> g_kSet_dwPVPKey;
  41. std::set<DWORD> g_kSet_dwGVGKey;
  42. std::set<DWORD> g_kSet_dwDUELKey;
  43. bool g_isEmpireNameMode=false;
  44. void CInstanceBase::SetEmpireNameMode(bool isEnable)
  45. {
  46. g_isEmpireNameMode=isEnable;
  47. if (isEnable)
  48. {
  49. g_akD3DXClrName[NAMECOLOR_MOB]=g_akD3DXClrName[NAMECOLOR_EMPIRE_MOB];
  50. g_akD3DXClrName[NAMECOLOR_NPC]=g_akD3DXClrName[NAMECOLOR_EMPIRE_NPC];
  51. g_akD3DXClrName[NAMECOLOR_PC]=g_akD3DXClrName[NAMECOLOR_NORMAL_PC];
  52. for (UINT uEmpire=1; uEmpire<EMPIRE_NUM; ++uEmpire)
  53. g_akD3DXClrName[NAMECOLOR_PC+uEmpire]=g_akD3DXClrName[NAMECOLOR_EMPIRE_PC+uEmpire];
  54. }
  55. else
  56. {
  57. g_akD3DXClrName[NAMECOLOR_MOB]=g_akD3DXClrName[NAMECOLOR_NORMAL_MOB];
  58. g_akD3DXClrName[NAMECOLOR_NPC]=g_akD3DXClrName[NAMECOLOR_NORMAL_NPC];
  59. for (UINT uEmpire=0; uEmpire<EMPIRE_NUM; ++uEmpire)
  60. g_akD3DXClrName[NAMECOLOR_PC+uEmpire]=g_akD3DXClrName[NAMECOLOR_NORMAL_PC];
  61. }
  62. }
  63. const D3DXCOLOR& CInstanceBase::GetIndexedNameColor(UINT eNameColor)
  64. {
  65. if (eNameColor>=NAMECOLOR_NUM)
  66. {
  67. static D3DXCOLOR s_kD3DXClrNameDefault(0xffffffff);
  68. return s_kD3DXClrNameDefault;
  69. }
  70. return g_akD3DXClrName[eNameColor];
  71. }
  72. void CInstanceBase::AddDamageEffect(DWORD damage,BYTE flag,BOOL bSelf,BOOL bTarget)
  73. {
  74. if(CPythonSystem::Instance().IsShowDamage())
  75. {
  76. SEffectDamage sDamage;
  77. sDamage.bSelf = bSelf;
  78. sDamage.bTarget = bTarget;
  79. sDamage.damage = damage;
  80. sDamage.flag = flag;
  81. m_DamageQueue.push_back(sDamage);
  82. }
  83. }
  84. void CInstanceBase::ProcessDamage()
  85. {
  86. if(m_DamageQueue.empty())
  87. return;
  88. SEffectDamage sDamage = m_DamageQueue.front();
  89. m_DamageQueue.pop_front();
  90. DWORD damage = sDamage.damage;
  91. BYTE flag = sDamage.flag;
  92. BOOL bSelf = sDamage.bSelf;
  93. BOOL bTarget = sDamage.bTarget;
  94. CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
  95. float cameraAngle = GetDegreeFromPosition2(pCamera->GetTarget().x,pCamera->GetTarget().y,pCamera->GetEye().x,pCamera->GetEye().y);
  96. DWORD FONT_WIDTH = 30;
  97. CEffectManager& rkEftMgr=CEffectManager::Instance();
  98. D3DXVECTOR3 v3Pos = m_GraphicThingInstance.GetPosition();
  99. v3Pos.z += float(m_GraphicThingInstance.GetHeight());
  100. D3DXVECTOR3 v3Rot = D3DXVECTOR3(0.0f, 0.0f, cameraAngle);
  101. if ( (flag & DAMAGE_DODGE) || (flag & DAMAGE_BLOCK) )
  102. {
  103. if(bSelf)
  104. rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[EFFECT_DAMAGE_MISS],v3Pos,v3Rot);
  105. else
  106. rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[EFFECT_DAMAGE_TARGETMISS],v3Pos,v3Rot);
  107. //__AttachEffect(EFFECT_DAMAGE_MISS);
  108. return;
  109. }
  110. else if (flag & DAMAGE_CRITICAL)
  111. {
  112. //rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[EFFECT_DAMAGE_CRITICAL],v3Pos,v3Rot);
  113. //return; ¼ıÀÚµµ Ç¥½Ã.
  114. }
  115. string strDamageType;
  116. DWORD rdwCRCEft = 0;
  117. /*
  118. if ( (flag & DAMAGE_POISON) )
  119. {
  120. strDamageType = "poison_";
  121. rdwCRCEft = EFFECT_DAMAGE_POISON;
  122. }
  123. else
  124. */
  125. {
  126. if(bSelf)
  127. {
  128. strDamageType = "damage_";
  129. if(m_bDamageEffectType==0)
  130. rdwCRCEft = EFFECT_DAMAGE_SELFDAMAGE;
  131. else
  132. rdwCRCEft = EFFECT_DAMAGE_SELFDAMAGE2;
  133. m_bDamageEffectType = !m_bDamageEffectType;
  134. }
  135. else if(bTarget == false)
  136. {
  137. strDamageType = "nontarget_";
  138. rdwCRCEft = EFFECT_DAMAGE_NOT_TARGET;
  139. return;//ÇöÀç Àû¿ë ¾ÈµÊ.
  140. }
  141. else
  142. {
  143. strDamageType = "target_";
  144. rdwCRCEft = EFFECT_DAMAGE_TARGET;
  145. }
  146. }
  147. DWORD index = 0;
  148. DWORD num = 0;
  149. vector<string> textures;
  150. while(damage>0)
  151. {
  152. if(index > 7)
  153. {
  154. TraceError("ProcessDamage¹«ÇÑ·çÇÁ °¡´É¼º");
  155. break;
  156. }
  157. num = damage%10;
  158. damage /= 10;
  159. char numBuf[MAX_PATH];
  160. sprintf(numBuf,"%d.dds",num);
  161. textures.push_back("d:/ymir work/effect/affect/damagevalue/"+strDamageType+numBuf);
  162. rkEftMgr.SetEffectTextures(ms_adwCRCAffectEffect[rdwCRCEft],textures);
  163. D3DXMATRIX matrix,matTrans;
  164. D3DXMatrixIdentity(&matrix);
  165. matrix._41 = v3Pos.x;
  166. matrix._42 = v3Pos.y;
  167. matrix._43 = v3Pos.z;
  168. D3DXMatrixTranslation(&matrix,v3Pos.x,v3Pos.y,v3Pos.z);
  169. D3DXMatrixMultiply(&matrix,&pCamera->GetInverseViewMatrix(),&matrix);
  170. D3DXMatrixTranslation(&matTrans,FONT_WIDTH*index,0,0);
  171. matTrans._41 = -matTrans._41;
  172. matrix = matTrans*matrix;
  173. D3DXMatrixMultiply(&matrix,&pCamera->GetViewMatrix(),&matrix);
  174. rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[rdwCRCEft],D3DXVECTOR3(matrix._41,matrix._42,matrix._43)
  175. ,v3Rot);
  176. textures.clear();
  177. index++;
  178. }
  179. }
  180. void CInstanceBase::AttachSpecialEffect(DWORD effect)
  181. {
  182. __AttachEffect(effect);
  183. }
  184. void CInstanceBase::LevelUp()
  185. {
  186. __AttachEffect(EFFECT_LEVELUP);
  187. }
  188. void CInstanceBase::SkillUp()
  189. {
  190. __AttachEffect(EFFECT_SKILLUP);
  191. }
  192. void CInstanceBase::CreateSpecialEffect(DWORD iEffectIndex)
  193. {
  194. const D3DXMATRIX & c_rmatGlobal = m_GraphicThingInstance.GetTransform();
  195. DWORD dwEffectIndex = CEffectManager::Instance().GetEmptyIndex();
  196. DWORD dwEffectCRC = ms_adwCRCAffectEffect[iEffectIndex];
  197. CEffectManager::Instance().CreateEffectInstance(dwEffectIndex, dwEffectCRC);
  198. CEffectManager::Instance().SelectEffectInstance(dwEffectIndex);
  199. CEffectManager::Instance().SetEffectInstanceGlobalMatrix(c_rmatGlobal);
  200. }
  201. void CInstanceBase::__EffectContainer_Destroy()
  202. {
  203. SEffectContainer::Dict& rkDctEftID=__EffectContainer_GetDict();
  204. SEffectContainer::Dict::iterator i;
  205. for (i=rkDctEftID.begin(); i!=rkDctEftID.end(); ++i)
  206. __DetachEffect(i->second);
  207. rkDctEftID.clear();
  208. }
  209. void CInstanceBase::__EffectContainer_Initialize()
  210. {
  211. SEffectContainer::Dict& rkDctEftID=__EffectContainer_GetDict();
  212. rkDctEftID.clear();
  213. }
  214. CInstanceBase::SEffectContainer::Dict& CInstanceBase::__EffectContainer_GetDict()
  215. {
  216. return m_kEffectContainer.m_kDct_dwEftID;
  217. }
  218. // Return value ¸¦ boolean ¿¡¼­ ID ·Î ¹Ù²ß´Ï´Ù
  219. DWORD CInstanceBase::__EffectContainer_AttachEffect(DWORD dwEftKey)
  220. {
  221. SEffectContainer::Dict& rkDctEftID=__EffectContainer_GetDict();
  222. SEffectContainer::Dict::iterator f=rkDctEftID.find(dwEftKey);
  223. if (rkDctEftID.end()!=f)
  224. return 0;
  225. DWORD dwEftID=__AttachEffect(dwEftKey);
  226. rkDctEftID.insert(SEffectContainer::Dict::value_type(dwEftKey, dwEftID));
  227. return dwEftID;
  228. }
  229. void CInstanceBase::__EffectContainer_DetachEffect(DWORD dwEftKey)
  230. {
  231. SEffectContainer::Dict& rkDctEftID=__EffectContainer_GetDict();
  232. SEffectContainer::Dict::iterator f=rkDctEftID.find(dwEftKey);
  233. if (rkDctEftID.end()==f)
  234. return;
  235. __DetachEffect(f->second);
  236. rkDctEftID.erase(f);
  237. }
  238. void CInstanceBase::__AttachEmpireEffect(DWORD eEmpire)
  239. {
  240. if (!__IsExistMainInstance())
  241. return;
  242. CInstanceBase* pkInstMain=__GetMainInstancePtr();
  243. if (IsWarp())
  244. return;
  245. if (IsObject())
  246. return;
  247. if (IsFlag())
  248. return;
  249. if (IsResource())
  250. return;
  251. if (pkInstMain->IsGameMaster())
  252. {
  253. }
  254. else
  255. {
  256. if (pkInstMain->IsSameEmpire(*this))
  257. return;
  258. // HIDE_OTHER_EMPIRE_EUNHYEONG_ASSASSIN
  259. if (IsAffect(AFFECT_EUNHYEONG))
  260. return;
  261. // END_OF_HIDE_OTHER_EMPIRE_EUNHYEONG_ASSASSIN
  262. }
  263. if (IsGameMaster())
  264. return;
  265. __EffectContainer_AttachEffect(EFFECT_EMPIRE+eEmpire);
  266. }
  267. void CInstanceBase::__AttachSelectEffect()
  268. {
  269. __EffectContainer_AttachEffect(EFFECT_SELECT);
  270. }
  271. void CInstanceBase::__DetachSelectEffect()
  272. {
  273. __EffectContainer_DetachEffect(EFFECT_SELECT);
  274. }
  275. void CInstanceBase::__AttachTargetEffect()
  276. {
  277. __EffectContainer_AttachEffect(EFFECT_TARGET);
  278. }
  279. void CInstanceBase::__DetachTargetEffect()
  280. {
  281. __EffectContainer_DetachEffect(EFFECT_TARGET);
  282. }
  283. void CInstanceBase::__StoneSmoke_Inialize()
  284. {
  285. m_kStoneSmoke.m_dwEftID=0;
  286. }
  287. void CInstanceBase::__StoneSmoke_Destroy()
  288. {
  289. if (!m_kStoneSmoke.m_dwEftID)
  290. return;
  291. __DetachEffect(m_kStoneSmoke.m_dwEftID);
  292. m_kStoneSmoke.m_dwEftID=0;
  293. }
  294. void CInstanceBase::__StoneSmoke_Create(DWORD eSmoke)
  295. {
  296. m_kStoneSmoke.m_dwEftID=m_GraphicThingInstance.AttachSmokeEffect(eSmoke);
  297. }
  298. void CInstanceBase::SetAlpha(float fAlpha)
  299. {
  300. __SetBlendRenderingMode();
  301. __SetAlphaValue(fAlpha);
  302. }
  303. bool CInstanceBase::UpdateDeleting()
  304. {
  305. Update();
  306. Transform();
  307. IAbstractApplication& rApp=IAbstractApplication::GetSingleton();
  308. float fAlpha = __GetAlphaValue() - (rApp.GetGlobalElapsedTime() * 1.5f);
  309. __SetAlphaValue(fAlpha);
  310. if (fAlpha < 0.0f)
  311. return false;
  312. return true;
  313. }
  314. void CInstanceBase::DeleteBlendOut()
  315. {
  316. __SetBlendRenderingMode();
  317. __SetAlphaValue(1.0f);
  318. DetachTextTail();
  319. IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton();
  320. rkPlayer.NotifyDeletingCharacterInstance(GetVirtualID());
  321. }
  322. void CInstanceBase::ClearPVPKeySystem()
  323. {
  324. g_kSet_dwPVPReadyKey.clear();
  325. g_kSet_dwPVPKey.clear();
  326. g_kSet_dwGVGKey.clear();
  327. g_kSet_dwDUELKey.clear();
  328. }
  329. void CInstanceBase::InsertPVPKey(DWORD dwVIDSrc, DWORD dwVIDDst)
  330. {
  331. DWORD dwPVPKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
  332. g_kSet_dwPVPKey.insert(dwPVPKey);
  333. }
  334. void CInstanceBase::InsertPVPReadyKey(DWORD dwVIDSrc, DWORD dwVIDDst)
  335. {
  336. DWORD dwPVPReadyKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
  337. g_kSet_dwPVPKey.insert(dwPVPReadyKey);
  338. }
  339. void CInstanceBase::RemovePVPKey(DWORD dwVIDSrc, DWORD dwVIDDst)
  340. {
  341. DWORD dwPVPKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
  342. g_kSet_dwPVPKey.erase(dwPVPKey);
  343. }
  344. void CInstanceBase::InsertGVGKey(DWORD dwSrcGuildVID, DWORD dwDstGuildVID)
  345. {
  346. DWORD dwGVGKey = __GetPVPKey(dwSrcGuildVID, dwDstGuildVID);
  347. g_kSet_dwGVGKey.insert(dwGVGKey);
  348. }
  349. void CInstanceBase::RemoveGVGKey(DWORD dwSrcGuildVID, DWORD dwDstGuildVID)
  350. {
  351. DWORD dwGVGKey = __GetPVPKey(dwSrcGuildVID, dwDstGuildVID);
  352. g_kSet_dwGVGKey.erase(dwGVGKey);
  353. }
  354. void CInstanceBase::InsertDUELKey(DWORD dwVIDSrc, DWORD dwVIDDst)
  355. {
  356. DWORD dwPVPKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
  357. g_kSet_dwDUELKey.insert(dwPVPKey);
  358. }
  359. DWORD CInstanceBase::__GetPVPKey(DWORD dwVIDSrc, DWORD dwVIDDst)
  360. {
  361. if (dwVIDSrc>dwVIDDst)
  362. std::swap(dwVIDSrc, dwVIDDst);
  363. DWORD awSrc[2];
  364. awSrc[0]=dwVIDSrc;
  365. awSrc[1]=dwVIDDst;
  366. const BYTE * s = (const BYTE *) awSrc;
  367. const BYTE * end = s + sizeof(awSrc);
  368. unsigned long h = 0;
  369. while (s < end)
  370. {
  371. h *= 16777619;
  372. h ^= (BYTE) *(BYTE *) (s++);
  373. }
  374. return h;
  375. }
  376. bool CInstanceBase::__FindPVPKey(DWORD dwVIDSrc, DWORD dwVIDDst)
  377. {
  378. DWORD dwPVPKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
  379. if (g_kSet_dwPVPKey.end()==g_kSet_dwPVPKey.find(dwPVPKey))
  380. return false;
  381. return true;
  382. }
  383. bool CInstanceBase::__FindPVPReadyKey(DWORD dwVIDSrc, DWORD dwVIDDst)
  384. {
  385. DWORD dwPVPKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
  386. if (g_kSet_dwPVPReadyKey.end()==g_kSet_dwPVPReadyKey.find(dwPVPKey))
  387. return false;
  388. return true;
  389. }
  390. //±æµåÀü½Ã »ó´ë ±æµåÀÎÁö È®ÀÎÇÒ¶§.
  391. bool CInstanceBase::__FindGVGKey(DWORD dwSrcGuildID, DWORD dwDstGuildID)
  392. {
  393. DWORD dwGVGKey=__GetPVPKey(dwSrcGuildID, dwDstGuildID);
  394. if (g_kSet_dwGVGKey.end()==g_kSet_dwGVGKey.find(dwGVGKey))
  395. return false;
  396. return true;
  397. }
  398. //´ë·Ã ¸ğµå¿¡¼­´Â ´ë·Ã »ó´ë¸¸ °ø°İÇÒ ¼ö ÀÖ´Ù.
  399. bool CInstanceBase::__FindDUELKey(DWORD dwVIDSrc, DWORD dwVIDDst)
  400. {
  401. DWORD dwDUELKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
  402. if (g_kSet_dwDUELKey.end()==g_kSet_dwDUELKey.find(dwDUELKey))
  403. return false;
  404. return true;
  405. }
  406. bool CInstanceBase::IsPVPInstance(CInstanceBase& rkInstSel)
  407. {
  408. DWORD dwVIDSrc=GetVirtualID();
  409. DWORD dwVIDDst=rkInstSel.GetVirtualID();
  410. DWORD dwGuildIDSrc=GetGuildID();
  411. DWORD dwGuildIDDst=rkInstSel.GetGuildID();
  412. if (GetDuelMode()) //´ë·Ã ¸ğµåÀ϶§´Â ~_~
  413. return true;
  414. return __FindPVPKey(dwVIDSrc, dwVIDDst) || __FindGVGKey(dwGuildIDSrc, dwGuildIDDst);
  415. //__FindDUELKey(dwVIDSrc, dwVIDDst);
  416. }
  417. const D3DXCOLOR& CInstanceBase::GetNameColor()
  418. {
  419. return GetIndexedNameColor(GetNameColorIndex());
  420. }
  421. UINT CInstanceBase::GetNameColorIndex()
  422. {
  423. if (IsPC())
  424. {
  425. if (m_isKiller)
  426. {
  427. return NAMECOLOR_PK;
  428. }
  429. if (__IsExistMainInstance() && !__IsMainInstance())
  430. {
  431. CInstanceBase* pkInstMain=__GetMainInstancePtr();
  432. if (!pkInstMain)
  433. {
  434. TraceError("CInstanceBase::GetNameColorIndex - MainInstance is NULL");
  435. return NAMECOLOR_PC;
  436. }
  437. DWORD dwVIDMain=pkInstMain->GetVirtualID();
  438. DWORD dwVIDSelf=GetVirtualID();
  439. if (pkInstMain->GetDuelMode())
  440. {
  441. switch(pkInstMain->GetDuelMode())
  442. {
  443. case DUEL_CANNOTATTACK:
  444. return NAMECOLOR_PC + GetEmpireID();
  445. case DUEL_START:
  446. if(__FindDUELKey(dwVIDMain, dwVIDSelf))
  447. return NAMECOLOR_PVP;
  448. else
  449. return NAMECOLOR_PC + GetEmpireID();
  450. }
  451. }
  452. if (pkInstMain->IsSameEmpire(*this))
  453. {
  454. if (__FindPVPKey(dwVIDMain, dwVIDSelf))
  455. {
  456. return NAMECOLOR_PVP;
  457. }
  458. DWORD dwGuildIDMain=pkInstMain->GetGuildID();
  459. DWORD dwGuildIDSelf=GetGuildID();
  460. if (__FindGVGKey(dwGuildIDMain, dwGuildIDSelf))
  461. {
  462. return NAMECOLOR_PVP;
  463. }
  464. /*
  465. if (__FindDUELKey(dwVIDMain, dwVIDSelf))
  466. {
  467. return NAMECOLOR_PVP;
  468. }
  469. */
  470. }
  471. else
  472. {
  473. return NAMECOLOR_PVP;
  474. }
  475. }
  476. IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
  477. if (rPlayer.IsPartyMemberByVID(GetVirtualID()))
  478. return NAMECOLOR_PARTY;
  479. return NAMECOLOR_PC + GetEmpireID();
  480. }
  481. else if (IsNPC())
  482. {
  483. return NAMECOLOR_NPC;
  484. }
  485. else if (IsEnemy())
  486. {
  487. return NAMECOLOR_MOB;
  488. }
  489. else if (IsPoly())
  490. {
  491. return NAMECOLOR_MOB;
  492. }
  493. return D3DXCOLOR(0xffffffff);
  494. }
  495. const D3DXCOLOR& CInstanceBase::GetTitleColor()
  496. {
  497. UINT uGrade = GetAlignmentGrade();
  498. if ( uGrade >= TITLE_NUM)
  499. {
  500. static D3DXCOLOR s_kD3DXClrTitleDefault(0xffffffff);
  501. return s_kD3DXClrTitleDefault;
  502. }
  503. return g_akD3DXClrTitle[uGrade];
  504. }
  505. void CInstanceBase::AttachTextTail()
  506. {
  507. if (m_isTextTail)
  508. {
  509. TraceError("CInstanceBase::AttachTextTail - VID [%d] ALREADY EXIST", GetVirtualID());
  510. return;
  511. }
  512. m_isTextTail=true;
  513. DWORD dwVID=GetVirtualID();
  514. float fTextTailHeight=IsMountingHorse() ? 110.0f : 10.0f;
  515. static D3DXCOLOR s_kD3DXClrTextTail=D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
  516. CPythonTextTail::Instance().RegisterCharacterTextTail(m_dwGuildID, dwVID, s_kD3DXClrTextTail, fTextTailHeight);
  517. // CHARACTER_LEVEL
  518. if (m_dwLevel)
  519. {
  520. UpdateTextTailLevel(m_dwLevel);
  521. }
  522. }
  523. void CInstanceBase::DetachTextTail()
  524. {
  525. if (!m_isTextTail)
  526. return;
  527. m_isTextTail=false;
  528. CPythonTextTail::Instance().DeleteCharacterTextTail(GetVirtualID());
  529. }
  530. void CInstanceBase::UpdateTextTailLevel(DWORD level)
  531. {
  532. #ifdef ENABLE_SUPPORT_SYSTEM
  533. if (GetRace() == 3 && GetInstanceType() == CActorInstance::TYPE_NPC && m_kHorse.GetActorPtr() && m_kHorse.GetActorPtr() != NULL)
  534. {
  535. float asd = 0.5f + 0.02f*GetLevel();
  536. m_kHorse.GetActorPtr()->SetScale(asd, asd, asd);
  537. }
  538. #endif
  539. //static D3DXCOLOR s_kLevelColor = D3DXCOLOR(119.0f/255.0f, 246.0f/255.0f, 168.0f/255.0f, 1.0f);
  540. static D3DXCOLOR s_kLevelColor = D3DXCOLOR(152.0f/255.0f, 255.0f/255.0f, 51.0f/255.0f, 1.0f);
  541. char szText[256];
  542. sprintf(szText, "[Lv %d]", level);
  543. CPythonTextTail::Instance().AttachLevel(GetVirtualID(), szText, s_kLevelColor);
  544. if (IsGameMaster())
  545. {
  546. sprintf(szText, "[Lv %d] |cffffcc00[Yönetici]|r", level);
  547. CPythonTextTail::Instance().AttachLevel(GetVirtualID(), szText, s_kLevelColor);
  548. }
  549. }
  550. void CInstanceBase::RefreshTextTail()
  551. {
  552. CPythonTextTail::Instance().SetCharacterTextTailColor(GetVirtualID(), GetNameColor());
  553. int iAlignmentGrade = GetAlignmentGrade();
  554. if (TITLE_NONE == iAlignmentGrade)
  555. {
  556. CPythonTextTail::Instance().DetachTitle(GetVirtualID());
  557. }
  558. else
  559. {
  560. std::map<int, std::string>::iterator itor = g_TitleNameMap.find(iAlignmentGrade);
  561. if (g_TitleNameMap.end() != itor)
  562. {
  563. const std::string & c_rstrTitleName = itor->second;
  564. CPythonTextTail::Instance().AttachTitle(GetVirtualID(), c_rstrTitleName.c_str(), GetTitleColor());
  565. }
  566. }
  567. }
  568. void CInstanceBase::RefreshTextTailTitle()
  569. {
  570. RefreshTextTail();
  571. }
  572. // 2004.07.25.myevan.ÀÌÆåÆ® ¾È ºÙ´Â ¹®Á¦ ÇØ°á
  573. /////////////////////////////////////////////////
  574. void CInstanceBase::__ClearAffectFlagContainer()
  575. {
  576. m_kAffectFlagContainer.Clear();
  577. }
  578. void CInstanceBase::__ClearAffects()
  579. {
  580. if (IsStone())
  581. {
  582. __StoneSmoke_Destroy();
  583. }
  584. else
  585. {
  586. for (int iAffect=0; iAffect<AFFECT_NUM; ++iAffect)
  587. {
  588. __DetachEffect(m_adwCRCAffectEffect[iAffect]);
  589. m_adwCRCAffectEffect[iAffect]=0;
  590. }
  591. __ClearAffectFlagContainer();
  592. }
  593. m_GraphicThingInstance.__OnClearAffects();
  594. }
  595. /////////////////////////////////////////////////
  596. void CInstanceBase::__SetNormalAffectFlagContainer(const CAffectFlagContainer& c_rkAffectFlagContainer)
  597. {
  598. for (int i=0; i<CAffectFlagContainer::BIT_SIZE; ++i)
  599. {
  600. bool isOldSet=m_kAffectFlagContainer.IsSet(i);
  601. bool isNewSet=c_rkAffectFlagContainer.IsSet(i);
  602. if (isOldSet != isNewSet)
  603. {
  604. __SetAffect(i, isNewSet);
  605. if (isNewSet)
  606. m_GraphicThingInstance.__OnSetAffect(i);
  607. else
  608. m_GraphicThingInstance.__OnResetAffect(i);
  609. }
  610. }
  611. m_kAffectFlagContainer.CopyInstance(c_rkAffectFlagContainer);
  612. }
  613. void CInstanceBase::__SetStoneSmokeFlagContainer(const CAffectFlagContainer& c_rkAffectFlagContainer)
  614. {
  615. m_kAffectFlagContainer.CopyInstance(c_rkAffectFlagContainer);
  616. DWORD eSmoke;
  617. if (m_kAffectFlagContainer.IsSet(STONE_SMOKE8))
  618. eSmoke=3;
  619. else if (m_kAffectFlagContainer.IsSet(STONE_SMOKE5)|m_kAffectFlagContainer.IsSet(STONE_SMOKE6)|m_kAffectFlagContainer.IsSet(STONE_SMOKE7))
  620. eSmoke=2;
  621. else if (m_kAffectFlagContainer.IsSet(STONE_SMOKE2)|m_kAffectFlagContainer.IsSet(STONE_SMOKE3)|m_kAffectFlagContainer.IsSet(STONE_SMOKE4))
  622. eSmoke=1;
  623. else
  624. eSmoke=0;
  625. __StoneSmoke_Destroy();
  626. __StoneSmoke_Create(eSmoke);
  627. }
  628. void CInstanceBase::SetAffectFlagContainer(const CAffectFlagContainer& c_rkAffectFlagContainer)
  629. {
  630. if (IsBuilding())
  631. {
  632. return;
  633. }
  634. else if (IsStone())
  635. {
  636. __SetStoneSmokeFlagContainer(c_rkAffectFlagContainer);
  637. }
  638. else
  639. {
  640. __SetNormalAffectFlagContainer(c_rkAffectFlagContainer);
  641. }
  642. }
  643. void CInstanceBase::SCRIPT_SetAffect(UINT eAffect, bool isVisible)
  644. {
  645. __SetAffect(eAffect, isVisible);
  646. }
  647. void CInstanceBase::__SetReviveInvisibilityAffect(bool isVisible)
  648. {
  649. if (isVisible)
  650. {
  651. // NOTE : Dress ¸¦ ÀÔ°í ÀÖÀ¸¸é Alpha ¸¦ ³ÖÁö ¾Ê´Â´Ù.
  652. if (IsWearingDress())
  653. return;
  654. m_GraphicThingInstance.BlendAlphaValue(0.5f, 1.0f);
  655. }
  656. else
  657. {
  658. m_GraphicThingInstance.BlendAlphaValue(1.0f, 1.0f);
  659. }
  660. }
  661. void CInstanceBase::__Assassin_SetEunhyeongAffect(bool isVisible)
  662. {
  663. if (isVisible)
  664. {
  665. // NOTE : Dress ¸¦ ÀÔ°í ÀÖÀ¸¸é Alpha ¸¦ ³ÖÁö ¾Ê´Â´Ù.
  666. if (IsWearingDress())
  667. return;
  668. if (__IsMainInstance() || __MainCanSeeHiddenThing())
  669. {
  670. m_GraphicThingInstance.BlendAlphaValue(0.5f, 1.0f);
  671. }
  672. else
  673. {
  674. // 2004.10.16.myevan.ÀºÇü¹ı ¿ÏÀü Åõ¸í
  675. m_GraphicThingInstance.BlendAlphaValue(0.0f, 1.0f);
  676. m_GraphicThingInstance.HideAllAttachingEffect();
  677. }
  678. }
  679. else
  680. {
  681. m_GraphicThingInstance.BlendAlphaValue(1.0f, 1.0f);
  682. m_GraphicThingInstance.ShowAllAttachingEffect();
  683. }
  684. }
  685. void CInstanceBase::__Shaman_SetParalysis(bool isParalysis)
  686. {
  687. m_GraphicThingInstance.SetParalysis(isParalysis);
  688. }
  689. void CInstanceBase::__Warrior_SetGeomgyeongAffect(bool isVisible)
  690. {
  691. if (isVisible)
  692. {
  693. if (IsWearingDress())
  694. return;
  695. if (m_kWarrior.m_dwGeomgyeongEffect)
  696. __DetachEffect(m_kWarrior.m_dwGeomgyeongEffect);
  697. m_GraphicThingInstance.SetReachScale(1.5f);
  698. if (m_GraphicThingInstance.IsTwoHandMode())
  699. m_kWarrior.m_dwGeomgyeongEffect=__AttachEffect(EFFECT_WEAPON+WEAPON_TWOHAND);
  700. else
  701. m_kWarrior.m_dwGeomgyeongEffect=__AttachEffect(EFFECT_WEAPON+WEAPON_ONEHAND);
  702. }
  703. else
  704. {
  705. m_GraphicThingInstance.SetReachScale(1.0f);
  706. __DetachEffect(m_kWarrior.m_dwGeomgyeongEffect);
  707. m_kWarrior.m_dwGeomgyeongEffect=0;
  708. }
  709. }
  710. void CInstanceBase::__SetAffect(UINT eAffect, bool isVisible)
  711. {
  712. switch (eAffect)
  713. {
  714. case AFFECT_YMIR:
  715. if (IsAffect(AFFECT_INVISIBILITY))
  716. return;
  717. break;
  718. /*
  719. case AFFECT_GWIGEOM: // Àü±â ¼Ó¼º °ø°İÀ¸·Î ¹Ù²ğ ¿¹Á¤
  720. if (isVisible)
  721. {
  722. m_GraphicThingInstance.SetBattleHitEffect(ms_adwCRCAffectEffect[EFFECT_ELECTRIC_HIT]);
  723. m_GraphicThingInstance.SetBattleAttachEffect(ms_adwCRCAffectEffect[EFFECT_ELECTRIC_ATTACH]);
  724. }
  725. else
  726. {
  727. m_GraphicThingInstance.SetBattleHitEffect(ms_adwCRCAffectEffect[EFFECT_HIT]);
  728. m_GraphicThingInstance.SetBattleAttachEffect(0);
  729. }
  730. return;
  731. break;
  732. case AFFECT_HWAYEOM: // È­¿° ¼Ó¼º °ø°İÀ¸·Î ¹Ù²ğ ¿¹Á¤
  733. if (isVisible)
  734. {
  735. m_GraphicThingInstance.SetBattleHitEffect(ms_adwCRCAffectEffect[EFFECT_FLAME_HIT]);
  736. m_GraphicThingInstance.SetBattleAttachEffect(ms_adwCRCAffectEffect[EFFECT_FLAME_ATTACH]);
  737. }
  738. else
  739. {
  740. m_GraphicThingInstance.SetBattleHitEffect(ms_adwCRCAffectEffect[EFFECT_HIT]);
  741. m_GraphicThingInstance.SetBattleAttachEffect(0);
  742. }
  743. // È­¿°ÂüÀº °ø°İÇÒ ¶§¸¸ ÀϽÃÀûÀ¸·Î Visible ÇÕ´Ï´Ù.
  744. return;
  745. break;
  746. */
  747. case AFFECT_CHEONGEUN:
  748. m_GraphicThingInstance.SetResistFallen(isVisible);
  749. break;
  750. case AFFECT_GEOMGYEONG:
  751. __Warrior_SetGeomgyeongAffect(isVisible);
  752. return;
  753. break;
  754. case AFFECT_REVIVE_INVISIBILITY:
  755. __Assassin_SetEunhyeongAffect(isVisible);
  756. break;
  757. case AFFECT_EUNHYEONG:
  758. __Assassin_SetEunhyeongAffect(isVisible);
  759. break;
  760. case AFFECT_GYEONGGONG:
  761. case AFFECT_KWAESOK:
  762. // °æ°ø¼ú, Äè¼ÓÀº ¶Û¶§¸¸ Attaching ½Ãŵ´Ï´Ù. - [levites]
  763. if (isVisible)
  764. if (!IsWalking())
  765. return;
  766. break;
  767. case AFFECT_INVISIBILITY:
  768. // 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Î º¯°æ
  769. if (isVisible)
  770. {
  771. m_GraphicThingInstance.ClearAttachingEffect();
  772. __EffectContainer_Destroy();
  773. DetachTextTail();
  774. }
  775. else
  776. {
  777. m_GraphicThingInstance.BlendAlphaValue(1.0f, 1.0f);
  778. AttachTextTail();
  779. RefreshTextTail();
  780. }
  781. return;
  782. break;
  783. // case AFFECT_FAINT:
  784. // m_GraphicThingInstance.SetFaint(isVisible);
  785. // break;
  786. // case AFFECT_SLEEP:
  787. // m_GraphicThingInstance.SetSleep(isVisible);
  788. // break;
  789. case AFFECT_STUN:
  790. m_GraphicThingInstance.SetSleep(isVisible);
  791. break;
  792. }
  793. if (eAffect>=AFFECT_NUM)
  794. {
  795. TraceError("CInstanceBase[VID:%d]::SetAffect(eAffect:%d<AFFECT_NUM:%d, isVisible=%d)", GetVirtualID(), eAffect, isVisible);
  796. return;
  797. }
  798. if (isVisible)
  799. {
  800. if (!m_adwCRCAffectEffect[eAffect])
  801. {
  802. m_adwCRCAffectEffect[eAffect]=__AttachEffect(EFFECT_AFFECT+eAffect);
  803. }
  804. }
  805. else
  806. {
  807. if (m_adwCRCAffectEffect[eAffect])
  808. {
  809. __DetachEffect(m_adwCRCAffectEffect[eAffect]);
  810. m_adwCRCAffectEffect[eAffect]=0;
  811. }
  812. }
  813. }
  814. bool CInstanceBase::IsPossibleEmoticon()
  815. {
  816. CEffectManager& rkEftMgr=CEffectManager::Instance();
  817. for(DWORD eEmoticon = 0; eEmoticon < EMOTICON_NUM; eEmoticon++)
  818. {
  819. DWORD effectID = ms_adwCRCAffectEffect[EFFECT_EMOTICON+eEmoticon];
  820. if( effectID && rkEftMgr.IsAliveEffect(effectID) )
  821. return false;
  822. }
  823. if(ELTimer_GetMSec() - m_dwEmoticonTime < 1000)
  824. {
  825. TraceError("ELTimer_GetMSec() - m_dwEmoticonTime");
  826. return false;
  827. }
  828. return true;
  829. }
  830. void CInstanceBase::SetFishEmoticon()
  831. {
  832. SetEmoticon(EMOTICON_FISH);
  833. }
  834. void CInstanceBase::SetEmoticon(UINT eEmoticon)
  835. {
  836. if (eEmoticon>=EMOTICON_NUM)
  837. {
  838. TraceError("CInstanceBase[VID:%d]::SetEmoticon(eEmoticon:%d<EMOTICON_NUM:%d, isVisible=%d)",
  839. GetVirtualID(), eEmoticon);
  840. return;
  841. }
  842. if (IsPossibleEmoticon())
  843. {
  844. D3DXVECTOR3 v3Pos = m_GraphicThingInstance.GetPosition();
  845. v3Pos.z += float(m_GraphicThingInstance.GetHeight());
  846. //CEffectManager& rkEftMgr=CEffectManager::Instance();
  847. CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
  848. D3DXVECTOR3 v3Dir = (pCamera->GetEye()-v3Pos)*9/10;
  849. v3Pos = pCamera->GetEye()-v3Dir;
  850. v3Pos = D3DXVECTOR3(0,0,0);
  851. v3Pos.z += float(m_GraphicThingInstance.GetHeight());
  852. //rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[EFFECT_EMOTICON+eEmoticon],v3Pos,D3DXVECTOR3(0,0,0));
  853. m_GraphicThingInstance.AttachEffectByID(0, NULL, ms_adwCRCAffectEffect[EFFECT_EMOTICON+eEmoticon],&v3Pos);
  854. m_dwEmoticonTime = ELTimer_GetMSec();
  855. }
  856. }
  857. void CInstanceBase::SetDustGap(float fDustGap)
  858. {
  859. ms_fDustGap=fDustGap;
  860. }
  861. void CInstanceBase::SetHorseDustGap(float fDustGap)
  862. {
  863. ms_fHorseDustGap=fDustGap;
  864. }
  865. void CInstanceBase::__DetachEffect(DWORD dwEID)
  866. {
  867. m_GraphicThingInstance.DettachEffect(dwEID);
  868. }
  869. DWORD CInstanceBase::__AttachEffect(UINT eEftType)
  870. {
  871. // 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Î º¯°æ
  872. if (IsAffect(AFFECT_INVISIBILITY))
  873. return 0;
  874. if (eEftType>=EFFECT_NUM)
  875. return 0;
  876. if (ms_astAffectEffectAttachBone[eEftType].empty())
  877. {
  878. return m_GraphicThingInstance.AttachEffectByID(0, NULL, ms_adwCRCAffectEffect[eEftType]);
  879. }
  880. else
  881. {
  882. std::string & rstrBoneName = ms_astAffectEffectAttachBone[eEftType];
  883. const char * c_szBoneName;
  884. // ¾ç¼Õ¿¡ ºÙÀÏ ¶§ »ç¿ëÇÑ´Ù.
  885. // ÀÌ·± ½ÄÀÇ ¿¹¿Ü 󸮸¦ ÇØ³õÀº °ÍÀº ij¸¯ÅÍ ¸¶´Ù Equip ÀÇ Bone Name ÀÌ ´Ù¸£±â ¶§¹®.
  886. if (0 == rstrBoneName.compare("PART_WEAPON"))
  887. {
  888. if (m_GraphicThingInstance.GetAttachingBoneName(CRaceData::PART_WEAPON, &c_szBoneName))
  889. {
  890. return m_GraphicThingInstance.AttachEffectByID(0, c_szBoneName, ms_adwCRCAffectEffect[eEftType]);
  891. }
  892. }
  893. else if (0 == rstrBoneName.compare("PART_WEAPON_LEFT"))
  894. {
  895. if (m_GraphicThingInstance.GetAttachingBoneName(CRaceData::PART_WEAPON_LEFT, &c_szBoneName))
  896. {
  897. return m_GraphicThingInstance.AttachEffectByID(0, c_szBoneName, ms_adwCRCAffectEffect[eEftType]);
  898. }
  899. }
  900. else
  901. {
  902. return m_GraphicThingInstance.AttachEffectByID(0, rstrBoneName.c_str(), ms_adwCRCAffectEffect[eEftType]);
  903. }
  904. }
  905. return 0;
  906. }
  907. void CInstanceBase::__ComboProcess()
  908. {
  909. /*
  910. DWORD dwcurComboIndex = m_GraphicThingInstance.GetComboIndex();
  911. if (0 != dwcurComboIndex)
  912. {
  913. if (m_dwLastComboIndex != m_GraphicThingInstance.GetComboIndex())
  914. {
  915. if (!m_GraphicThingInstance.IsHandMode() & IsAffect(AFFECT_HWAYEOM))
  916. {
  917. __AttachEffect(EFFECT_FLAME_ATTACK);
  918. }
  919. }
  920. }
  921. m_dwLastComboIndex = dwcurComboIndex;
  922. */
  923. }
  924. bool CInstanceBase::RegisterEffect(UINT eEftType, const char* c_szEftAttachBone, const char* c_szEftName, bool isCache)
  925. {
  926. if (eEftType>=EFFECT_NUM)
  927. return false;
  928. ms_astAffectEffectAttachBone[eEftType]=c_szEftAttachBone;
  929. DWORD& rdwCRCEft=ms_adwCRCAffectEffect[eEftType];
  930. if (!CEffectManager::Instance().RegisterEffect2(c_szEftName, &rdwCRCEft, isCache))
  931. {
  932. TraceError("CInstanceBase::RegisterEffect(eEftType=%d, c_szEftAttachBone=%s, c_szEftName=%s, isCache=%d) - Error", eEftType, c_szEftAttachBone, c_szEftName, isCache);
  933. rdwCRCEft=0;
  934. return false;
  935. }
  936. return true;
  937. }
  938. void CInstanceBase::RegisterTitleName(int iIndex, const char * c_szTitleName)
  939. {
  940. g_TitleNameMap.insert(make_pair(iIndex, c_szTitleName));
  941. }
  942. D3DXCOLOR __RGBToD3DXColoru(UINT r, UINT g, UINT b)
  943. {
  944. DWORD dwColor=0xff;dwColor<<=8;
  945. dwColor|=r;dwColor<<=8;
  946. dwColor|=g;dwColor<<=8;
  947. dwColor|=b;
  948. return D3DXCOLOR(dwColor);
  949. }
  950. bool CInstanceBase::RegisterNameColor(UINT uIndex, UINT r, UINT g, UINT b)
  951. {
  952. if (uIndex>=NAMECOLOR_NUM)
  953. return false;
  954. g_akD3DXClrName[uIndex]=__RGBToD3DXColoru(r, g, b);
  955. return true;
  956. }
  957. bool CInstanceBase::RegisterTitleColor(UINT uIndex, UINT r, UINT g, UINT b)
  958. {
  959. if (uIndex>=TITLE_NUM)
  960. return false;
  961. g_akD3DXClrTitle[uIndex]=__RGBToD3DXColoru(r, g, b);
  962. return true;
  963. }