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. #ifdef ENABLE_EFFECT_SYSTEM_KUROKO
  230. DWORD CInstanceBase::__AttachEffectToArmours(string effectfilename)
  231. {
  232. const char * effectpath = effectfilename.c_str();
  233. CEffectManager::Instance().RegisterEffect(effectpath, false, false);
  234. return m_GraphicThingInstance.AttachEffectByName(0, "Bip01", effectpath);
  235. }
  236. #endif
  237. void CInstanceBase::__EffectContainer_DetachEffect(DWORD dwEftKey)
  238. {
  239. SEffectContainer::Dict& rkDctEftID=__EffectContainer_GetDict();
  240. SEffectContainer::Dict::iterator f=rkDctEftID.find(dwEftKey);
  241. if (rkDctEftID.end()==f)
  242. return;
  243. __DetachEffect(f->second);
  244. rkDctEftID.erase(f);
  245. }
  246. #ifdef WJ_ENABLE_BOSS_EFFECT
  247. void CInstanceBase::__AttachEffectBoss()
  248. {
  249. if (!__IsExistMainInstance())
  250. return;
  251. CInstanceBase* pkInstMain = __GetMainInstancePtr();
  252. if (IsWarp())
  253. return;
  254. if (IsObject())
  255. return;
  256. if (IsFlag())
  257. return;
  258. if (IsResource())
  259. return;
  260. #ifdef ENABLE_OFFLINE_SHOP_SYSTEM
  261. if (IsOfflineShopNPC())
  262. return;
  263. #endif
  264. __EffectContainer_AttachEffect(EFFECT_BOSS);
  265. }
  266. #endif
  267. void CInstanceBase::__AttachEmpireEffect(DWORD eEmpire)
  268. {
  269. if (!__IsExistMainInstance())
  270. return;
  271. CInstanceBase* pkInstMain=__GetMainInstancePtr();
  272. if (IsWarp())
  273. return;
  274. if (IsObject())
  275. return;
  276. if (IsFlag())
  277. return;
  278. if (IsResource())
  279. return;
  280. #ifdef ENABLE_OFFLINE_SHOP_SYSTEM
  281. if (IsOfflineShopNPC())
  282. return;
  283. #endif
  284. #ifdef HIDE_KINGDOM_FLAG_NPC
  285. if (IsNPC())
  286. return;
  287. #endif
  288. if (pkInstMain->IsGameMaster())
  289. {
  290. }
  291. else
  292. {
  293. if (pkInstMain->IsSameEmpire(*this))
  294. return;
  295. // HIDE_OTHER_EMPIRE_EUNHYEONG_ASSASSIN
  296. if (IsAffect(AFFECT_EUNHYEONG))
  297. return;
  298. // END_OF_HIDE_OTHER_EMPIRE_EUNHYEONG_ASSASSIN
  299. }
  300. if (IsGameMaster())
  301. return;
  302. __EffectContainer_AttachEffect(EFFECT_EMPIRE+eEmpire);
  303. }
  304. void CInstanceBase::__AttachSelectEffect()
  305. {
  306. __EffectContainer_AttachEffect(EFFECT_SELECT);
  307. }
  308. void CInstanceBase::__DetachSelectEffect()
  309. {
  310. __EffectContainer_DetachEffect(EFFECT_SELECT);
  311. }
  312. #ifdef ENABLE_OFFLINE_SHOP_SYSTEM
  313. void CInstanceBase::__AttachOfflineShopSelectEffect()
  314. {
  315. __EffectContainer_AttachEffect(EFFECT_SELECT_OFFLINESHOP);
  316. }
  317. void CInstanceBase::__DetachOfflineShopSelectEffect()
  318. {
  319. __EffectContainer_DetachEffect(EFFECT_SELECT_OFFLINESHOP);
  320. }
  321. #endif
  322. void CInstanceBase::__AttachTargetEffect()
  323. {
  324. __EffectContainer_AttachEffect(EFFECT_TARGET);
  325. }
  326. void CInstanceBase::__DetachTargetEffect()
  327. {
  328. __EffectContainer_DetachEffect(EFFECT_TARGET);
  329. }
  330. #ifdef ENABLE_OFFLINE_SHOP_SYSTEM
  331. void CInstanceBase::__AttachOfflineShopTargetEffect()
  332. {
  333. __EffectContainer_AttachEffect(EFFECT_TARGET_OFFLINESHOP);
  334. }
  335. void CInstanceBase::__DetachOfflineShopTargetEffect()
  336. {
  337. __EffectContainer_DetachEffect(EFFECT_TARGET_OFFLINESHOP);
  338. }
  339. #endif
  340. #ifdef ENABLE_TARGET_SELECT_COLOR
  341. ///////////////////////////////////////////////////////////////////////
  342. void CInstanceBase::__AttachSelectEffectMonster()
  343. {
  344. __EffectContainer_AttachEffect(EFFECT_MONSTER);
  345. }
  346. void CInstanceBase::__DetachSelectEffectMonster()
  347. {
  348. __EffectContainer_DetachEffect(EFFECT_MONSTER);
  349. }
  350. void CInstanceBase::__AttachTargetEffectMonster()
  351. {
  352. __EffectContainer_AttachEffect(EFFECT_TARGET_MONSTER);
  353. }
  354. void CInstanceBase::__DetachTargetEffectMonster()
  355. {
  356. __EffectContainer_DetachEffect(EFFECT_TARGET_MONSTER);
  357. }
  358. /////////////////////////////////////////////////////////////
  359. void CInstanceBase::__AttachSelectEffectShinsoo()
  360. {
  361. __EffectContainer_AttachEffect(EFFECT_SHINSOO);
  362. }
  363. void CInstanceBase::__DetachSelectEffectShinsoo()
  364. {
  365. __EffectContainer_DetachEffect(EFFECT_SHINSOO);
  366. }
  367. void CInstanceBase::__AttachTargetEffectShinsoo()
  368. {
  369. __EffectContainer_AttachEffect(EFFECT_TARGET_SHINSOO);
  370. }
  371. void CInstanceBase::__DetachTargetEffectShinsoo()
  372. {
  373. __EffectContainer_DetachEffect(EFFECT_TARGET_SHINSOO);
  374. }
  375. /////////////////////////////////////////////////////////////
  376. void CInstanceBase::__AttachSelectEffectChunjo()
  377. {
  378. __EffectContainer_AttachEffect(EFFECT_CHUNJO);
  379. }
  380. void CInstanceBase::__DetachSelectEffectChunjo()
  381. {
  382. __EffectContainer_DetachEffect(EFFECT_CHUNJO);
  383. }
  384. void CInstanceBase::__AttachTargetEffectChunjo()
  385. {
  386. __EffectContainer_AttachEffect(EFFECT_TARGET_CHUNJO);
  387. }
  388. void CInstanceBase::__DetachTargetEffectChunjo()
  389. {
  390. __EffectContainer_DetachEffect(EFFECT_TARGET_CHUNJO);
  391. }
  392. /////////////////////////////////////////////////////////////
  393. void CInstanceBase::__AttachSelectEffectJinnos()
  394. {
  395. __EffectContainer_AttachEffect(EFFECT_JINNOS);
  396. }
  397. void CInstanceBase::__DetachSelectEffectJinnos()
  398. {
  399. __EffectContainer_DetachEffect(EFFECT_JINNOS);
  400. }
  401. void CInstanceBase::__AttachTargetEffectJinnos()
  402. {
  403. __EffectContainer_AttachEffect(EFFECT_TARGET_JINNOS);
  404. }
  405. void CInstanceBase::__DetachTargetEffectJinnos()
  406. {
  407. __EffectContainer_DetachEffect(EFFECT_TARGET_JINNOS);
  408. }
  409. #endif
  410. void CInstanceBase::__StoneSmoke_Inialize()
  411. {
  412. m_kStoneSmoke.m_dwEftID=0;
  413. }
  414. void CInstanceBase::__StoneSmoke_Destroy()
  415. {
  416. if (!m_kStoneSmoke.m_dwEftID)
  417. return;
  418. __DetachEffect(m_kStoneSmoke.m_dwEftID);
  419. m_kStoneSmoke.m_dwEftID=0;
  420. }
  421. void CInstanceBase::__StoneSmoke_Create(DWORD eSmoke)
  422. {
  423. m_kStoneSmoke.m_dwEftID=m_GraphicThingInstance.AttachSmokeEffect(eSmoke);
  424. }
  425. void CInstanceBase::SetAlpha(float fAlpha)
  426. {
  427. __SetBlendRenderingMode();
  428. __SetAlphaValue(fAlpha);
  429. }
  430. bool CInstanceBase::UpdateDeleting()
  431. {
  432. Update();
  433. Transform();
  434. IAbstractApplication& rApp=IAbstractApplication::GetSingleton();
  435. float fAlpha = __GetAlphaValue() - (rApp.GetGlobalElapsedTime() * 1.5f);
  436. __SetAlphaValue(fAlpha);
  437. if (fAlpha < 0.0f)
  438. return false;
  439. return true;
  440. }
  441. void CInstanceBase::DeleteBlendOut()
  442. {
  443. __SetBlendRenderingMode();
  444. __SetAlphaValue(1.0f);
  445. DetachTextTail();
  446. IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton();
  447. rkPlayer.NotifyDeletingCharacterInstance(GetVirtualID());
  448. }
  449. void CInstanceBase::ClearPVPKeySystem()
  450. {
  451. g_kSet_dwPVPReadyKey.clear();
  452. g_kSet_dwPVPKey.clear();
  453. g_kSet_dwGVGKey.clear();
  454. g_kSet_dwDUELKey.clear();
  455. }
  456. void CInstanceBase::InsertPVPKey(DWORD dwVIDSrc, DWORD dwVIDDst)
  457. {
  458. DWORD dwPVPKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
  459. g_kSet_dwPVPKey.insert(dwPVPKey);
  460. }
  461. void CInstanceBase::InsertPVPReadyKey(DWORD dwVIDSrc, DWORD dwVIDDst)
  462. {
  463. DWORD dwPVPReadyKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
  464. g_kSet_dwPVPKey.insert(dwPVPReadyKey);
  465. }
  466. void CInstanceBase::RemovePVPKey(DWORD dwVIDSrc, DWORD dwVIDDst)
  467. {
  468. DWORD dwPVPKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
  469. g_kSet_dwPVPKey.erase(dwPVPKey);
  470. }
  471. void CInstanceBase::InsertGVGKey(DWORD dwSrcGuildVID, DWORD dwDstGuildVID)
  472. {
  473. DWORD dwGVGKey = __GetPVPKey(dwSrcGuildVID, dwDstGuildVID);
  474. g_kSet_dwGVGKey.insert(dwGVGKey);
  475. }
  476. void CInstanceBase::RemoveGVGKey(DWORD dwSrcGuildVID, DWORD dwDstGuildVID)
  477. {
  478. DWORD dwGVGKey = __GetPVPKey(dwSrcGuildVID, dwDstGuildVID);
  479. g_kSet_dwGVGKey.erase(dwGVGKey);
  480. }
  481. void CInstanceBase::InsertDUELKey(DWORD dwVIDSrc, DWORD dwVIDDst)
  482. {
  483. DWORD dwPVPKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
  484. g_kSet_dwDUELKey.insert(dwPVPKey);
  485. }
  486. DWORD CInstanceBase::__GetPVPKey(DWORD dwVIDSrc, DWORD dwVIDDst)
  487. {
  488. if (dwVIDSrc>dwVIDDst)
  489. std::swap(dwVIDSrc, dwVIDDst);
  490. DWORD awSrc[2];
  491. awSrc[0]=dwVIDSrc;
  492. awSrc[1]=dwVIDDst;
  493. const BYTE * s = (const BYTE *) awSrc;
  494. const BYTE * end = s + sizeof(awSrc);
  495. unsigned long h = 0;
  496. while (s < end)
  497. {
  498. h *= 16777619;
  499. h ^= (BYTE) *(BYTE *) (s++);
  500. }
  501. return h;
  502. }
  503. bool CInstanceBase::__FindPVPKey(DWORD dwVIDSrc, DWORD dwVIDDst)
  504. {
  505. DWORD dwPVPKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
  506. if (g_kSet_dwPVPKey.end()==g_kSet_dwPVPKey.find(dwPVPKey))
  507. return false;
  508. return true;
  509. }
  510. bool CInstanceBase::__FindPVPReadyKey(DWORD dwVIDSrc, DWORD dwVIDDst)
  511. {
  512. DWORD dwPVPKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
  513. if (g_kSet_dwPVPReadyKey.end()==g_kSet_dwPVPReadyKey.find(dwPVPKey))
  514. return false;
  515. return true;
  516. }
  517. //±æµåÀü½Ã »ó´ë ±æµåÀÞÞö È®ÀÞÇÒ¶§.
  518. bool CInstanceBase::__FindGVGKey(DWORD dwSrcGuildID, DWORD dwDstGuildID)
  519. {
  520. DWORD dwGVGKey=__GetPVPKey(dwSrcGuildID, dwDstGuildID);
  521. if (g_kSet_dwGVGKey.end()==g_kSet_dwGVGKey.find(dwGVGKey))
  522. return false;
  523. return true;
  524. }
  525. //´ë·Ã ¸ðµå¿¡¼­´Â ´ë·Ã »ó´ë¸¸ °ø°ÞÇÒ ¼ö ÀÖ´Ù.
  526. bool CInstanceBase::__FindDUELKey(DWORD dwVIDSrc, DWORD dwVIDDst)
  527. {
  528. DWORD dwDUELKey=__GetPVPKey(dwVIDSrc, dwVIDDst);
  529. if (g_kSet_dwDUELKey.end()==g_kSet_dwDUELKey.find(dwDUELKey))
  530. return false;
  531. return true;
  532. }
  533. bool CInstanceBase::IsPVPInstance(CInstanceBase& rkInstSel)
  534. {
  535. DWORD dwVIDSrc=GetVirtualID();
  536. DWORD dwVIDDst=rkInstSel.GetVirtualID();
  537. DWORD dwGuildIDSrc=GetGuildID();
  538. DWORD dwGuildIDDst=rkInstSel.GetGuildID();
  539. if (GetDuelMode()) //´ë·Ã ¸ðµåÀÞ¶§´Â ~_~
  540. return true;
  541. return __FindPVPKey(dwVIDSrc, dwVIDDst) || __FindGVGKey(dwGuildIDSrc, dwGuildIDDst);
  542. //__FindDUELKey(dwVIDSrc, dwVIDDst);
  543. }
  544. const D3DXCOLOR& CInstanceBase::GetNameColor()
  545. {
  546. return GetIndexedNameColor(GetNameColorIndex());
  547. }
  548. UINT CInstanceBase::GetNameColorIndex()
  549. {
  550. if (IsPC())
  551. {
  552. if (m_isKiller)
  553. {
  554. return NAMECOLOR_PK;
  555. }
  556. if (__IsExistMainInstance() && !__IsMainInstance())
  557. {
  558. CInstanceBase* pkInstMain=__GetMainInstancePtr();
  559. if (!pkInstMain)
  560. {
  561. TraceError("CInstanceBase::GetNameColorIndex - MainInstance is NULL");
  562. return NAMECOLOR_PC;
  563. }
  564. DWORD dwVIDMain=pkInstMain->GetVirtualID();
  565. DWORD dwVIDSelf=GetVirtualID();
  566. if (pkInstMain->GetDuelMode())
  567. {
  568. switch(pkInstMain->GetDuelMode())
  569. {
  570. case DUEL_CANNOTATTACK:
  571. return NAMECOLOR_PC + GetEmpireID();
  572. case DUEL_START:
  573. if(__FindDUELKey(dwVIDMain, dwVIDSelf))
  574. return NAMECOLOR_PVP;
  575. else
  576. return NAMECOLOR_PC + GetEmpireID();
  577. }
  578. }
  579. if (pkInstMain->IsSameEmpire(*this))
  580. {
  581. if (__FindPVPKey(dwVIDMain, dwVIDSelf))
  582. {
  583. return NAMECOLOR_PVP;
  584. }
  585. DWORD dwGuildIDMain=pkInstMain->GetGuildID();
  586. DWORD dwGuildIDSelf=GetGuildID();
  587. if (__FindGVGKey(dwGuildIDMain, dwGuildIDSelf))
  588. {
  589. return NAMECOLOR_PVP;
  590. }
  591. /*
  592. if (__FindDUELKey(dwVIDMain, dwVIDSelf))
  593. {
  594. return NAMECOLOR_PVP;
  595. }
  596. */
  597. }
  598. else
  599. {
  600. return NAMECOLOR_PVP;
  601. }
  602. }
  603. IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
  604. if (rPlayer.IsPartyMemberByVID(GetVirtualID()))
  605. return NAMECOLOR_PARTY;
  606. return NAMECOLOR_PC + GetEmpireID();
  607. }
  608. #ifdef ENABLE_OFFLINE_SHOP_SYSTEM
  609. else if (IsNPC())
  610. {
  611. if(GetVirtualNumber() == 30000)
  612. return NAMECOLOR_OFFLINESHOP;
  613. else
  614. return NAMECOLOR_NPC;
  615. }
  616. #else
  617. else if (IsNPC())
  618. {
  619. return NAMECOLOR_NPC;
  620. }
  621. #endif
  622. else if (IsEnemy())
  623. {
  624. return NAMECOLOR_MOB;
  625. }
  626. else if (IsPoly())
  627. {
  628. return NAMECOLOR_MOB;
  629. }
  630. #ifdef ENABLE_STONE_ON_MINIMAP
  631. else if (IsStone())
  632. {
  633. return NAMECOLOR_METIN;
  634. }
  635. #endif
  636. return D3DXCOLOR(0xffffffff);
  637. }
  638. const D3DXCOLOR& CInstanceBase::GetTitleColor()
  639. {
  640. UINT uGrade = GetAlignmentGrade();
  641. if ( uGrade >= TITLE_NUM)
  642. {
  643. static D3DXCOLOR s_kD3DXClrTitleDefault(0xffffffff);
  644. return s_kD3DXClrTitleDefault;
  645. }
  646. return g_akD3DXClrTitle[uGrade];
  647. }
  648. void CInstanceBase::AttachTextTail()
  649. {
  650. if (m_isTextTail)
  651. {
  652. TraceError("CInstanceBase::AttachTextTail - VID [%d] ALREADY EXIST", GetVirtualID());
  653. return;
  654. }
  655. m_isTextTail=true;
  656. DWORD dwVID=GetVirtualID();
  657. #ifdef ENABLE_GF_HEIGHT_OF_ACTORS
  658. float fTextTailHeight = GetBaseHeight() + 10.0f;
  659. #else
  660. float fTextTailHeight=IsMountingHorse() ? 110.0f : 10.0f;
  661. #endif
  662. static D3DXCOLOR s_kD3DXClrTextTail=D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
  663. CPythonTextTail::Instance().RegisterCharacterTextTail(m_dwGuildID, dwVID, s_kD3DXClrTextTail, fTextTailHeight);
  664. // CHARACTER_LEVEL
  665. if (m_dwLevel)
  666. {
  667. UpdateTextTailLevel(m_dwLevel);
  668. }
  669. }
  670. void CInstanceBase::DetachTextTail()
  671. {
  672. if (!m_isTextTail)
  673. return;
  674. m_isTextTail=false;
  675. CPythonTextTail::Instance().DeleteCharacterTextTail(GetVirtualID());
  676. }
  677. void CInstanceBase::UpdateTextTailLevel(DWORD level)
  678. {
  679. //static D3DXCOLOR s_kLevelColor = D3DXCOLOR(119.0f/255.0f, 246.0f/255.0f, 168.0f/255.0f, 1.0f);
  680. static D3DXCOLOR s_kLevelColor = D3DXCOLOR(152.0f/255.0f, 255.0f/255.0f, 51.0f/255.0f, 1.0f);
  681. char szText[256];
  682. sprintf(szText, "[Niv. %d] ", level);
  683. CPythonTextTail::Instance().AttachLevel(GetVirtualID(), szText, s_kLevelColor);
  684. if (IsGameMaster())
  685. {
  686. sprintf(szText, "|cffffff00[STAFF]|r ", level);
  687. CPythonTextTail::Instance().AttachLevel(GetVirtualID(), szText, s_kLevelColor);
  688. }
  689. }
  690. void CInstanceBase::RefreshTextTail()
  691. {
  692. CPythonTextTail::Instance().SetCharacterTextTailColor(GetVirtualID(), GetNameColor());
  693. int iAlignmentGrade = GetAlignmentGrade();
  694. if (TITLE_NONE == iAlignmentGrade)
  695. {
  696. CPythonTextTail::Instance().DetachTitle(GetVirtualID());
  697. }
  698. else
  699. {
  700. std::map<int, std::string>::iterator itor = g_TitleNameMap.find(iAlignmentGrade);
  701. if (g_TitleNameMap.end() != itor)
  702. {
  703. const std::string & c_rstrTitleName = itor->second;
  704. CPythonTextTail::Instance().AttachTitle(GetVirtualID(), c_rstrTitleName.c_str(), GetTitleColor());
  705. }
  706. }
  707. }
  708. void CInstanceBase::RefreshTextTailTitle()
  709. {
  710. RefreshTextTail();
  711. }
  712. // 2004.07.25.myevan.ÀÌÆåÆ® ¾È ºÙ´Â ¹®Þ¦ ÇØ°á
  713. /////////////////////////////////////////////////
  714. void CInstanceBase::__ClearAffectFlagContainer()
  715. {
  716. m_kAffectFlagContainer.Clear();
  717. }
  718. void CInstanceBase::__ClearAffects()
  719. {
  720. if (IsStone())
  721. {
  722. __StoneSmoke_Destroy();
  723. }
  724. else
  725. {
  726. for (int iAffect=0; iAffect<AFFECT_NUM; ++iAffect)
  727. {
  728. __DetachEffect(m_adwCRCAffectEffect[iAffect]);
  729. m_adwCRCAffectEffect[iAffect]=0;
  730. }
  731. __ClearAffectFlagContainer();
  732. }
  733. m_GraphicThingInstance.__OnClearAffects();
  734. }
  735. /////////////////////////////////////////////////
  736. void CInstanceBase::__SetNormalAffectFlagContainer(const CAffectFlagContainer& c_rkAffectFlagContainer)
  737. {
  738. for (int i=0; i<CAffectFlagContainer::BIT_SIZE; ++i)
  739. {
  740. bool isOldSet=m_kAffectFlagContainer.IsSet(i);
  741. bool isNewSet=c_rkAffectFlagContainer.IsSet(i);
  742. if (isOldSet != isNewSet)
  743. {
  744. __SetAffect(i, isNewSet);
  745. if (isNewSet)
  746. m_GraphicThingInstance.__OnSetAffect(i);
  747. else
  748. m_GraphicThingInstance.__OnResetAffect(i);
  749. }
  750. }
  751. m_kAffectFlagContainer.CopyInstance(c_rkAffectFlagContainer);
  752. }
  753. void CInstanceBase::__SetStoneSmokeFlagContainer(const CAffectFlagContainer& c_rkAffectFlagContainer)
  754. {
  755. m_kAffectFlagContainer.CopyInstance(c_rkAffectFlagContainer);
  756. DWORD eSmoke;
  757. if (m_kAffectFlagContainer.IsSet(STONE_SMOKE8))
  758. eSmoke=3;
  759. else if (m_kAffectFlagContainer.IsSet(STONE_SMOKE5)|m_kAffectFlagContainer.IsSet(STONE_SMOKE6)|m_kAffectFlagContainer.IsSet(STONE_SMOKE7))
  760. eSmoke=2;
  761. else if (m_kAffectFlagContainer.IsSet(STONE_SMOKE2)|m_kAffectFlagContainer.IsSet(STONE_SMOKE3)|m_kAffectFlagContainer.IsSet(STONE_SMOKE4))
  762. eSmoke=1;
  763. else
  764. eSmoke=0;
  765. __StoneSmoke_Destroy();
  766. __StoneSmoke_Create(eSmoke);
  767. }
  768. void CInstanceBase::SetAffectFlagContainer(const CAffectFlagContainer& c_rkAffectFlagContainer)
  769. {
  770. if (IsBuilding())
  771. {
  772. return;
  773. }
  774. else if (IsStone())
  775. {
  776. __SetStoneSmokeFlagContainer(c_rkAffectFlagContainer);
  777. }
  778. else
  779. {
  780. __SetNormalAffectFlagContainer(c_rkAffectFlagContainer);
  781. }
  782. }
  783. void CInstanceBase::SCRIPT_SetAffect(UINT eAffect, bool isVisible)
  784. {
  785. __SetAffect(eAffect, isVisible);
  786. }
  787. void CInstanceBase::__SetReviveInvisibilityAffect(bool isVisible)
  788. {
  789. if (isVisible)
  790. {
  791. // NOTE : Dress ¸¦ ÀÔ°í ÀÖÀ¸¸é Alpha ¸¦ ³ÖÞö ¾Ê´Â´Ù.
  792. if (IsWearingDress())
  793. return;
  794. m_GraphicThingInstance.BlendAlphaValue(0.5f, 1.0f);
  795. }
  796. else
  797. {
  798. m_GraphicThingInstance.BlendAlphaValue(1.0f, 1.0f);
  799. }
  800. }
  801. void CInstanceBase::__Assassin_SetEunhyeongAffect(bool isVisible)
  802. {
  803. if (isVisible)
  804. {
  805. // NOTE : Dress ¸¦ ÀÔ°í ÀÖÀ¸¸é Alpha ¸¦ ³ÖÞö ¾Ê´Â´Ù.
  806. if (IsWearingDress())
  807. return;
  808. if (__IsMainInstance() || __MainCanSeeHiddenThing())
  809. {
  810. m_GraphicThingInstance.BlendAlphaValue(0.5f, 1.0f);
  811. }
  812. else
  813. {
  814. // 2004.10.16.myevan.ÀºÇü¹ý ¿ÞÀü Åõ¸í
  815. m_GraphicThingInstance.BlendAlphaValue(0.0f, 1.0f);
  816. m_GraphicThingInstance.HideAllAttachingEffect();
  817. }
  818. }
  819. else
  820. {
  821. m_GraphicThingInstance.BlendAlphaValue(1.0f, 1.0f);
  822. m_GraphicThingInstance.ShowAllAttachingEffect();
  823. }
  824. }
  825. void CInstanceBase::__Shaman_SetParalysis(bool isParalysis)
  826. {
  827. m_GraphicThingInstance.SetParalysis(isParalysis);
  828. }
  829. void CInstanceBase::__Warrior_SetGeomgyeongAffect(bool isVisible)
  830. {
  831. if (isVisible)
  832. {
  833. if (IsWearingDress())
  834. return;
  835. if (m_kWarrior.m_dwGeomgyeongEffect)
  836. __DetachEffect(m_kWarrior.m_dwGeomgyeongEffect);
  837. m_GraphicThingInstance.SetReachScale(1.5f);
  838. if (m_GraphicThingInstance.IsTwoHandMode())
  839. m_kWarrior.m_dwGeomgyeongEffect=__AttachEffect(EFFECT_WEAPON+WEAPON_TWOHAND);
  840. else
  841. m_kWarrior.m_dwGeomgyeongEffect=__AttachEffect(EFFECT_WEAPON+WEAPON_ONEHAND);
  842. }
  843. else
  844. {
  845. m_GraphicThingInstance.SetReachScale(1.0f);
  846. __DetachEffect(m_kWarrior.m_dwGeomgyeongEffect);
  847. m_kWarrior.m_dwGeomgyeongEffect=0;
  848. }
  849. }
  850. void CInstanceBase::__SetAffect(UINT eAffect, bool isVisible)
  851. {
  852. switch (eAffect)
  853. {
  854. case AFFECT_YMIR:
  855. if (IsAffect(AFFECT_INVISIBILITY))
  856. return;
  857. break;
  858. /*
  859. case AFFECT_GWIGEOM: // Àü±â ¼Ó¼º °ø°ÞÀ¸·Þ ¹Ù²ð ¿¹Þ¤
  860. if (isVisible)
  861. {
  862. m_GraphicThingInstance.SetBattleHitEffect(ms_adwCRCAffectEffect[EFFECT_ELECTRIC_HIT]);
  863. m_GraphicThingInstance.SetBattleAttachEffect(ms_adwCRCAffectEffect[EFFECT_ELECTRIC_ATTACH]);
  864. }
  865. else
  866. {
  867. m_GraphicThingInstance.SetBattleHitEffect(ms_adwCRCAffectEffect[EFFECT_HIT]);
  868. m_GraphicThingInstance.SetBattleAttachEffect(0);
  869. }
  870. return;
  871. break;
  872. case AFFECT_HWAYEOM: // È­¿° ¼Ó¼º °ø°ÞÀ¸·Þ ¹Ù²ð ¿¹Þ¤
  873. if (isVisible)
  874. {
  875. m_GraphicThingInstance.SetBattleHitEffect(ms_adwCRCAffectEffect[EFFECT_FLAME_HIT]);
  876. m_GraphicThingInstance.SetBattleAttachEffect(ms_adwCRCAffectEffect[EFFECT_FLAME_ATTACH]);
  877. }
  878. else
  879. {
  880. m_GraphicThingInstance.SetBattleHitEffect(ms_adwCRCAffectEffect[EFFECT_HIT]);
  881. m_GraphicThingInstance.SetBattleAttachEffect(0);
  882. }
  883. // È­¿°ÂüÀº °ø°ÞÇÒ ¶§¸¸ ÀÞ½ÃÀûÀ¸·Þ Visible ÇÕ´Þ´Ù.
  884. return;
  885. break;
  886. */
  887. case AFFECT_CHEONGEUN:
  888. m_GraphicThingInstance.SetResistFallen(isVisible);
  889. break;
  890. case AFFECT_GEOMGYEONG:
  891. __Warrior_SetGeomgyeongAffect(isVisible);
  892. return;
  893. break;
  894. case AFFECT_REVIVE_INVISIBILITY:
  895. __Assassin_SetEunhyeongAffect(isVisible);
  896. break;
  897. case AFFECT_EUNHYEONG:
  898. __Assassin_SetEunhyeongAffect(isVisible);
  899. break;
  900. case AFFECT_GYEONGGONG:
  901. case AFFECT_KWAESOK:
  902. // °æ°ø¼ú, Äè¼ÓÀº ¶Û¶§¸¸ Attaching ½Ãŵ´Þ´Ù. - [levites]
  903. if (isVisible)
  904. if (!IsWalking())
  905. return;
  906. break;
  907. case AFFECT_INVISIBILITY:
  908. // 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Þ º¯°æ
  909. if (isVisible)
  910. {
  911. m_GraphicThingInstance.ClearAttachingEffect();
  912. __EffectContainer_Destroy();
  913. DetachTextTail();
  914. }
  915. else
  916. {
  917. m_GraphicThingInstance.BlendAlphaValue(1.0f, 1.0f);
  918. AttachTextTail();
  919. RefreshTextTail();
  920. }
  921. return;
  922. break;
  923. // case AFFECT_FAINT:
  924. // m_GraphicThingInstance.SetFaint(isVisible);
  925. // break;
  926. // case AFFECT_SLEEP:
  927. // m_GraphicThingInstance.SetSleep(isVisible);
  928. // break;
  929. case AFFECT_STUN:
  930. m_GraphicThingInstance.SetSleep(isVisible);
  931. break;
  932. }
  933. if (eAffect>=AFFECT_NUM)
  934. {
  935. TraceError("CInstanceBase[VID:%d]::SetAffect(eAffect:%d<AFFECT_NUM:%d, isVisible=%d)", GetVirtualID(), eAffect, isVisible);
  936. return;
  937. }
  938. if (isVisible)
  939. {
  940. if (!m_adwCRCAffectEffect[eAffect])
  941. {
  942. m_adwCRCAffectEffect[eAffect]=__AttachEffect(EFFECT_AFFECT+eAffect);
  943. }
  944. }
  945. else
  946. {
  947. if (m_adwCRCAffectEffect[eAffect])
  948. {
  949. __DetachEffect(m_adwCRCAffectEffect[eAffect]);
  950. m_adwCRCAffectEffect[eAffect]=0;
  951. }
  952. }
  953. }
  954. bool CInstanceBase::IsPossibleEmoticon()
  955. {
  956. CEffectManager& rkEftMgr=CEffectManager::Instance();
  957. for(DWORD eEmoticon = 0; eEmoticon < EMOTICON_NUM; eEmoticon++)
  958. {
  959. DWORD effectID = ms_adwCRCAffectEffect[EFFECT_EMOTICON+eEmoticon];
  960. if( effectID && rkEftMgr.IsAliveEffect(effectID) )
  961. return false;
  962. }
  963. if(ELTimer_GetMSec() - m_dwEmoticonTime < 1000)
  964. {
  965. TraceError("ELTimer_GetMSec() - m_dwEmoticonTime");
  966. return false;
  967. }
  968. return true;
  969. }
  970. void CInstanceBase::SetFishEmoticon()
  971. {
  972. SetEmoticon(EMOTICON_FISH);
  973. }
  974. void CInstanceBase::SetEmoticon(UINT eEmoticon)
  975. {
  976. if (eEmoticon>=EMOTICON_NUM)
  977. {
  978. TraceError("CInstanceBase[VID:%d]::SetEmoticon(eEmoticon:%d<EMOTICON_NUM:%d, isVisible=%d)",
  979. GetVirtualID(), eEmoticon);
  980. return;
  981. }
  982. if (IsPossibleEmoticon())
  983. {
  984. D3DXVECTOR3 v3Pos = m_GraphicThingInstance.GetPosition();
  985. #ifdef ENABLE_GF_HEIGHT_OF_ACTORS
  986. v3Pos.z += float(GetBaseHeight() + m_GraphicThingInstance.GetHeight());
  987. #else
  988. v3Pos.z += float(m_GraphicThingInstance.GetHeight());
  989. #endif
  990. //CEffectManager& rkEftMgr=CEffectManager::Instance();
  991. CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();
  992. D3DXVECTOR3 v3Dir = (pCamera->GetEye()-v3Pos)*9/10;
  993. v3Pos = pCamera->GetEye()-v3Dir;
  994. v3Pos = D3DXVECTOR3(0,0,0);
  995. #ifdef ENABLE_GF_HEIGHT_OF_ACTORS
  996. v3Pos.z += float(GetBaseHeight() + m_GraphicThingInstance.GetHeight());
  997. #else
  998. v3Pos.z += float(m_GraphicThingInstance.GetHeight());
  999. #endif
  1000. //rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[EFFECT_EMOTICON+eEmoticon],v3Pos,D3DXVECTOR3(0,0,0));
  1001. m_GraphicThingInstance.AttachEffectByID(0, NULL, ms_adwCRCAffectEffect[EFFECT_EMOTICON+eEmoticon],&v3Pos);
  1002. m_dwEmoticonTime = ELTimer_GetMSec();
  1003. }
  1004. }
  1005. void CInstanceBase::SetDustGap(float fDustGap)
  1006. {
  1007. ms_fDustGap=fDustGap;
  1008. }
  1009. void CInstanceBase::SetHorseDustGap(float fDustGap)
  1010. {
  1011. ms_fHorseDustGap=fDustGap;
  1012. }
  1013. void CInstanceBase::__DetachEffect(DWORD dwEID)
  1014. {
  1015. m_GraphicThingInstance.DettachEffect(dwEID);
  1016. }
  1017. DWORD CInstanceBase::__AttachEffect(UINT eEftType)
  1018. {
  1019. #ifdef ENABLE_SKILL_COLOR_SYSTEM
  1020. switch (eEftType)
  1021. {
  1022. case EFFECT_AFFECT + AFFECT_GONGPO:
  1023. RegisterEffect(eEftType, "", "d:/ymir work/pc/sura/effect/fear_loop.mse", false, GetNameString());
  1024. break;
  1025. case EFFECT_AFFECT + AFFECT_JUMAGAP:
  1026. RegisterEffect(eEftType, "", "d:/ymir work/pc/sura/effect/jumagap_loop.mse", false, GetNameString());
  1027. break;
  1028. case EFFECT_AFFECT + AFFECT_HOSIN:
  1029. RegisterEffect(eEftType, "", "d:/ymir work/pc/shaman/effect/3hosin_loop.mse", false, GetNameString());
  1030. break;
  1031. case EFFECT_AFFECT + AFFECT_BOHO:
  1032. RegisterEffect(eEftType, "", "d:/ymir work/pc/shaman/effect/boho_loop.mse", false, GetNameString());
  1033. break;
  1034. case EFFECT_AFFECT + AFFECT_KWAESOK:
  1035. RegisterEffect(eEftType, "", "d:/ymir work/pc/shaman/effect/10kwaesok_loop.mse", false, GetNameString());
  1036. break;
  1037. case EFFECT_AFFECT + AFFECT_HEUKSIN:
  1038. RegisterEffect(eEftType, "", "d:/ymir work/pc/sura/effect/heuksin_loop.mse", false, GetNameString());
  1039. break;
  1040. case EFFECT_AFFECT + AFFECT_MUYEONG:
  1041. RegisterEffect(eEftType, "", "d:/ymir work/pc/sura/effect/muyeong_loop.mse", false, GetNameString());
  1042. break;
  1043. case EFFECT_AFFECT + AFFECT_FIRE:
  1044. RegisterEffect(eEftType, "Bip01", "d:/ymir work/effect/hit/blow_flame/flame_loop.mse", false, GetNameString());
  1045. break;
  1046. case EFFECT_AFFECT + AFFECT_GICHEON:
  1047. RegisterEffect(eEftType, "Bip01 R Hand", "d:/ymir work/pc/shaman/effect/6gicheon_hand.mse", false, GetNameString());
  1048. break;
  1049. case EFFECT_AFFECT + AFFECT_JEUNGRYEOK:
  1050. RegisterEffect(eEftType, "Bip01 L Hand", "d:/ymir work/pc/shaman/effect/jeungryeok_hand.mse", false, GetNameString());
  1051. break;
  1052. case EFFECT_AFFECT + AFFECT_PABEOP:
  1053. RegisterEffect(eEftType, "Bip01 Head", "d:/ymir work/pc/sura/effect/pabeop_loop.mse", false, GetNameString());
  1054. break;
  1055. case EFFECT_AFFECT + AFFECT_CHEONGEUN:
  1056. case EFFECT_AFFECT + AFFECT_FALLEN_CHEONGEUN:
  1057. RegisterEffect(eEftType, "", "d:/ymir work/pc/warrior/effect/gyeokgongjang_loop.mse", false, GetNameString());
  1058. break;
  1059. case EFFECT_AFFECT + AFFECT_GWIGEOM:
  1060. RegisterEffect(eEftType, "Bip01 R Finger2", "d:/ymir work/pc/sura/effect/gwigeom_loop.mse", false, GetNameString());
  1061. break;
  1062. case EFFECT_AFFECT + AFFECT_GYEONGGONG:
  1063. RegisterEffect(eEftType, "", "d:/ymir work/pc/assassin/effect/gyeonggong_loop.mse", false, GetNameString());
  1064. break;
  1065. case EFFECT_WEAPON + WEAPON_ONEHAND:
  1066. RegisterEffect(eEftType, "equip_right_hand", "d:/ymir work/pc/warrior/effect/geom_sword_loop.mse", false, GetNameString());
  1067. break;
  1068. case EFFECT_WEAPON + WEAPON_TWOHAND:
  1069. RegisterEffect(eEftType, "equip_right_hand", "d:/ymir work/pc/warrior/effect/geom_spear_loop.mse", false, GetNameString());
  1070. break;
  1071. default:
  1072. break;
  1073. }
  1074. #endif
  1075. // 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Þ º¯°æ
  1076. if (IsAffect(AFFECT_INVISIBILITY))
  1077. return 0;
  1078. if (eEftType>=EFFECT_NUM)
  1079. return 0;
  1080. #ifdef ENABLE_SKILL_COLOR_SYSTEM
  1081. DWORD * dwSkillColor = m_GraphicThingInstance.GetSkillColorByEffectID(eEftType);
  1082. #endif
  1083. if (ms_astAffectEffectAttachBone[eEftType].empty())
  1084. {
  1085. #ifdef ENABLE_SKILL_COLOR_SYSTEM
  1086. return m_GraphicThingInstance.AttachEffectByID(0, NULL, ms_adwCRCAffectEffect[eEftType], NULL, dwSkillColor);
  1087. #else
  1088. return m_GraphicThingInstance.AttachEffectByID(0, NULL, ms_adwCRCAffectEffect[eEftType]);
  1089. #endif
  1090. }
  1091. else
  1092. {
  1093. std::string & rstrBoneName = ms_astAffectEffectAttachBone[eEftType];
  1094. const char * c_szBoneName;
  1095. // ¾ç¼Õ¿¡ ºÙÀÞ ¶§ »ç¿ëÇÑ´Ù.
  1096. // ÀÌ·± ½ÄÀÇ ¿¹¿Ü 󸮸¦ ÇØ³õÀº °ÞÀº ij¸¯ÅÞ ¸¶´Ù Equip ÀÇ Bone Name ÀÌ ´Ù¸£±â ¶§¹®.
  1097. if (0 == rstrBoneName.compare("PART_WEAPON"))
  1098. {
  1099. if (m_GraphicThingInstance.GetAttachingBoneName(CRaceData::PART_WEAPON, &c_szBoneName))
  1100. {
  1101. #ifdef ENABLE_SKILL_COLOR_SYSTEM
  1102. return m_GraphicThingInstance.AttachEffectByID(0, c_szBoneName, ms_adwCRCAffectEffect[eEftType], NULL, dwSkillColor);
  1103. #else
  1104. return m_GraphicThingInstance.AttachEffectByID(0, c_szBoneName, ms_adwCRCAffectEffect[eEftType]);
  1105. #endif
  1106. }
  1107. }
  1108. else if (0 == rstrBoneName.compare("PART_WEAPON_LEFT"))
  1109. {
  1110. if (m_GraphicThingInstance.GetAttachingBoneName(CRaceData::PART_WEAPON_LEFT, &c_szBoneName))
  1111. {
  1112. #ifdef ENABLE_SKILL_COLOR_SYSTEM
  1113. return m_GraphicThingInstance.AttachEffectByID(0, c_szBoneName, ms_adwCRCAffectEffect[eEftType], NULL, dwSkillColor);
  1114. #else
  1115. return m_GraphicThingInstance.AttachEffectByID(0, c_szBoneName, ms_adwCRCAffectEffect[eEftType]);
  1116. #endif
  1117. }
  1118. }
  1119. else
  1120. {
  1121. #ifdef ENABLE_SKILL_COLOR_SYSTEM
  1122. return m_GraphicThingInstance.AttachEffectByID(0, c_szBoneName, ms_adwCRCAffectEffect[eEftType], NULL, dwSkillColor);
  1123. #else
  1124. return m_GraphicThingInstance.AttachEffectByID(0, c_szBoneName, ms_adwCRCAffectEffect[eEftType]);
  1125. #endif
  1126. }
  1127. }
  1128. return 0;
  1129. }
  1130. void CInstanceBase::__ComboProcess()
  1131. {
  1132. /*
  1133. DWORD dwcurComboIndex = m_GraphicThingInstance.GetComboIndex();
  1134. if (0 != dwcurComboIndex)
  1135. {
  1136. if (m_dwLastComboIndex != m_GraphicThingInstance.GetComboIndex())
  1137. {
  1138. if (!m_GraphicThingInstance.IsHandMode() & IsAffect(AFFECT_HWAYEOM))
  1139. {
  1140. __AttachEffect(EFFECT_FLAME_ATTACK);
  1141. }
  1142. }
  1143. }
  1144. m_dwLastComboIndex = dwcurComboIndex;
  1145. */
  1146. }
  1147. #ifdef ENABLE_SKILL_COLOR_SYSTEM
  1148. bool CInstanceBase::RegisterEffect(UINT eEftType, const char* c_szEftAttachBone, const char* c_szEftName, bool isCache, const char * name)
  1149. #else
  1150. bool CInstanceBase::RegisterEffect(UINT eEftType, const char* c_szEftAttachBone, const char* c_szEftName, bool isCache)
  1151. #endif
  1152. {
  1153. if (eEftType>=EFFECT_NUM)
  1154. return false;
  1155. ms_astAffectEffectAttachBone[eEftType]=c_szEftAttachBone;
  1156. DWORD& rdwCRCEft=ms_adwCRCAffectEffect[eEftType];
  1157. #ifdef ENABLE_SKILL_COLOR_SYSTEM
  1158. if (!CEffectManager::Instance().RegisterEffect2(c_szEftName, &rdwCRCEft, isCache, name))
  1159. #else
  1160. if (!CEffectManager::Instance().RegisterEffect2(c_szEftName, &rdwCRCEft, isCache))
  1161. #endif
  1162. {
  1163. TraceError("CInstanceBase::RegisterEffect(eEftType=%d, c_szEftAttachBone=%s, c_szEftName=%s, isCache=%d) - Error", eEftType, c_szEftAttachBone, c_szEftName, isCache);
  1164. rdwCRCEft=0;
  1165. return false;
  1166. }
  1167. return true;
  1168. }
  1169. void CInstanceBase::RegisterTitleName(int iIndex, const char * c_szTitleName)
  1170. {
  1171. g_TitleNameMap.insert(make_pair(iIndex, c_szTitleName));
  1172. }
  1173. D3DXCOLOR __RGBToD3DXColoru(UINT r, UINT g, UINT b)
  1174. {
  1175. DWORD dwColor=0xff;dwColor<<=8;
  1176. dwColor|=r;dwColor<<=8;
  1177. dwColor|=g;dwColor<<=8;
  1178. dwColor|=b;
  1179. return D3DXCOLOR(dwColor);
  1180. }
  1181. bool CInstanceBase::RegisterNameColor(UINT uIndex, UINT r, UINT g, UINT b)
  1182. {
  1183. if (uIndex>=NAMECOLOR_NUM)
  1184. return false;
  1185. g_akD3DXClrName[uIndex]=__RGBToD3DXColoru(r, g, b);
  1186. return true;
  1187. }
  1188. bool CInstanceBase::RegisterTitleColor(UINT uIndex, UINT r, UINT g, UINT b)
  1189. {
  1190. if (uIndex>=TITLE_NUM)
  1191. return false;
  1192. g_akD3DXClrTitle[uIndex]=__RGBToD3DXColoru(r, g, b);
  1193. return true;
  1194. }