Advertisement
Guest User

Untitled

a guest
Dec 4th, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 85.25 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "defineObj.h"
  3. #include "guild.h"
  4. #include "authorization.h"
  5. #include "AppDefine.h"
  6. #include "sfx.h"
  7. #include "party.h"
  8.  
  9. #include "..\_UnhandledException\ExceptionHandler.h"
  10. extern CPartyMng g_PartyMng;
  11.  
  12. #include "eveschool.h"
  13. #include "defineskill.h"
  14. #include "commonctrl.h"
  15.  
  16. extern CGuildCombat g_GuildCombatMng;
  17.  
  18.  
  19. #ifndef __WORLDSERVER
  20.  
  21. //////////////////////////////////////////////////////////////////////////////////////////////
  22. // CMover
  23. //////////////////////////////////////////////////////////////////////////////////////////////
  24. void CMover::SetRenderPartsEffect( int nParts )
  25. {
  26. CModelObject* pModel = (CModelObject*)m_pModel;
  27. CItemElem *pItemElem = NULL;
  28. ItemProp *pItemProp = NULL;
  29.  
  30. if( IsActiveMover() )
  31. {
  32. pItemElem = GetEquipItem( nParts ); // 오른쪽 무기에
  33. if( pItemElem )
  34. {
  35. pItemProp = pItemElem->GetProp();
  36.  
  37. #ifdef __SWITCH_GLOW_OLDNEW
  38. pModel->SetGlow( nParts, pItemElem->m_nNewGlow );
  39. #endif //__SWITCH_GLOW_OLDNEW
  40.  
  41. }
  42. }
  43. else
  44. {
  45. DWORD dwItemID = m_aEquipInfo[nParts].dwId;
  46. if( dwItemID != NULL_ID )
  47. {
  48.  
  49. pItemProp = prj.GetItemProp( dwItemID );
  50.  
  51. #ifdef __SWITCH_GLOW_OLDNEW
  52. pModel->SetGlow( nParts, m_aEquipInfo[nParts].bNewGlow );
  53. #endif //__SWITCH_GLOW_OLDNEW
  54.  
  55. }
  56. }
  57. #ifdef __LOOKCHANGE
  58. DWORD dwLook = NULL_ID;
  59. if( IsActiveMover() && pItemElem )
  60. {
  61. dwLook = pItemElem->GetLook();
  62. }else if(!IsActiveMover() )
  63. {
  64. dwLook = m_aEquipInfo[nParts].dwLook;
  65. }
  66. if( dwLook != NULL_ID )
  67. {
  68. pItemProp = prj.GetItemProp( dwLook );
  69. }
  70. #endif
  71. if( pItemProp )
  72. {
  73. if( pItemProp->nReflect > 0 ) // 리플렉트가 걸려있으면
  74. {
  75. pModel->SetEffect( nParts, XE_REFLECT ); // 리플렉트 옵션으로 렌더.
  76.  
  77. if( nParts == PARTS_RWEAPON && pItemProp->dwItemKind3 == IK3_YOYO )
  78. pModel->SetEffect( PARTS_LWEAPON, XE_REFLECT ); // 리플렉트 옵션으로 렌더.
  79. }
  80.  
  81. BOOL bExec = FALSE;
  82.  
  83. switch( pItemProp->dwSfxElemental )
  84. {
  85. case ELEMENTAL_FIRE: pModel->SetEffect( nParts, XE_ITEM_FIRE | (5 << 24) ); bExec = TRUE; break; // 불 타는 옵션.
  86. case ELEMENTAL_ELEC: pModel->SetEffect( nParts, XE_ITEM_ELEC | (0 << 24) ); bExec = TRUE; break; // 전기 옵션.
  87. case ELEMENTAL_WATER: pModel->SetEffect( nParts, XE_ITEM_WATER | (5 << 24)); bExec = TRUE; break; // 물 옵션
  88. case ELEMENTAL_WIND: pModel->SetEffect( nParts, XE_ITEM_WIND | (5 << 24)); bExec = TRUE; break; // 바람 옵션
  89. case ELEMENTAL_EARTH: pModel->SetEffect( nParts, XE_ITEM_EARTH | (5 << 24)); bExec = TRUE; break;// 땅 옵션
  90. break;
  91. }
  92.  
  93. if( pItemProp->dwSfxElemental == -1 )
  94. {
  95. int nAttrLevel = 0;
  96. int nAttr = 0;
  97. int nLevel = 0;
  98. if( pItemElem )
  99. {
  100. nAttrLevel = pItemElem->m_nResistAbilityOption;
  101. nAttr = pItemElem->m_bItemResist;
  102. nLevel = pItemElem->GetAbilityOption();
  103. } else
  104. {
  105. nAttr = (m_aEquipInfo[nParts].nOption & 0x00FF0000) >> 16;
  106. nAttrLevel = (m_aEquipInfo[nParts].nOption & 0xFF000000) >> 24;
  107. nLevel = m_aEquipInfo[nParts].nOption & 0xFF;
  108. }
  109.  
  110. int nEffLevel = 0;
  111. #if __VER >= 13 // __EXT_ENCHANT
  112. if( nAttrLevel > 10 )
  113. nAttrLevel = 10;
  114. #endif // __EXT_ENCHANT
  115. if( nAttr && (nAttrLevel > 10 || nAttrLevel < 0) ) // 속성은 있는데 속성레벨값이 이상할때.
  116. {
  117. LPCTSTR szErr = Error( "m_nResistAbilityOption=%d %s", nAttrLevel, GetName() );
  118. ADDERRORMSG( szErr );
  119. nAttrLevel = 10;
  120. }
  121.  
  122. DWORD dwItemFire = XE_ITEM_FIRE;
  123. DWORD dwItemElec = XE_ITEM_ELEC;
  124. DWORD dwItemWater = XE_ITEM_WATER;
  125. DWORD dwItemWind = XE_ITEM_WIND;
  126. DWORD dwItemEarth = XE_ITEM_EARTH;
  127. DWORD dwItemNone = XE_ITEM_GEN;
  128.  
  129. #if __VER >= 9 // __Y_ADV_ENCHANT_EFFECT
  130. #ifndef __CSC_ENCHANT_EFFECT_2
  131. if( prj.m_nEnchantLimitLevel[2] >= nLevel )
  132. return;
  133. #endif //__CSC_ENCHANT_EFFECT_2
  134. {
  135. nEffLevel = nLevel;
  136.  
  137. switch( pItemProp->dwReferStat1 )
  138. {
  139. case WEAPON_GENERAL:
  140. case WEAPON_UNIQUE:
  141. {
  142. if( prj.m_nEnchantLimitLevel[0] > nAttrLevel )
  143. return;
  144. }
  145. break;
  146. case WEAPON_ULTIMATE:
  147. {
  148. if( prj.m_nEnchantLimitLevel[1] > nAttrLevel )
  149. return;
  150.  
  151. dwItemFire = XE_ITEM_FIRE_AL;
  152. dwItemElec = XE_ITEM_ELEC_AL;
  153. dwItemWater = XE_ITEM_WATER_AL;
  154. dwItemWind = XE_ITEM_WIND_AL;
  155. dwItemEarth = XE_ITEM_EARTH_AL;
  156. dwItemNone = XE_ITEM_GEN_AL;
  157. }
  158. break;
  159. }
  160. }
  161. #else //__Y_ADV_ENCHANT_EFFECT
  162. if( nAttrLevel == 10 ) nEffLevel = 5;
  163. else if( nAttrLevel == 9 ) nEffLevel = 4;
  164. else if( nAttrLevel == 8 ) nEffLevel = 3;
  165. else if( nAttrLevel == 7 ) nEffLevel = 2;
  166. else if( nAttrLevel >= 4 ) nEffLevel = 1; // 4 ~ 6
  167. else
  168. nEffLevel = 0;
  169. #endif //__Y_ADV_ENCHANT_EFFECT
  170. if( nEffLevel >= 0 )
  171. #ifdef __CSC_ENCHANT_EFFECT_2
  172. #else //__CSC_ENCHANT_EFFECT_2
  173. if( nEffLevel >= 1 ) // 속성제련레벨 1,2,3은 이펙트 없음.
  174. #endif //__CSC_ENCHANT_EFFECT_2
  175. {
  176. nEffLevel <<= 24;
  177.  
  178. switch( nAttr )
  179. {
  180. #if __VER >= 9 // __Y_ADV_ENCHANT_EFFECT
  181. case 0: pModel->SetEffect( nParts, dwItemNone | nEffLevel ); break;
  182. #endif //__Y_ADV_ENCHANT_EFFECT
  183. case SAI79::FIRE: pModel->SetEffect( nParts, dwItemFire | nEffLevel ); break;
  184. case SAI79::ELECTRICITY: pModel->SetEffect( nParts, dwItemElec | nEffLevel ); break;
  185. case SAI79::WATER: pModel->SetEffect( nParts, dwItemWater | nEffLevel ); break;
  186. case SAI79::WIND: pModel->SetEffect( nParts, dwItemWind | nEffLevel ); break;
  187. case SAI79::EARTH: pModel->SetEffect( nParts, dwItemEarth | nEffLevel ); break;
  188. }
  189. }
  190. }
  191. }
  192. }
  193. void CMover::Render( LPDIRECT3DDEVICE9 pd3dDevice )
  194. {
  195. MoverProp *pMoverProp = GetProp();
  196. if( pMoverProp == NULL )
  197. {
  198. LPCTSTR szErr = Error( "CMover::Render : Prop %s", GetName() );
  199. ADDERRORMSG( szErr );
  200. }
  201. #ifdef _DEBUG
  202. if( g_pPlayer == this )
  203. {
  204. int a = 0;
  205. } else
  206. {
  207. int a = 0;
  208. }
  209.  
  210. #endif
  211.  
  212. if( !IsVisible() || IsCull() )
  213. return;
  214.  
  215. #ifdef __CLIENT
  216. if( IsActiveMover() && m_pActMover->IsFly() )
  217. {
  218. // if( g_Neuz.m_camera.m_fZoom < 1.0f ) // 가까이 확대됐을땐 안보이게 하자.
  219. // return;
  220. }
  221.  
  222. D3DXVECTOR3 vPos = GetPos();
  223. #ifdef __ANTIALIASING
  224. pd3dDevice->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, TRUE);
  225. #endif
  226.  
  227. #if 0
  228. if( !m_pActMover->IsFly() )
  229. {
  230. if( GetWorld() )
  231. {
  232. D3DXVECTOR3 vec3Tri[3];
  233. GetWorld()->GetLandTri( vPos.x, vPos.z, vec3Tri );
  234.  
  235. D3DXVECTOR3 vVector1 = vec3Tri[2] - vec3Tri[0];
  236. D3DXVECTOR3 vVector2 = vec3Tri[1] - vec3Tri[0];
  237. D3DXVECTOR3 vNormal;
  238. D3DXVec3Cross( &vNormal, &vVector1, &vVector2);
  239. D3DXVec3Normalize( &vNormal, &vNormal );
  240.  
  241. D3DXVECTOR3 v3Up = D3DXVECTOR3( 0.0f, -1.0f, 0.0f );
  242. D3DXVECTOR3 v3Cross;
  243. FLOAT fDot;
  244. FLOAT fTheta;
  245. D3DXVec3Cross( &v3Cross, &v3Up, &vNormal );
  246. fDot = D3DXVec3Dot( &v3Up, &vNormal );
  247. fTheta = acos( fDot );
  248.  
  249. D3DXQUATERNION qDirMap;
  250. D3DXQuaternionRotationAxis( &qDirMap, &v3Cross, fTheta );
  251.  
  252. D3DXVECTOR3 vYPW;
  253. QuaternionRotationToYPW( qDirMap, vYPW );
  254.  
  255. if( GetAngle() > 180 )
  256. {
  257. // vYPW.x = -vYPW.x;
  258. }
  259.  
  260. FLOAT ff = D3DXToDegree(vYPW.y);
  261.  
  262. FLOAT fa = (360.0/65536) * ((int)(ff*(65536/360.0)) & 65535);
  263.  
  264. // SetAngle(fa);
  265. // SetAngleZ(D3DXToDegree(-vYPW.z));
  266. // SetAngleX(D3DXToDegree(-vYPW.x));
  267. }
  268. }
  269. #endif //0
  270.  
  271. #endif
  272.  
  273. pd3dDevice->SetMaterial( g_TextureMng.GetMaterial( pd3dDevice, 0 ) );
  274.  
  275. D3DXMATRIX mWorld;
  276.  
  277. /*
  278. mWorld = m_matWorld; // 이후부터는 m_matWorld를 쓰지말고 matWorld를 쓰자
  279.  
  280. if( IsPlayer() )
  281. mWorld._42 += 0.07f; // 구두의 힐 높이만큼 올려줌.
  282. // 좌표 이동
  283. */
  284. #ifdef __CLIENT
  285. if( IsPlayer() )
  286. {
  287. D3DXVECTOR3 vPosHeel = vPos + D3DXVECTOR3( 0.0f, 0.07f, 0.0f ) ;
  288. D3DXMatrixTranslation( &m_matTrans, vPosHeel.x, vPosHeel.y, vPosHeel.z );
  289. }
  290. // if( IsUpdateMatrix() )
  291. {
  292. UpdateMatrix(); // 클라에선 매트릭스 갱신을 렌더에서 한다. 서버에선 Process에서 한다.
  293. }
  294. #endif
  295. mWorld = m_matWorld; // 이후부터는 m_matWorld를 쓰지말고 matWorld를 쓰자
  296.  
  297. #ifdef __CLIENT
  298. switch( GetIndex() )
  299. {
  300. case MI_SYLIACA1:
  301. case MI_SYLIACA2:
  302. case MI_SYLIACA3:
  303. case MI_SYLIACA4:
  304. if( m_pModel )
  305. mWorld._42 = (float)( mWorld._42 + (fabs(m_pModel->m_vMax.y - m_pModel->m_vMin.y) / 2.0) );
  306. break;
  307. }
  308. #endif
  309.  
  310. // 티나 스케일 조정...
  311. if( GetIndex() == MI_MASA_TINA )
  312. {
  313. ResetScale();
  314. D3DXMatrixScaling(&m_matScale, GetScale().x, GetScale().y, GetScale().z );
  315. }
  316.  
  317. // 맞으면 흔들리는 처리.
  318. if( IsNPC() && m_nDmgCnt > 0 && pMoverProp->dwClass != RANK_SUPER ) // 보스몹은 흔들리지 않음.
  319. {
  320. {
  321. D3DXMATRIX matDmg;
  322. int cx = -25 + (xRandom(50));
  323. int cz = -25 + (xRandom(50));
  324. D3DXMatrixTranslation( &matDmg, (float)cx / 100.0f, 0, (float)cz / 100.0f );
  325. D3DXMatrixMultiply( &mWorld, &mWorld, &matDmg );
  326. }
  327. }
  328.  
  329. D3DXVECTOR3 vPos2 = GetPos() - GetWorld()->m_pCamera->m_vPos;
  330. int nLength = (int)( D3DXVec3Length( &vPos2 ) );
  331. if( nLength > CWorld::m_fFarPlane )
  332. nLength = (int)( CWorld::m_fFarPlane );
  333. if( nLength > CWorld::m_fFarPlane - ( CWorld::m_fFarPlane / 4 ) )
  334. {
  335. #ifdef __ANTIALIASING
  336. pd3dDevice->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, FALSE);
  337. #endif
  338. return;
  339. }
  340.  
  341. CItemElem *pItemElem = NULL, pItemElemCloak;
  342. ItemProp *pItemProp = NULL;
  343.  
  344. CModelObject* pModel = (CModelObject*)m_pModel;
  345.  
  346. OverCoatItemRenderCheck(pModel);
  347.  
  348.  
  349. if( IsActiveMover() )
  350. {
  351. pItemElem = GetEquipItem( PARTS_RWEAPON ); // 오른쪽 무기에
  352. if( pItemElem )
  353. pItemProp = pItemElem->GetProp();
  354. }
  355. else
  356. {
  357. DWORD dwItemID = m_aEquipInfo[PARTS_RWEAPON].dwId;
  358. if( dwItemID != NULL_ID )
  359. pItemProp = prj.GetItemProp( dwItemID );
  360. }
  361.  
  362. // 들고있는 무기의 이펙트 세팅.
  363. SetRenderPartsEffect( PARTS_RWEAPON );
  364. SetRenderPartsEffect( PARTS_LWEAPON );
  365. #ifdef __NEW_WEAPON_GLOW
  366. SetRenderPartsEffect( PARTS_SHIELD );
  367. #endif // __NEW_WEAPON_GLOW
  368. if( IsActiveMover() )
  369. {
  370. pItemElem = GetEquipItem( PARTS_SHIELD ); // 방패에
  371. if( pItemElem )
  372. pItemProp = pItemElem->GetProp();
  373. } else
  374. {
  375. DWORD dwItemID = m_aEquipInfo[PARTS_SHIELD].dwId; // activemover 가 아닌놈은 가상아이템으로 꺼낸다.
  376. if( dwItemID != NULL_ID )
  377. pItemProp = prj.GetItemProp( dwItemID );
  378. }
  379. #ifdef __LOOKCHANGE
  380. DWORD dwLook = NULL_ID;
  381. if( IsActiveMover() && pItemElem )
  382. {
  383. dwLook = pItemElem->GetLook();
  384. }else if(!IsActiveMover() )
  385. {
  386. dwLook = m_aEquipInfo[PARTS_SHIELD].dwLook;
  387. }
  388. if( dwLook != NULL_ID )
  389. {
  390. ItemProp *pProp = prj.GetItemProp(dwLook);
  391. if( pProp )
  392. {
  393. if( pProp->nReflect > 0)
  394. pModel->SetEffect( PARTS_SHIELD, XE_REFLECT );
  395. }
  396. }else
  397. #endif
  398. if( pItemProp )
  399. {
  400. if( pItemProp->nReflect > 0 ) // 리플렉트가 걸려있으면
  401. pModel->SetEffect( PARTS_SHIELD, XE_REFLECT ); // 리플렉트 옵션으로 렌더.
  402. }
  403. // 망토 텍스쳐 있으면 지정.
  404. pModel->SetExtTexture( m_pCloakTexture );
  405.  
  406. if( pModel )
  407. {
  408. O3D_ELEMENT *pElem = pModel->GetParts( PARTS_HAIR );
  409.  
  410. if( pElem )
  411. {
  412. if( pElem->m_pObject3D )
  413. {
  414. pElem->m_pObject3D->m_fAmbient[0] = m_fHairColorR;
  415. pElem->m_pObject3D->m_fAmbient[1] = m_fHairColorG;
  416. pElem->m_pObject3D->m_fAmbient[2] = m_fHairColorB;
  417. }
  418. }
  419. }
  420.  
  421. if( GetActiveObj() == this )
  422. m_pModel->SetGroup( 0 );
  423. else
  424. {
  425. if( m_pModel->m_nNoEffect == 0 )
  426. {
  427. float fDist = 50.0f;
  428. switch( g_Option.m_nObjectDetail )
  429. {
  430. case 0 : fDist = 20.0f; break;
  431. case 1 : fDist = 10.0f; break;
  432. case 2 : fDist = 5.0f; break;
  433. }
  434. int nLevel = (int)( m_fDistCamera / fDist );
  435. if( nLevel >= 2 ) nLevel = 2;
  436. if( nLevel < 0 )
  437. {
  438. Error( "CMover::Render : %s, lod lv=%d %f", m_szName, nLevel, m_fDistCamera );
  439. nLevel = 0;
  440. }
  441. m_pModel->SetGroup( nLevel );
  442. } else
  443. m_pModel->SetGroup( 2 ); // 그림자 찍을땐 가장 낮은 단계로 찍자.
  444. }
  445.  
  446. if( pModel->m_pModelElem->m_nTextureEx > 0 ) // 확장텍스쳐 쓰는넘인가?
  447. pModel->SetTextureEx( pModel->m_pModelElem->m_nTextureEx );
  448. else
  449. pModel->SetTextureEx( 0 );
  450.  
  451. #ifdef __CLIENT
  452. if( IsActiveMover() )
  453. {
  454. // 헬멧이 머리카락 날려야하는것이냐? // 인벤이 있는 경우
  455. CItemElem* pItemElem = GetEquipItem( PARTS_CAP );
  456. O3D_ELEMENT* pElement = NULL;
  457.  
  458.  
  459. if( pItemElem )
  460. {
  461. #ifdef __LOOKCHANGE
  462. ItemProp *pProp = NULL;
  463. DWORD dwLook = pItemElem->GetLook();
  464. if( dwLook != NULL_ID )
  465. pProp = prj.GetItemProp( dwLook );
  466. if( pProp )
  467. {
  468. if( pProp->dwBasePartsIgnore != -1 )
  469. {
  470. pElement = ((CModelObject*)m_pModel)->SetEffect(pProp->dwBasePartsIgnore, XE_HIDE);
  471. }
  472. }
  473. else
  474. #endif
  475. {
  476. ItemProp* pItemProp = pItemElem->GetProp();
  477. if( pItemProp && pItemProp->dwBasePartsIgnore != -1 )
  478. {
  479. pElement = ((CModelObject*)m_pModel)->SetEffect(pItemProp->dwBasePartsIgnore, XE_HIDE);
  480. }
  481. }
  482.  
  483. // 외투의상을 입었을경우 머리날릴것인가의 기준을 외투 모자를 기준으로 바꾼다
  484. CItemElem* pItemElemOvercoat = GetEquipItem( PARTS_HAT );
  485.  
  486. if( pItemElemOvercoat )
  487. {
  488. if( !pItemElemOvercoat->IsFlag( CItemElem::expired ) )
  489. {
  490. ItemProp* pItemPropOC = pItemElemOvercoat->GetProp();
  491. #ifdef __LOOKCHANGE
  492. if( pItemElemOvercoat->IsChangedLook() )
  493. pItemPropOC = prj.GetItemProp( pItemElemOvercoat->GetLook() );
  494. #endif
  495. if( pItemPropOC && pItemPropOC->dwBasePartsIgnore != -1 )
  496. {
  497. if( pItemPropOC->dwBasePartsIgnore == PARTS_HEAD )
  498. ((CModelObject*)m_pModel)->SetEffect(PARTS_HAIR, XE_HIDE );
  499.  
  500. ((CModelObject*)m_pModel)->SetEffect(pItemPropOC->dwBasePartsIgnore, XE_HIDE );
  501. }
  502. else
  503. {
  504. if( pElement )
  505. pElement->m_nEffect &= ~XE_HIDE;
  506. }
  507. }
  508. }
  509. }
  510. else
  511. {
  512. // 외투의상을 입었을경우 머리날릴것인가의 기준을 외투 모자를 기준으로 바꾼다
  513. CItemElem* pItemElemOvercoat = GetEquipItem( PARTS_HAT );
  514.  
  515. if( pItemElemOvercoat )
  516. {
  517. if( !pItemElemOvercoat->IsFlag( CItemElem::expired ) )
  518. {
  519. ItemProp* pItemPropOC = pItemElemOvercoat->GetProp();
  520. #ifdef __LOOKCHANGE
  521. if( pItemElemOvercoat->IsChangedLook() )
  522. pItemPropOC = prj.GetItemProp( pItemElemOvercoat->GetLook() );
  523. #endif
  524. if( pItemPropOC && pItemPropOC->dwBasePartsIgnore != -1 )
  525. {
  526. if( pItemPropOC->dwBasePartsIgnore == PARTS_HEAD )
  527. ((CModelObject*)m_pModel)->SetEffect(PARTS_HAIR, XE_HIDE );
  528.  
  529. ((CModelObject*)m_pModel)->SetEffect(pItemPropOC->dwBasePartsIgnore, XE_HIDE );
  530. }
  531. }
  532. }
  533. }
  534. }
  535. else
  536. {
  537. // 헬멧이 머리카락 날려야하는것이냐? // 인벤이 없는경우
  538. DWORD dwId = m_aEquipInfo[PARTS_CAP].dwId;
  539. #ifdef __LOOKCHANGE
  540. if( m_aEquipInfo[PARTS_CAP].dwLook != NULL_ID )
  541. dwId = m_aEquipInfo[PARTS_CAP].dwLook;
  542. #endif
  543. O3D_ELEMENT* pElement = NULL;
  544.  
  545. if( dwId != NULL_ID )
  546. {
  547. ItemProp* pItemProp = prj.GetItemProp( dwId );
  548.  
  549. if( pItemProp && pItemProp->dwBasePartsIgnore != -1 )
  550. {
  551. pElement = pModel->SetEffect(pItemProp->dwBasePartsIgnore, XE_HIDE);
  552. }
  553.  
  554. // 외투의상을 입었을경우 머리날릴것인가의 기준을 외투 모자를 기준으로 바꾼다
  555. dwId = m_aEquipInfo[PARTS_HAT].dwId;
  556. #ifdef __LOOKCHANGE
  557. if( m_aEquipInfo[PARTS_HAT].dwLook != NULL_ID )
  558. dwId = m_aEquipInfo[PARTS_HAT].dwLook;
  559. #endif
  560. if( dwId != NULL_ID )
  561. {
  562. if( !(m_aEquipInfo[PARTS_HAT].byFlag & CItemElem::expired) )
  563. {
  564. pItemProp = prj.GetItemProp( dwId );
  565. if( pItemProp && pItemProp->dwBasePartsIgnore != -1 )
  566. {
  567. if( pItemProp->dwBasePartsIgnore == PARTS_HEAD )
  568. ((CModelObject*)m_pModel)->SetEffect(PARTS_HAIR, XE_HIDE );
  569.  
  570. ((CModelObject*)m_pModel)->SetEffect(pItemProp->dwBasePartsIgnore, XE_HIDE );
  571. }
  572. else
  573. {
  574. if( pElement )
  575. pElement->m_nEffect &= ~XE_HIDE;
  576. }
  577. }
  578. }
  579. }
  580. else
  581. {
  582. // 외투의상을 입었을경우 머리날릴것인가의 기준을 외투 모자를 기준으로 바꾼다
  583. dwId = m_aEquipInfo[PARTS_HAT].dwId;
  584. #ifdef __LOOKCHANGE
  585. if( m_aEquipInfo[PARTS_HAT].dwLook != NULL_ID )
  586. dwId = m_aEquipInfo[PARTS_HAT].dwLook;
  587. #endif
  588. if( dwId != NULL_ID )
  589. {
  590. if( !(m_aEquipInfo[PARTS_HAT].byFlag & CItemElem::expired) )
  591. {
  592. pItemProp = prj.GetItemProp( dwId );
  593. if( pItemProp && pItemProp->dwBasePartsIgnore != -1 )
  594. {
  595. if( pItemProp->dwBasePartsIgnore == PARTS_HEAD )
  596. ((CModelObject*)m_pModel)->SetEffect(PARTS_HAIR, XE_HIDE );
  597.  
  598. ((CModelObject*)m_pModel)->SetEffect(pItemProp->dwBasePartsIgnore, XE_HIDE );
  599. }
  600. else
  601. {
  602. if( pElement )
  603. pElement->m_nEffect &= ~XE_HIDE;
  604. }
  605. }
  606. }
  607.  
  608. }
  609. }
  610. #endif //__CLIENT
  611.  
  612. if( IsMode( TRANSPARENT_MODE ) ) // 투명상태가 아닐때만 렌더.
  613. {
  614. if( g_eLocal.GetState( EVE_SCHOOL ) == 1 && // 학교 대항전 서버에 접속,
  615. g_eLocal.GetState( EVE_SCHOOL_BATTLE ) < SBS_START && // 대항전 시작 이전,
  616. !IsAuthHigher( AUTH_GAMEMASTER ) ) // 일반 사용자,
  617. {
  618. m_pModel->Render( pd3dDevice, &mWorld );
  619. }
  620. else
  621. {
  622. m_pModel->SetBlendFactor( 80 );
  623. if( IsActiveMover() || // 자기자신은 반투명으로 출력 ...혹은
  624. (IsActiveMover() == FALSE && g_pPlayer->IsAuthHigher( AUTH_GAMEMASTER )) ) // 타인인데 플레이어가 겜마면.
  625. m_pModel->Render( pd3dDevice, &mWorld ); // 반투명으로 출력
  626. m_pModel->SetBlendFactor( 255 );
  627. }
  628. }
  629. else
  630. {
  631.  
  632. #ifdef __YSMOOTH_OBJ
  633. if( m_bSmooth )//&& m_pModel->m_nNoEffect != 2 )
  634. {
  635. m_nSmoothCount += 5;
  636.  
  637. if( m_nSmoothCount > 255 )
  638. {
  639. m_wBlendFactor = 255;
  640. m_nSmoothCount = 0;
  641. m_bSmooth = FALSE;
  642. }
  643. else
  644. m_wBlendFactor = m_nSmoothCount;
  645. }
  646. #endif //__YSMOOTH_OBJ
  647.  
  648. m_pModel->SetBlendFactor(m_wBlendFactor);
  649. m_pModel->Render( pd3dDevice, &mWorld ); // 일반 상태 출력
  650. }
  651.  
  652.  
  653. if( m_pObjHighlight == this )
  654. {
  655. // m_pObjHighlight = NULL;
  656. if( m_pModel->m_nNoEffect == 0 )
  657. {
  658. pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
  659. pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE );
  660. pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
  661. }
  662.  
  663. if( IsMode( TRANSPARENT_MODE ) == 0 ) // 투명상태가 아닐때만 렌더.
  664. {
  665. if( m_pModel->m_nNoEffect == 0 )
  666. {
  667. m_pModel->Render( pd3dDevice, &mWorld );
  668. pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
  669. pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
  670. pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
  671. }
  672. }
  673.  
  674. }
  675. if( m_pActMover )
  676. m_pActMover->Render( pd3dDevice, &mWorld );
  677.  
  678. #ifdef __CLIENT
  679. #ifdef __AMAKI
  680. if( g_pPlayer != this )
  681. {
  682. if( m_pRide && m_pActMover->IsFly() )
  683. m_pRide->Render( pd3dDevice, &mWorld );
  684. }
  685. #else
  686. if( IsMode( TRANSPARENT_MODE ) == 0 ) // 투명상태가 아닐때만 렌더.
  687. {
  688. D3DXMATRIX mRide = m_matWorld;
  689.  
  690. if( m_pRide && m_pActMover->IsFly() )
  691. {
  692. m_pRide->m_nNoEffect = m_pModel->m_nNoEffect;
  693. //D3DXMATRIX mRide = m_matWorld;
  694. ItemProp* pRideProp = prj.GetItemProp( m_dwRideItemIdx ); // 현재 타고있는 탈것의 프로퍼티.
  695.  
  696. if( pRideProp && pRideProp->dwItemKind3 == IK3_STICK )
  697. {
  698. if( pModel->GetMatrixBone(0) )
  699. {
  700. D3DXMATRIX mBoundY;
  701. D3DXMatrixTranslation( &mBoundY, 0, pModel->GetMatrixBone(0)->_42, 0 );
  702. D3DXMatrixMultiply( &mRide, &mBoundY, &m_matWorld );
  703. }
  704. }
  705. #if __VER >= 14 // __WING_ITEM
  706. if( pRideProp && pRideProp->dwItemKind3 == IK3_WING )
  707. {
  708. static const int SPINE1_BONE = 4;
  709. static const int SPINE2_BONE = 5;
  710. D3DXMATRIX* pmatSpine1Bone = pModel->GetMatrixBone( SPINE1_BONE );
  711. D3DXMATRIX* pmatSpine2Bone = pModel->GetMatrixBone( SPINE2_BONE );
  712. if( pmatSpine1Bone && pmatSpine2Bone )
  713. {
  714. D3DXMATRIX matEvent;
  715. D3DXMatrixIdentity( &matEvent );
  716.  
  717. D3DXMATRIX matRotation;
  718. D3DXMatrixIdentity( &matRotation );
  719. D3DXMatrixRotationX( &matRotation, D3DXToRadian( 180 ) );
  720. D3DXMatrixMultiply( &matEvent, &matRotation, &matEvent );
  721. D3DXMatrixRotationZ( &matRotation, D3DXToRadian( -90 ) );
  722. D3DXMatrixMultiply( &matEvent, &matRotation, &matEvent );
  723. D3DXMatrixMultiply( &matEvent, &matEvent, pmatSpine1Bone );
  724.  
  725. // 깃털 날개에 대해서만 임시 위치 보정 (추후 반드시 모든 날개가 else 쪽 코드로 통일되어야 함)
  726. if( pRideProp && ( pRideProp->dwID == II_RID_RID_WIN_FEATHER01 || pRideProp->dwID == II_RID_RID_WIN_FEATHER02 ) )
  727. {
  728. matEvent._41 = pmatSpine2Bone->_41;
  729. matEvent._42 = pmatSpine2Bone->_42 - 0.02f;
  730. matEvent._43 = pmatSpine2Bone->_43 + 0.1f;
  731. }
  732. else
  733. {
  734. matEvent._41 = pmatSpine2Bone->_41;
  735. matEvent._42 = pmatSpine2Bone->_42;
  736. matEvent._43 = pmatSpine2Bone->_43;
  737. }
  738.  
  739. D3DXMatrixMultiply( &mRide, &matEvent, &m_matWorld );
  740. }
  741. }
  742. #endif // __WING_ITEM
  743. #ifdef __CSC_EXTEXTURE
  744. m_pRide->SetTextureEx(m_pRide->m_pModelElem->m_nTextureEx);
  745. #endif //__CSC_EXTEXTURE
  746. m_pRide->Render( pd3dDevice, &mRide );
  747. m_pRide->m_nNoEffect = 0;
  748.  
  749. #ifdef __CLIENT
  750. // 일본판은 일회용이 아니다...나머지국가는 일회용~
  751. if( pRideProp && pRideProp->dwID == II_RID_RID_BOR_LADOLF || pRideProp->dwID == II_RID_RID_BOR_JLADOLF
  752. #if __VER >= 9
  753. || pRideProp->dwID == II_RID_RID_BOR_JLADOLF_S || pRideProp->dwID == II_RID_RID_BOR_LADOLF_S
  754. #endif //
  755. )
  756. {
  757. if( m_pLadolf == NULL )
  758. {
  759. m_pLadolf = new CModelObject;
  760. m_pLadolf->InitDeviceObjects( pd3dDevice );
  761. m_pLadolf->LoadBone( "mvr_Ladolf.chr" );
  762. m_pLadolf->LoadElement( "mvr_Ladolf.o3d", 0 );
  763. m_pLadolf->LoadMotion( "mvr_Ladolf_stand.ani" );
  764. }
  765.  
  766. D3DXMATRIX mLadolf = mRide;
  767. D3DXVECTOR3 vLocal;
  768.  
  769. FLOAT fAngXZ = GetAngle();
  770. FLOAT fAngH = GetAngleX();
  771. AngleToVector( &vLocal, fAngXZ, -fAngH-10.0f, 1.4f );
  772.  
  773. // 날기 시작 - 가속중
  774. if( m_pActMover->GetStateFlag() & OBJSTAF_ACC )
  775. {
  776. if( m_dwLadolfFlag == 0 )
  777. {
  778. m_pLadolf->LoadMotion( "mvr_Ladolf_walk.ani" );
  779. m_pLadolf->SetMotionBlending( TRUE );
  780. m_pLadolf->SetLoop( ANILOOP_LOOP );
  781. m_dwLadolfFlag = 1;
  782. }
  783. }
  784. else
  785. {
  786. if( D3DXVec3LengthSq( &m_pActMover->m_vDelta ) < 0.001f )
  787. {
  788. if( m_dwLadolfFlag == 1 )
  789. {
  790. m_pLadolf->LoadMotion( "mvr_Ladolf_stand.ani" );
  791. m_pLadolf->SetMotionBlending( TRUE );
  792. m_pLadolf->SetLoop( ANILOOP_LOOP );
  793. m_dwLadolfFlag = 0;
  794. }
  795. }
  796. }
  797.  
  798. mLadolf._41 += vLocal.x;
  799. mLadolf._42 += vLocal.y;
  800. mLadolf._43 += vLocal.z;
  801.  
  802. m_pLadolf->m_nNoEffect = m_pModel->m_nNoEffect;
  803. m_pLadolf->Render( pd3dDevice, &mLadolf );
  804. m_pLadolf->m_nNoEffect = 0;
  805. }
  806. #endif //__CLIENT
  807.  
  808. }
  809. }
  810. #endif
  811.  
  812. #endif
  813.  
  814. #ifdef __CLIENT
  815. // 비행중 전방 xx각도 이내에 들어오는것은 TAB으로 자동 타겟팅.
  816. #if __VER >= 8 //__CSC_VER8_5
  817. if(m_pAngelFlag && m_pAngel != NULL)
  818. {
  819. m_pAngel->m_nNoEffect = m_pModel->m_nNoEffect;
  820. m_pAngel->Render( pd3dDevice, &m_AngelWorldM );
  821. m_pAngel->m_nNoEffect = 0;
  822. }
  823. #endif //__CSC_VER8_5
  824.  
  825. #ifdef __EVE_BALLOON
  826. if(m_pBalloonFlag && m_pBalloon != NULL)
  827. {
  828. m_pBalloon->m_nNoEffect = m_pModel->m_nNoEffect;
  829. m_pBalloon->Render( pd3dDevice, &m_BalloonWorldM );
  830. m_pBalloon->m_nNoEffect = 0;
  831. }
  832. #endif //__EVE_BALLOON
  833.  
  834. if( /*IsPlayer() &&*/ IsActiveMover() == FALSE && g_pPlayer->m_pActMover->IsFly() )
  835. {
  836. if( GetProp()->bKillable == 1 && GetProp()->dwFlying == 1 ) // 죽이는게 가능한넘 / 비행몹 만 타겟으로 잡힌다.
  837. {
  838. D3DXVECTOR3 vCamera = g_Neuz.m_camera.m_vLookAt - g_Neuz.m_camera.GetPos(); // 카메라가 보는 정면벡터
  839. D3DXVECTOR3 vObj = GetPos() - g_Neuz.m_camera.GetPos(); // 카메라에서 this오브젝트의 벡터.
  840. D3DXVec3Normalize( &vCamera, &vCamera ); // 노말라이즈.
  841. D3DXVec3Normalize( &vObj, &vObj );
  842. FLOAT fDot = D3DXVec3Dot( &vCamera, &vObj );
  843. if( fDot > cosf(D3DXToRadian(15.0f)) )
  844. {
  845. CWndWorld *pWndWorld = (CWndWorld *)g_WndMng.m_pWndWorld;
  846. if( pWndWorld )
  847. {
  848. pWndWorld->AddFlyTarget( GetId() );
  849. }
  850. }
  851. }
  852. }
  853.  
  854. // 무버에 기본적으로 달려있는 이펙트. - 이건 죽을때까지 안없어진다.
  855. if( (m_dwFlag & MVRF_EFFECT1) == 0 )
  856. {
  857. CSfx *pSfx = NULL;
  858. switch( m_dwIndex )
  859. {
  860. case MI_RISEM1:
  861. case MI_RISEM2:
  862. case MI_RISEM3:
  863. case MI_RISEM4:
  864. pSfx = CreateSfx( D3DDEVICE, XI_NPCRISEMSIGN, GetPos(), GetId(), D3DXVECTOR3(0,0,0), NULL_ID, -1 );
  865. if( pSfx )
  866. pSfx->SetScale( GetScale() );
  867. }
  868. if( pSfx )
  869. m_dwFlag |= MVRF_EFFECT1;
  870. }
  871. if( m_pModel->m_nNoEffect == 0 )
  872. RenderQuestEmoticon( pd3dDevice );
  873.  
  874. #if __VER >= 8 //__Y_EYE_FLASH_8
  875. if( IsActiveMover() && m_pModel && IsDie() && HasBuffByIk3(IK3_TEXT_DISGUISE) == FALSE )
  876. {
  877. CModelObject* pModelObj = (CModelObject*)m_pModel;
  878.  
  879. O3D_ELEMENT* pElement = NULL;
  880. pElement = pModelObj->GetParts(PARTS_HEAD);
  881.  
  882. if( pElement && pElement->m_pObject3D )
  883. {
  884. GMOBJECT* pGmObj = pElement->m_pObject3D->GetGMOBJECT(0);
  885.  
  886. if( pGmObj )
  887. {
  888. (*pGmObj->m_pMtrlBlkTexture) = CMover::m_pTextureEye[m_bySex][m_dwHeadMesh];
  889. }
  890. }
  891. }
  892. #endif //__Y_EYE_FLASH_8
  893.  
  894. #ifdef __ANTIALIASING
  895. pd3dDevice->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, FALSE);
  896. #endif
  897. #endif
  898.  
  899. }
  900.  
  901. // 이것이 호출될때는 바로 이전에 CMover::Render()가 호출되어야 한다.
  902. void CMover::RenderPartsEffect( LPDIRECT3DDEVICE9 pd3dDevice )
  903. {
  904. #ifdef _DEBUG
  905. if( g_pPlayer == this )
  906. {
  907. int a = 0;
  908. } else
  909. {
  910. int a = 0;
  911. }
  912. #endif
  913.  
  914. if( IsMode( TRANSPARENT_MODE ) ) // 투명상태가 아닐때만 렌더.
  915. return;
  916.  
  917. if( !IsVisible() || IsCull() )
  918. return;
  919.  
  920. pd3dDevice->SetMaterial( g_TextureMng.GetMaterial( pd3dDevice, 0 ) );
  921.  
  922. D3DXVECTOR3 vPos = GetPos();
  923. D3DXMATRIX matWorld;
  924.  
  925. matWorld = m_matWorld;
  926.  
  927. D3DXVECTOR3 vPos2 = GetPos() - GetWorld()->m_pCamera->m_vPos;
  928. int nLength = (int)( D3DXVec3Length( &vPos2 ) );
  929. if( nLength > CWorld::m_fFarPlane )
  930. nLength = (int)( CWorld::m_fFarPlane );
  931. if( nLength > CWorld::m_fFarPlane - ( CWorld::m_fFarPlane / 4 ) )
  932. return;
  933. //m_pModel->SetBlendFactor( 255 );//255 - nBlendFactor );
  934.  
  935. #ifndef __NEW_WEAPON_GLOW
  936. CItemElem *pItemElem = NULL;
  937. ItemProp *pItemProp = NULL;
  938.  
  939.  
  940. if( IsActiveMover() )
  941. {
  942. pItemElem = GetEquipItem( PARTS_RWEAPON ); // 오른쪽 무기에
  943. if( pItemElem )
  944. pItemProp = pItemElem->GetProp();
  945. } else
  946. {
  947. DWORD dwItemID = m_aEquipInfo[PARTS_RWEAPON].dwId;
  948. if( dwItemID != NULL_ID )
  949. pItemProp = prj.GetItemProp( dwItemID );
  950. }
  951.  
  952. if( IsActiveMover() )
  953. {
  954. pItemElem = GetEquipItem( PARTS_SHIELD ); // 방패에
  955. if( pItemElem )
  956. pItemProp = pItemElem->GetProp();
  957. } else
  958. {
  959. DWORD dwItemID = m_aEquipInfo[PARTS_SHIELD].dwId; // activemover 가 아닌놈은 가상아이템으로 꺼낸다.
  960. if( dwItemID != NULL_ID )
  961. pItemProp = prj.GetItemProp( dwItemID );
  962. }
  963. if( pItemProp )
  964. {
  965. if( pItemProp->nReflect > 0 ) // 리플렉트가 걸려있으면
  966. ((CModelObject*)m_pModel)->SetEffect( PARTS_SHIELD, XE_REFLECT ); // 리플렉트 옵션으로 렌더.
  967. }
  968. #ifdef __LOOKCHANGE
  969. DWORD dwLook = NULL_ID;
  970. if( IsActiveMover() && pItemElem )
  971. {
  972. dwLook = pItemElem->GetLook();
  973. }else if(!IsActiveMover() )
  974. {
  975. dwLook = m_aEquipInfo[PARTS_SHIELD].dwLook;
  976. }
  977. if( dwLook != NULL_ID )
  978. {
  979. ItemProp *pProp = prj.GetItemProp( dwLook );
  980. if( pProp )
  981. {
  982. if( pProp->nReflect > 0 )
  983. ((CModelObject*)m_pModel)->SetEffect( PARTS_SHIELD, XE_REFLECT );
  984. }
  985. }else
  986. #endif
  987. #endif//!__NEW_WEAPON_GLOW
  988.  
  989. m_pModel->SetGroup( 0 );
  990.  
  991. #ifdef __NEW_WEAPON_GLOW
  992. int nElement[2];
  993. nElement[0] = nElement[1] = 0;
  994. CItemElem *pItemElem[2];
  995. //ItemProp *pItemProp[2];
  996. DWORD dwItemKind[2];
  997. dwItemKind[0] = dwItemKind[1] = 0;
  998.  
  999. if( IsActiveMover() )
  1000. {
  1001. if( GetEquipItem( PARTS_SHIELD ) )
  1002. pItemElem[0] = GetEquipItem( PARTS_SHIELD );
  1003. else
  1004. pItemElem[0] = GetEquipItem( PARTS_LWEAPON );
  1005.  
  1006. pItemElem[1] = GetEquipItem( PARTS_RWEAPON );
  1007. //
  1008. for ( int i = 0; i < 2; i++ )
  1009. {
  1010. if( pItemElem[i] )
  1011. {
  1012. nElement[i] = pItemElem[i]->GetResistAbilityOption();
  1013. dwItemKind[i] = pItemElem[i]->GetProp()->dwItemKind3;
  1014.  
  1015. if( pItemElem[i]->GetProp()->dwHanded == HD_TWO )
  1016. {
  1017. if( dwItemKind[i] == IK3_SWD )
  1018. dwItemKind[i] = IK3_THSWD;
  1019. else
  1020. if( dwItemKind[i] == IK3_AXE )
  1021. dwItemKind[i] = IK3_THAXE;
  1022. }
  1023. }
  1024. }
  1025. // render effect
  1026.  
  1027. m_pModel->RenderEffect( pd3dDevice, &matWorld, dwItemKind[0], dwItemKind[1], nElement[0], nElement[1] );
  1028. }
  1029. else
  1030. {
  1031. DWORD dwItemID = NULL_ID;
  1032. dwItemID = m_aEquipInfo[PARTS_SHIELD].dwId;
  1033. if( dwItemID != NULL_ID )
  1034. {
  1035. dwItemKind[0] = prj.GetItemProp( dwItemID )->dwItemKind3;
  1036. nElement[0] = (m_aEquipInfo[PARTS_SHIELD].nOption & 0xFF000000) >> 24;
  1037. }else
  1038. {
  1039. dwItemID = m_aEquipInfo[PARTS_LWEAPON].dwId;
  1040. if( dwItemID != NULL_ID )
  1041. {
  1042. dwItemKind[0] = prj.GetItemProp( dwItemID )->dwItemKind3;
  1043. nElement[0] = (m_aEquipInfo[PARTS_LWEAPON].nOption & 0xFF000000) >> 24;
  1044. }
  1045. }
  1046. dwItemID = m_aEquipInfo[PARTS_RWEAPON].dwId;
  1047. if( dwItemID != NULL_ID )
  1048. {
  1049. dwItemKind[1] = prj.GetItemProp( dwItemID )->dwItemKind3;
  1050. if( prj.GetItemProp( dwItemID )->dwHanded == HD_TWO )
  1051. {
  1052. if( dwItemKind[1] == IK3_SWD )
  1053. dwItemKind[1] = IK3_THSWD;
  1054. else
  1055. if( dwItemKind[1] == IK3_AXE )
  1056. dwItemKind[1] = IK3_THAXE;
  1057. }
  1058. nElement[1] = (m_aEquipInfo[PARTS_RWEAPON].nOption & 0xFF000000) >> 24;
  1059. }
  1060. // render effect
  1061.  
  1062. m_pModel->RenderEffect( pd3dDevice, &matWorld, dwItemKind[0], dwItemKind[1], nElement[0], nElement[1] );
  1063. }
  1064. #else//__NEW_WEAPON_GLOW
  1065. if( IsMode( TRANSPARENT_MODE ) == 0 ) // 투명상태가 아닐때만 렌더.
  1066. {
  1067. if( pItemProp )
  1068. {
  1069. int nLO = 0, nRO = 0;
  1070.  
  1071. if( IsActiveMover() )
  1072. {
  1073. if( GetEquipItem( PARTS_LWEAPON ) )
  1074. {
  1075. nLO = GetEquipItem( PARTS_LWEAPON )->m_nResistAbilityOption;
  1076. }
  1077.  
  1078. }
  1079. else
  1080. {
  1081. nLO = (m_aEquipInfo[PARTS_LWEAPON].nOption & 0xFF000000) >> 24;
  1082. }
  1083.  
  1084. if( IsActiveMover() )
  1085. {
  1086. if( GetEquipItem( PARTS_RWEAPON ) )
  1087. {
  1088. nRO = GetEquipItem( PARTS_RWEAPON )->m_nResistAbilityOption;
  1089. }
  1090. }
  1091. else
  1092. {
  1093. nRO = (m_aEquipInfo[PARTS_RWEAPON].nOption & 0xFF000000) >> 24;
  1094. }
  1095.  
  1096. m_pModel->RenderEffect( pd3dDevice, &matWorld, pItemProp->dwItemKind3, nLO, nRO );
  1097. }
  1098. else
  1099. m_pModel->RenderEffect( pd3dDevice, &matWorld, NULL_ID );
  1100. }
  1101. #endif // __NEW_WEAPON_GLOW
  1102. extern CPartsLaser g_Laser;
  1103. D3DXMatrixIdentity( &matWorld );
  1104. g_Laser.Render( pd3dDevice, &matWorld, g_ModelGlobal.m_vCameraPos, g_ModelGlobal.m_vCameraForward );
  1105.  
  1106. #if __VER >= 10 // __Y_DRAGON_FIRE
  1107. if( m_dwIndex == MI_DU_METEONYKER || m_dwIndex == MI_DU_METEONYKER2 || m_dwIndex == MI_DU_METEONYKER3 ||
  1108. m_dwIndex == MI_DU_METEONYKER4 )
  1109. {
  1110. extern CPartsFireDragon g_FireDragon;
  1111. g_FireDragon.Render( pd3dDevice, &matWorld );
  1112. }
  1113. #endif //__Y_DRAGON_FIRE
  1114. /*
  1115. #ifdef __NEW_WEAPON_GLOW
  1116. if( IsMode( TRANSPARENT_MODE ) ) // 투명상태가 아닐때만 렌더.
  1117. return;
  1118.  
  1119. if( !IsVisible() || IsCull() )
  1120. return;
  1121.  
  1122. pd3dDevice->SetMaterial( g_TextureMng.GetMaterial( pd3dDevice, 0 ) );
  1123.  
  1124. D3DXVECTOR3 vPos = GetPos();
  1125. D3DXMATRIX matWorld;
  1126.  
  1127. matWorld = m_matWorld;
  1128.  
  1129. D3DXVECTOR3 vPos2 = GetPos() - GetWorld()->m_pCamera->m_vPos;
  1130. int nLength = (int)( D3DXVec3Length( &vPos2 ) );
  1131. if( nLength > CWorld::m_fFarPlane )
  1132. nLength = (int)( CWorld::m_fFarPlane );
  1133. if( nLength > CWorld::m_fFarPlane - ( CWorld::m_fFarPlane / 4 ) )
  1134. return;
  1135.  
  1136.  
  1137. m_pModel->SetGroup( 0 );
  1138.  
  1139. int nElement[2];
  1140. nElement[0] = nElement[1] = 0;
  1141. CItemElem *pItemElem[2];
  1142. //ItemProp *pItemProp[2];
  1143. DWORD dwItemKind[2];
  1144. dwItemKind[0] = dwItemKind[1] = 0;
  1145.  
  1146. if( IsActiveMover() )
  1147. {
  1148. if( GetEquipItem( PARTS_SHIELD ) )
  1149. pItemElem[0] = GetEquipItem( PARTS_SHIELD );
  1150. else
  1151. pItemElem[0] = GetEquipItem( PARTS_LWEAPON );
  1152.  
  1153. pItemElem[1] = GetEquipItem( PARTS_RWEAPON );
  1154. //
  1155. for ( int i = 0; i < 2; i++ )
  1156. {
  1157. if( pItemElem[i] )
  1158. {
  1159. nElement[i] = pItemElem[i]->GetResistAbilityOption();
  1160. dwItemKind[i] = pItemElem[i]->GetProp()->dwItemKind3;
  1161.  
  1162. if( pItemElem[i]->GetProp()->dwHanded == HD_TWO )
  1163. {
  1164. if( dwItemKind[i] == IK3_SWD )
  1165. dwItemKind[i] = IK3_THSWD;
  1166. else
  1167. if( dwItemKind[i] == IK3_AXE )
  1168. dwItemKind[i] = IK3_THAXE;
  1169. }
  1170. }
  1171. }
  1172. // render effect
  1173. m_pModel->RenderEffect( pd3dDevice, &matWorld, dwItemKind[0], dwItemKind[1], nElement[0], nElement[1] );
  1174. }
  1175. else
  1176. {
  1177. DWORD dwItemID = NULL_ID;
  1178. dwItemID = m_aEquipInfo[PARTS_SHIELD].dwId;
  1179. if( dwItemID != NULL_ID )
  1180. {
  1181. dwItemKind[0] = prj.GetItemProp( dwItemID )->dwItemKind3;
  1182. nElement[0] = (m_aEquipInfo[PARTS_SHIELD].nOption & 0xFF000000) >> 24;
  1183. }else
  1184. {
  1185. dwItemID = m_aEquipInfo[PARTS_LWEAPON].dwId;
  1186. if( dwItemID != NULL_ID )
  1187. {
  1188. dwItemKind[0] = prj.GetItemProp( dwItemID )->dwItemKind3;
  1189. nElement[0] = (m_aEquipInfo[PARTS_LWEAPON].nOption & 0xFF000000) >> 24;
  1190. }
  1191. }
  1192. dwItemID = m_aEquipInfo[PARTS_RWEAPON].dwId;
  1193. if( dwItemID != NULL_ID )
  1194. {
  1195. dwItemKind[1] = prj.GetItemProp( dwItemID )->dwItemKind3;
  1196. if( prj.GetItemProp( dwItemID )->dwHanded == HD_TWO )
  1197. {
  1198. if( dwItemKind[1] == IK3_SWD )
  1199. dwItemKind[1] = IK3_THSWD;
  1200. else
  1201. if( dwItemKind[1] == IK3_AXE )
  1202. dwItemKind[1] = IK3_THAXE;
  1203. }
  1204. nElement[1] = (m_aEquipInfo[PARTS_RWEAPON].nOption & 0xFF000000) >> 24;
  1205. }
  1206. // render effect
  1207. m_pModel->RenderEffect( pd3dDevice, &matWorld, dwItemKind[0], dwItemKind[1], nElement[0], nElement[1] );
  1208. }
  1209.  
  1210. extern CPartsLaser g_Laser;
  1211. D3DXMatrixIdentity( &matWorld );
  1212. g_Laser.Render( pd3dDevice, &matWorld, g_ModelGlobal.m_vCameraPos, g_ModelGlobal.m_vCameraForward );
  1213.  
  1214. #if __VER >= 10 // __Y_DRAGON_FIRE
  1215. if( m_dwIndex == MI_DU_METEONYKER || m_dwIndex == MI_DU_METEONYKER2 || m_dwIndex == MI_DU_METEONYKER3 ||
  1216. m_dwIndex == MI_DU_METEONYKER4 )
  1217. {
  1218. extern CPartsFireDragon g_FireDragon;
  1219. g_FireDragon.Render( pd3dDevice, &matWorld );
  1220. }
  1221. #endif //__Y_DRAGON_FIRE
  1222. #else // __NEW_WEAPON_GLOW
  1223. #ifdef _DEBUG
  1224. if( g_pPlayer == this )
  1225. {
  1226. int a = 0;
  1227. } else
  1228. {
  1229. int a = 0;
  1230. }
  1231. #endif
  1232.  
  1233. if( IsMode( TRANSPARENT_MODE ) ) // 투명상태가 아닐때만 렌더.
  1234. return;
  1235.  
  1236. if( !IsVisible() || IsCull() )
  1237. return;
  1238.  
  1239. pd3dDevice->SetMaterial( g_TextureMng.GetMaterial( pd3dDevice, 0 ) );
  1240.  
  1241. D3DXVECTOR3 vPos = GetPos();
  1242. D3DXMATRIX matWorld;
  1243.  
  1244. matWorld = m_matWorld;
  1245.  
  1246. D3DXVECTOR3 vPos2 = GetPos() - GetWorld()->m_pCamera->m_vPos;
  1247. int nLength = (int)( D3DXVec3Length( &vPos2 ) );
  1248. if( nLength > CWorld::m_fFarPlane )
  1249. nLength = (int)( CWorld::m_fFarPlane );
  1250. if( nLength > CWorld::m_fFarPlane - ( CWorld::m_fFarPlane / 4 ) )
  1251. return;
  1252. //m_pModel->SetBlendFactor( 255 );//255 - nBlendFactor );
  1253.  
  1254. CItemElem *pItemElem = NULL;
  1255. ItemProp *pItemProp = NULL;
  1256.  
  1257. if( IsActiveMover() )
  1258. {
  1259. pItemElem = GetEquipItem( PARTS_RWEAPON ); // 오른쪽 무기에
  1260. if( pItemElem )
  1261. pItemProp = pItemElem->GetProp();
  1262. } else
  1263. {
  1264. DWORD dwItemID = m_aEquipInfo[PARTS_RWEAPON].dwId;
  1265. if( dwItemID != NULL_ID )
  1266. pItemProp = prj.GetItemProp( dwItemID );
  1267. }
  1268.  
  1269. if( IsActiveMover() )
  1270. {
  1271. pItemElem = GetEquipItem( PARTS_SHIELD ); // 방패에
  1272. if( pItemElem )
  1273. pItemProp = pItemElem->GetProp();
  1274. } else
  1275. {
  1276. DWORD dwItemID = m_aEquipInfo[PARTS_SHIELD].dwId; // activemover 가 아닌놈은 가상아이템으로 꺼낸다.
  1277. if( dwItemID != NULL_ID )
  1278. pItemProp = prj.GetItemProp( dwItemID );
  1279. }
  1280. */
  1281.  
  1282. /*
  1283. if( pItemProp )
  1284. {
  1285. if( pItemProp->nReflect > 0 ) // 리플렉트가 걸려있으면
  1286. ((CModelObject*)m_pModel)->SetEffect( PARTS_SHIELD, XE_REFLECT ); // 리플렉트 옵션으로 렌더.
  1287. }
  1288.  
  1289. m_pModel->SetGroup( 0 );
  1290. if( IsMode( TRANSPARENT_MODE ) == 0 ) // 투명상태가 아닐때만 렌더.
  1291. {
  1292. if( pItemProp )
  1293. {
  1294. int nLO = 0, nRO = 0;
  1295.  
  1296. if( IsActiveMover() )
  1297. {
  1298. if( GetEquipItem( PARTS_LWEAPON ) )
  1299. {
  1300. nLO = GetEquipItem( PARTS_LWEAPON )->m_nResistAbilityOption;
  1301. }
  1302.  
  1303. }
  1304. else
  1305. {
  1306. nLO = (m_aEquipInfo[PARTS_LWEAPON].nOption & 0xFF000000) >> 24;
  1307. }
  1308.  
  1309. if( IsActiveMover() )
  1310. {
  1311. if( GetEquipItem( PARTS_RWEAPON ) )
  1312. {
  1313. nRO = GetEquipItem( PARTS_RWEAPON )->m_nResistAbilityOption;
  1314. }
  1315. }
  1316. else
  1317. {
  1318. nRO = (m_aEquipInfo[PARTS_RWEAPON].nOption & 0xFF000000) >> 24;
  1319. }
  1320.  
  1321. m_pModel->RenderEffect( pd3dDevice, &matWorld, pItemProp->dwItemKind3, nLO, nRO );
  1322. }
  1323. else
  1324. m_pModel->RenderEffect( pd3dDevice, &matWorld, NULL_ID );
  1325. }
  1326.  
  1327. extern CPartsLaser g_Laser;
  1328. D3DXMatrixIdentity( &matWorld );
  1329. g_Laser.Render( pd3dDevice, &matWorld, g_ModelGlobal.m_vCameraPos, g_ModelGlobal.m_vCameraForward );
  1330.  
  1331. #if __VER >= 10 // __Y_DRAGON_FIRE
  1332. if( m_dwIndex == MI_DU_METEONYKER || m_dwIndex == MI_DU_METEONYKER2 || m_dwIndex == MI_DU_METEONYKER3 ||
  1333. m_dwIndex == MI_DU_METEONYKER4 )
  1334. {
  1335. extern CPartsFireDragon g_FireDragon;
  1336. g_FireDragon.Render( pd3dDevice, &matWorld );
  1337. }
  1338. #endif //__Y_DRAGON_FIRE
  1339. #endif // __NEW_WEAPON_GLOW
  1340. */
  1341. }
  1342.  
  1343.  
  1344. #ifdef __CLIENT
  1345.  
  1346. // nValue ( 1,2,3,4 )
  1347. void CMover::RenderGauge( LPDIRECT3DDEVICE9 pd3dDevice, int nValue )
  1348. {
  1349. // 월드 좌표를 스크린 좌표로 프로젝션 한다.
  1350. D3DXVECTOR3 vOut, vPos = GetPos(), vPosHeight;
  1351. D3DVIEWPORT9 vp;
  1352. const BOUND_BOX* pBB = m_pModel->GetBBVector();
  1353.  
  1354. pd3dDevice->GetViewport( &vp );
  1355. vp.X = 0;
  1356. vp.Y = 0;
  1357.  
  1358. D3DXMATRIX matTrans;
  1359. D3DXMATRIX matWorld;
  1360. D3DXMatrixIdentity(&matWorld);
  1361. pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
  1362. D3DXMatrixTranslation( &matTrans, vPos.x, vPos.y, vPos.z);
  1363. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matScale );
  1364. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matRotation );
  1365. D3DXMatrixMultiply( &matWorld, &matWorld, &matTrans );
  1366.  
  1367. vPosHeight = pBB->m_vPos[0];
  1368. vPosHeight.x = 0;
  1369. vPosHeight.z = 0;
  1370.  
  1371. D3DXVec3Project( &vOut, &vPosHeight, &vp, &GetWorld()->m_matProj,
  1372. &GetWorld()->m_pCamera->m_matView, &matWorld);
  1373.  
  1374. vOut.y -= 40;
  1375.  
  1376. int nGaugeWidth = 80;
  1377. CPoint point( (LONG)( vOut.x - nGaugeWidth / 2 ), (LONG)( vOut.y - 3 ) );
  1378. CRect rect( point.x - 2, point.y - 2, point.x + nGaugeWidth + 2, point.y + 5 + 2);
  1379.  
  1380. CPoint p = CPoint( rect.left, rect.top );
  1381. LONG y = 200;
  1382.  
  1383. MakeEven( p.x );
  1384.  
  1385. g_Neuz.m_TextureGauge[0].RenderScal(&(g_Neuz.m_2DRender), p, y, 0.8f, 0.55f);
  1386.  
  1387. switch( nValue )
  1388. {
  1389. case 4:
  1390. g_Neuz.m_TextureGauge[4].RenderScal(&(g_Neuz.m_2DRender), p, y, 0.8f, 0.55f);
  1391. case 3:
  1392. g_Neuz.m_TextureGauge[3].RenderScal(&(g_Neuz.m_2DRender), p, y, 0.8f, 0.55f);
  1393. case 2:
  1394. g_Neuz.m_TextureGauge[2].RenderScal(&(g_Neuz.m_2DRender), p, y, 0.8f, 0.55f);
  1395. case 1:
  1396. g_Neuz.m_TextureGauge[1].RenderScal(&(g_Neuz.m_2DRender), p, y, 0.8f, 0.55f);
  1397. break;
  1398. case 0: // 그리지 않는다.
  1399. break;
  1400. default:
  1401. ASSERT( 0 );
  1402. break;
  1403. }
  1404.  
  1405. #ifdef __XUZHU
  1406. g_Neuz.m_2DRender.TextOut( 2, 160, GetHitPoint(), D3DCOLOR_ARGB( 255, 255, 255, 255 ) );
  1407. #endif
  1408. }
  1409.  
  1410.  
  1411. // 비행시 터보그래프
  1412. void CMover::RenderTurboGauge( LPDIRECT3DDEVICE9 pd3dDevice, DWORD nColor, int nValue, int nMaxValue )
  1413. {
  1414. if( IsMode( TRANSPARENT_MODE ) )
  1415. return;
  1416. if( !IsVisible() )
  1417. return;
  1418. // pd3dDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
  1419.  
  1420. // 월드 좌표를 스크린 좌표로 프로젝션 한다.
  1421. D3DXVECTOR3 vOut, vPos = GetPos(), vPosHeight;
  1422. D3DVIEWPORT9 vp;
  1423. const BOUND_BOX* pBB = m_pModel->GetBBVector();
  1424.  
  1425. pd3dDevice->GetViewport( &vp );
  1426. vp.X = 0;
  1427. vp.Y = 0;
  1428.  
  1429. D3DXMATRIX matTrans;
  1430. D3DXMATRIX matWorld;
  1431. D3DXMatrixIdentity(&matWorld);
  1432. pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
  1433. D3DXMatrixTranslation( &matTrans, vPos.x, vPos.y, vPos.z);
  1434. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matScale );
  1435. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matRotation );
  1436. D3DXMatrixMultiply( &matWorld, &matWorld, &matTrans );
  1437.  
  1438. vPosHeight = pBB->m_vPos[0];
  1439. vPosHeight.x = 0;
  1440. vPosHeight.z = 0;
  1441.  
  1442. D3DXVec3Project( &vOut, &vPosHeight, &vp, &GetWorld()->m_matProj,
  1443. &GetWorld()->m_pCamera->m_matView, &matWorld);
  1444.  
  1445. // vOut.y -= 40;
  1446.  
  1447. CPoint point( (LONG)( vOut.x - 80 / 2 ), (LONG)( vOut.y - 40 - 3 ) ); // 게이지 width 100
  1448. CPoint p = CPoint( point.x - 2, point.y - 2 );
  1449.  
  1450. MakeEven( p.x );
  1451.  
  1452. g_Neuz.m_TextureTurboGauge[0].RenderScal(&(g_Neuz.m_2DRender), p, 200, 0.8f, 0.55f); // 게이지바 테두리(와꾸?)
  1453.  
  1454. //int nHitWidth = nValue * nGaugeWidth / nMaxValue;
  1455.  
  1456. int nWidth = g_Neuz.m_TextureTurboGauge[1].m_size.cx * nValue / nMaxValue;
  1457.  
  1458. CPoint p2 = CPoint( nWidth, g_Neuz.m_TextureTurboGauge[1].m_size.cy );
  1459.  
  1460. if( m_pActMover->GetStateFlag() & OBJSTAF_TURBO )
  1461. {
  1462. if( g_nRenderCnt & 1 )
  1463. {
  1464. g_Neuz.m_TextureTurboGauge[1].Render( &g_Neuz.m_2DRender, p, p2, 200, 0.8f, 0.55f);
  1465. }
  1466. else
  1467. {
  1468. int nWidthScale = (int)( (96 * nValue / nMaxValue) * 0.8f );
  1469. CRect rect( p.x + 1, p.y + 1, p.x + nWidthScale, p.y + 6 );
  1470. g_Neuz.m_2DRender.RenderFillRect( rect, 0xffffffff );
  1471. }
  1472.  
  1473. } else
  1474. g_Neuz.m_TextureTurboGauge[1].Render( &g_Neuz.m_2DRender, p, p2, 200, 0.8f, 0.55f);
  1475.  
  1476. #ifdef __XUZHU
  1477. g_Neuz.m_2DRender.TextOut( p.x + 128, p.y, nValue, D3DCOLOR_ARGB( 255, 255, 255, 255 ) );
  1478. #endif
  1479.  
  1480. // 속도 표시.
  1481.  
  1482. extern int g_nFlySpeed;
  1483. char szBuff[64];
  1484. int nLen, i, nIdx;
  1485. sprintf( szBuff, "%d", g_nFlySpeed );
  1486. nLen = strlen( szBuff );
  1487.  
  1488. // vPosHeight = vPos;
  1489. vPosHeight.x = 0;
  1490. vPosHeight.z = 0;
  1491. vPosHeight.y = 0;
  1492.  
  1493. D3DXVec3Project( &vOut, &vPosHeight, &vp, &GetWorld()->m_matProj,
  1494. &GetWorld()->m_pCamera->m_matView, &matWorld);
  1495.  
  1496.  
  1497. // 숫자폰트 찍기.
  1498. p.x = (LONG)( vOut.x + 30 );
  1499. p.y = (LONG)( vOut.y + 0 );
  1500.  
  1501. MakeEven( p.x );
  1502.  
  1503. for( i = 0; i < nLen; i ++ )
  1504. {
  1505. nIdx = szBuff[i] - '0';
  1506. g_WndMng.m_pWndWorld->m_texFontDigital.GetAt(nIdx)->Render( &g_Neuz.m_2DRender, p ); // 수평 게이지.
  1507. p.x += 16;
  1508.  
  1509. }
  1510.  
  1511. g_WndMng.m_pWndWorld->m_texFontDigital.GetAt(10)->Render( &g_Neuz.m_2DRender, p ); // 수평 게이지.
  1512.  
  1513.  
  1514. }
  1515. #endif // __CLIENT
  1516.  
  1517. #ifdef __CLIENT
  1518. void CMover::RenderQuestEmoticon( LPDIRECT3DDEVICE9 pd3dDevice )
  1519. {
  1520. if( IsPlayer() || m_bShowQuestEmoticon == FALSE )
  1521. return;
  1522. LPCHARACTER lpCharacter = GetCharacter();
  1523.  
  1524. if( lpCharacter == NULL ) return;
  1525.  
  1526. // 월드 좌표를 스크린 좌표로 프로젝션 한다.
  1527. D3DXVECTOR3 vOut, vPos = GetPos(), vPosHeight;
  1528. D3DVIEWPORT9 vp;
  1529. const BOUND_BOX* pBB = m_pModel->GetBBVector();
  1530.  
  1531. pd3dDevice->GetViewport( &vp );
  1532.  
  1533. D3DXMATRIX matTrans;
  1534. D3DXMATRIX matWorld;
  1535. D3DXMatrixIdentity(&matWorld);
  1536. D3DXMatrixTranslation( &matTrans, vPos.x, vPos.y, vPos.z );
  1537. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matScale );
  1538. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matRotation );
  1539. D3DXMatrixMultiply( &matWorld, &matWorld, &matTrans );
  1540.  
  1541. vPosHeight = pBB->m_vPos[0];
  1542. vPosHeight.x = 0;
  1543. vPosHeight.z = 0;
  1544.  
  1545. D3DXVec3Project( &vOut, &vPosHeight, &vp, &GetWorld()->m_matProj,
  1546. &GetWorld()->m_pCamera->m_matView, &matWorld);
  1547. //vOutFLOAT fHeight = ( vOut[0].y - vOut[4].y ) - 10f;
  1548. CPoint point;
  1549. point.x = (LONG)( vOut.x );
  1550. point.y = (LONG)( vOut.y );
  1551.  
  1552. MakeEven( point.x );
  1553. //point.x -= pFont->GetTextExtent( szName ).cx / 2;
  1554. point.y -= 50;
  1555.  
  1556. if( m_nQuestEmoticonIndex > 0 )
  1557. {
  1558.  
  1559. pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
  1560. pd3dDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
  1561. pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
  1562. pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
  1563.  
  1564. point.x = (LONG)( point.x - (16 * m_fQuestEmoticonScale) );
  1565. point.y = (LONG)( point.y - (16 * m_fQuestEmoticonScale) );
  1566.  
  1567. g_Neuz.m_texQuestEmoticon.GetAt( m_nQuestEmoticonIndex )->RenderScal(&(g_Neuz.m_2DRender), point, 255, m_fQuestEmoticonScale, m_fQuestEmoticonScale );//questemoticonindex
  1568.  
  1569. pd3dDevice->SetRenderState( D3DRS_FOGENABLE, TRUE );
  1570. }
  1571. }
  1572. #endif // __CLIENT
  1573.  
  1574. void CMover::RenderChrState(LPDIRECT3DDEVICE9 pd3dDevice)
  1575. {
  1576. if( !IsVisible() )
  1577. return;
  1578.  
  1579. if( IsPlayer() )
  1580. {
  1581. if( IsCull() == FALSE )
  1582. {
  1583. // 월드 좌표를 스크린 좌표로 프로젝션 한다.
  1584. D3DXVECTOR3 vOut, vPos = GetPos(), vPosHeight;
  1585. D3DVIEWPORT9 vp;
  1586. const BOUND_BOX* pBB;
  1587.  
  1588. if( m_pModel )
  1589. pBB = m_pModel->GetBBVector();
  1590. else
  1591. return;
  1592.  
  1593. pd3dDevice->GetViewport( &vp );
  1594.  
  1595. D3DXMATRIX matTrans;
  1596. D3DXMATRIX matWorld;
  1597. D3DXMatrixIdentity(&matWorld);
  1598. D3DXMatrixTranslation( &matTrans, vPos.x, vPos.y , vPos.z);
  1599.  
  1600. D3DXMatrixMultiply( &matWorld, &matWorld, &GetMatrixScale() );
  1601. D3DXMatrixMultiply( &matWorld, &matWorld, &GetMatrixRotation() );
  1602. D3DXMatrixMultiply( &matWorld, &matWorld, &matTrans );
  1603.  
  1604. vPosHeight = pBB->m_vPos[0];
  1605. vPosHeight.x = 0;
  1606. vPosHeight.z = 0;
  1607.  
  1608. D3DXVec3Project( &vOut, &vPosHeight, &vp, &GetWorld()->m_matProj,
  1609. &GetWorld()->m_pCamera->m_matView, &matWorld);
  1610.  
  1611. CPoint point;
  1612. point.x = (LONG)( vOut.x - 32 / 2 );
  1613. point.y = (LONG)( vOut.y - 32 );
  1614.  
  1615. MakeEven( point.x );
  1616.  
  1617. CTexture* pTexture = NULL;
  1618. if( GetAdjParam( DST_CHRSTATE ) & CHS_STUN )
  1619. {
  1620. pTexture = g_DialogMsg.m_texEmoticon.GetAt(DLGEMOT_STUN);
  1621. }
  1622.  
  1623. if( pTexture )
  1624. {
  1625. g_Neuz.m_2DRender.RenderTexture( point, pTexture, 220 );
  1626. }
  1627. }
  1628. }
  1629. }
  1630. #if __VER >= 13 // __HONORABLE_TITLE
  1631. LPCTSTR CMover::GetTitle()
  1632. {
  1633. return m_strTitle.GetBuffer(0);
  1634. }
  1635.  
  1636. void CMover::SetTitle(LPCTSTR pTitle)
  1637. {
  1638. m_strTitle = pTitle;
  1639. }
  1640. #endif // __HONORABLE_TITLE
  1641.  
  1642. void CMover::RenderName( LPDIRECT3DDEVICE9 pd3dDevice, CD3DFont* pFont, DWORD dwColor )
  1643. {
  1644. if( !IsVisible() )
  1645. return;
  1646.  
  1647. if( g_Option.m_nPlayerName == FALSE && IsActiveMover() )
  1648. return;
  1649.  
  1650. if( g_Option.m_nOtherPlayerName == FALSE && !IsActiveMover() && IsPlayer() )
  1651. return;
  1652.  
  1653. char szName[ 256 ];
  1654. strcpy( szName, m_szName );
  1655.  
  1656. BOOL bOtherColor = FALSE;
  1657. DWORD dwNewColor;
  1658.  
  1659. if( IsPlayer() )
  1660. {
  1661. if( GetWorld()->GetID() == WI_WORLD_GUILDWAR && g_pPlayer->GetGuild() && GetGuild() )
  1662. {
  1663. bOtherColor = TRUE;
  1664. if( g_pPlayer->GetGuild()->GetGuildId() == GetGuild()->GetGuildId() )
  1665. dwNewColor = COLOR_GUILDCOMBAT;
  1666. else
  1667. dwNewColor = COLOR_PLAYER;
  1668. }
  1669. // 명성에 따른 색표시.
  1670. #if __VER >= 13 // __HONORABLE_TITLE
  1671. if( IsChaotic() )
  1672. {
  1673. dwColor = prj.m_PKSetting.dwChaoColor;
  1674. }
  1675. else if( IsPKPink() )
  1676. {
  1677. dwColor = prj.m_PKSetting.dwReadyColor;
  1678. }
  1679.  
  1680. #ifdef __PLAYER_NAMECOLOR
  1681. else if( m_dwPlayerColor == 0 )
  1682. {
  1683. dwColor = COLOR_RED;
  1684. }
  1685. else if( m_dwPlayerColor == 1 )
  1686. {
  1687. dwColor = COLOR_VIOLET;
  1688. }
  1689. else if( m_dwPlayerColor == 2 )
  1690. {
  1691. dwColor = COLOR_BLUE_DARK;
  1692. }
  1693. else if( m_dwPlayerColor == 3 )
  1694. {
  1695. dwColor = COLOR_BLUE_LIGHT;
  1696. }
  1697. else if( m_dwPlayerColor == 4 )
  1698. {
  1699. dwColor = COLOR_GREEN;
  1700. }
  1701. else if( m_dwPlayerColor == 5 )
  1702. {
  1703. dwColor = COLOR_YELLOW;
  1704. }
  1705. else if( m_dwPlayerColor == 6 )
  1706. {
  1707. dwColor = COLOR_ORANGE;
  1708. }
  1709. else if( m_dwPlayerColor == 7 )
  1710. {
  1711. dwColor = COLOR_BROWN;
  1712. }
  1713. else if( m_dwPlayerColor == 8 )
  1714. {
  1715. dwColor = COLOR_BLACK;
  1716. }
  1717. else if( m_dwPlayerColor == 9 )
  1718. {
  1719. dwColor = COLOR_GRAY;
  1720. }
  1721. else if( m_dwPlayerColor == 10 )
  1722. {
  1723. dwColor = COLOR_PINK;
  1724. }
  1725. /*else if( m_dwPlayerColor == 11 )
  1726. {
  1727. dwColor = COLOR_BLUE;
  1728. }*/
  1729. #endif //__PLAYER_NAMECOLOR
  1730.  
  1731.  
  1732. #ifdef __PREMIUM_SYSTEM
  1733. else if( g_pPlayer->IsPremium())
  1734. {
  1735. dwColor = prj.m_VipSettings.dwColorPremium;
  1736. //Error("Premium Color = %x" ,prj.m_VipSettings.dwColorPremium);
  1737. }
  1738.  
  1739. #endif//__PREMIUM_SYSTEM
  1740. #ifdef __PVP_MATCH
  1741. else if( m_dwMatchId != NULL_ID && m_nMatchTeam != -1 )
  1742. {
  1743. if( m_nMatchTeam == 0 )
  1744. dwColor = PVP_MATCH_COLORBLUE;
  1745. else
  1746. dwColor = PVP_MATCH_COLORRED;
  1747. }
  1748. #endif
  1749.  
  1750. else if( m_dwAuthorization >= AUTH_ADMINISTRATOR ) // ADMIN
  1751. dwColor = COLOR_ADMINISTRATOR; // ADMIN
  1752. else if( m_dwAuthorization >= AUTH_OPERATOR ) // DEV
  1753. dwColor = COLOR_OPERATOR; // DEV
  1754. else if( m_dwAuthorization >= AUTH_GAMEMASTER3 ) // GM
  1755. dwColor = COLOR_GAMEMASTER3; // GM
  1756. else if( m_dwAuthorization >= AUTH_GAMEMASTER2 ) // MAPPER
  1757. dwColor = COLOR_GAMEMASTER2; // MAPPER
  1758. else if( m_dwAuthorization >= AUTH_GAMEMASTER ) // SUPPORTER
  1759. dwColor = COLOR_GAMEMASTER; // SUPPORTER
  1760.  
  1761. #ifdef __VIP
  1762. else if( IsVIP() )
  1763. dwColor = 0xFFFACC2E;
  1764. #endif
  1765. else
  1766. dwColor = 0xFFBDECFF;
  1767.  
  1768. #ifdef __USER_OWN_TITLE
  1769. if( lstrlen( m_szOwnTitle ) > NULL && m_szOwnTitle[0] != '$' )
  1770. {
  1771. CString strName;
  1772. strName = "[";
  1773. strName += m_szOwnTitle;
  1774. strName += "] ";
  1775. strName += m_szName;
  1776. strcpy( szName, (LPCTSTR)strName );
  1777. }
  1778. else
  1779. {
  1780. #endif
  1781.  
  1782. #ifdef __METIER
  1783. CString jobName;
  1784. CString jobFull;
  1785. switch (GetIdJob())
  1786. {
  1787. case 0:
  1788. jobName = "Chomeur";
  1789. break;
  1790. case 1:
  1791. if ( GetJobLvl() >= 1 && GetJobLvl() <= 30 )
  1792. jobName = "Forgeron";
  1793. else if ( GetJobLvl() >= 31 && GetJobLvl() <= 60 )
  1794. jobName = "Artisant";
  1795. else if ( GetJobLvl() >= 61 && GetJobLvl() <= 80 )
  1796. jobName = "Ferronier";
  1797. else if ( GetJobLvl() >= 81 && GetJobLvl() <= 100)
  1798. jobName = "Armurier";
  1799. break;
  1800. case 2:
  1801. if ( GetJobLvl() >= 1 && GetJobLvl() <= 30 )
  1802. jobName = "Alchimiste";
  1803. else if ( GetJobLvl() >= 31 && GetJobLvl() <= 60 )
  1804. jobName = "Chimiste";
  1805. else if ( GetJobLvl() >= 61 && GetJobLvl() <= 80 )
  1806. jobName = "Scientifique";
  1807. else if ( GetJobLvl() >= 81 && GetJobLvl() <= 100)
  1808. jobName = "Savant Fou";
  1809. break;
  1810. case 3:
  1811. if ( GetJobLvl() >= 1 && GetJobLvl() <= 30 )
  1812. jobName = "Eleveur";
  1813. else if ( GetJobLvl() >= 31 && GetJobLvl() <= 60 )
  1814. jobName = "Master-Eleveur";
  1815. else if ( GetJobLvl() >= 61 && GetJobLvl() <= 80 )
  1816. jobName = "Hero-Eleveur";
  1817. else if ( GetJobLvl() >= 81 && GetJobLvl() <= 100)
  1818. jobName = "Dresseur";
  1819. break;
  1820. case 4:
  1821. if ( GetJobLvl() >= 1 && GetJobLvl() <= 30 )
  1822. jobName = "Couturier";
  1823. else if ( GetJobLvl() >= 31 && GetJobLvl() <= 60 )
  1824. jobName = "Maitre-Couturier";
  1825. else if ( GetJobLvl() >= 61 && GetJobLvl() <= 80 )
  1826. jobName = "Hero-Couturier";
  1827. else if ( GetJobLvl() >= 81 && GetJobLvl() <= 100)
  1828. jobName = "Styliste";
  1829. break;
  1830. case 5:
  1831. if ( GetJobLvl() >= 1 && GetJobLvl() <= 30 )
  1832. jobName = "Joaillier";
  1833. else if ( GetJobLvl() >= 31 && GetJobLvl() <= 60 )
  1834. jobName = "Sertisseur";
  1835. else if ( GetJobLvl() >= 61 && GetJobLvl() <= 80 )
  1836. jobName = "Parrurier";
  1837. else if ( GetJobLvl() >= 81 && GetJobLvl() <= 100)
  1838. jobName = "Bijoutier";
  1839. break;
  1840. case 6:
  1841. if ( GetJobLvl() >= 1 && GetJobLvl() <= 30 )
  1842. jobName = "Cuisinier";
  1843. else if ( GetJobLvl() >= 31 && GetJobLvl() <= 60 )
  1844. jobName = "Chef";
  1845. else if ( GetJobLvl() >= 61 && GetJobLvl() <= 80 )
  1846. jobName = "Gastronome";
  1847. else if ( GetJobLvl() >= 81 && GetJobLvl() <= 100)
  1848. jobName = "Critique-Culinaire";
  1849. break;
  1850. default:
  1851. jobName = "Indefini";
  1852. break;
  1853. }
  1854. //jobFull.Format(" <%s lvl%d[%d%%]>", jobName, GetJobLvl(), GetJobExp());
  1855. jobFull.Format(" [%s]", jobName );
  1856. #endif
  1857.  
  1858. CString strFameName = GetTitle();
  1859. if( strFameName.IsEmpty() == FALSE )
  1860. {
  1861. CString strName;
  1862. strName = "[";
  1863. strName += strFameName;
  1864. strName += "] ";
  1865. strName += m_szName;
  1866. strcpy( szName, (LPCTSTR)strName );
  1867. }
  1868. #ifdef __USER_OWN_TITLE
  1869. }
  1870. #endif
  1871. #ifdef __PVP_MATCH
  1872. if(GetWorld()->IsArena())
  1873. {
  1874. CString strName;
  1875. int nKills = (m_nKillCount == 0 ? 1 : m_nKillCount);
  1876. int nDeads = (m_nDeadCount == 0 ? 1 : m_nDeadCount);
  1877. float fKD = (float)nKills / (float)nDeads;
  1878. strName.Format("%s[%0.2f]",szName,fKD);
  1879. strcpy( szName, (LPCTSTR)strName );
  1880. }
  1881. #endif
  1882. // GM / Admin tag
  1883. if(m_dwAuthorization >= AUTH_GAMEMASTER)
  1884. {
  1885. CString strName;
  1886. strName = szName;
  1887.  
  1888. if(m_dwAuthorization >= AUTH_ADMINISTRATOR )
  1889. {
  1890. strName += " [Admin]";
  1891. }
  1892. else if(m_dwAuthorization >= AUTH_OPERATOR )
  1893. {
  1894. strName += " [Developer]";
  1895. }
  1896. else if(m_dwAuthorization >= AUTH_GAMEMASTER3 )
  1897. {
  1898. strName += " [Gamemaster]";
  1899. }
  1900. else if(m_dwAuthorization >= AUTH_GAMEMASTER2 )
  1901. {
  1902. strName += " [Mapper]";
  1903. }
  1904. else if(m_dwAuthorization >= AUTH_GAMEMASTER )
  1905. {
  1906. strName += " [Supporter]";
  1907. }
  1908. strcpy( szName, (LPCTSTR)strName );
  1909.  
  1910. }
  1911. #else
  1912. #if __VER >= 8 // __S8_PK
  1913. if( IsChaotic() )
  1914. dwColor = prj.m_PKSetting.dwChaoColor;
  1915. else if( IsPKPink() )
  1916. dwColor = prj.m_PKSetting.dwReadyColor;
  1917. else
  1918. dwColor = 0xFFBDECFF;
  1919.  
  1920. CString strFameName = GetFameName();
  1921. if( strFameName.IsEmpty() == FALSE )
  1922. {
  1923. CString strName;
  1924. strName = "[";
  1925. strName += strFameName;
  1926. strName += "] ";
  1927. strName += m_szName;
  1928. strcpy( szName, (LPCTSTR)strName );
  1929. }
  1930. #else // __VER >= 8 // __S8_PK
  1931. KarmaProp* pKarmaProp = prj.GetKarmaProp(m_nSlaughter);
  1932. if( pKarmaProp )
  1933. {
  1934. dwColor = pKarmaProp->dwColor;
  1935. CString strFameName = GetFameName();
  1936. if( strFameName.IsEmpty() == FALSE )
  1937. {
  1938. CString strName;
  1939. strName = "[";
  1940. strName += strFameName;
  1941. strName += "] ";
  1942. strName += m_szName;
  1943. strcpy( szName, (LPCTSTR)strName );
  1944. }
  1945. }
  1946. #endif // __VER >= 8 // __S8_PK
  1947. #endif
  1948. }
  1949. #ifdef __AFK_STATE
  1950. if(IsAfk())
  1951. {
  1952. CString strName;
  1953. strName = "[AFK]";
  1954. strName += m_szName;
  1955. strcpy(szName,(LPCTSTR)strName );
  1956. }
  1957. #endif //__AFK_STATE
  1958.  
  1959. // 월드 좌표를 스크린 좌표로 프로젝션 한다.
  1960. D3DXVECTOR3 vOut, vPos, vPosHeight;
  1961.  
  1962. //소환수만 GetScrPos로 위치를 구한다.
  1963. MoverProp* pMoverProp = GetProp();
  1964. if( pMoverProp && ( pMoverProp->dwAI == AII_PET || pMoverProp->dwAI == AII_EGG ) )
  1965. vPos = GetScrPos();
  1966. else
  1967. vPos = GetPos();
  1968.  
  1969. D3DVIEWPORT9 vp;
  1970. const BOUND_BOX* pBB = m_pModel->GetBBVector();
  1971.  
  1972. pd3dDevice->GetViewport( &vp );
  1973.  
  1974. D3DXMATRIX matTrans;
  1975. D3DXMATRIX matWorld;
  1976. D3DXMatrixIdentity(&matWorld);
  1977. D3DXMatrixTranslation( &matTrans, vPos.x, vPos.y, vPos.z );
  1978. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matScale );
  1979. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matRotation );
  1980. D3DXMatrixMultiply( &matWorld, &matWorld, &matTrans );
  1981.  
  1982. vPosHeight = pBB->m_vPos[0];
  1983. vPosHeight.x = 0;
  1984. vPosHeight.z = 0;
  1985.  
  1986. D3DXVec3Project( &vOut, &vPosHeight, &vp, &GetWorld()->m_matProj,
  1987. &GetWorld()->m_pCamera->m_matView, &matWorld);
  1988. //vOutFLOAT fHeight = ( vOut[0].y - vOut[4].y ) - 10f;
  1989. CPoint point;
  1990. point.x = (LONG)( vOut.x );
  1991. point.y = (LONG)( vOut.y );
  1992.  
  1993. MakeEven( point.x );
  1994. point.x -= pFont->GetTextExtent( szName ).cx / 2;
  1995. point.y -= 20;
  1996. point.x -= 3;
  1997.  
  1998. // 특수 캐릭터 이름 출력
  1999. if( m_dwAuthorization >= AUTH_GAMEMASTER )
  2000. {
  2001. if( ( GetIndex() == MI_CROWNIBLIS || GetIndex() == MI_CROWNSHADE || GetIndex() == MI_CROWNBUBBLE ) )
  2002. {
  2003. strcpy( szName, GetProp()->szName );
  2004. point.x = (LONG)( vOut.x );
  2005. point.y = (LONG)( vOut.y );
  2006. MakeEven( point.x );
  2007. point.x -= pFont->GetTextExtent( szName ).cx / 2;
  2008. point.y -= 20;
  2009. dwColor = 0xffa0a0ff;
  2010. }
  2011. else
  2012. if( GetIndex() == MI_DWARPET || GetIndex() == MI_DWARPETMAS )
  2013. {
  2014. TCHAR szStr[ 64 ];
  2015. dwColor = 0xffa0a0ff;
  2016. sprintf( szStr, "[%s]", GetProp()->szName );
  2017. point.x = (LONG)( vOut.x );
  2018. point.y = (LONG)( vOut.y );
  2019. MakeEven( point.x );
  2020. point.x -= pFont->GetTextExtent( szStr ).cx / 2;
  2021. point.y -= 35;
  2022. pFont->DrawText( (FLOAT)( point.x ), (FLOAT)( point.y ), dwColor, szStr );
  2023. point.x = (LONG)( vOut.x );
  2024. point.y = (LONG)( vOut.y );
  2025. MakeEven( point.x );
  2026. point.x -= pFont->GetTextExtent( szName ).cx / 2;
  2027. point.y -= 20;
  2028. }
  2029. }
  2030.  
  2031. #ifdef __CLIENT
  2032. if( IsPlayer() )
  2033. {
  2034. #if __VER >= 8 // __S8_PK
  2035. if( dwColor == prj.m_PKSetting.dwGeneralColor ) // 핑크색이나 카오색이면 바뀌지 않게 하자
  2036. #endif // __VER >= 8 // __S8_PK
  2037. if( g_Party.FindMember( m_idPlayer ) != -1 ) // 파티멤버면 색깔 다르게 표시.
  2038. dwColor = COLOR_PARTY;
  2039.  
  2040. if( bOtherColor )
  2041. dwColor = dwNewColor;
  2042.  
  2043. pFont->DrawText( (FLOAT)( point.x ), (FLOAT)( point.y ), dwColor, szName );
  2044.  
  2045. if( IsMode( EVENT_OLDBOY_MODE ) )
  2046. {
  2047. int nWidth = pFont->GetTextExtent( szName ).cx;
  2048. pFont->DrawText( (FLOAT)( point.x+nWidth ), (FLOAT)( point.y ), D3DCOLOR_XRGB( 0, 200, 0 ), " ★" );
  2049. }
  2050. }
  2051. else
  2052. #endif
  2053. {
  2054. if( g_Option.m_nMonName )
  2055. {
  2056. LPCHARACTER lpCharacter = GetCharacter();
  2057. if( lpCharacter && lpCharacter->m_nStructure != -1 )
  2058. {
  2059. LPSTRUCTURE lpStr = &prj.m_aStructure[ lpCharacter->m_nStructure ];
  2060. TCHAR szStr[ 64 ];
  2061. sprintf( szStr, "[%s]", lpStr->szName );
  2062. point.x = (LONG)( vOut.x );
  2063. point.y = (LONG)( vOut.y );
  2064. MakeEven( point.x );
  2065. point.x -= pFont->GetTextExtent( szStr ).cx / 2;
  2066. point.y -= 35;
  2067. pFont->DrawText( (FLOAT)( point.x ), (FLOAT)( point.y ), COLOR_NPC, szStr );
  2068. point.x = (LONG)( vOut.x );
  2069. point.y = (LONG)( vOut.y );
  2070. MakeEven( point.x );
  2071. point.x -= pFont->GetTextExtent( szName ).cx / 2;
  2072. point.y -= 20;
  2073. }
  2074. //sprintf( szNameTemp, "NPC %s", m_szName );
  2075. //pFont->DrawText( vOut.x + 1, vOut.y + 1, 0xff000000, szName );
  2076. if( IsPeaceful() )
  2077. {
  2078. pFont->DrawText( (FLOAT)( point.x ), (FLOAT)( point.y ), COLOR_NPC, szName );
  2079. }
  2080. else
  2081. {
  2082. if( m_bActiveAttack ) // 선공 몬스터는 깜빡거린다.
  2083. {
  2084. pFont->DrawText( (FLOAT)( point.x ), (FLOAT)( point.y ), 0xffff0000, szName );
  2085. } else
  2086. {
  2087. pFont->DrawText( (FLOAT)( point.x ), (FLOAT)( point.y ), COLOR_MONSTER, szName );
  2088. }
  2089. }
  2090. }
  2091. }
  2092. // 플레이어가 겜마면 디버깅 정보를 보여준다.
  2093. if( GetWorld()->m_bViewIdState )
  2094. {
  2095. char szBuff[256];
  2096. CString strName;
  2097. CMover *pAttacker = prj.GetMover( m_idAttacker );
  2098. if( pAttacker )
  2099. strName = pAttacker->m_szName;
  2100. sprintf( szBuff, "0x%x %08x, %d %d, %d(%s)", m_pActMover->GetStateFlag(), m_pActMover->GetState(), GetId(), m_pActMover->m_bGround, (int)m_idAttacker, strName );
  2101. pFont->DrawText( vOut.x, vOut.y - 50, dwColor, szBuff );
  2102.  
  2103. }
  2104. /*#ifdef __XUZHU
  2105. if( GetAdjParam( DST_CHRSTATE ) & CHS_STUN )
  2106. pFont->DrawText( point.x, point.y - 20, dwColor, "스턴" );
  2107. if( GetAdjParam( DST_CHRSTATE ) & CHS_POISON )
  2108. pFont->DrawText( point.x + 40, point.y - 20, dwColor, "독" );
  2109. if( GetAdjParam( DST_CHRSTATE ) & CHS_DARK )
  2110. pFont->DrawText( point.x + 80, point.y - 20, dwColor, "암흑" );
  2111. if( GetAdjParam( DST_CHRSTATE ) & CHS_BLEEDING )
  2112. pFont->DrawText( point.x + 100, point.y - 20, dwColor, "출혈" );
  2113. #endif // */
  2114.  
  2115. // Render Guild Name & Logo
  2116. CGuild* pGuild = GetGuild();
  2117.  
  2118. BOOL bSkip = FALSE;
  2119. // 운영자이고 변신중이면 길드명과 로고를 안그린다.
  2120. if( IsAuthHigher( AUTH_GAMEMASTER ) == TRUE )
  2121. {
  2122. if( HasBuffByIk3(IK3_TEXT_DISGUISE) )
  2123. bSkip = TRUE;
  2124. }
  2125.  
  2126. #if __VER >= 10 // __CSC_VER9_1
  2127. //전승 및 영웅 아이콘 표시 추가.
  2128. point.x = (LONG)( vOut.x );
  2129. point.y = (LONG)( vOut.y );
  2130. MakeEven( point.x );
  2131. //pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ZERO );
  2132. pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
  2133. pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
  2134. pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
  2135. pd3dDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
  2136.  
  2137. if(!bSkip && IsPlayer())
  2138. {
  2139. BYTE checkhero = GetLegendChar();
  2140. CTexture* pTexture;
  2141. CString strPath;
  2142. CSize cs1 = pFont->GetTextExtent( szName );
  2143. CSize cs2;
  2144.  
  2145. if(pGuild != NULL)
  2146. {
  2147. cs2 = pFont->GetTextExtent( pGuild->m_szGuild );
  2148.  
  2149. if( cs1.cx > cs2.cx )
  2150. point.x += cs1.cx / 2;
  2151. else
  2152. point.x += cs2.cx / 2;
  2153. }
  2154. else
  2155. point.x += cs1.cx / 2;
  2156.  
  2157.  
  2158. #ifdef __PLATIN
  2159. if ( m_nPlatinLv > 0 )
  2160. {
  2161. strPath.Format("Icon_PlatinLv%i.png", m_nPlatinLv);
  2162. if( !strPath.IsEmpty() )
  2163. {
  2164. strPath = MakePath( DIR_ICON, strPath);
  2165. pTexture = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, strPath, 0xffff00ff );
  2166. if(pTexture != NULL)
  2167. {
  2168. point.y -= pTexture->m_size.cy + 1;
  2169. pTexture->Render( &g_Neuz.m_2DRender, point );
  2170. }
  2171. }
  2172. }
  2173. else
  2174. #endif //__PLATIN
  2175.  
  2176. if(checkhero == LEGEND_CLASS_MASTER && m_nLevel >= 60 && m_nLevel <= 120) //전승을 했을 경우.
  2177. {
  2178. if(/*m_nLevel >= 60 && */m_nLevel < 70) //Level Down될 경우를 생각해서 주석처리.
  2179. // strPath = MakePath( DIR_ICON, "icon_Expert1.dds");
  2180. pTexture = g_Neuz.m_pMasterIcon[0];
  2181. else if(m_nLevel >= 70 && m_nLevel < 80)
  2182. // strPath = MakePath( DIR_ICON, "icon_Expert2.dds");
  2183. pTexture = g_Neuz.m_pMasterIcon[1];
  2184. else if(m_nLevel >= 80 && m_nLevel < 90)
  2185. // strPath = MakePath( DIR_ICON, "icon_Expert3.dds");
  2186. pTexture = g_Neuz.m_pMasterIcon[2];
  2187. else if(m_nLevel >= 90 && m_nLevel < 100)
  2188. // strPath = MakePath( DIR_ICON, "icon_Expert4.dds");
  2189. pTexture = g_Neuz.m_pMasterIcon[3];
  2190. else if(m_nLevel >= 100 && m_nLevel < 110)
  2191. // strPath = MakePath( DIR_ICON, "icon_Expert5.dds");
  2192. pTexture = g_Neuz.m_pMasterIcon[4];
  2193. else if(m_nLevel >= 110 && m_nLevel <= 120)
  2194. // strPath = MakePath( DIR_ICON, "icon_Expert6.dds");
  2195. pTexture = g_Neuz.m_pMasterIcon[5];
  2196.  
  2197. //pTexture = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, strPath, 0xffff00ff );
  2198. if(pTexture != NULL)
  2199. {
  2200. point.y -= pTexture->m_size.cy + 5;
  2201. pTexture->Render( &g_Neuz.m_2DRender, point );
  2202. }
  2203. }
  2204. else if(checkhero == LEGEND_CLASS_HERO) //영웅일 경우.
  2205. {
  2206. pTexture = g_Neuz.m_pHeroIcon;
  2207. if(pTexture != NULL)
  2208. {
  2209. point.y -= pTexture->m_size.cy + 5;
  2210. pTexture->Render( &g_Neuz.m_2DRender, point );
  2211. }
  2212. }
  2213. #ifdef __3RD_LEGEND16
  2214. else if(checkhero == LEGEND_CLASS_LEGENDHERO) //영웅일 경우.
  2215. {
  2216. //strPath = MakePath( DIR_ITEM, "Itm_FlameOrb.dds");
  2217. //pTexture = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, strPath, 0xffff00ff );
  2218. pTexture = g_Neuz.m_pHeroIcon;
  2219. if(pTexture != NULL)
  2220. {
  2221. point.y -= pTexture->m_size.cy + 5;
  2222. pTexture->Render( &g_Neuz.m_2DRender, point );
  2223. }
  2224. }
  2225. #endif // __3RD_LEGEND16
  2226. }
  2227. //pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
  2228. #endif //__CSC_VER9_1
  2229.  
  2230. #ifdef __COUNTRY_ICON
  2231.  
  2232. if( IsPlayer() && GetCountry() > 0 && bSkip == FALSE )
  2233. {
  2234. MakeEven( point.x );
  2235. CTexture* pCountryIcon;
  2236. CString strPath;
  2237. switch( GetCountry() )
  2238. {
  2239. case 1:
  2240. strPath = MakePath( DIR_THEME, "Albania.tga"); break;
  2241. case 2:
  2242. strPath = MakePath( DIR_THEME, "Argentina.tga"); break;
  2243. case 3:
  2244. strPath = MakePath( DIR_THEME, "Australia.tga"); break;
  2245. case 4:
  2246. strPath = MakePath( DIR_THEME, "Austria.tga"); break;
  2247. case 5:
  2248. strPath = MakePath( DIR_THEME, "Belgium.tga"); break;
  2249. case 6:
  2250. strPath = MakePath( DIR_THEME, "Brazil.tga"); break;
  2251. case 7:
  2252. strPath = MakePath( DIR_THEME, "China.tga"); break;
  2253. case 8:
  2254. strPath = MakePath( DIR_THEME, "Czech Republic.tga"); break;
  2255. case 9:
  2256. strPath = MakePath( DIR_THEME, "Denmark.tga"); break;
  2257. case 10:
  2258. strPath = MakePath( DIR_THEME, "England.tga"); break;
  2259. case 11:
  2260. strPath = MakePath( DIR_THEME, "France.tga"); break;
  2261. case 12:
  2262. strPath = MakePath( DIR_THEME, "Germany.tga"); break;
  2263. case 13:
  2264. strPath = MakePath( DIR_THEME, "Great Britain.tga"); break;
  2265. case 14:
  2266. strPath = MakePath( DIR_THEME, "Greece.tga"); break;
  2267. case 15:
  2268. strPath = MakePath( DIR_THEME, "Israel.tga"); break;
  2269. case 16:
  2270. strPath = MakePath( DIR_THEME, "Italy.tga"); break;
  2271. case 17:
  2272. strPath = MakePath( DIR_THEME, "Japan.tga"); break;
  2273. case 18:
  2274. strPath = MakePath( DIR_THEME, "Korea.tga"); break;
  2275. case 19:
  2276. strPath = MakePath( DIR_THEME, "Kosova.tga"); break;
  2277. case 20:
  2278. strPath = MakePath( DIR_THEME, "Netherlands.tga"); break;
  2279. case 21:
  2280. strPath = MakePath( DIR_THEME, "Poland.tga"); break;
  2281. case 22:
  2282. strPath = MakePath( DIR_THEME, "Portugal.tga"); break;
  2283. case 23:
  2284. strPath = MakePath( DIR_THEME, "Russia.tga"); break;
  2285. case 24:
  2286. strPath = MakePath( DIR_THEME, "Spain.tga"); break;
  2287. case 25:
  2288. strPath = MakePath( DIR_THEME, "Sweden.tga"); break;
  2289. case 26:
  2290. strPath = MakePath( DIR_THEME, "Switzerland.tga"); break;
  2291. case 27:
  2292. strPath = MakePath( DIR_THEME, "Turkey.tga"); break;
  2293. case 28:
  2294. strPath = MakePath( DIR_THEME, "Ukraina.tga"); break;
  2295. case 29:
  2296. strPath = MakePath( DIR_THEME, "Uruguay.tga"); break;
  2297. case 30:
  2298. strPath = MakePath( DIR_THEME, "USA.tga"); break;
  2299. case 31:
  2300. strPath = MakePath( DIR_THEME, "Philippine.tga"); break;
  2301. //default:;
  2302. //strPath = MakePath( DIR_THEME, 0); break;
  2303. }
  2304. pCountryIcon = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, strPath, 0xffff00ff );
  2305. if(pCountryIcon != NULL)
  2306. {
  2307. point.y -= pCountryIcon->m_size.cy +3;
  2308. if( IsHero() || IsMaster() || IsLegendHero()
  2309. #ifdef __REBIRTH
  2310. || m_nRebirthCount > 0
  2311. #endif//__REBIRTH
  2312. )
  2313. {
  2314. point.x += 25;
  2315. point.y += pCountryIcon->m_size.cy +11;
  2316. }
  2317. pCountryIcon->Render( &g_Neuz.m_2DRender, point );
  2318. }
  2319. }
  2320. #endif //__COUNTRY_ICON
  2321.  
  2322. if( pGuild && bSkip == FALSE )
  2323. {
  2324. point.x = (LONG)( vOut.x );
  2325. point.y = (LONG)( vOut.y );
  2326. MakeEven( point.x );
  2327. point.x -= pFont->GetTextExtent( pGuild->m_szGuild ).cx / 2;
  2328. point.y -= 32;
  2329. point.x -= 3;
  2330.  
  2331. #if __VER < 8 // __S8_PK
  2332. KarmaProp* pKarmaProp = prj.GetKarmaProp(m_nSlaughter);
  2333. if( pKarmaProp )
  2334. dwColor = pKarmaProp->dwColor;
  2335. #endif // __VER < 8 // __S8_PK
  2336.  
  2337. CWndWorld* pWndWorld = (CWndWorld*)g_WndMng.GetWndBase( APP_WORLD );
  2338. // 길드마스터면 길드명을 노란색으로 출력
  2339. dwColor = 0xFFFFFFFF;
  2340. if( pGuild->IsMaster(m_idPlayer))
  2341. dwColor = 0xFFFFFF99;
  2342. else
  2343. if( bOtherColor )
  2344. dwColor = dwNewColor;
  2345.  
  2346. // 길드컴뱃이 열린상태이면서 디펜더는 분홍색으로 출력
  2347. if( g_GuildCombatMng.m_nGCState >= CGuildCombat::MAINTENANCE_STATE )
  2348. {
  2349. if( pWndWorld && pWndWorld->GetGCStatusDefender(m_idPlayer) != -1 )
  2350. {
  2351. dwColor = 0xFFFEA8FF;
  2352. }
  2353. }
  2354.  
  2355. // 베스트 플레이어 표시 - 우승길드이고 베스트 플레이어면 베스트 플레이어만 표시
  2356. // 우승 길드는 길드로고 앞에 표시해줌
  2357. BOOL bRenderCombatBestLogo = FALSE;
  2358. BOOL bRenderCombatWinLogo = FALSE;
  2359.  
  2360. // 길드대전이 열리지 않았을때만 출력해줌
  2361. if( g_GuildCombatMng.m_nState == CGuildCombat::CLOSE_STATE )
  2362. {
  2363. if( g_GuildCombatMng.m_uBestPlayer == m_idPlayer )
  2364. bRenderCombatBestLogo = TRUE;
  2365. else
  2366. if( g_GuildCombatMng.m_uWinGuildId == pGuild->GetGuildId() )
  2367. bRenderCombatWinLogo = TRUE;
  2368. }
  2369.  
  2370. pFont->DrawText( (FLOAT)( point.x ), (FLOAT)( point.y ), dwColor, pGuild->m_szGuild );
  2371.  
  2372. if( pGuild->m_dwLogo != 0 )
  2373. {
  2374. pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ZERO );
  2375.  
  2376. int nLogoSizey = pWndWorld->m_pTextureLogo[pGuild->m_dwLogo-1].m_size.cy+5;
  2377.  
  2378. point.x = (LONG)( vOut.x );
  2379. point.y = (LONG)( vOut.y );
  2380.  
  2381. MakeEven( point.x );
  2382.  
  2383. CSize cs1 = pFont->GetTextExtent( szName );
  2384. CSize cs2 = pFont->GetTextExtent( pGuild->m_szGuild );
  2385.  
  2386. if( cs1.cx > cs2.cx )
  2387. {
  2388. point.x -= cs1.cx / 2;
  2389. point.y -= nLogoSizey;
  2390. }
  2391. else
  2392. {
  2393. point.x -= cs2.cx / 2;
  2394. point.y -= nLogoSizey;
  2395. }
  2396.  
  2397. point.x -= pWndWorld->m_pTextureLogo[pGuild->m_dwLogo-1].m_size.cx+2;
  2398. pWndWorld->m_pTextureLogo[pGuild->m_dwLogo-1].Render( &g_Neuz.m_2DRender, point, 255 );
  2399.  
  2400. D3DDEVICE->SetRenderState( D3DRS_DESTBLEND ,D3DBLEND_INVSRCALPHA );
  2401.  
  2402. if( bRenderCombatBestLogo )
  2403. {
  2404. point.x -= pWndWorld->m_pTextureLogo[pGuild->m_dwLogo-1].m_size.cx+2;
  2405. pWndWorld->m_TexGuildBest.Render( &g_Neuz.m_2DRender, point, 255 );
  2406. }
  2407. else
  2408. if( bRenderCombatWinLogo )
  2409. {
  2410. point.x -= pWndWorld->m_pTextureLogo[pGuild->m_dwLogo-1].m_size.cx+2;
  2411. pWndWorld->m_TexGuildWinner.Render( &g_Neuz.m_2DRender, point, 255 );
  2412. }
  2413. }
  2414. else
  2415. {
  2416. // 길드로고가 설정안된 상태이지만 우승한 길드일경우
  2417. if( bRenderCombatBestLogo || bRenderCombatWinLogo )
  2418. {
  2419. D3DDEVICE->SetRenderState( D3DRS_DESTBLEND ,D3DBLEND_INVSRCALPHA );
  2420. int nLogoSizey = 30;
  2421.  
  2422. point.x = (LONG)( vOut.x );
  2423. point.y = (LONG)( vOut.y );
  2424.  
  2425. MakeEven( point.x );
  2426.  
  2427. if( strlen(szName) > strlen(pGuild->m_szGuild) )
  2428. {
  2429. point.x -= pFont->GetTextExtent( szName ).cx / 2;
  2430. point.y -= nLogoSizey;
  2431. }
  2432. else
  2433. {
  2434. point.x -= pFont->GetTextExtent( pGuild->m_szGuild ).cx / 2;
  2435. point.y -= nLogoSizey;
  2436. }
  2437.  
  2438. point.x -= nLogoSizey;
  2439.  
  2440. if( bRenderCombatBestLogo )
  2441. pWndWorld->m_TexGuildBest.Render( &g_Neuz.m_2DRender, point, 255 );
  2442. else
  2443. if( bRenderCombatWinLogo )
  2444. pWndWorld->m_TexGuildWinner.Render( &g_Neuz.m_2DRender, point, 255 );
  2445. }
  2446. }
  2447.  
  2448.  
  2449. if( IsPlayer() && !IsActiveMover() && g_Neuz.m_NeuzEnemy.IsPKing( GetId() ) )
  2450. {
  2451. if( (m_dwFlag & MVRF_WARMARK) == 0 ) // 전쟁마크가 아직 안떠있는 상태면
  2452. {
  2453. RenderFlag( ENEMY_PK ); // 생성 전투 SFX
  2454. }
  2455. }
  2456. else
  2457. #ifdef __CLIENT
  2458. // 길드전시에 머리위에 뜨는 전투마크
  2459. if( g_eLocal.GetState( EVE_GUILDWAR ) == 1 ) // 길드전 가능한 서버인가.
  2460. {
  2461. if( m_idWar && g_pPlayer->m_idWar == m_idWar ) // 나랑 같은 전쟁에 참가중인 놈인가.
  2462. {
  2463. if( m_idGuild != g_pPlayer->m_idGuild ) // 나랑 다른길드인가(동맹인경우는 이걸로 안된다.)
  2464. {
  2465. if( (m_dwFlag & MVRF_WARMARK) == 0 ) // 전쟁마크가 아직 안떠있는 상태면
  2466. {
  2467. RenderFlag( ENEMY_WAR );
  2468. }
  2469. }
  2470. }
  2471. }
  2472. #endif // CLIENT
  2473. }
  2474. /*
  2475. #ifdef __REBIRTH
  2476. if( !bSkip && IsPlayer() )
  2477. {
  2478. CString strNameFract;
  2479. strNameFract.Format ( "[PrLv.%i] ", g_pPlayer->m_nRebirthCount);
  2480. if( !pGuild )
  2481. {
  2482. point.x = (LONG)( vOut.x );
  2483. point.y = (LONG)( vOut.y );
  2484. MakeEven( point.x );
  2485. point.x -= pFont->GetTextExtent( strNameFract ).cx / 2;
  2486. point.y -= 32;
  2487. point.x -= 5;
  2488. }
  2489. else
  2490. {
  2491. point.x = (LONG)( vOut.x );
  2492. point.y = (LONG)( vOut.y ); MakeEven( point.x );
  2493. point.x -= pFont->GetTextExtent( strNameFract ).cx / 2;
  2494. point.y -= 44; point.x -= 3;
  2495. }
  2496. pFont->DrawText( (FLOAT)point.x, (FLOAT)point.y, D3DCOLOR_ARGB( 255, 255, 176, 176 ), strNameFract );
  2497. //Error("Fract Debug: Num %i, Text %s, Color %lu", m_nFraction, strNameFract, dwColor);
  2498. }
  2499. #endif//__REBIRTH
  2500. */
  2501. }
  2502.  
  2503. // 전투교전중인 상태 표시
  2504. void CMover::RenderFlag( int nType )
  2505. {
  2506. // 결투상대라는 sfx를 머리위에 띄워줌.
  2507. CSfx *pSfx = CreateSfx( D3DDEVICE, XI_GEN_PVP_FLAG01, GetPos(), GetId(), D3DXVECTOR3(0,0,0), NULL_ID, -1 );
  2508. if( pSfx )
  2509. {
  2510. pSfx->SetScale( D3DXVECTOR3(1.5f, 1.5f, 1.5f) );
  2511. ((CSfxDuelParty*)pSfx)->m_nType = nType;
  2512. m_dwFlag |= MVRF_WARMARK;
  2513. }
  2514. }
  2515.  
  2516. void CMover::RenderHP(LPDIRECT3DDEVICE9 pd3dDevice)
  2517. {
  2518. if( !IsVisible() )
  2519. return;
  2520.  
  2521. if( IsMode( TRANSPARENT_MODE ) )
  2522. return;
  2523.  
  2524. if( g_Option.m_nPlayerName == FALSE && IsActiveMover() )
  2525. return;
  2526.  
  2527. if( g_Option.m_nOtherPlayerName == FALSE && !IsActiveMover() && IsPlayer() )
  2528. return;
  2529.  
  2530. if( g_WorldMng()->m_bViewHP == FALSE )
  2531. return;
  2532.  
  2533. // 운영자이고 변신중이면 HP바 안그린다.
  2534. if( IsAuthHigher( AUTH_GAMEMASTER ) == TRUE )
  2535. {
  2536. if( IsPlayer() && HasBuffByIk3(IK3_TEXT_DISGUISE) )
  2537. return;
  2538. }
  2539.  
  2540. #ifdef __QUIZ
  2541. if( !IsActiveObj() && ( m_dwMode & QUIZ_RENDER_SKIP_MODE ) )
  2542. return;
  2543. #endif // __QUIZ
  2544.  
  2545. pd3dDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
  2546. // 월드 좌표를 스크린 좌표로 프로젝션 한다.
  2547. D3DXVECTOR3 vOut, vPos, vPosHeight;
  2548. D3DVIEWPORT9 vp;
  2549.  
  2550. //소환수만 GetScrPos로 위치를 구한다.
  2551. MoverProp* pMoverProp = GetProp();
  2552. if( pMoverProp && ( pMoverProp->dwAI == AII_PET || pMoverProp->dwAI == AII_EGG ) )
  2553. vPos = GetScrPos();
  2554. else
  2555. vPos = GetPos();
  2556.  
  2557. const BOUND_BOX* pBB = m_pModel->GetBBVector();
  2558.  
  2559. pd3dDevice->GetViewport( &vp );
  2560. vp.X = 0;
  2561. vp.Y = 0;
  2562.  
  2563. D3DXMATRIX matTrans;
  2564. D3DXMATRIX matWorld;
  2565. D3DXMatrixIdentity(&matWorld);
  2566. pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
  2567. D3DXMatrixTranslation( &matTrans, vPos.x, vPos.y, vPos.z);
  2568. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matScale );
  2569. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matRotation );
  2570. D3DXMatrixMultiply( &matWorld, &matWorld, &matTrans );
  2571.  
  2572. vPosHeight = pBB->m_vPos[0];
  2573. vPosHeight.x = 0;
  2574. vPosHeight.z = 0;
  2575.  
  2576. D3DXVec3Project( &vOut, &vPosHeight, &vp, &GetWorld()->m_matProj,
  2577. &GetWorld()->m_pCamera->m_matView, &matWorld);
  2578. #ifdef __REBIRTH
  2579. if( GetGuild() )
  2580. vOut.y -= 46;
  2581. else
  2582. #endif//__REBIRTH
  2583. vOut.y -= 34;
  2584. int nGaugeWidth = 80;
  2585. CPoint point( (int)( vOut.x - nGaugeWidth / 2 ), (int)( vOut.y - 3 ) );
  2586. CRect rect( point.x - 2, point.y - 2, point.x + nGaugeWidth + 2, point.y + 5 + 2);
  2587.  
  2588. CPoint p = CPoint( rect.left, rect.top );
  2589. MakeEven( p.x );
  2590.  
  2591. BOOL bDbuff = FALSE;
  2592.  
  2593. if( IsStateDbuff() )
  2594. bDbuff = TRUE;
  2595.  
  2596. #if __VER < 9 // __S_9_ADD
  2597. int nHitPercent = GetHitPointPercent( 100 );
  2598. if( nHitPercent < CRITICAL_BERSERK_HP )
  2599. {
  2600. if( g_nRenderCnt & 1 )
  2601. {
  2602. g_Neuz.m_TextureHPGauge[0].RenderScal2(&(g_Neuz.m_2DRender), p, 200, 0.7f, 0.45f, 0xffffffff );
  2603. }
  2604. else
  2605. {
  2606. g_Neuz.m_TextureHPGauge[0].RenderScal(&(g_Neuz.m_2DRender), p, 200, 0.8f, 0.55f);
  2607. }
  2608. }
  2609. else
  2610. #endif // __S_9_ADD
  2611. {
  2612. g_Neuz.m_TextureHPGauge[0].RenderScal(&(g_Neuz.m_2DRender), p, 200, 0.8f, 0.55f);
  2613. }
  2614.  
  2615. int nWidth = g_Neuz.m_TextureHPGauge[1].m_size.cx * GetHitPoint() / GetMaxHitPoint();
  2616.  
  2617. CPoint p2 = CPoint( nWidth, g_Neuz.m_TextureHPGauge[1].m_size.cy );
  2618.  
  2619. if( bDbuff )
  2620. g_Neuz.m_TextureHPGauge[2].Render(&(g_Neuz.m_2DRender), p, p2, 200, 0.8f, 0.55f);
  2621. else
  2622. g_Neuz.m_TextureHPGauge[1].Render(&(g_Neuz.m_2DRender), p, p2, 200, 0.8f, 0.55f);
  2623.  
  2624. #if __VER >= 8 //__CSC_VER8_5
  2625. if(m_pAngelFlag)
  2626. RenderAngelStatus( pd3dDevice );
  2627. #endif //__CSC_VER8_5
  2628. }
  2629.  
  2630.  
  2631. #if __VER >= 11 // __SYS_COLLECTING
  2632. void CMover::RenderCltGauge(LPDIRECT3DDEVICE9 pd3dDevice)
  2633. {
  2634.  
  2635. if( !IsVisible()) return;
  2636.  
  2637. if(!IsCollecting()) return;
  2638.  
  2639. if( g_Option.m_nOtherPlayerName == FALSE && !IsActiveMover() && IsPlayer() )
  2640. return;
  2641.  
  2642. // 월드 좌표를 스크린 좌표로 프로젝션 한다.
  2643. D3DXVECTOR3 vOut, vPos, vPosHeight;
  2644. D3DVIEWPORT9 vp;
  2645.  
  2646. MoverProp* pMoverProp = GetProp();
  2647. vPos = GetPos();
  2648.  
  2649. const BOUND_BOX* pBB = m_pModel->GetBBVector();
  2650.  
  2651. pd3dDevice->GetViewport( &vp );
  2652. vp.X = 0;
  2653. vp.Y = 0;
  2654.  
  2655. D3DXMATRIX matTrans;
  2656. D3DXMATRIX matWorld;
  2657. D3DXMatrixIdentity(&matWorld);
  2658. pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
  2659. D3DXMatrixTranslation( &matTrans, vPos.x, vPos.y, vPos.z);
  2660. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matScale );
  2661. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matRotation );
  2662. D3DXMatrixMultiply( &matWorld, &matWorld, &matTrans );
  2663.  
  2664. vPosHeight = pBB->m_vPos[0];
  2665. vPosHeight.x = 0;
  2666. vPosHeight.z = 0;
  2667.  
  2668. D3DXVec3Project( &vOut, &vPosHeight, &vp, &GetWorld()->m_matProj,
  2669. &GetWorld()->m_pCamera->m_matView, &matWorld);
  2670.  
  2671. vOut.y -= 48;
  2672. int nGaugeWidth = 80;
  2673. CPoint point( (int)( vOut.x - nGaugeWidth / 2 ), (int)( vOut.y - 3 ) );
  2674. CRect rect( point.x - 2, point.y - 2, point.x + nGaugeWidth + 2, point.y + 5 + 2);
  2675.  
  2676. CPoint p = CPoint( rect.left, rect.top );
  2677. MakeEven( p.x );
  2678.  
  2679. g_Neuz.m_TexCltGauge[0].RenderScal(&(g_Neuz.m_2DRender), p, 255, 0.8f, 0.55f);
  2680.  
  2681. int nWidth = g_Neuz.m_TexCltGauge[1].m_size.cx * m_nCltTime / m_nMaxCltTime;
  2682.  
  2683. CPoint p2 = CPoint( nWidth, g_Neuz.m_TexCltGauge[1].m_size.cy );
  2684.  
  2685. g_Neuz.m_TexCltGauge[1].Render(&(g_Neuz.m_2DRender), p, p2, 255, 0.8f, 0.55f);
  2686.  
  2687. }
  2688. #endif
  2689.  
  2690. #if __VER >= 8 //__CSC_VER8_5
  2691. void CMover::RenderAngelStatus(LPDIRECT3DDEVICE9 pd3dDevice)
  2692. {
  2693. if(m_pAngel == NULL)
  2694. return;
  2695.  
  2696. pd3dDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
  2697. // 월드 좌표를 스크린 좌표로 프로젝션 한다.
  2698. D3DXVECTOR3 vOut, vPos, vPosHeight;
  2699. vPos = m_AngelPos;
  2700. D3DVIEWPORT9 vp;
  2701.  
  2702. pd3dDevice->GetViewport( &vp );
  2703. vp.X = 0;
  2704. vp.Y = 0;
  2705.  
  2706. D3DXMATRIX matTrans;
  2707. D3DXMATRIX matWorld;
  2708. D3DXMatrixIdentity(&matWorld);
  2709. pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
  2710. D3DXMatrixTranslation( &matTrans, vPos.x, vPos.y, vPos.z);
  2711. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matScale );
  2712. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matRotation );
  2713. D3DXMatrixMultiply( &matWorld, &matWorld, &matTrans );
  2714.  
  2715. matWorld._41 = m_AngelPos.x;
  2716. matWorld._42 = m_AngelPos.y;
  2717. matWorld._43 = m_AngelPos.z;
  2718.  
  2719. vPosHeight.y = 1.4f;
  2720. vPosHeight.x = 0;
  2721. vPosHeight.z = 0;
  2722.  
  2723. D3DXVec3Project( &vOut, &vPosHeight, &vp, &GetWorld()->m_matProj,
  2724. &GetWorld()->m_pCamera->m_matView, &matWorld);
  2725.  
  2726. int nGaugeWidth = 40;
  2727. CPoint point( (int)( vOut.x - nGaugeWidth / 2 ), (int)( vOut.y - 3 ) );
  2728. CRect rect( point.x - 2, point.y - 2, point.x + nGaugeWidth + 2, point.y + 5 + 2);
  2729.  
  2730. CPoint p = CPoint( rect.left, rect.top );
  2731. MakeEven( p.x );
  2732.  
  2733. g_Neuz.m_TextureAngelGauge[0].RenderScal(&(g_Neuz.m_2DRender), p, 200, 0.4f, 0.55f);
  2734.  
  2735. int nAngel = 100;
  2736. #ifdef __BUFF_1107
  2737. IBuff* pBuff = m_buffs.GetBuffByIk3( IK3_ANGEL_BUFF );
  2738. if( pBuff )
  2739. {
  2740. ItemProp* pItemProp = pBuff->GetProp();
  2741. if( pItemProp )
  2742. nAngel = (int)( (float)pItemProp->nAdjParamVal1 );
  2743. }
  2744. #else // __BUFF_1107
  2745. LPSKILLINFLUENCE lpSkillIn = m_SkillState.GetItemBuf( IK3_ANGEL_BUFF );
  2746. if( lpSkillIn )
  2747. {
  2748. ItemProp* pItemProp = prj.GetItemProp( lpSkillIn->wID );
  2749. if( pItemProp )
  2750. nAngel = (float)pItemProp->nAdjParamVal1;
  2751. }
  2752. #endif // __BUFF_1107
  2753. if( nAngel <= 0 || 100 < nAngel )
  2754. nAngel = 100;
  2755.  
  2756. EXPINTEGER maxExp = prj.m_aExpCharacter[m_nAngelLevel].nExp1 / 100 * nAngel;
  2757. if( maxExp > 0)
  2758. {
  2759. int nWidth = (int)( g_Neuz.m_TextureAngelGauge[1].m_size.cx * m_nAngelExp / maxExp );
  2760. CPoint p2 = CPoint( nWidth, g_Neuz.m_TextureAngelGauge[1].m_size.cy );
  2761. g_Neuz.m_TextureAngelGauge[1].Render(&(g_Neuz.m_2DRender), p, p2, 200, 0.4f, 0.55f);
  2762. }
  2763. }
  2764. #endif //__CSC_VER8_5
  2765.  
  2766. void CMover::RenderCasting(LPDIRECT3DDEVICE9 pd3dDevice)
  2767. {
  2768. if( g_pPlayer->IsStateMode( STATE_BASEMOTION_MODE ) == FALSE )
  2769. return;
  2770. if( g_pPlayer->m_nReadyTime == 0 )
  2771. return;
  2772. if( !IsVisible() )
  2773. return;
  2774.  
  2775. pd3dDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
  2776. // 월드 좌표를 스크린 좌표로 프로젝션 한다.
  2777. D3DXVECTOR3 vOut, vPos = GetPos(), vPosHeight;
  2778. D3DVIEWPORT9 vp;
  2779. const BOUND_BOX* pBB = m_pModel->GetBBVector();
  2780.  
  2781. pd3dDevice->GetViewport( &vp );
  2782. vp.X = 0;
  2783. vp.Y = 0;
  2784.  
  2785. D3DXMATRIX matTrans;
  2786. D3DXMATRIX matWorld;
  2787. D3DXMatrixIdentity(&matWorld);
  2788. pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
  2789. D3DXMatrixTranslation( &matTrans, vPos.x, vPos.y, vPos.z);
  2790. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matScale );
  2791. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matRotation );
  2792. D3DXMatrixMultiply( &matWorld, &matWorld, &matTrans );
  2793.  
  2794. vPosHeight = pBB->m_vPos[0];
  2795. vPosHeight.x = 0;
  2796. vPosHeight.z = 0;
  2797.  
  2798. D3DXVec3Project( &vOut, &vPosHeight, &vp, &GetWorld()->m_matProj,
  2799. &GetWorld()->m_pCamera->m_matView, &matWorld);
  2800.  
  2801. vOut.y -= 48;
  2802. int nGaugeWidth = 80;
  2803.  
  2804. CPoint point( (int)( vOut.x - nGaugeWidth / 2 ), (int)( vOut.y - 3 ) );
  2805. CRect rect( point.x - 2, point.y - 2, point.x + nGaugeWidth + 2, point.y + 5 + 2);
  2806.  
  2807. CPoint p = CPoint( rect.left, rect.top );
  2808.  
  2809. MakeEven( p.x );
  2810.  
  2811. g_Neuz.m_TextureCastingGauge[0].RenderScal(&(g_Neuz.m_2DRender), p, 200, 0.8f, 0.55f);
  2812.  
  2813. ItemProp* pItemProp = prj.GetItemProp( g_pPlayer->m_dwUseItemId );
  2814. if( pItemProp )
  2815. {
  2816. DWORD dwTime = timeGetTime() - g_pPlayer->m_nReadyTime;
  2817. int nWidth = (int)( g_Neuz.m_TextureHPGauge[1].m_size.cx * ( (float)dwTime / (float)pItemProp->dwSkillReadyType ) );
  2818. if( 112 < nWidth )
  2819. nWidth = 112;
  2820. if( nWidth < 0 )
  2821. nWidth = 0;
  2822.  
  2823. CPoint p2 = CPoint( nWidth, g_Neuz.m_TextureHPGauge[1].m_size.cy );
  2824.  
  2825. g_Neuz.m_TextureCastingGauge[1].Render(&(g_Neuz.m_2DRender), p, p2, 255, 0.8f, 0.55f);
  2826. }
  2827. }
  2828.  
  2829. void CMover::RenderCtrlCasting(LPDIRECT3DDEVICE9 pd3dDevice)
  2830. {
  2831. // if( g_pPlayer->IsStateMode( STATE_BASEMOTION_MODE ) == FALSE )
  2832. // return;
  2833. if( g_pPlayer->m_dwCtrlReadyTime == 0xffffffff )
  2834. return;
  2835. if( !IsVisible() )
  2836. return;
  2837.  
  2838. pd3dDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
  2839. // 월드 좌표를 스크린 좌표로 프로젝션 한다.
  2840. D3DXVECTOR3 vOut, vPos = GetPos(), vPosHeight;
  2841. D3DVIEWPORT9 vp;
  2842. const BOUND_BOX* pBB = m_pModel->GetBBVector();
  2843.  
  2844. pd3dDevice->GetViewport( &vp );
  2845. vp.X = 0;
  2846. vp.Y = 0;
  2847.  
  2848. D3DXMATRIX matTrans;
  2849. D3DXMATRIX matWorld;
  2850. D3DXMatrixIdentity(&matWorld);
  2851. pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
  2852. D3DXMatrixTranslation( &matTrans, vPos.x, vPos.y, vPos.z);
  2853. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matScale );
  2854. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matRotation );
  2855. D3DXMatrixMultiply( &matWorld, &matWorld, &matTrans );
  2856.  
  2857. vPosHeight = pBB->m_vPos[0];
  2858. vPosHeight.x = 0;
  2859. vPosHeight.z = 0;
  2860.  
  2861. D3DXVec3Project( &vOut, &vPosHeight, &vp, &GetWorld()->m_matProj,
  2862. &GetWorld()->m_pCamera->m_matView, &matWorld);
  2863.  
  2864. vOut.y -= 48;
  2865. int nGaugeWidth = 80;
  2866.  
  2867. CPoint point( (int)( vOut.x - nGaugeWidth / 2 ), (int)( vOut.y - 3 ) );
  2868. CRect rect( point.x - 2, point.y - 2, point.x + nGaugeWidth + 2, point.y + 5 + 2);
  2869.  
  2870. CPoint p = CPoint( rect.left, rect.top );
  2871.  
  2872. MakeEven( p.x );
  2873.  
  2874. g_Neuz.m_TextureCastingGauge[0].RenderScal(&(g_Neuz.m_2DRender), p, 200, 0.8f, 0.55f);
  2875.  
  2876. // ItemProp* pItemProp = prj.GetItemProp( g_pPlayer->m_dwUseItemId );
  2877. // if( pItemProp )
  2878. {
  2879. DWORD dwTime = OPEN_COOLTIME - (g_pPlayer->m_dwCtrlReadyTime - timeGetTime()) ;
  2880. int nWidth = (int)( g_Neuz.m_TextureHPGauge[1].m_size.cx * ((float)dwTime / OPEN_COOLTIME ) );
  2881. if( 112 < nWidth )
  2882. nWidth = 112;
  2883. if( nWidth < 0 )
  2884. nWidth = 0;
  2885.  
  2886. CPoint p2 = CPoint( nWidth, g_Neuz.m_TextureHPGauge[1].m_size.cy );
  2887.  
  2888. g_Neuz.m_TextureCastingGauge[1].Render(&(g_Neuz.m_2DRender), p, p2, 255, 0.8f, 0.55f);
  2889. }
  2890. }
  2891.  
  2892. #if __VER >= 10 // __LEGEND // 9차 전승시스템 Neuz, World, Trans
  2893. void CMover::RenderSkillCasting(LPDIRECT3DDEVICE9 pd3dDevice)
  2894. {
  2895. // if( g_pPlayer->IsStateMode( STATE_BASEMOTION_MODE ) == FALSE )
  2896. // return;
  2897. DWORD dwtmpTick = GetTickCount();
  2898. DWORD dwTmpCastingEndTick = g_pPlayer->m_pActMover->GetCastingEndTick();
  2899. if( dwTmpCastingEndTick < dwtmpTick )
  2900. return;
  2901.  
  2902. int dwTmpSkillID = g_pPlayer->m_pActMover->GetCastingSKillID();
  2903. if( dwTmpSkillID != SI_KNT_HERO_DRAWING && dwTmpSkillID != SI_RIG_HERO_RETURN )
  2904. return;
  2905.  
  2906. if( !IsVisible() )
  2907. return;
  2908.  
  2909. DWORD dwTmpCastingTick = (DWORD)g_pPlayer->m_pActMover->GetCastingTick();
  2910.  
  2911.  
  2912. pd3dDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
  2913. // 월드 좌표를 스크린 좌표로 프로젝션 한다.
  2914. D3DXVECTOR3 vOut, vPos = GetPos(), vPosHeight;
  2915. D3DVIEWPORT9 vp;
  2916. const BOUND_BOX* pBB = m_pModel->GetBBVector();
  2917.  
  2918. pd3dDevice->GetViewport( &vp );
  2919. vp.X = 0;
  2920. vp.Y = 0;
  2921.  
  2922. D3DXMATRIX matTrans;
  2923. D3DXMATRIX matWorld;
  2924. D3DXMatrixIdentity(&matWorld);
  2925. pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
  2926. D3DXMatrixTranslation( &matTrans, vPos.x, vPos.y, vPos.z);
  2927. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matScale );
  2928. D3DXMatrixMultiply( &matWorld, &matWorld, &m_matRotation );
  2929. D3DXMatrixMultiply( &matWorld, &matWorld, &matTrans );
  2930.  
  2931. vPosHeight = pBB->m_vPos[0];
  2932. vPosHeight.x = 0;
  2933. vPosHeight.z = 0;
  2934.  
  2935. D3DXVec3Project( &vOut, &vPosHeight, &vp, &GetWorld()->m_matProj,
  2936. &GetWorld()->m_pCamera->m_matView, &matWorld);
  2937.  
  2938. vOut.y -= 48;
  2939. int nGaugeWidth = 80;
  2940.  
  2941. CPoint point( (int)( vOut.x - nGaugeWidth / 2 ), (int)( vOut.y - 3 ) );
  2942. CRect rect( point.x - 2, point.y - 2, point.x + nGaugeWidth + 2, point.y + 5 + 2);
  2943.  
  2944. CPoint p = CPoint( rect.left, rect.top );
  2945.  
  2946. MakeEven( p.x );
  2947.  
  2948. g_Neuz.m_TextureCastingGauge[0].RenderScal(&(g_Neuz.m_2DRender), p, 200, 0.8f, 0.55f);
  2949.  
  2950. // ItemProp* pItemProp = prj.GetItemProp( g_pPlayer->m_dwUseItemId );
  2951. // if( pItemProp )
  2952. {
  2953. DWORD dwTime = dwTmpCastingTick - (dwTmpCastingEndTick - dwtmpTick) ;
  2954. int nWidth = (int)( g_Neuz.m_TextureHPGauge[1].m_size.cx * ((float)dwTime / dwTmpCastingTick ) );
  2955. if( 112 < nWidth )
  2956. nWidth = 112;
  2957. if( nWidth < 0 )
  2958. nWidth = 0;
  2959.  
  2960. CPoint p2 = CPoint( nWidth, g_Neuz.m_TextureHPGauge[1].m_size.cy );
  2961.  
  2962. g_Neuz.m_TextureCastingGauge[1].Render(&(g_Neuz.m_2DRender), p, p2, 255, 0.8f, 0.55f);
  2963. }
  2964. }
  2965. #endif //__LEGEND // 9차 전승시스템 Neuz, World, Trans
  2966.  
  2967.  
  2968. void CMover::RenderPVPCount(LPDIRECT3DDEVICE9 pd3dDevice)
  2969. {
  2970. DWORD dwWidth = g_Neuz.m_d3dsdBackBuffer.Width / 2;
  2971. DWORD dwHeight = g_Neuz.m_d3dsdBackBuffer.Height / 2;
  2972.  
  2973. if( g_Neuz.m_dwPVPTime <= GetTickCount() && GetTickCount() <= g_Neuz.m_dwPVPTime + 1500 )
  2974. {
  2975. if( g_Neuz.m_nPVPCount == 0 )
  2976. g_Neuz.m_nPVPCount = 10;
  2977.  
  2978. float fScal = (float)( GetTickCount() - g_Neuz.m_dwPVPTime );
  2979. fScal = fScal / 10.0f;
  2980. int nAlpha = 180;
  2981. if( 150 < nAlpha )
  2982. if( fScal < 25 )
  2983. {
  2984. fScal = 1.0f;
  2985. }
  2986. else
  2987. {
  2988. fScal /= 10;
  2989. fScal -= 1.5f;
  2990. nAlpha = (int)( nAlpha - (fScal * 10) );
  2991. }
  2992.  
  2993. if( 1.5f < fScal )
  2994. {
  2995. if( g_Neuz.m_nPVPCount == 0 )
  2996. fScal = 1.5f;
  2997. else if( 2.0f < fScal )
  2998. fScal = 2.0f;
  2999. }
  3000.  
  3001. TRACE( "fScal : %f\n", fScal );
  3002.  
  3003. CPoint p = CPoint(
  3004. (int)( dwWidth - ( g_Neuz.m_TexturePackPVP.m_ap2DTexture[g_Neuz.m_nPVPCount].m_size.cx * fScal / 2 ) ),
  3005. (int)( dwHeight - ( g_Neuz.m_TexturePackPVP.m_ap2DTexture[g_Neuz.m_nPVPCount].m_size.cy * fScal / 2 ) - 50 )
  3006. );
  3007.  
  3008. MakeEven( p.x );
  3009. g_Neuz.m_TexturePackPVP.m_ap2DTexture[g_Neuz.m_nPVPCount].RenderScal(&(g_Neuz.m_2DRender), p, nAlpha, fScal, fScal);
  3010. }
  3011.  
  3012.  
  3013. }
  3014.  
  3015. #endif // not worldserver
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement