1. #include "StdAfx.h"
  2. #include "InstanceBase.h"
  3. #include "PythonBackground.h"
  4. #include "PythonNonPlayer.h"
  5. #include "PythonPlayer.h"
  6. #include "PythonCharacterManager.h"
  7. #include "AbstractPlayer.h"
  8. #include "AbstractApplication.h"
  9. #include "packet.h"
  10. #include "../eterlib/StateManager.h"
  11. #include "../gamelib/ItemManager.h"
  12. BOOL HAIR_COLOR_ENABLE=FALSE;
  13. BOOL USE_ARMOR_SPECULAR=FALSE;
  14. BOOL RIDE_HORSE_ENABLE=TRUE;
  15. const float c_fDefaultRotationSpeed = 1200.0f;
  16. const float c_fDefaultHorseRotationSpeed = 1500.0f;
  17. bool IsWall(unsigned race)
  18. {
  19. switch (race)
  20. {
  21. case 14201:
  22. case 14202:
  23. case 14203:
  24. case 14204:
  25. return true;
  26. break;
  27. }
  28. return false;
  29. }
  30. //////////////////////////////////////////////////////////////////////////////////////
  31. CInstanceBase::SHORSE::SHORSE()
  32. {
  33. __Initialize();
  34. }
  35. CInstanceBase::SHORSE::~SHORSE()
  36. {
  37. assert(m_pkActor==NULL);
  38. }
  39. void CInstanceBase::SHORSE::__Initialize()
  40. {
  41. m_isMounting=false;
  42. m_pkActor=NULL;
  43. }
  44. void CInstanceBase::SHORSE::SetAttackSpeed(UINT uAtkSpd)
  45. {
  46. if (!IsMounting())
  47. return;
  48. CActorInstance& rkActor=GetActorRef();
  49. rkActor.SetAttackSpeed(uAtkSpd/100.0f);
  50. }
  51. void CInstanceBase::SHORSE::SetMoveSpeed(UINT uMovSpd)
  52. {
  53. if (!IsMounting())
  54. return;
  55. CActorInstance& rkActor=GetActorRef();
  56. rkActor.SetMoveSpeed(uMovSpd/100.0f);
  57. }
  58. void CInstanceBase::SHORSE::Create(const TPixelPosition& c_rkPPos, UINT eRace, UINT eHitEffect)
  59. {
  60. assert(NULL==m_pkActor && "CInstanceBase::SHORSE::Create - ALREADY MOUNT");
  61. m_pkActor=new CActorInstance;
  62. CActorInstance& rkActor=GetActorRef();
  63. rkActor.SetEventHandler(CActorInstance::IEventHandler::GetEmptyPtr());
  64. if (!rkActor.SetRace(eRace))
  65. {
  66. delete m_pkActor;
  67. m_pkActor=NULL;
  68. return;
  69. }
  70. rkActor.SetShape(0);
  71. rkActor.SetBattleHitEffect(eHitEffect);
  72. rkActor.SetAlphaValue(0.0f);
  73. rkActor.BlendAlphaValue(1.0f, 0.5f);
  74. rkActor.SetMoveSpeed(1.0f);
  75. rkActor.SetAttackSpeed(1.0f);
  76. rkActor.SetMotionMode(CRaceMotionData::MODE_GENERAL);
  77. rkActor.Stop();
  78. rkActor.RefreshActorInstance();
  79. rkActor.SetCurPixelPosition(c_rkPPos);
  80. m_isMounting=true;
  81. }
  82. void CInstanceBase::SHORSE::Destroy()
  83. {
  84. if (m_pkActor)
  85. {
  86. m_pkActor->Destroy();
  87. delete m_pkActor;
  88. }
  89. __Initialize();
  90. }
  91. CActorInstance& CInstanceBase::SHORSE::GetActorRef()
  92. {
  93. assert(NULL!=m_pkActor && "CInstanceBase::SHORSE::GetActorRef");
  94. return *m_pkActor;
  95. }
  96. CActorInstance* CInstanceBase::SHORSE::GetActorPtr()
  97. {
  98. return m_pkActor;
  99. }
  100. UINT CInstanceBase::SHORSE::GetLevel()
  101. {
  102. if (m_pkActor)
  103. {
  104. DWORD mount = m_pkActor->GetRace();
  105. switch (mount)
  106. {
  107. case 20101:
  108. case 20102:
  109. case 20103:
  110. return 1;
  111. case 20104:
  112. case 20105:
  113. case 20106:
  114. return 2;
  115. case 20107:
  116. case 20108:
  117. case 20109:
  118. case 20110: // #0000673: [M2EU] »õ·Î¿î Å»°Í Ÿ°í °ø°İ ¾ÈµÊ
  119. case 20111: // #0000673: [M2EU] »õ·Î¿î Å»°Í Ÿ°í °ø°İ ¾ÈµÊ
  120. case 20112: // #0000673: [M2EU] »õ·Î¿î Å»°Í Ÿ°í °ø°İ ¾ÈµÊ
  121. case 20113: // #0000673: [M2EU] »õ·Î¿î Å»°Í Ÿ°í °ø°İ ¾ÈµÊ
  122. case 20114:
  123. case 20115:
  124. case 20116:
  125. case 20117:
  126. case 20118:
  127. case 20120:
  128. case 20121:
  129. case 20122:
  130. case 20123:
  131. case 20124:
  132. case 20125:
  133. return 3;
  134. case 20119: // ¶ó¸¶´Ü À̺¥Æ®¿ë Èæ¸¶´Â ½ºÅ³ºÒ°¡, °ø°İ°¡´ÉÇÑ ·¹º§2·Î ¼³Á¤
  135. case 20219: // ÇÒ·ÎÀ© À̺¥Æ®¿ë Èæ¸¶´Â ½ºÅ³ºÒ°¡, °ø°İ°¡´ÉÇÑ ·¹º§2·Î ¼³Á¤ (=¶ó¸¶´Ü Èæ¸¶ Ŭ·Ğ)
  136. case 20220:
  137. case 20221:
  138. case 20222:
  139. return 2;
  140. }
  141. // ¸¶¿îÆ® È®Àå ½Ã½ºÅÛ¿ë Æ¯¼ö ó¸® (20201 ~ 20212 ´ë¿ªÀ» »ç¿ëÇÏ°í ¼ø¼­´ë·Î 4°³¾¿ ³ª´²¼­ ÃʱŞ, Áß±Ş, °í±ŞÀÓ)
  142. // -- Å»°Í ·¹º§À» Ŭ¶ó¿¡¼­ ÃøÁ¤ÇÏ°í °ø°İ/½ºÅ³ »ç¿ë°¡´É ¿©ºÎµµ Ŭ¶ó¿¡¼­ ó¸®ÇÏ´Â °Í ÀÚü¿¡ ¹®Á¦°¡ ÀÖ´Â µí.. [hyo]
  143. {
  144. // Áß±Ş Å»°ÍÀº ·¹º§2 (°ø°İ °¡´É, ½ºÅ³ ºÒ°¡)
  145. if ((20205 <= mount && 20208 >= mount) ||
  146. (20214 == mount) || (20217 == mount) // ³­ÆøÇÑ Àü°©¼ø¼ø·Ï, ³­ÆøÇÑ Àü°©¾Ï¼ø·Ï
  147. )
  148. return 2;
  149. // °í±Ş Å»°ÍÀº ·¹º§3 (°ø°İ °¡´É, ½ºÅ³ °¡´É)
  150. if ((20209 <= mount && 20212 >= mount) ||
  151. (20215 == mount) || (20218 == mount) || // ¿ë¸ÍÇÑ Àü°©¼ø¼ø·Ï, ¿ë¸ÍÇÑ Àü°©¾Ï¼ø·Ï
  152. (20220 == mount)
  153. )
  154. return 3;
  155. }
  156. }
  157. return 0;
  158. }
  159. bool CInstanceBase::SHORSE::IsNewMount()
  160. {
  161. if (!m_pkActor)
  162. return false;
  163. DWORD mount = m_pkActor->GetRace();
  164. if ((20205 <= mount && 20208 >= mount) ||
  165. (20214 == mount) || (20217 == mount) // ³­ÆøÇÑ Àü°©¼ø¼ø·Ï, ³­ÆøÇÑ Àü°©¾Ï¼ø·Ï
  166. )
  167. return true;
  168. // °í±Ş Å»°Í
  169. if ((20209 <= mount && 20212 >= mount) ||
  170. (20215 == mount) || (20218 == mount) || // ¿ë¸ÍÇÑ Àü°©¼ø¼ø·Ï, ¿ë¸ÍÇÑ Àü°©¾Ï¼ø·Ï
  171. (20220 == mount)
  172. )
  173. return true;
  174. return false;
  175. }
  176. bool CInstanceBase::SHORSE::CanUseSkill()
  177. {
  178. // ¸¶»ó½ºÅ³Àº ¸»ÀÇ ·¹º§ÀÌ 3 ÀÌ»óÀ̾î¾ß¸¸ ÇÔ.
  179. if (IsMounting())
  180. return 2 < GetLevel();
  181. return true;
  182. }
  183. bool CInstanceBase::SHORSE::CanAttack()
  184. {
  185. if (IsMounting())
  186. if (GetLevel()<=1)
  187. return false;
  188. return true;
  189. }
  190. bool CInstanceBase::SHORSE::IsMounting()
  191. {
  192. return m_isMounting;
  193. }
  194. void CInstanceBase::SHORSE::Deform()
  195. {
  196. if (!IsMounting())
  197. return;
  198. CActorInstance& rkActor=GetActorRef();
  199. rkActor.INSTANCEBASE_Deform();
  200. }
  201. void CInstanceBase::SHORSE::Render()
  202. {
  203. if (!IsMounting())
  204. return;
  205. CActorInstance& rkActor=GetActorRef();
  206. rkActor.Render();
  207. }
  208. void CInstanceBase::__AttachHorseSaddle()
  209. {
  210. if (!IsMountingHorse())
  211. return;
  212. m_kHorse.m_pkActor->AttachModelInstance(CRaceData::PART_MAIN, "saddle", m_GraphicThingInstance, CRaceData::PART_MAIN);
  213. }
  214. void CInstanceBase::__DetachHorseSaddle()
  215. {
  216. if (!IsMountingHorse())
  217. return;
  218. m_kHorse.m_pkActor->DetachModelInstance(CRaceData::PART_MAIN, m_GraphicThingInstance, CRaceData::PART_MAIN);
  219. }
  220. //////////////////////////////////////////////////////////////////////////////////////
  221. void CInstanceBase::BlockMovement()
  222. {
  223. m_GraphicThingInstance.BlockMovement();
  224. }
  225. bool CInstanceBase::IsBlockObject(const CGraphicObjectInstance& c_rkBGObj)
  226. {
  227. return m_GraphicThingInstance.IsBlockObject(c_rkBGObj);
  228. }
  229. bool CInstanceBase::AvoidObject(const CGraphicObjectInstance& c_rkBGObj)
  230. {
  231. return m_GraphicThingInstance.AvoidObject(c_rkBGObj);
  232. }
  233. ///////////////////////////////////////////////////////////////////////////////////
  234. bool __ArmorVnumToShape(int iVnum, DWORD * pdwShape)
  235. {
  236. *pdwShape = iVnum;
  237. /////////////////////////////////////////
  238. if (0 == iVnum || 1 == iVnum)
  239. return false;
  240. if (!USE_ARMOR_SPECULAR)
  241. return false;
  242. CItemData * pItemData;
  243. if (!CItemManager::Instance().GetItemDataPointer(iVnum, &pItemData))
  244. return false;
  245. enum
  246. {
  247. SHAPE_VALUE_SLOT_INDEX = 3,
  248. };
  249. *pdwShape = pItemData->GetValue(SHAPE_VALUE_SLOT_INDEX);
  250. return true;
  251. }
  252. // 2004.07.05.myevan.±Ã½Åź¿µ ³¢ÀÌ´Â ¹®Á¦
  253. class CActorInstanceBackground : public IBackground
  254. {
  255. public:
  256. CActorInstanceBackground() {}
  257. virtual ~CActorInstanceBackground() {}
  258. bool IsBlock(int x, int y)
  259. {
  260. CPythonBackground& rkBG=CPythonBackground::Instance();
  261. return rkBG.isAttrOn(x, y, CTerrainImpl::ATTRIBUTE_BLOCK);
  262. }
  263. };
  264. static CActorInstanceBackground gs_kActorInstBG;
  265. bool CInstanceBase::LessRenderOrder(CInstanceBase* pkInst)
  266. {
  267. int nMainAlpha=(__GetAlphaValue() < 1.0f) ? 1 : 0;
  268. int nTestAlpha=(pkInst->__GetAlphaValue() < 1.0f) ? 1 : 0;
  269. if (nMainAlpha < nTestAlpha)
  270. return true;
  271. if (nMainAlpha > nTestAlpha)
  272. return false;
  273. if (GetRace()<pkInst->GetRace())
  274. return true;
  275. if (GetRace()>pkInst->GetRace())
  276. return false;
  277. if (GetShape()<pkInst->GetShape())
  278. return true;
  279. if (GetShape()>pkInst->GetShape())
  280. return false;
  281. UINT uLeftLODLevel=__LessRenderOrder_GetLODLevel();
  282. UINT uRightLODLevel=pkInst->__LessRenderOrder_GetLODLevel();
  283. if (uLeftLODLevel<uRightLODLevel)
  284. return true;
  285. if (uLeftLODLevel>uRightLODLevel)
  286. return false;
  287. if (m_awPart[CRaceData::PART_WEAPON]<pkInst->m_awPart[CRaceData::PART_WEAPON])
  288. return true;
  289. return false;
  290. }
  291. UINT CInstanceBase::__LessRenderOrder_GetLODLevel()
  292. {
  293. CGrannyLODController* pLODCtrl=m_GraphicThingInstance.GetLODControllerPointer(0);
  294. if (!pLODCtrl)
  295. return 0;
  296. return pLODCtrl->GetLODLevel();
  297. }
  298. bool CInstanceBase::__Background_GetWaterHeight(const TPixelPosition& c_rkPPos, float* pfHeight)
  299. {
  300. long lHeight;
  301. if (!CPythonBackground::Instance().GetWaterHeight(int(c_rkPPos.x), int(c_rkPPos.y), &lHeight))
  302. return false;
  303. *pfHeight = float(lHeight);
  304. return true;
  305. }
  306. bool CInstanceBase::__Background_IsWaterPixelPosition(const TPixelPosition& c_rkPPos)
  307. {
  308. return CPythonBackground::Instance().isAttrOn(c_rkPPos.x, c_rkPPos.y, CTerrainImpl::ATTRIBUTE_WATER);
  309. }
  310. const float PC_DUST_RANGE = 2000.0f;
  311. const float NPC_DUST_RANGE = 1000.0f;
  312. DWORD CInstanceBase::ms_dwUpdateCounter=0;
  313. DWORD CInstanceBase::ms_dwRenderCounter=0;
  314. DWORD CInstanceBase::ms_dwDeformCounter=0;
  315. CDynamicPool<CInstanceBase> CInstanceBase::ms_kPool;
  316. bool CInstanceBase::__IsInDustRange()
  317. {
  318. if (!__IsExistMainInstance())
  319. return false;
  320. CInstanceBase* pkInstMain=__GetMainInstancePtr();
  321. float fDistance=NEW_GetDistanceFromDestInstance(*pkInstMain);
  322. if (IsPC())
  323. {
  324. if (fDistance<=PC_DUST_RANGE)
  325. return true;
  326. }
  327. if (fDistance<=NPC_DUST_RANGE)
  328. return true;
  329. return false;
  330. }
  331. void CInstanceBase::__EnableSkipCollision()
  332. {
  333. if (__IsMainInstance())
  334. {
  335. TraceError("CInstanceBase::__EnableSkipCollision - ÀÚ½ÅÀº Ãæµ¹°Ë»ç½ºÅµÀÌ µÇ¸é ¾ÈµÈ´Ù!!");
  336. return;
  337. }
  338. m_GraphicThingInstance.EnableSkipCollision();
  339. }
  340. void CInstanceBase::__DisableSkipCollision()
  341. {
  342. m_GraphicThingInstance.DisableSkipCollision();
  343. }
  344. DWORD CInstanceBase::__GetShadowMapColor(float x, float y)
  345. {
  346. CPythonBackground& rkBG=CPythonBackground::Instance();
  347. return rkBG.GetShadowMapColor(x, y);
  348. }
  349. float CInstanceBase::__GetBackgroundHeight(float x, float y)
  350. {
  351. CPythonBackground& rkBG=CPythonBackground::Instance();
  352. return rkBG.GetHeight(x, y);
  353. }
  354. #ifdef __MOVIE_MODE__
  355. BOOL CInstanceBase::IsMovieMode()
  356. {
  357. if (IsAffect(AFFECT_INVISIBILITY))
  358. return true;
  359. return false;
  360. }
  361. #endif
  362. BOOL CInstanceBase::IsInvisibility()
  363. {
  364. if (IsAffect(AFFECT_INVISIBILITY))
  365. return true;
  366. return false;
  367. }
  368. BOOL CInstanceBase::IsParalysis()
  369. {
  370. return m_GraphicThingInstance.IsParalysis();
  371. }
  372. BOOL CInstanceBase::IsGameMaster()
  373. {
  374. if (m_kAffectFlagContainer.IsSet(AFFECT_YMIR))
  375. return true;
  376. return false;
  377. }
  378. BOOL CInstanceBase::IsSameEmpire(CInstanceBase& rkInstDst)
  379. {
  380. if (0 == rkInstDst.m_dwEmpireID)
  381. return TRUE;
  382. if (IsGameMaster())
  383. return TRUE;
  384. if (rkInstDst.IsGameMaster())
  385. return TRUE;
  386. if (rkInstDst.m_dwEmpireID==m_dwEmpireID)
  387. return TRUE;
  388. return FALSE;
  389. }
  390. DWORD CInstanceBase::GetEmpireID()
  391. {
  392. return m_dwEmpireID;
  393. }
  394. DWORD CInstanceBase::GetGuildID()
  395. {
  396. return m_dwGuildID;
  397. }
  398. int CInstanceBase::GetAlignment()
  399. {
  400. return m_sAlignment;
  401. }
  402. UINT CInstanceBase::GetAlignmentGrade()
  403. {
  404. if (m_sAlignment >= 12000)
  405. return 0;
  406. else if (m_sAlignment >= 8000)
  407. return 1;
  408. else if (m_sAlignment >= 4000)
  409. return 2;
  410. else if (m_sAlignment >= 1000)
  411. return 3;
  412. else if (m_sAlignment >= 0)
  413. return 4;
  414. else if (m_sAlignment > -4000)
  415. return 5;
  416. else if (m_sAlignment > -8000)
  417. return 6;
  418. else if (m_sAlignment > -12000)
  419. return 7;
  420. return 8;
  421. }
  422. int CInstanceBase::GetAlignmentType()
  423. {
  424. switch (GetAlignmentGrade())
  425. {
  426. case 0:
  427. case 1:
  428. case 2:
  429. case 3:
  430. {
  431. return ALIGNMENT_TYPE_WHITE;
  432. break;
  433. }
  434. case 5:
  435. case 6:
  436. case 7:
  437. case 8:
  438. {
  439. return ALIGNMENT_TYPE_DARK;
  440. break;
  441. }
  442. }
  443. return ALIGNMENT_TYPE_NORMAL;
  444. }
  445. BYTE CInstanceBase::GetPKMode()
  446. {
  447. return m_byPKMode;
  448. }
  449. bool CInstanceBase::IsKiller()
  450. {
  451. return m_isKiller;
  452. }
  453. bool CInstanceBase::IsPartyMember()
  454. {
  455. return m_isPartyMember;
  456. }
  457. BOOL CInstanceBase::IsInSafe()
  458. {
  459. const TPixelPosition& c_rkPPosCur=m_GraphicThingInstance.NEW_GetCurPixelPositionRef();
  460. if (CPythonBackground::Instance().isAttrOn(c_rkPPosCur.x, c_rkPPosCur.y, CTerrainImpl::ATTRIBUTE_BANPK))
  461. return TRUE;
  462. return FALSE;
  463. }
  464. float CInstanceBase::CalculateDistanceSq3d(const TPixelPosition& c_rkPPosDst)
  465. {
  466. const TPixelPosition& c_rkPPosSrc=m_GraphicThingInstance.NEW_GetCurPixelPositionRef();
  467. return SPixelPosition_CalculateDistanceSq3d(c_rkPPosSrc, c_rkPPosDst);
  468. }
  469. void CInstanceBase::OnSelected()
  470. {
  471. #ifdef __MOVIE_MODE__
  472. if (!__IsExistMainInstance())
  473. return;
  474. #endif
  475. if (IsStoneDoor())
  476. return;
  477. if (IsDead())
  478. return;
  479. __AttachSelectEffect();
  480. }
  481. void CInstanceBase::OnUnselected()
  482. {
  483. __DetachSelectEffect();
  484. }
  485. void CInstanceBase::OnTargeted()
  486. {
  487. #ifdef __MOVIE_MODE__
  488. if (!__IsExistMainInstance())
  489. return;
  490. #endif
  491. if (IsStoneDoor())
  492. return;
  493. if (IsDead())
  494. return;
  495. __AttachTargetEffect();
  496. }
  497. void CInstanceBase::OnUntargeted()
  498. {
  499. __DetachTargetEffect();
  500. }
  501. void CInstanceBase::DestroySystem()
  502. {
  503. ms_kPool.Clear();
  504. }
  505. void CInstanceBase::CreateSystem(UINT uCapacity)
  506. {
  507. ms_kPool.Create(uCapacity);
  508. memset(ms_adwCRCAffectEffect, 0, sizeof(ms_adwCRCAffectEffect));
  509. ms_fDustGap=250.0f;
  510. ms_fHorseDustGap=500.0f;
  511. }
  512. CInstanceBase* CInstanceBase::New()
  513. {
  514. return ms_kPool.Alloc();
  515. }
  516. void CInstanceBase::Delete(CInstanceBase* pkInst)
  517. {
  518. pkInst->Destroy();
  519. ms_kPool.Free(pkInst);
  520. }
  521. void CInstanceBase::SetMainInstance()
  522. {
  523. CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
  524. DWORD dwVID=GetVirtualID();
  525. rkChrMgr.SetMainInstance(dwVID);
  526. m_GraphicThingInstance.SetMainInstance();
  527. }
  528. CInstanceBase* CInstanceBase::__GetMainInstancePtr()
  529. {
  530. CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
  531. return rkChrMgr.GetMainInstancePtr();
  532. }
  533. void CInstanceBase::__ClearMainInstance()
  534. {
  535. CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
  536. rkChrMgr.ClearMainInstance();
  537. }
  538. /* ½ÇÁ¦ Ç÷¹À̾î ij¸¯ÅÍÀÎÁö Á¶»ç.*/
  539. bool CInstanceBase::__IsMainInstance()
  540. {
  541. if (this==__GetMainInstancePtr())
  542. return true;
  543. return false;
  544. }
  545. bool CInstanceBase::__IsExistMainInstance()
  546. {
  547. if(__GetMainInstancePtr())
  548. return true;
  549. else
  550. return false;
  551. }
  552. bool CInstanceBase::__MainCanSeeHiddenThing()
  553. {
  554. return false;
  555. // CInstanceBase * pInstance = __GetMainInstancePtr();
  556. // return pInstance->IsAffect(AFFECT_GAMJI);
  557. }
  558. float CInstanceBase::__GetBowRange()
  559. {
  560. float fRange = 2500.0f - 100.0f;
  561. if (__IsMainInstance())
  562. {
  563. IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
  564. fRange += float(rPlayer.GetStatus(POINT_BOW_DISTANCE));
  565. }
  566. return fRange;
  567. }
  568. CInstanceBase* CInstanceBase::__FindInstancePtr(DWORD dwVID)
  569. {
  570. CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
  571. return rkChrMgr.GetInstancePtr(dwVID);
  572. }
  573. bool CInstanceBase::__FindRaceType(DWORD dwRace, BYTE* pbType)
  574. {
  575. CPythonNonPlayer& rkNonPlayer=CPythonNonPlayer::Instance();
  576. return rkNonPlayer.GetInstanceType(dwRace, pbType);
  577. }
  578. bool CInstanceBase::Create(const SCreateData& c_rkCreateData)
  579. {
  580. IAbstractApplication::GetSingleton().SkipRenderBuffering(300);
  581. SetInstanceType(c_rkCreateData.m_bType);
  582. if (!SetRace(c_rkCreateData.m_dwRace))
  583. return false;
  584. #ifdef ENABLE_SUPPORT_SYSTEM
  585. int i=0;
  586. if (c_rkCreateData.m_dwRace == 34077)
  587. {
  588. SetInstanceType(CActorInstance::TYPE_NPC);
  589. SetRace(3);
  590. i=1;
  591. }
  592. #endif
  593. SetVirtualID(c_rkCreateData.m_dwVID);
  594. if (c_rkCreateData.m_isMain)
  595. SetMainInstance();
  596. if (IsGuildWall())
  597. {
  598. unsigned center_x;
  599. unsigned center_y;
  600. c_rkCreateData.m_kAffectFlags.ConvertToPosition(&center_x, &center_y);
  601. float center_z = __GetBackgroundHeight(center_x, center_y);
  602. NEW_SetPixelPosition(TPixelPosition(float(c_rkCreateData.m_lPosX), float(c_rkCreateData.m_lPosY), center_z));
  603. }
  604. else
  605. {
  606. SCRIPT_SetPixelPosition(float(c_rkCreateData.m_lPosX), float(c_rkCreateData.m_lPosY));
  607. }
  608. if (0 != c_rkCreateData.m_dwMountVnum)
  609. MountHorse(c_rkCreateData.m_dwMountVnum);
  610. SetArmor(c_rkCreateData.m_dwArmor);
  611. if (IsPC())
  612. {
  613. SetHair(c_rkCreateData.m_dwHair);
  614. SetWeapon(c_rkCreateData.m_dwWeapon);
  615. }
  616. __Create_SetName(c_rkCreateData);
  617. m_dwLevel = c_rkCreateData.m_dwLevel;
  618. m_dwGuildID = c_rkCreateData.m_dwGuildID;
  619. m_dwEmpireID = c_rkCreateData.m_dwEmpireID;
  620. SetVirtualNumber(c_rkCreateData.m_dwRace);
  621. SetRotation(c_rkCreateData.m_fRot);
  622. #ifdef ENABLE_SUPPORT_SYSTEM
  623. SetLevelText(c_rkCreateData.m_dwLevel);
  624. #endif
  625. SetAlignment(c_rkCreateData.m_sAlignment);
  626. SetPKMode(c_rkCreateData.m_byPKMode);
  627. SetMoveSpeed(c_rkCreateData.m_dwMovSpd);
  628. SetAttackSpeed(c_rkCreateData.m_dwAtkSpd);
  629. // NOTE : Dress ¸¦ ÀÔ°í ÀÖÀ¸¸é Alpha ¸¦ ³ÖÁö ¾Ê´Â´Ù.
  630. if (!IsWearingDress())
  631. {
  632. // NOTE : ¹İµå½Ã Affect ¼ÂÆÃ À­ÂÊ¿¡ ÀÖ¾î¾ß ÇÔ
  633. m_GraphicThingInstance.SetAlphaValue(0.0f);
  634. m_GraphicThingInstance.BlendAlphaValue(1.0f, 0.5f);
  635. }
  636. if (!IsGuildWall())
  637. {
  638. SetAffectFlagContainer(c_rkCreateData.m_kAffectFlags);
  639. }
  640. // NOTE : ¹İµå½Ã Affect ¼ÂÆÃ ÈÄ¿¡ ÇØ¾ß ÇÔ
  641. AttachTextTail();
  642. RefreshTextTail();
  643. if (c_rkCreateData.m_dwStateFlags & ADD_CHARACTER_STATE_SPAWN)
  644. {
  645. if (IsAffect(AFFECT_SPAWN))
  646. __AttachEffect(EFFECT_SPAWN_APPEAR);
  647. if (IsPC())
  648. {
  649. Refresh(CRaceMotionData::NAME_WAIT, true);
  650. }
  651. else
  652. {
  653. Refresh(CRaceMotionData::NAME_SPAWN, false);
  654. }
  655. }
  656. else
  657. {
  658. Refresh(CRaceMotionData::NAME_WAIT, true);
  659. }
  660. __AttachEmpireEffect(c_rkCreateData.m_dwEmpireID);
  661. RegisterBoundingSphere();
  662. if (c_rkCreateData.m_dwStateFlags & ADD_CHARACTER_STATE_DEAD)
  663. m_GraphicThingInstance.DieEnd();
  664. SetStateFlags(c_rkCreateData.m_dwStateFlags);
  665. m_GraphicThingInstance.SetBattleHitEffect(ms_adwCRCAffectEffect[EFFECT_HIT]);
  666. if (!IsPC())
  667. {
  668. DWORD dwBodyColor = CPythonNonPlayer::Instance().GetMonsterColor(c_rkCreateData.m_dwRace);
  669. if (0 != dwBodyColor)
  670. {
  671. SetModulateRenderMode();
  672. SetAddColor(dwBodyColor);
  673. }
  674. }
  675. __AttachHorseSaddle();
  676. // ±æµå ½Éº¼À» À§ÇÑ Àӽà ÄÚµå, ÀûÁ¤ À§Ä¡¸¦ ã´Â Áß
  677. const int c_iGuildSymbolRace = 14200;
  678. if (c_iGuildSymbolRace == GetRace())
  679. {
  680. std::string strFileName = GetGuildSymbolFileName(m_dwGuildID);
  681. if (IsFile(strFileName.c_str()))
  682. m_GraphicThingInstance.ChangeMaterial(strFileName.c_str());
  683. }
  684. return true;
  685. }
  686. void CInstanceBase::__Create_SetName(const SCreateData& c_rkCreateData)
  687. {
  688. if (IsGoto())
  689. {
  690. SetNameString("", 0);
  691. return;
  692. }
  693. if (IsWarp())
  694. {
  695. __Create_SetWarpName(c_rkCreateData);
  696. return;
  697. }
  698. SetNameString(c_rkCreateData.m_stName.c_str(), c_rkCreateData.m_stName.length());
  699. }
  700. void CInstanceBase::__Create_SetWarpName(const SCreateData& c_rkCreateData)
  701. {
  702. const char * c_szName;
  703. if (CPythonNonPlayer::Instance().GetName(c_rkCreateData.m_dwRace, &c_szName))
  704. {
  705. std::string strName = c_szName;
  706. int iFindingPos = strName.find_first_of(" ", 0);
  707. if (iFindingPos > 0)
  708. {
  709. strName.resize(iFindingPos);
  710. }
  711. SetNameString(strName.c_str(), strName.length());
  712. }
  713. else
  714. {
  715. SetNameString(c_rkCreateData.m_stName.c_str(), c_rkCreateData.m_stName.length());
  716. }
  717. }
  718. void CInstanceBase::SetNameString(const char* c_szName, int len)
  719. {
  720. m_stName.assign(c_szName, len);
  721. }
  722. bool CInstanceBase::SetRace(DWORD eRace)
  723. {
  724. m_dwRace = eRace;
  725. if (!m_GraphicThingInstance.SetRace(eRace))
  726. return false;
  727. if (!__FindRaceType(m_dwRace, &m_eRaceType))
  728. m_eRaceType=CActorInstance::TYPE_PC;
  729. return true;
  730. }
  731. BOOL CInstanceBase::__IsChangableWeapon(int iWeaponID)
  732. {
  733. // µå·¹½º ÀÔ°í ÀÖÀ»¶§´Â ºÎÄÉ¿ÜÀÇ Àåºñ´Â ³ª¿ÀÁö ¾Ê°Ô..
  734. if (IsWearingDress())
  735. {
  736. const int c_iBouquets[] =
  737. {
  738. 50201, // Bouquet for Assassin
  739. 50202, // Bouquet for Shaman
  740. 50203,
  741. 50204,
  742. 0, // #0000545: [M2CN] ¿şµù µå·¹½º¿Í Àåºñ Âø¿ë ¹®Á¦
  743. };
  744. for (int i = 0; c_iBouquets[i] != 0; ++i)
  745. if (iWeaponID == c_iBouquets[i])
  746. return true;
  747. return false;
  748. }
  749. else
  750. return true;
  751. }
  752. BOOL CInstanceBase::IsWearingDress()
  753. {
  754. const int c_iWeddingDressShape = 201;
  755. return c_iWeddingDressShape == m_eShape;
  756. }
  757. BOOL CInstanceBase::IsHoldingPickAxe()
  758. {
  759. const int c_iPickAxeStart = 29101;
  760. const int c_iPickAxeEnd = 29110;
  761. return m_awPart[CRaceData::PART_WEAPON] >= c_iPickAxeStart && m_awPart[CRaceData::PART_WEAPON] <= c_iPickAxeEnd;
  762. }
  763. BOOL CInstanceBase::IsNewMount()
  764. {
  765. return m_kHorse.IsNewMount();
  766. }
  767. BOOL CInstanceBase::IsMountingHorse()
  768. {
  769. return m_kHorse.IsMounting();
  770. }
  771. void CInstanceBase::MountHorse(UINT eRace)
  772. {
  773. m_kHorse.Destroy();
  774. m_kHorse.Create(m_GraphicThingInstance.NEW_GetCurPixelPositionRef(), eRace, ms_adwCRCAffectEffect[EFFECT_HIT]);
  775. SetMotionMode(CRaceMotionData::MODE_HORSE);
  776. SetRotationSpeed(c_fDefaultHorseRotationSpeed);
  777. m_GraphicThingInstance.MountHorse(m_kHorse.GetActorPtr());
  778. m_GraphicThingInstance.Stop();
  779. m_GraphicThingInstance.RefreshActorInstance();
  780. }
  781. void CInstanceBase::DismountHorse()
  782. {
  783. m_kHorse.Destroy();
  784. }
  785. void CInstanceBase::GetInfo(std::string* pstInfo)
  786. {
  787. char szInfo[256];
  788. sprintf(szInfo, "Inst - UC %d, RC %d Pool - %d ",
  789. ms_dwUpdateCounter,
  790. ms_dwRenderCounter,
  791. ms_kPool.GetCapacity()
  792. );
  793. pstInfo->append(szInfo);
  794. }
  795. void CInstanceBase::ResetPerformanceCounter()
  796. {
  797. ms_dwUpdateCounter=0;
  798. ms_dwRenderCounter=0;
  799. ms_dwDeformCounter=0;
  800. }
  801. bool CInstanceBase::NEW_IsLastPixelPosition()
  802. {
  803. return m_GraphicThingInstance.IsPushing();
  804. }
  805. const TPixelPosition& CInstanceBase::NEW_GetLastPixelPositionRef()
  806. {
  807. return m_GraphicThingInstance.NEW_GetLastPixelPositionRef();
  808. }
  809. void CInstanceBase::NEW_SetDstPixelPositionZ(FLOAT z)
  810. {
  811. m_GraphicThingInstance.NEW_SetDstPixelPositionZ(z);
  812. }
  813. void CInstanceBase::NEW_SetDstPixelPosition(const TPixelPosition& c_rkPPosDst)
  814. {
  815. m_GraphicThingInstance.NEW_SetDstPixelPosition(c_rkPPosDst);
  816. }
  817. void CInstanceBase::NEW_SetSrcPixelPosition(const TPixelPosition& c_rkPPosSrc)
  818. {
  819. m_GraphicThingInstance.NEW_SetSrcPixelPosition(c_rkPPosSrc);
  820. }
  821. const TPixelPosition& CInstanceBase::NEW_GetCurPixelPositionRef()
  822. {
  823. return m_GraphicThingInstance.NEW_GetCurPixelPositionRef();
  824. }
  825. const TPixelPosition& CInstanceBase::NEW_GetDstPixelPositionRef()
  826. {
  827. return m_GraphicThingInstance.NEW_GetDstPixelPositionRef();
  828. }
  829. const TPixelPosition& CInstanceBase::NEW_GetSrcPixelPositionRef()
  830. {
  831. return m_GraphicThingInstance.NEW_GetSrcPixelPositionRef();
  832. }
  833. /////////////////////////////////////////////////////////////////////////////////////////////////
  834. void CInstanceBase::OnSyncing()
  835. {
  836. m_GraphicThingInstance.__OnSyncing();
  837. }
  838. void CInstanceBase::OnWaiting()
  839. {
  840. m_GraphicThingInstance.__OnWaiting();
  841. }
  842. void CInstanceBase::OnMoving()
  843. {
  844. m_GraphicThingInstance.__OnMoving();
  845. }
  846. void CInstanceBase::ChangeGuild(DWORD dwGuildID)
  847. {
  848. m_dwGuildID=dwGuildID;
  849. DetachTextTail();
  850. AttachTextTail();
  851. RefreshTextTail();
  852. }
  853. DWORD CInstanceBase::GetPart(CRaceData::EParts part)
  854. {
  855. assert(part >= 0 && part < CRaceData::PART_MAX_NUM);
  856. return m_awPart[part];
  857. }
  858. DWORD CInstanceBase::GetShape()
  859. {
  860. return m_eShape;
  861. }
  862. bool CInstanceBase::CanAct()
  863. {
  864. return m_GraphicThingInstance.CanAct();
  865. }
  866. bool CInstanceBase::CanMove()
  867. {
  868. return m_GraphicThingInstance.CanMove();
  869. }
  870. bool CInstanceBase::CanUseSkill()
  871. {
  872. if (IsPoly())
  873. return false;
  874. if (IsWearingDress())
  875. return false;
  876. if (IsHoldingPickAxe())
  877. return false;
  878. if (!m_kHorse.CanUseSkill())
  879. return false;
  880. if (!m_GraphicThingInstance.CanUseSkill())
  881. return false;
  882. return true;
  883. }
  884. bool CInstanceBase::CanAttack()
  885. {
  886. if (!m_kHorse.CanAttack())
  887. return false;
  888. if (IsWearingDress())
  889. return false;
  890. if (IsHoldingPickAxe())
  891. return false;
  892. return m_GraphicThingInstance.CanAttack();
  893. }
  894. bool CInstanceBase::CanFishing()
  895. {
  896. return m_GraphicThingInstance.CanFishing();
  897. }
  898. BOOL CInstanceBase::IsBowMode()
  899. {
  900. return m_GraphicThingInstance.IsBowMode();
  901. }
  902. BOOL CInstanceBase::IsHandMode()
  903. {
  904. return m_GraphicThingInstance.IsHandMode();
  905. }
  906. BOOL CInstanceBase::IsFishingMode()
  907. {
  908. if (CRaceMotionData::MODE_FISHING == m_GraphicThingInstance.GetMotionMode())
  909. return true;
  910. return false;
  911. }
  912. BOOL CInstanceBase::IsFishing()
  913. {
  914. return m_GraphicThingInstance.IsFishing();
  915. }
  916. BOOL CInstanceBase::IsDead()
  917. {
  918. return m_GraphicThingInstance.IsDead();
  919. }
  920. BOOL CInstanceBase::IsStun()
  921. {
  922. return m_GraphicThingInstance.IsStun();
  923. }
  924. BOOL CInstanceBase::IsSleep()
  925. {
  926. return m_GraphicThingInstance.IsSleep();
  927. }
  928. BOOL CInstanceBase::__IsSyncing()
  929. {
  930. return m_GraphicThingInstance.__IsSyncing();
  931. }
  932. void CInstanceBase::NEW_SetOwner(DWORD dwVIDOwner)
  933. {
  934. m_GraphicThingInstance.SetOwner(dwVIDOwner);
  935. }
  936. float CInstanceBase::GetLocalTime()
  937. {
  938. return m_GraphicThingInstance.GetLocalTime();
  939. }
  940. void CInstanceBase::PushUDPState(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg)
  941. {
  942. }
  943. DWORD ELTimer_GetServerFrameMSec();
  944. void CInstanceBase::PushTCPStateExpanded(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg, UINT uTargetVID)
  945. {
  946. SCommand kCmdNew;
  947. kCmdNew.m_kPPosDst = c_rkPPosDst;
  948. kCmdNew.m_dwChkTime = dwCmdTime+100;
  949. kCmdNew.m_dwCmdTime = dwCmdTime;
  950. kCmdNew.m_fDstRot = fDstRot;
  951. kCmdNew.m_eFunc = eFunc;
  952. kCmdNew.m_uArg = uArg;
  953. kCmdNew.m_uTargetVID = uTargetVID;
  954. m_kQue_kCmdNew.push_back(kCmdNew);
  955. }
  956. void CInstanceBase::PushTCPState(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg)
  957. {
  958. if (__IsMainInstance())
  959. {
  960. //assert(!"CInstanceBase::PushTCPState Ç÷¹À̾î Àڽſ¡°Ô À̵¿ÆĞŶÀº ¿À¸é ¾ÈµÈ´Ù!");
  961. TraceError("CInstanceBase::PushTCPState Ç÷¹À̾î Àڽſ¡°Ô À̵¿ÆĞŶÀº ¿À¸é ¾ÈµÈ´Ù!");
  962. return;
  963. }
  964. int nNetworkGap=ELTimer_GetServerFrameMSec()-dwCmdTime;
  965. m_nAverageNetworkGap=(m_nAverageNetworkGap*70+nNetworkGap*30)/100;
  966. /*
  967. if (m_dwBaseCmdTime == 0)
  968. {
  969. m_dwBaseChkTime = ELTimer_GetFrameMSec()-nNetworkGap;
  970. m_dwBaseCmdTime = dwCmdTime;
  971. Tracenf("VID[%d] ³×Æ®¿÷°¸ [%d]", GetVirtualID(), nNetworkGap);
  972. }
  973. */
  974. //m_dwBaseChkTime-m_dwBaseCmdTime+ELTimer_GetServerMSec();
  975. SCommand kCmdNew;
  976. kCmdNew.m_kPPosDst = c_rkPPosDst;
  977. kCmdNew.m_dwChkTime = dwCmdTime+m_nAverageNetworkGap;//m_dwBaseChkTime + (dwCmdTime - m_dwBaseCmdTime);// + nNetworkGap;
  978. kCmdNew.m_dwCmdTime = dwCmdTime;
  979. kCmdNew.m_fDstRot = fDstRot;
  980. kCmdNew.m_eFunc = eFunc;
  981. kCmdNew.m_uArg = uArg;
  982. m_kQue_kCmdNew.push_back(kCmdNew);
  983. //int nApplyGap=kCmdNew.m_dwChkTime-ELTimer_GetServerFrameMSec();
  984. //if (nApplyGap<-500 || nApplyGap>500)
  985. // Tracenf("VID[%d] NAME[%s] ³×Æ®¿÷°¸ [cur:%d ave:%d] ÀÛµ¿½Ã°£ (%d)", GetVirtualID(), GetNameString(), nNetworkGap, m_nAverageNetworkGap, nApplyGap);
  986. }
  987. /*
  988. CInstanceBase::TStateQueue::iterator CInstanceBase::FindSameState(TStateQueue& rkQuekStt, DWORD dwCmdTime, UINT eFunc, UINT uArg)
  989. {
  990. TStateQueue::iterator i=rkQuekStt.begin();
  991. while (rkQuekStt.end()!=i)
  992. {
  993. SState& rkSttEach=*i;
  994. if (rkSttEach.m_dwCmdTime==dwCmdTime)
  995. if (rkSttEach.m_eFunc==eFunc)
  996. if (rkSttEach.m_uArg==uArg)
  997. break;
  998. ++i;
  999. }
  1000. return i;
  1001. }
  1002. */
  1003. BOOL CInstanceBase::__CanProcessNetworkStatePacket()
  1004. {
  1005. if (m_GraphicThingInstance.IsDead())
  1006. return FALSE;
  1007. if (m_GraphicThingInstance.IsKnockDown())
  1008. return FALSE;
  1009. if (m_GraphicThingInstance.IsUsingSkill())
  1010. if (!m_GraphicThingInstance.CanCancelSkill())
  1011. return FALSE;
  1012. return TRUE;
  1013. }
  1014. BOOL CInstanceBase::__IsEnableTCPProcess(UINT eCurFunc)
  1015. {
  1016. if (m_GraphicThingInstance.IsActEmotion())
  1017. {
  1018. return FALSE;
  1019. }
  1020. if (!m_bEnableTCPState)
  1021. {
  1022. if (FUNC_EMOTION != eCurFunc)
  1023. {
  1024. return FALSE;
  1025. }
  1026. }
  1027. return TRUE;
  1028. }
  1029. void CInstanceBase::StateProcess()
  1030. {
  1031. while (1)
  1032. {
  1033. if (m_kQue_kCmdNew.empty())
  1034. return;
  1035. DWORD dwDstChkTime = m_kQue_kCmdNew.front().m_dwChkTime;
  1036. DWORD dwCurChkTime = ELTimer_GetServerFrameMSec();
  1037. if (dwCurChkTime < dwDstChkTime)
  1038. return;
  1039. SCommand kCmdTop = m_kQue_kCmdNew.front();
  1040. m_kQue_kCmdNew.pop_front();
  1041. TPixelPosition kPPosDst = kCmdTop.m_kPPosDst;
  1042. //DWORD dwCmdTime = kCmdTop.m_dwCmdTime;
  1043. FLOAT fRotDst = kCmdTop.m_fDstRot;
  1044. UINT eFunc = kCmdTop.m_eFunc;
  1045. UINT uArg = kCmdTop.m_uArg;
  1046. UINT uVID = GetVirtualID();
  1047. UINT uTargetVID = kCmdTop.m_uTargetVID;
  1048. TPixelPosition kPPosCur;
  1049. NEW_GetPixelPosition(&kPPosCur);
  1050. /*
  1051. if (IsPC())
  1052. Tracenf("%d cmd: vid=%d[%s] func=%d arg=%d curPos=(%f, %f) dstPos=(%f, %f) rot=%f (time %d)",
  1053. ELTimer_GetMSec(),
  1054. uVID, m_stName.c_str(), eFunc, uArg,
  1055. kPPosCur.x, kPPosCur.y,
  1056. kPPosDst.x, kPPosDst.y, fRotDst, dwCmdTime-m_dwBaseCmdTime);
  1057. */
  1058. TPixelPosition kPPosDir = kPPosDst - kPPosCur;
  1059. float fDirLen = (float)sqrt(kPPosDir.x * kPPosDir.x + kPPosDir.y * kPPosDir.y);
  1060. //Tracenf("°Å¸® %f", fDirLen);
  1061. if (!__CanProcessNetworkStatePacket())
  1062. {
  1063. Lognf(0, "vid=%d ¿òÁ÷ÀÏ ¼ö ¾ø´Â »óÅÂ¶ó ½ºÅµ IsDead=%d, IsKnockDown=%d", uVID, m_GraphicThingInstance.IsDead(), m_GraphicThingInstance.IsKnockDown());
  1064. return;
  1065. }
  1066. if (!__IsEnableTCPProcess(eFunc))
  1067. {
  1068. return;
  1069. }
  1070. switch (eFunc)
  1071. {
  1072. case FUNC_WAIT:
  1073. {
  1074. //Tracenf("%s (%f, %f) -> (%f, %f) ³²Àº°Å¸® %f", GetNameString(), kPPosCur.x, kPPosCur.y, kPPosDst.x, kPPosDst.y, fDirLen);
  1075. if (fDirLen > 1.0f)
  1076. {
  1077. //NEW_GetSrcPixelPositionRef() = kPPosCur;
  1078. //NEW_GetDstPixelPositionRef() = kPPosDst;
  1079. NEW_SetSrcPixelPosition(kPPosCur);
  1080. NEW_SetDstPixelPosition(kPPosDst);
  1081. __EnableSkipCollision();
  1082. m_fDstRot = fRotDst;
  1083. m_isGoing = TRUE;
  1084. m_kMovAfterFunc.eFunc = FUNC_WAIT;
  1085. if (!IsWalking())
  1086. StartWalking();
  1087. //Tracen("¸ñÇ¥Á¤Áö");
  1088. }
  1089. else
  1090. {
  1091. //Tracen("ÇöÀç Á¤Áö");
  1092. m_isGoing = FALSE;
  1093. if (!IsWaiting())
  1094. EndWalking();
  1095. SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
  1096. SetAdvancingRotation(fRotDst);
  1097. SetRotation(fRotDst);
  1098. }
  1099. break;
  1100. }
  1101. case FUNC_MOVE:
  1102. {
  1103. //NEW_GetSrcPixelPositionRef() = kPPosCur;
  1104. //NEW_GetDstPixelPositionRef() = kPPosDst;
  1105. NEW_SetSrcPixelPosition(kPPosCur);
  1106. NEW_SetDstPixelPosition(kPPosDst);
  1107. m_fDstRot = fRotDst;
  1108. m_isGoing = TRUE;
  1109. __EnableSkipCollision();
  1110. //m_isSyncMov = TRUE;
  1111. m_kMovAfterFunc.eFunc = FUNC_MOVE;
  1112. if (!IsWalking())
  1113. {
  1114. //Tracen("°È°í ÀÖÁö ¾Ê¾Æ °È±â ½ÃÀÛ");
  1115. StartWalking();
  1116. }
  1117. else
  1118. {
  1119. //Tracen("ÀÌ¹Ì °È´ÂÁß ");
  1120. }
  1121. break;
  1122. }
  1123. case FUNC_COMBO:
  1124. {
  1125. if (fDirLen >= 50.0f)
  1126. {
  1127. NEW_SetSrcPixelPosition(kPPosCur);
  1128. NEW_SetDstPixelPosition(kPPosDst);
  1129. m_fDstRot=fRotDst;
  1130. m_isGoing = TRUE;
  1131. __EnableSkipCollision();
  1132. m_kMovAfterFunc.eFunc = FUNC_COMBO;
  1133. m_kMovAfterFunc.uArg = uArg;
  1134. if (!IsWalking())
  1135. StartWalking();
  1136. }
  1137. else
  1138. {
  1139. //Tracen("´ë±â °ø°İ Á¤Áö");
  1140. m_isGoing = FALSE;
  1141. if (IsWalking())
  1142. EndWalking();
  1143. SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
  1144. RunComboAttack(fRotDst, uArg);
  1145. }
  1146. break;
  1147. }
  1148. case FUNC_ATTACK:
  1149. {
  1150. if (fDirLen>=50.0f)
  1151. {
  1152. //NEW_GetSrcPixelPositionRef() = kPPosCur;
  1153. //NEW_GetDstPixelPositionRef() = kPPosDst;
  1154. NEW_SetSrcPixelPosition(kPPosCur);
  1155. NEW_SetDstPixelPosition(kPPosDst);
  1156. m_fDstRot = fRotDst;
  1157. m_isGoing = TRUE;
  1158. __EnableSkipCollision();
  1159. //m_isSyncMov = TRUE;
  1160. m_kMovAfterFunc.eFunc = FUNC_ATTACK;
  1161. if (!IsWalking())
  1162. StartWalking();
  1163. //Tracen("³Ê¹« ¸Ö¾î¼­ À̵¿ ÈÄ °ø°İ");
  1164. }
  1165. else
  1166. {
  1167. //Tracen("³ë¸» °ø°İ Á¤Áö");
  1168. m_isGoing = FALSE;
  1169. if (IsWalking())
  1170. EndWalking();
  1171. SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
  1172. BlendRotation(fRotDst);
  1173. RunNormalAttack(fRotDst);
  1174. //Tracen("°¡±õ±â ¶§¹®¿¡ ¿öÇÁ °ø°İ");
  1175. }
  1176. break;
  1177. }
  1178. case FUNC_MOB_SKILL:
  1179. {
  1180. if (fDirLen >= 50.0f)
  1181. {
  1182. NEW_SetSrcPixelPosition(kPPosCur);
  1183. NEW_SetDstPixelPosition(kPPosDst);
  1184. m_fDstRot = fRotDst;
  1185. m_isGoing = TRUE;
  1186. __EnableSkipCollision();
  1187. m_kMovAfterFunc.eFunc = FUNC_MOB_SKILL;
  1188. m_kMovAfterFunc.uArg = uArg;
  1189. if (!IsWalking())
  1190. StartWalking();
  1191. }
  1192. else
  1193. {
  1194. m_isGoing = FALSE;
  1195. if (IsWalking())
  1196. EndWalking();
  1197. SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
  1198. BlendRotation(fRotDst);
  1199. m_GraphicThingInstance.InterceptOnceMotion(CRaceMotionData::NAME_SPECIAL_1 + uArg);
  1200. }
  1201. break;
  1202. }
  1203. case FUNC_EMOTION:
  1204. {
  1205. if (fDirLen>100.0f)
  1206. {
  1207. NEW_SetSrcPixelPosition(kPPosCur);
  1208. NEW_SetDstPixelPosition(kPPosDst);
  1209. m_fDstRot = fRotDst;
  1210. m_isGoing = TRUE;
  1211. if (__IsMainInstance())
  1212. __EnableSkipCollision();
  1213. m_kMovAfterFunc.eFunc = FUNC_EMOTION;
  1214. m_kMovAfterFunc.uArg = uArg;
  1215. m_kMovAfterFunc.uArgExpanded = uTargetVID;
  1216. m_kMovAfterFunc.kPosDst = kPPosDst;
  1217. if (!IsWalking())
  1218. StartWalking();
  1219. }
  1220. else
  1221. {
  1222. __ProcessFunctionEmotion(uArg, uTargetVID, kPPosDst);
  1223. }
  1224. break;
  1225. }
  1226. default:
  1227. {
  1228. if (eFunc & FUNC_SKILL)
  1229. {
  1230. if (fDirLen >= 50.0f)
  1231. {
  1232. //NEW_GetSrcPixelPositionRef() = kPPosCur;
  1233. //NEW_GetDstPixelPositionRef() = kPPosDst;
  1234. NEW_SetSrcPixelPosition(kPPosCur);
  1235. NEW_SetDstPixelPosition(kPPosDst);
  1236. m_fDstRot = fRotDst;
  1237. m_isGoing = TRUE;
  1238. //m_isSyncMov = TRUE;
  1239. __EnableSkipCollision();
  1240. m_kMovAfterFunc.eFunc = eFunc;
  1241. m_kMovAfterFunc.uArg = uArg;
  1242. if (!IsWalking())
  1243. StartWalking();
  1244. //Tracen("³Ê¹« ¸Ö¾î¼­ À̵¿ ÈÄ °ø°İ");
  1245. }
  1246. else
  1247. {
  1248. //Tracen("½ºÅ³ Á¤Áö");
  1249. m_isGoing = FALSE;
  1250. if (IsWalking())
  1251. EndWalking();
  1252. SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
  1253. SetAdvancingRotation(fRotDst);
  1254. SetRotation(fRotDst);
  1255. NEW_UseSkill(0, eFunc & 0x7f, uArg&0x0f, (uArg>>4) ? true : false);
  1256. //Tracen("°¡±õ±â ¶§¹®¿¡ ¿öÇÁ °ø°İ");
  1257. }
  1258. }
  1259. break;
  1260. }
  1261. }
  1262. }
  1263. }
  1264. void CInstanceBase::MovementProcess()
  1265. {
  1266. TPixelPosition kPPosCur;
  1267. NEW_GetPixelPosition(&kPPosCur);
  1268. // ·»´õ¸µ ÁÂÇ¥°èÀ̹ǷΠy¸¦ -È­ÇØ¼­ ´õÇÑ´Ù.
  1269. TPixelPosition kPPosNext;
  1270. {
  1271. const D3DXVECTOR3 & c_rkV3Mov = m_GraphicThingInstance.GetMovementVectorRef();
  1272. kPPosNext.x = kPPosCur.x + (+c_rkV3Mov.x);
  1273. kPPosNext.y = kPPosCur.y + (-c_rkV3Mov.y);
  1274. kPPosNext.z = kPPosCur.z + (+c_rkV3Mov.z);
  1275. }
  1276. TPixelPosition kPPosDeltaSC = kPPosCur - NEW_GetSrcPixelPositionRef();
  1277. TPixelPosition kPPosDeltaSN = kPPosNext - NEW_GetSrcPixelPositionRef();
  1278. TPixelPosition kPPosDeltaSD = NEW_GetDstPixelPositionRef() - NEW_GetSrcPixelPositionRef();
  1279. float fCurLen = sqrtf(kPPosDeltaSC.x * kPPosDeltaSC.x + kPPosDeltaSC.y * kPPosDeltaSC.y);
  1280. float fNextLen = sqrtf(kPPosDeltaSN.x * kPPosDeltaSN.x + kPPosDeltaSN.y * kPPosDeltaSN.y);
  1281. float fTotalLen = sqrtf(kPPosDeltaSD.x * kPPosDeltaSD.x + kPPosDeltaSD.y * kPPosDeltaSD.y);
  1282. float fRestLen = fTotalLen - fCurLen;
  1283. if (__IsMainInstance())
  1284. {
  1285. if (m_isGoing && IsWalking())
  1286. {
  1287. float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(NEW_GetSrcPixelPositionRef(), NEW_GetDstPixelPositionRef());
  1288. SetAdvancingRotation(fDstRot);
  1289. if (fRestLen<=0.0)
  1290. {
  1291. if (IsWalking())
  1292. EndWalking();
  1293. //Tracen("¸ñÇ¥ µµ´Ş Á¤Áö");
  1294. m_isGoing = FALSE;
  1295. BlockMovement();
  1296. if (FUNC_EMOTION == m_kMovAfterFunc.eFunc)
  1297. {
  1298. DWORD dwMotionNumber = m_kMovAfterFunc.uArg;
  1299. DWORD dwTargetVID = m_kMovAfterFunc.uArgExpanded;
  1300. __ProcessFunctionEmotion(dwMotionNumber, dwTargetVID, m_kMovAfterFunc.kPosDst);
  1301. m_kMovAfterFunc.eFunc = FUNC_WAIT;
  1302. return;
  1303. }
  1304. }
  1305. }
  1306. }
  1307. else
  1308. {
  1309. if (m_isGoing && IsWalking())
  1310. {
  1311. float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(NEW_GetSrcPixelPositionRef(), NEW_GetDstPixelPositionRef());
  1312. SetAdvancingRotation(fDstRot);
  1313. // ¸¸¾à ·»ÅϽð¡ ´Ê¾î ³Ê¹« ¸¹ÀÌ À̵¿Çß´Ù¸é..
  1314. if (fRestLen < -100.0f)
  1315. {
  1316. NEW_SetSrcPixelPosition(kPPosCur);
  1317. float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(kPPosCur, NEW_GetDstPixelPositionRef());
  1318. SetAdvancingRotation(fDstRot);
  1319. //Tracenf("VID %d ¿À¹ö ¹æÇâ¼³Á¤ (%f, %f) %f rest %f", GetVirtualID(), kPPosCur.x, kPPosCur.y, fDstRot, fRestLen);
  1320. // À̵¿ÁßÀ̶ó¸é ´ÙÀ½¹ø¿¡ ¸ØÃß°Ô ÇÑ´Ù
  1321. if (FUNC_MOVE == m_kMovAfterFunc.eFunc)
  1322. {
  1323. m_kMovAfterFunc.eFunc = FUNC_WAIT;
  1324. }
  1325. }
  1326. // µµÂøÇß´Ù¸é...
  1327. else if (fCurLen <= fTotalLen && fTotalLen <= fNextLen)
  1328. {
  1329. if (m_GraphicThingInstance.IsDead() || m_GraphicThingInstance.IsKnockDown())
  1330. {
  1331. __DisableSkipCollision();
  1332. //Tracen("»ç¸Á »óÅÂ¶ó µ¿ÀÛ ½ºÅµ");
  1333. m_isGoing = FALSE;
  1334. //Tracen("Çൿ ºÒ´É »óŶó ÀÌÈÄ µ¿ÀÛ ½ºÅµ");
  1335. }
  1336. else
  1337. {
  1338. switch (m_kMovAfterFunc.eFunc)
  1339. {
  1340. case FUNC_ATTACK:
  1341. {
  1342. if (IsWalking())
  1343. EndWalking();
  1344. __DisableSkipCollision();
  1345. m_isGoing = FALSE;
  1346. BlockMovement();
  1347. SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
  1348. SetAdvancingRotation(m_fDstRot);
  1349. SetRotation(m_fDstRot);
  1350. RunNormalAttack(m_fDstRot);
  1351. break;
  1352. }
  1353. case FUNC_COMBO:
  1354. {
  1355. if (IsWalking())
  1356. EndWalking();
  1357. __DisableSkipCollision();
  1358. m_isGoing = FALSE;
  1359. BlockMovement();
  1360. SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
  1361. RunComboAttack(m_fDstRot, m_kMovAfterFunc.uArg);
  1362. break;
  1363. }
  1364. case FUNC_EMOTION:
  1365. {
  1366. m_isGoing = FALSE;
  1367. m_kMovAfterFunc.eFunc = FUNC_WAIT;
  1368. __DisableSkipCollision();
  1369. BlockMovement();
  1370. DWORD dwMotionNumber = m_kMovAfterFunc.uArg;
  1371. DWORD dwTargetVID = m_kMovAfterFunc.uArgExpanded;
  1372. __ProcessFunctionEmotion(dwMotionNumber, dwTargetVID, m_kMovAfterFunc.kPosDst);
  1373. break;
  1374. }
  1375. case FUNC_MOVE:
  1376. {
  1377. break;
  1378. }
  1379. case FUNC_MOB_SKILL:
  1380. {
  1381. if (IsWalking())
  1382. EndWalking();
  1383. __DisableSkipCollision();
  1384. m_isGoing = FALSE;
  1385. BlockMovement();
  1386. SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
  1387. SetAdvancingRotation(m_fDstRot);
  1388. SetRotation(m_fDstRot);
  1389. m_GraphicThingInstance.InterceptOnceMotion(CRaceMotionData::NAME_SPECIAL_1 + m_kMovAfterFunc.uArg);
  1390. break;
  1391. }
  1392. default:
  1393. {
  1394. if (m_kMovAfterFunc.eFunc & FUNC_SKILL)
  1395. {
  1396. SetAdvancingRotation(m_fDstRot);
  1397. BlendRotation(m_fDstRot);
  1398. NEW_UseSkill(0, m_kMovAfterFunc.eFunc & 0x7f, m_kMovAfterFunc.uArg&0x0f, (m_kMovAfterFunc.uArg>>4) ? true : false);
  1399. }
  1400. else
  1401. {
  1402. //Tracenf("VID %d ½ºÅ³ °ø°İ (%f, %f) rot %f", GetVirtualID(), NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y, m_fDstRot);
  1403. __DisableSkipCollision();
  1404. m_isGoing = FALSE;
  1405. BlockMovement();
  1406. SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
  1407. SetAdvancingRotation(m_fDstRot);
  1408. BlendRotation(m_fDstRot);
  1409. if (!IsWaiting())
  1410. {
  1411. EndWalking();
  1412. }
  1413. //Tracenf("VID %d Á¤Áö (%f, %f) rot %f IsWalking %d", GetVirtualID(), NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y, m_fDstRot, IsWalking());
  1414. }
  1415. break;
  1416. }
  1417. }
  1418. }
  1419. }
  1420. }
  1421. }
  1422. if (IsWalking() || m_GraphicThingInstance.IsUsingMovingSkill())
  1423. {
  1424. float fRotation = m_GraphicThingInstance.GetRotation();
  1425. float fAdvancingRotation = m_GraphicThingInstance.GetAdvancingRotation();
  1426. int iDirection = GetRotatingDirection(fRotation, fAdvancingRotation);
  1427. if (DEGREE_DIRECTION_SAME != m_iRotatingDirection)
  1428. {
  1429. if (DEGREE_DIRECTION_LEFT == iDirection)
  1430. {
  1431. fRotation = fmodf(fRotation + m_fRotSpd*m_GraphicThingInstance.GetSecondElapsed(), 360.0f);
  1432. }
  1433. else if (DEGREE_DIRECTION_RIGHT == iDirection)
  1434. {
  1435. fRotation = fmodf(fRotation - m_fRotSpd*m_GraphicThingInstance.GetSecondElapsed() + 360.0f, 360.0f);
  1436. }
  1437. if (m_iRotatingDirection != GetRotatingDirection(fRotation, fAdvancingRotation))
  1438. {
  1439. m_iRotatingDirection = DEGREE_DIRECTION_SAME;
  1440. fRotation = fAdvancingRotation;
  1441. }
  1442. m_GraphicThingInstance.SetRotation(fRotation);
  1443. }
  1444. if (__IsInDustRange())
  1445. {
  1446. float fDustDistance = NEW_GetDistanceFromDestPixelPosition(m_kPPosDust);
  1447. if (IsMountingHorse())
  1448. {
  1449. if (fDustDistance > ms_fHorseDustGap)
  1450. {
  1451. NEW_GetPixelPosition(&m_kPPosDust);
  1452. __AttachEffect(EFFECT_HORSE_DUST);
  1453. }
  1454. }
  1455. else
  1456. {
  1457. if (fDustDistance > ms_fDustGap)
  1458. {
  1459. NEW_GetPixelPosition(&m_kPPosDust);
  1460. __AttachEffect(EFFECT_DUST);
  1461. }
  1462. }
  1463. }
  1464. }
  1465. }
  1466. void CInstanceBase::__ProcessFunctionEmotion(DWORD dwMotionNumber, DWORD dwTargetVID, const TPixelPosition & c_rkPosDst)
  1467. {
  1468. if (IsWalking())
  1469. EndWalkingWithoutBlending();
  1470. __EnableChangingTCPState();
  1471. SCRIPT_SetPixelPosition(c_rkPosDst.x, c_rkPosDst.y);
  1472. CInstanceBase * pTargetInstance = CPythonCharacterManager::Instance().GetInstancePtr(dwTargetVID);
  1473. if (pTargetInstance)
  1474. {
  1475. pTargetInstance->__EnableChangingTCPState();
  1476. if (pTargetInstance->IsWalking())
  1477. pTargetInstance->EndWalkingWithoutBlending();
  1478. WORD wMotionNumber1 = HIWORD(dwMotionNumber);
  1479. WORD wMotionNumber2 = LOWORD(dwMotionNumber);
  1480. int src_job = RaceToJob(GetRace());
  1481. int dst_job = RaceToJob(pTargetInstance->GetRace());
  1482. NEW_LookAtDestInstance(*pTargetInstance);
  1483. m_GraphicThingInstance.InterceptOnceMotion(wMotionNumber1 + dst_job);
  1484. m_GraphicThingInstance.SetRotation(m_GraphicThingInstance.GetTargetRotation());
  1485. m_GraphicThingInstance.SetAdvancingRotation(m_GraphicThingInstance.GetTargetRotation());
  1486. pTargetInstance->NEW_LookAtDestInstance(*this);
  1487. pTargetInstance->m_GraphicThingInstance.InterceptOnceMotion(wMotionNumber2 + src_job);
  1488. pTargetInstance->m_GraphicThingInstance.SetRotation(pTargetInstance->m_GraphicThingInstance.GetTargetRotation());
  1489. pTargetInstance->m_GraphicThingInstance.SetAdvancingRotation(pTargetInstance->m_GraphicThingInstance.GetTargetRotation());
  1490. if (pTargetInstance->__IsMainInstance())
  1491. {
  1492. IAbstractPlayer & rPlayer=IAbstractPlayer::GetSingleton();
  1493. rPlayer.EndEmotionProcess();
  1494. }
  1495. }
  1496. if (__IsMainInstance())
  1497. {
  1498. IAbstractPlayer & rPlayer=IAbstractPlayer::GetSingleton();
  1499. rPlayer.EndEmotionProcess();
  1500. }
  1501. }
  1502. ///////////////////////////////////////////////////////////////////////////////////////////////////
  1503. // Update & Deform & Render
  1504. int g_iAccumulationTime = 0;
  1505. void CInstanceBase::Update()
  1506. {
  1507. ++ms_dwUpdateCounter;
  1508. StateProcess();
  1509. m_GraphicThingInstance.PhysicsProcess();
  1510. m_GraphicThingInstance.RotationProcess();
  1511. m_GraphicThingInstance.ComboProcess();
  1512. m_GraphicThingInstance.AccumulationMovement();
  1513. if (m_GraphicThingInstance.IsMovement())
  1514. {
  1515. TPixelPosition kPPosCur;
  1516. NEW_GetPixelPosition(&kPPosCur);
  1517. DWORD dwCurTime=ELTimer_GetFrameMSec();
  1518. //if (m_dwNextUpdateHeightTime<dwCurTime)
  1519. {
  1520. m_dwNextUpdateHeightTime=dwCurTime;
  1521. kPPosCur.z = __GetBackgroundHeight(kPPosCur.x, kPPosCur.y);
  1522. NEW_SetPixelPosition(kPPosCur);
  1523. }
  1524. // SetMaterialColor
  1525. {
  1526. DWORD dwMtrlColor=__GetShadowMapColor(kPPosCur.x, kPPosCur.y);
  1527. m_GraphicThingInstance.SetMaterialColor(dwMtrlColor);
  1528. }
  1529. }
  1530. m_GraphicThingInstance.UpdateAdvancingPointInstance();
  1531. AttackProcess();
  1532. MovementProcess();
  1533. m_GraphicThingInstance.MotionProcess(IsPC());
  1534. if (IsMountingHorse())
  1535. {
  1536. m_kHorse.m_pkActor->HORSE_MotionProcess(FALSE);
  1537. }
  1538. __ComboProcess();
  1539. ProcessDamage();
  1540. }
  1541. void CInstanceBase::Transform()
  1542. {
  1543. if (__IsSyncing())
  1544. {
  1545. //OnSyncing();
  1546. }
  1547. else
  1548. {
  1549. if (IsWalking() || m_GraphicThingInstance.IsUsingMovingSkill())
  1550. {
  1551. const D3DXVECTOR3& c_rv3Movment=m_GraphicThingInstance.GetMovementVectorRef();
  1552. float len=(c_rv3Movment.x*c_rv3Movment.x)+(c_rv3Movment.y*c_rv3Movment.y);
  1553. if (len>1.0f)
  1554. OnMoving();
  1555. else
  1556. OnWaiting();
  1557. }
  1558. }
  1559. m_GraphicThingInstance.INSTANCEBASE_Transform();
  1560. }
  1561. void CInstanceBase::Deform()
  1562. {
  1563. // 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Î º¯°æ
  1564. if (!__CanRender())
  1565. return;
  1566. ++ms_dwDeformCounter;
  1567. m_GraphicThingInstance.INSTANCEBASE_Deform();
  1568. m_kHorse.Deform();
  1569. }
  1570. void CInstanceBase::RenderTrace()
  1571. {
  1572. if (!__CanRender())
  1573. return;
  1574. m_GraphicThingInstance.RenderTrace();
  1575. }
  1576. void CInstanceBase::Render()
  1577. {
  1578. // 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Î º¯°æ
  1579. if (!__CanRender())
  1580. return;
  1581. ++ms_dwRenderCounter;
  1582. m_kHorse.Render();
  1583. m_GraphicThingInstance.Render();
  1584. if (CActorInstance::IsDirLine())
  1585. {
  1586. if (NEW_GetDstPixelPositionRef().x != 0.0f)
  1587. {
  1588. static CScreen s_kScreen;
  1589. STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
  1590. STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
  1591. STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  1592. STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, FALSE);
  1593. STATEMANAGER.SetRenderState(D3DRS_FOGENABLE, FALSE);
  1594. STATEMANAGER.SetRenderState(D3DRS_LIGHTING, FALSE);
  1595. TPixelPosition px;
  1596. m_GraphicThingInstance.GetPixelPosition(&px);
  1597. D3DXVECTOR3 kD3DVt3Cur(px.x, px.y, px.z);
  1598. //D3DXVECTOR3 kD3DVt3Cur(NEW_GetSrcPixelPositionRef().x, -NEW_GetSrcPixelPositionRef().y, NEW_GetSrcPixelPositionRef().z);
  1599. D3DXVECTOR3 kD3DVt3Dest(NEW_GetDstPixelPositionRef().x, -NEW_GetDstPixelPositionRef().y, NEW_GetDstPixelPositionRef().z);
  1600. //printf("%s %f\n", GetNameString(), kD3DVt3Cur.y - kD3DVt3Dest.y);
  1601. //float fdx = NEW_GetDstPixelPositionRef().x - NEW_GetSrcPixelPositionRef().x;
  1602. //float fdy = NEW_GetDstPixelPositionRef().y - NEW_GetSrcPixelPositionRef().y;
  1603. s_kScreen.SetDiffuseColor(0.0f, 0.0f, 1.0f);
  1604. s_kScreen.RenderLine3d(kD3DVt3Cur.x, kD3DVt3Cur.y, px.z, kD3DVt3Dest.x, kD3DVt3Dest.y, px.z);
  1605. STATEMANAGER.RestoreRenderState(D3DRS_ZENABLE);
  1606. STATEMANAGER.SetRenderState(D3DRS_FOGENABLE, TRUE);
  1607. STATEMANAGER.SetRenderState(D3DRS_LIGHTING, TRUE);
  1608. }
  1609. }
  1610. }
  1611. void CInstanceBase::RenderToShadowMap()
  1612. {
  1613. if (IsDoor())
  1614. return;
  1615. if (IsBuilding())
  1616. return;
  1617. if (!__CanRender())
  1618. return;
  1619. if (!__IsExistMainInstance())
  1620. return;
  1621. CInstanceBase* pkInstMain=__GetMainInstancePtr();
  1622. const float SHADOW_APPLY_DISTANCE = 2500.0f;
  1623. float fDistance=NEW_GetDistanceFromDestInstance(*pkInstMain);
  1624. if (fDistance>=SHADOW_APPLY_DISTANCE)
  1625. return;
  1626. m_GraphicThingInstance.RenderToShadowMap();
  1627. }
  1628. void CInstanceBase::RenderCollision()
  1629. {
  1630. m_GraphicThingInstance.RenderCollisionData();
  1631. }
  1632. ///////////////////////////////////////////////////////////////////////////////////////////////////
  1633. // Setting & Getting Data
  1634. void CInstanceBase::SetVirtualID(DWORD dwVirtualID)
  1635. {
  1636. m_GraphicThingInstance.SetVirtualID(dwVirtualID);
  1637. }
  1638. void CInstanceBase::SetVirtualNumber(DWORD dwVirtualNumber)
  1639. {
  1640. m_dwVirtualNumber = dwVirtualNumber;
  1641. }
  1642. void CInstanceBase::SetInstanceType(int iInstanceType)
  1643. {
  1644. m_GraphicThingInstance.SetActorType(iInstanceType);
  1645. }
  1646. void CInstanceBase::SetAlignment(short sAlignment)
  1647. {
  1648. m_sAlignment = sAlignment;
  1649. RefreshTextTailTitle();
  1650. }
  1651. void CInstanceBase::SetPKMode(BYTE byPKMode)
  1652. {
  1653. if (m_byPKMode == byPKMode)
  1654. return;
  1655. m_byPKMode = byPKMode;
  1656. if (__IsMainInstance())
  1657. {
  1658. IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
  1659. rPlayer.NotifyChangePKMode();
  1660. }
  1661. }
  1662. void CInstanceBase::SetKiller(bool bFlag)
  1663. {
  1664. if (m_isKiller == bFlag)
  1665. return;
  1666. m_isKiller = bFlag;
  1667. RefreshTextTail();
  1668. }
  1669. void CInstanceBase::SetPartyMemberFlag(bool bFlag)
  1670. {
  1671. m_isPartyMember = bFlag;
  1672. }
  1673. void CInstanceBase::SetStateFlags(DWORD dwStateFlags)
  1674. {
  1675. if (dwStateFlags & ADD_CHARACTER_STATE_KILLER)
  1676. SetKiller(TRUE);
  1677. else
  1678. SetKiller(FALSE);
  1679. if (dwStateFlags & ADD_CHARACTER_STATE_PARTY)
  1680. SetPartyMemberFlag(TRUE);
  1681. else
  1682. SetPartyMemberFlag(FALSE);
  1683. }
  1684. void CInstanceBase::SetComboType(UINT uComboType)
  1685. {
  1686. m_GraphicThingInstance.SetComboType(uComboType);
  1687. }
  1688. const char * CInstanceBase::GetNameString()
  1689. {
  1690. return m_stName.c_str();
  1691. }
  1692. DWORD CInstanceBase::GetRace()
  1693. {
  1694. return m_dwRace;
  1695. }
  1696. bool CInstanceBase::IsConflictAlignmentInstance(CInstanceBase& rkInstVictim)
  1697. {
  1698. if (PK_MODE_PROTECT == rkInstVictim.GetPKMode())
  1699. return false;
  1700. switch (GetAlignmentType())
  1701. {
  1702. case ALIGNMENT_TYPE_NORMAL:
  1703. case ALIGNMENT_TYPE_WHITE:
  1704. if (ALIGNMENT_TYPE_DARK == rkInstVictim.GetAlignmentType())
  1705. return true;
  1706. break;
  1707. case ALIGNMENT_TYPE_DARK:
  1708. if (GetAlignmentType() != rkInstVictim.GetAlignmentType())
  1709. return true;
  1710. break;
  1711. }
  1712. return false;
  1713. }
  1714. void CInstanceBase::SetDuelMode(DWORD type)
  1715. {
  1716. m_dwDuelMode = type;
  1717. }
  1718. DWORD CInstanceBase::GetDuelMode()
  1719. {
  1720. return m_dwDuelMode;
  1721. }
  1722. bool CInstanceBase::IsAttackableInstance(CInstanceBase& rkInstVictim)
  1723. {
  1724. #ifdef ENABLE_SUPPORT_SYSTEM
  1725. if (rkInstVictim.GetInstanceType() == CActorInstance::TYPE_NPC && rkInstVictim.GetRace() == 3)
  1726. {
  1727. return false;
  1728. }
  1729. #endif
  1730. if (__IsMainInstance())
  1731. {
  1732. CPythonPlayer& rkPlayer=CPythonPlayer::Instance();
  1733. if(rkPlayer.IsObserverMode())
  1734. return false;
  1735. }
  1736. if (GetVirtualID() == rkInstVictim.GetVirtualID())
  1737. return false;
  1738. if (IsStone())
  1739. {
  1740. if (rkInstVictim.IsPC())
  1741. return true;
  1742. }
  1743. else if (IsPC())
  1744. {
  1745. if (rkInstVictim.IsStone())
  1746. return true;
  1747. if (rkInstVictim.IsPC())
  1748. {
  1749. if (GetDuelMode())
  1750. {
  1751. switch(GetDuelMode())
  1752. {
  1753. case DUEL_CANNOTATTACK:
  1754. return false;
  1755. case DUEL_START:
  1756. if(__FindDUELKey(GetVirtualID(),rkInstVictim.GetVirtualID()))
  1757. return true;
  1758. else
  1759. return false;
  1760. }
  1761. }
  1762. if (PK_MODE_GUILD == GetPKMode())
  1763. if (GetGuildID() == rkInstVictim.GetGuildID())
  1764. return false;
  1765. if (rkInstVictim.IsKiller())
  1766. if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
  1767. return true;
  1768. if (PK_MODE_PROTECT != GetPKMode())
  1769. {
  1770. if (PK_MODE_FREE == GetPKMode())
  1771. {
  1772. if (PK_MODE_PROTECT != rkInstVictim.GetPKMode())
  1773. if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
  1774. return true;
  1775. }
  1776. if (PK_MODE_GUILD == GetPKMode())
  1777. {
  1778. if (PK_MODE_PROTECT != rkInstVictim.GetPKMode())
  1779. if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
  1780. if (GetGuildID() != rkInstVictim.GetGuildID())
  1781. return true;
  1782. }
  1783. }
  1784. if (IsSameEmpire(rkInstVictim))
  1785. {
  1786. if (IsPVPInstance(rkInstVictim))
  1787. return true;
  1788. if (PK_MODE_REVENGE == GetPKMode())
  1789. if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
  1790. if (IsConflictAlignmentInstance(rkInstVictim))
  1791. return true;
  1792. }
  1793. else
  1794. {
  1795. return true;
  1796. }
  1797. }
  1798. if (rkInstVictim.IsEnemy())
  1799. return true;
  1800. if (rkInstVictim.IsWoodenDoor())
  1801. return true;
  1802. }
  1803. else if (IsEnemy())
  1804. {
  1805. if (rkInstVictim.IsPC())
  1806. return true;
  1807. if (rkInstVictim.IsBuilding())
  1808. return true;
  1809. }
  1810. else if (IsPoly())
  1811. {
  1812. if (rkInstVictim.IsPC())
  1813. return true;
  1814. if (rkInstVictim.IsEnemy())
  1815. return true;
  1816. }
  1817. return false;
  1818. }
  1819. bool CInstanceBase::IsTargetableInstance(CInstanceBase& rkInstVictim)
  1820. {
  1821. return rkInstVictim.CanPickInstance();
  1822. }
  1823. // 2004. 07. 07. [levites] - ½ºÅ³ »ç¿ëÁß Å¸°ÙÀÌ ¹Ù²î´Â ¹®Á¦ ÇØ°áÀ» À§ÇÑ ÄÚµå
  1824. bool CInstanceBase::CanChangeTarget()
  1825. {
  1826. return m_GraphicThingInstance.CanChangeTarget();
  1827. }
  1828. // 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Î º¯°æ
  1829. bool CInstanceBase::CanPickInstance()
  1830. {
  1831. if (!__IsInViewFrustum())
  1832. return false;
  1833. if (IsDoor())
  1834. {
  1835. if (IsDead())
  1836. return false;
  1837. }
  1838. if (IsPC())
  1839. {
  1840. if (IsAffect(AFFECT_EUNHYEONG))
  1841. {
  1842. if (!__MainCanSeeHiddenThing())
  1843. return false;
  1844. }
  1845. if (IsAffect(AFFECT_REVIVE_INVISIBILITY))
  1846. return false;
  1847. if (IsAffect(AFFECT_INVISIBILITY))
  1848. return false;
  1849. }
  1850. if (IsDead())
  1851. return false;
  1852. return true;
  1853. }
  1854. bool CInstanceBase::CanViewTargetHP(CInstanceBase& rkInstVictim)
  1855. {
  1856. if (rkInstVictim.IsStone())
  1857. return true;
  1858. if (rkInstVictim.IsWoodenDoor())
  1859. return true;
  1860. if (rkInstVictim.IsEnemy())
  1861. return true;
  1862. return false;
  1863. }
  1864. BOOL CInstanceBase::IsPoly()
  1865. {
  1866. return m_GraphicThingInstance.IsPoly();
  1867. }
  1868. BOOL CInstanceBase::IsPC()
  1869. {
  1870. return m_GraphicThingInstance.IsPC();
  1871. }
  1872. BOOL CInstanceBase::IsNPC()
  1873. {
  1874. return m_GraphicThingInstance.IsNPC();
  1875. }
  1876. BOOL CInstanceBase::IsEnemy()
  1877. {
  1878. return m_GraphicThingInstance.IsEnemy();
  1879. }
  1880. BOOL CInstanceBase::IsStone()
  1881. {
  1882. return m_GraphicThingInstance.IsStone();
  1883. }
  1884. BOOL CInstanceBase::IsGuildWall() //IsBuilding ±æµå°Ç¹°Àüü IsGuildWallÀº ´ãÀ庮¸¸(¹®Àº Á¦¿Ü)
  1885. {
  1886. return IsWall(m_dwRace);
  1887. }
  1888. BOOL CInstanceBase::IsResource()
  1889. {
  1890. switch (m_dwVirtualNumber)
  1891. {
  1892. case 20047:
  1893. case 20048:
  1894. case 20049:
  1895. case 20050:
  1896. case 20051:
  1897. case 20052:
  1898. case 20053:
  1899. case 20054:
  1900. case 20055:
  1901. case 20056:
  1902. case 20057:
  1903. case 20058:
  1904. case 20059:
  1905. case 30301:
  1906. case 30302:
  1907. case 30303:
  1908. case 30304:
  1909. case 30305:
  1910. return TRUE;
  1911. }
  1912. return FALSE;
  1913. }
  1914. BOOL CInstanceBase::IsWarp()
  1915. {
  1916. return m_GraphicThingInstance.IsWarp();
  1917. }
  1918. BOOL CInstanceBase::IsGoto()
  1919. {
  1920. return m_GraphicThingInstance.IsGoto();
  1921. }
  1922. BOOL CInstanceBase::IsObject()
  1923. {
  1924. return m_GraphicThingInstance.IsObject();
  1925. }
  1926. BOOL CInstanceBase::IsBuilding()
  1927. {
  1928. return m_GraphicThingInstance.IsBuilding();
  1929. }
  1930. BOOL CInstanceBase::IsDoor()
  1931. {
  1932. return m_GraphicThingInstance.IsDoor();
  1933. }
  1934. BOOL CInstanceBase::IsWoodenDoor()
  1935. {
  1936. if (m_GraphicThingInstance.IsDoor())
  1937. {
  1938. int vnum = GetVirtualNumber();
  1939. if (vnum == 13000) // ³ª¹«¹®
  1940. return true;
  1941. else if (vnum >= 30111 && vnum <= 30119) // »ç±Í¹®
  1942. return true;
  1943. else
  1944. return false;
  1945. }
  1946. else
  1947. {
  1948. return false;
  1949. }
  1950. }
  1951. BOOL CInstanceBase::IsStoneDoor()
  1952. {
  1953. return m_GraphicThingInstance.IsDoor() && 13001 == GetVirtualNumber();
  1954. }
  1955. BOOL CInstanceBase::IsFlag()
  1956. {
  1957. if (GetRace() == 20035)
  1958. return TRUE;
  1959. if (GetRace() == 20036)
  1960. return TRUE;
  1961. if (GetRace() == 20037)
  1962. return TRUE;
  1963. return FALSE;
  1964. }
  1965. BOOL CInstanceBase::IsForceVisible()
  1966. {
  1967. if (IsAffect(AFFECT_SHOW_ALWAYS))
  1968. return TRUE;
  1969. if (IsObject() || IsBuilding() || IsDoor() )
  1970. return TRUE;
  1971. return FALSE;
  1972. }
  1973. int CInstanceBase::GetInstanceType()
  1974. {
  1975. return m_GraphicThingInstance.GetActorType();
  1976. }
  1977. DWORD CInstanceBase::GetVirtualID()
  1978. {
  1979. return m_GraphicThingInstance.GetVirtualID();
  1980. }
  1981. DWORD CInstanceBase::GetVirtualNumber()
  1982. {
  1983. return m_dwVirtualNumber;
  1984. }
  1985. // 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Î º¯°æ
  1986. bool CInstanceBase::__IsInViewFrustum()
  1987. {
  1988. return m_GraphicThingInstance.isShow();
  1989. }
  1990. bool CInstanceBase::__CanRender()
  1991. {
  1992. if (!__IsInViewFrustum())
  1993. return false;
  1994. if (IsAffect(AFFECT_INVISIBILITY))
  1995. return false;
  1996. return true;
  1997. }
  1998. ///////////////////////////////////////////////////////////////////////////////////////////////////
  1999. // Graphic Control
  2000. bool CInstanceBase::IntersectBoundingBox()
  2001. {
  2002. float u, v, t;
  2003. return m_GraphicThingInstance.Intersect(&u, &v, &t);
  2004. }
  2005. bool CInstanceBase::IntersectDefendingSphere()
  2006. {
  2007. return m_GraphicThingInstance.IntersectDefendingSphere();
  2008. }
  2009. float CInstanceBase::GetDistance(CInstanceBase * pkTargetInst)
  2010. {
  2011. TPixelPosition TargetPixelPosition;
  2012. pkTargetInst->m_GraphicThingInstance.GetPixelPosition(&TargetPixelPosition);
  2013. return GetDistance(TargetPixelPosition);
  2014. }
  2015. float CInstanceBase::GetDistance(const TPixelPosition & c_rPixelPosition)
  2016. {
  2017. TPixelPosition PixelPosition;
  2018. m_GraphicThingInstance.GetPixelPosition(&PixelPosition);
  2019. float fdx = PixelPosition.x - c_rPixelPosition.x;
  2020. float fdy = PixelPosition.y - c_rPixelPosition.y;
  2021. return sqrtf((fdx*fdx) + (fdy*fdy));
  2022. }
  2023. CActorInstance& CInstanceBase::GetGraphicThingInstanceRef()
  2024. {
  2025. return m_GraphicThingInstance;
  2026. }
  2027. CActorInstance* CInstanceBase::GetGraphicThingInstancePtr()
  2028. {
  2029. return &m_GraphicThingInstance;
  2030. }
  2031. void CInstanceBase::RefreshActorInstance()
  2032. {
  2033. m_GraphicThingInstance.RefreshActorInstance();
  2034. }
  2035. void CInstanceBase::Refresh(DWORD dwMotIndex, bool isLoop)
  2036. {
  2037. RefreshState(dwMotIndex, isLoop);
  2038. }
  2039. void CInstanceBase::RestoreRenderMode()
  2040. {
  2041. m_GraphicThingInstance.RestoreRenderMode();
  2042. }
  2043. void CInstanceBase::SetAddRenderMode()
  2044. {
  2045. m_GraphicThingInstance.SetAddRenderMode();
  2046. }
  2047. void CInstanceBase::SetModulateRenderMode()
  2048. {
  2049. m_GraphicThingInstance.SetModulateRenderMode();
  2050. }
  2051. void CInstanceBase::SetRenderMode(int iRenderMode)
  2052. {
  2053. m_GraphicThingInstance.SetRenderMode(iRenderMode);
  2054. }
  2055. void CInstanceBase::SetAddColor(const D3DXCOLOR & c_rColor)
  2056. {
  2057. m_GraphicThingInstance.SetAddColor(c_rColor);
  2058. }
  2059. void CInstanceBase::__SetBlendRenderingMode()
  2060. {
  2061. m_GraphicThingInstance.SetBlendRenderMode();
  2062. }
  2063. void CInstanceBase::__SetAlphaValue(float fAlpha)
  2064. {
  2065. m_GraphicThingInstance.SetAlphaValue(fAlpha);
  2066. }
  2067. float CInstanceBase::__GetAlphaValue()
  2068. {
  2069. return m_GraphicThingInstance.GetAlphaValue();
  2070. }
  2071. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2072. // Part
  2073. void CInstanceBase::SetHair(DWORD eHair)
  2074. {
  2075. if (!HAIR_COLOR_ENABLE)
  2076. return;
  2077. if (IsPC()==false)
  2078. return;
  2079. m_awPart[CRaceData::PART_HAIR] = eHair;
  2080. m_GraphicThingInstance.SetHair(eHair);
  2081. }
  2082. void CInstanceBase::ChangeHair(DWORD eHair)
  2083. {
  2084. if (!HAIR_COLOR_ENABLE)
  2085. return;
  2086. if (IsPC()==false)
  2087. return;
  2088. if (GetPart(CRaceData::PART_HAIR)==eHair)
  2089. return;
  2090. SetHair(eHair);
  2091. //int type = m_GraphicThingInstance.GetMotionMode();
  2092. RefreshState(CRaceMotionData::NAME_WAIT, true);
  2093. //RefreshState(type, true);
  2094. }
  2095. void CInstanceBase::SetArmor(DWORD dwArmor)
  2096. {
  2097. DWORD dwShape;
  2098. if (__ArmorVnumToShape(dwArmor, &dwShape))
  2099. {
  2100. CItemData * pItemData;
  2101. if (CItemManager::Instance().GetItemDataPointer(dwArmor, &pItemData))
  2102. {
  2103. float fSpecularPower=pItemData->GetSpecularPowerf();
  2104. SetShape(dwShape, fSpecularPower);
  2105. __GetRefinedEffect(pItemData);
  2106. return;
  2107. }
  2108. else
  2109. __ClearArmorRefineEffect();
  2110. }
  2111. SetShape(dwArmor);
  2112. }
  2113. void CInstanceBase::SetShape(DWORD eShape, float fSpecular)
  2114. {
  2115. if (IsPoly())
  2116. {
  2117. m_GraphicThingInstance.SetShape(0);
  2118. }
  2119. else
  2120. {
  2121. m_GraphicThingInstance.SetShape(eShape, fSpecular);
  2122. }
  2123. m_eShape = eShape;
  2124. }
  2125. DWORD CInstanceBase::GetWeaponType()
  2126. {
  2127. DWORD dwWeapon = GetPart(CRaceData::PART_WEAPON);
  2128. CItemData * pItemData;
  2129. if (!CItemManager::Instance().GetItemDataPointer(dwWeapon, &pItemData))
  2130. return CItemData::WEAPON_NONE;
  2131. return pItemData->GetWeaponType();
  2132. }
  2133. /*
  2134. void CInstanceBase::SetParts(const WORD * c_pParts)
  2135. {
  2136. if (IsPoly())
  2137. return;
  2138. if (__IsShapeAnimalWear())
  2139. return;
  2140. UINT eWeapon=c_pParts[CRaceData::PART_WEAPON];
  2141. if (__IsChangableWeapon(eWeapon) == false)
  2142. eWeapon = 0;
  2143. if (eWeapon != m_GraphicThingInstance.GetPartItemID(CRaceData::PART_WEAPON))
  2144. {
  2145. m_GraphicThingInstance.AttachPart(CRaceData::PART_MAIN, CRaceData::PART_WEAPON, eWeapon);
  2146. m_awPart[CRaceData::PART_WEAPON] = eWeapon;
  2147. }
  2148. __AttachHorseSaddle();
  2149. }
  2150. */
  2151. void CInstanceBase::__ClearWeaponRefineEffect()
  2152. {
  2153. if (m_swordRefineEffectRight)
  2154. {
  2155. __DetachEffect(m_swordRefineEffectRight);
  2156. m_swordRefineEffectRight = 0;
  2157. }
  2158. if (m_swordRefineEffectLeft)
  2159. {
  2160. __DetachEffect(m_swordRefineEffectLeft);
  2161. m_swordRefineEffectLeft = 0;
  2162. }
  2163. }
  2164. void CInstanceBase::__ClearArmorRefineEffect()
  2165. {
  2166. if (m_armorRefineEffect)
  2167. {
  2168. __DetachEffect(m_armorRefineEffect);
  2169. m_armorRefineEffect = 0;
  2170. }
  2171. }
  2172. UINT CInstanceBase::__GetRefinedEffect(CItemData* pItem)
  2173. {
  2174. DWORD refine = max(pItem->GetRefine() + pItem->GetSocketCount(),CItemData::ITEM_SOCKET_MAX_NUM) - CItemData::ITEM_SOCKET_MAX_NUM;
  2175. switch (pItem->GetType())
  2176. {
  2177. case CItemData::ITEM_TYPE_WEAPON:
  2178. __ClearWeaponRefineEffect();
  2179. if (refine < 7) //ÇöÀç Á¦·Ãµµ 7 ÀÌ»ó¸¸ ÀÌÆåÆ®°¡ ÀÖ½À´Ï´Ù.
  2180. return 0;
  2181. switch(pItem->GetSubType())
  2182. {
  2183. case CItemData::WEAPON_DAGGER:
  2184. m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7+refine-7;
  2185. m_swordRefineEffectLeft = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7_LEFT+refine-7;
  2186. break;
  2187. case CItemData::WEAPON_FAN:
  2188. m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_FANBELL_REFINED7+refine-7;
  2189. break;
  2190. case CItemData::WEAPON_ARROW:
  2191. case CItemData::WEAPON_BELL:
  2192. m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7+refine-7;
  2193. break;
  2194. case CItemData::WEAPON_BOW:
  2195. m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_BOW_REFINED7+refine-7;
  2196. break;
  2197. default:
  2198. m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SWORD_REFINED7+refine-7;
  2199. }
  2200. if (m_swordRefineEffectRight)
  2201. m_swordRefineEffectRight = __AttachEffect(m_swordRefineEffectRight);
  2202. if (m_swordRefineEffectLeft)
  2203. m_swordRefineEffectLeft = __AttachEffect(m_swordRefineEffectLeft);
  2204. break;
  2205. case CItemData::ITEM_TYPE_ARMOR:
  2206. __ClearArmorRefineEffect();
  2207. // °©¿Ê Ưȭ ÀÌÆåÆ®
  2208. if (pItem->GetSubType() == CItemData::ARMOR_BODY)
  2209. {
  2210. DWORD vnum = pItem->GetIndex();
  2211. if (12010 <= vnum && vnum <= 12049)
  2212. {
  2213. __AttachEffect(EFFECT_REFINED+EFFECT_BODYARMOR_SPECIAL);
  2214. __AttachEffect(EFFECT_REFINED+EFFECT_BODYARMOR_SPECIAL2);
  2215. }
  2216. }
  2217. if (refine < 7) //ÇöÀç Á¦·Ãµµ 7 ÀÌ»ó¸¸ ÀÌÆåÆ®°¡ ÀÖ½À´Ï´Ù.
  2218. return 0;
  2219. if (pItem->GetSubType() == CItemData::ARMOR_BODY)
  2220. {
  2221. m_armorRefineEffect = EFFECT_REFINED+EFFECT_BODYARMOR_REFINED7+refine-7;
  2222. __AttachEffect(m_armorRefineEffect);
  2223. }
  2224. break;
  2225. }
  2226. return 0;
  2227. }
  2228. bool CInstanceBase::SetWeapon(DWORD eWeapon)
  2229. {
  2230. if (IsPoly())
  2231. return false;
  2232. if (__IsShapeAnimalWear())
  2233. return false;
  2234. if (__IsChangableWeapon(eWeapon) == false)
  2235. eWeapon = 0;
  2236. m_GraphicThingInstance.AttachWeapon(eWeapon);
  2237. m_awPart[CRaceData::PART_WEAPON] = eWeapon;
  2238. //Weapon Effect
  2239. CItemData * pItemData;
  2240. if (CItemManager::Instance().GetItemDataPointer(eWeapon, &pItemData))
  2241. __GetRefinedEffect(pItemData);
  2242. else
  2243. __ClearWeaponRefineEffect();
  2244. return true;
  2245. }
  2246. void CInstanceBase::ChangeWeapon(DWORD eWeapon)
  2247. {
  2248. if (eWeapon == m_GraphicThingInstance.GetPartItemID(CRaceData::PART_WEAPON))
  2249. return;
  2250. if (SetWeapon(eWeapon))
  2251. RefreshState(CRaceMotionData::NAME_WAIT, true);
  2252. }
  2253. bool CInstanceBase::ChangeArmor(DWORD dwArmor)
  2254. {
  2255. DWORD eShape;
  2256. __ArmorVnumToShape(dwArmor, &eShape);
  2257. if (GetShape()==eShape)
  2258. return false;
  2259. CAffectFlagContainer kAffectFlagContainer;
  2260. kAffectFlagContainer.CopyInstance(m_kAffectFlagContainer);
  2261. DWORD dwVID = GetVirtualID();
  2262. DWORD dwRace = GetRace();
  2263. DWORD eHair = GetPart(CRaceData::PART_HAIR);
  2264. DWORD eWeapon = GetPart(CRaceData::PART_WEAPON);
  2265. float fRot = GetRotation();
  2266. float fAdvRot = GetAdvancingRotation();
  2267. if (IsWalking())
  2268. EndWalking();
  2269. // 2004.07.25.myevan.ÀÌÆåÆ® ¾È ºÙ´Â ¹®Á¦
  2270. //////////////////////////////////////////////////////
  2271. __ClearAffects();
  2272. //////////////////////////////////////////////////////
  2273. if (!SetRace(dwRace))
  2274. {
  2275. TraceError("CPythonCharacterManager::ChangeArmor - SetRace VID[%d] Race[%d] ERROR", dwVID, dwRace);
  2276. return false;
  2277. }
  2278. SetArmor(dwArmor);
  2279. SetHair(eHair);
  2280. SetWeapon(eWeapon);
  2281. SetRotation(fRot);
  2282. SetAdvancingRotation(fAdvRot);
  2283. __AttachHorseSaddle();
  2284. RefreshState(CRaceMotionData::NAME_WAIT, TRUE);
  2285. // 2004.07.25.myevan.ÀÌÆåÆ® ¾È ºÙ´Â ¹®Á¦
  2286. /////////////////////////////////////////////////
  2287. SetAffectFlagContainer(kAffectFlagContainer);
  2288. /////////////////////////////////////////////////
  2289. CActorInstance::IEventHandler& rkEventHandler=GetEventHandlerRef();
  2290. rkEventHandler.OnChangeShape();
  2291. return true;
  2292. }
  2293. bool CInstanceBase::__IsShapeAnimalWear()
  2294. {
  2295. if (100 == GetShape() ||
  2296. 101 == GetShape() ||
  2297. 102 == GetShape() ||
  2298. 103 == GetShape())
  2299. return true;
  2300. return false;
  2301. }
  2302. DWORD CInstanceBase::__GetRaceType()
  2303. {
  2304. return m_eRaceType;
  2305. }
  2306. void CInstanceBase::RefreshState(DWORD dwMotIndex, bool isLoop)
  2307. {
  2308. DWORD dwPartItemID = m_GraphicThingInstance.GetPartItemID(CRaceData::PART_WEAPON);
  2309. BYTE byItemType = 0xff;
  2310. BYTE bySubType = 0xff;
  2311. CItemManager & rkItemMgr = CItemManager::Instance();
  2312. CItemData * pItemData;
  2313. if (rkItemMgr.GetItemDataPointer(dwPartItemID, &pItemData))
  2314. {
  2315. byItemType = pItemData->GetType();
  2316. bySubType = pItemData->GetWeaponType();
  2317. }
  2318. if (IsPoly())
  2319. {
  2320. SetMotionMode(CRaceMotionData::MODE_GENERAL);
  2321. }
  2322. else if (IsWearingDress())
  2323. {
  2324. SetMotionMode(CRaceMotionData::MODE_WEDDING_DRESS);
  2325. }
  2326. else if (IsHoldingPickAxe())
  2327. {
  2328. if (m_kHorse.IsMounting())
  2329. {
  2330. SetMotionMode(CRaceMotionData::MODE_HORSE);
  2331. }
  2332. else
  2333. {
  2334. SetMotionMode(CRaceMotionData::MODE_GENERAL);
  2335. }
  2336. }
  2337. else if (CItemData::ITEM_TYPE_ROD == byItemType)
  2338. {
  2339. if (m_kHorse.IsMounting())
  2340. {
  2341. SetMotionMode(CRaceMotionData::MODE_HORSE);
  2342. }
  2343. else
  2344. {
  2345. SetMotionMode(CRaceMotionData::MODE_FISHING);
  2346. }
  2347. }
  2348. else if (m_kHorse.IsMounting())
  2349. {
  2350. switch (bySubType)
  2351. {
  2352. case CItemData::WEAPON_SWORD:
  2353. SetMotionMode(CRaceMotionData::MODE_HORSE_ONEHAND_SWORD);
  2354. break;
  2355. case CItemData::WEAPON_TWO_HANDED:
  2356. SetMotionMode(CRaceMotionData::MODE_HORSE_TWOHAND_SWORD); // Only Warrior
  2357. break;
  2358. case CItemData::WEAPON_DAGGER:
  2359. SetMotionMode(CRaceMotionData::MODE_HORSE_DUALHAND_SWORD); // Only Assassin
  2360. break;
  2361. case CItemData::WEAPON_FAN:
  2362. SetMotionMode(CRaceMotionData::MODE_HORSE_FAN); // Only Shaman
  2363. break;
  2364. case CItemData::WEAPON_BELL:
  2365. SetMotionMode(CRaceMotionData::MODE_HORSE_BELL); // Only Shaman
  2366. break;
  2367. case CItemData::WEAPON_BOW:
  2368. SetMotionMode(CRaceMotionData::MODE_HORSE_BOW); // Only Shaman
  2369. break;
  2370. default:
  2371. SetMotionMode(CRaceMotionData::MODE_HORSE);
  2372. break;
  2373. }
  2374. }
  2375. else
  2376. {
  2377. switch (bySubType)
  2378. {
  2379. case CItemData::WEAPON_SWORD:
  2380. SetMotionMode(CRaceMotionData::MODE_ONEHAND_SWORD);
  2381. break;
  2382. case CItemData::WEAPON_TWO_HANDED:
  2383. SetMotionMode(CRaceMotionData::MODE_TWOHAND_SWORD); // Only Warrior
  2384. break;
  2385. case CItemData::WEAPON_DAGGER:
  2386. SetMotionMode(CRaceMotionData::MODE_DUALHAND_SWORD); // Only Assassin
  2387. break;
  2388. case CItemData::WEAPON_BOW:
  2389. SetMotionMode(CRaceMotionData::MODE_BOW); // Only Assassin
  2390. break;
  2391. case CItemData::WEAPON_FAN:
  2392. SetMotionMode(CRaceMotionData::MODE_FAN); // Only Shaman
  2393. break;
  2394. case CItemData::WEAPON_BELL:
  2395. SetMotionMode(CRaceMotionData::MODE_BELL); // Only Shaman
  2396. break;
  2397. case CItemData::WEAPON_ARROW:
  2398. default:
  2399. SetMotionMode(CRaceMotionData::MODE_GENERAL);
  2400. break;
  2401. }
  2402. }
  2403. if (isLoop)
  2404. m_GraphicThingInstance.InterceptLoopMotion(dwMotIndex);
  2405. else
  2406. m_GraphicThingInstance.InterceptOnceMotion(dwMotIndex);
  2407. RefreshActorInstance();
  2408. }
  2409. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2410. // Device
  2411. void CInstanceBase::RegisterBoundingSphere()
  2412. {
  2413. // Stone ÀÏ °æ¿ì DeforomNoSkin À» Çϸé
  2414. // ³«ÇÏÇÏ´Â ¾Ö´Ï¸ŞÀÌ¼Ç °°Àº °æ¿ì ¾Ö´Ï¸ŞÀ̼ÇÀÌ
  2415. // ¹Ù¿îµå ¹Ú½º¿¡ ¿µÇâÀ» ¹ÌÃÄ ÄøµÀÌ Á¦´ë·Î ÀÌ·ç¾îÁöÁö ¾Ê´Â´Ù.
  2416. if (!IsStone())
  2417. {
  2418. m_GraphicThingInstance.DeformNoSkin();
  2419. }
  2420. m_GraphicThingInstance.RegisterBoundingSphere();
  2421. }
  2422. bool CInstanceBase::CreateDeviceObjects()
  2423. {
  2424. return m_GraphicThingInstance.CreateDeviceObjects();
  2425. }
  2426. void CInstanceBase::DestroyDeviceObjects()
  2427. {
  2428. m_GraphicThingInstance.DestroyDeviceObjects();
  2429. }
  2430. void CInstanceBase::Destroy()
  2431. {
  2432. DetachTextTail();
  2433. DismountHorse();
  2434. m_kQue_kCmdNew.clear();
  2435. __EffectContainer_Destroy();
  2436. __StoneSmoke_Destroy();
  2437. if (__IsMainInstance())
  2438. __ClearMainInstance();
  2439. m_GraphicThingInstance.Destroy();
  2440. __Initialize();
  2441. }
  2442. void CInstanceBase::__InitializeRotationSpeed()
  2443. {
  2444. SetRotationSpeed(c_fDefaultRotationSpeed);
  2445. }
  2446. void CInstanceBase::__Warrior_Initialize()
  2447. {
  2448. m_kWarrior.m_dwGeomgyeongEffect=0;
  2449. }
  2450. void CInstanceBase::__Initialize()
  2451. {
  2452. __Warrior_Initialize();
  2453. __StoneSmoke_Inialize();
  2454. __EffectContainer_Initialize();
  2455. __InitializeRotationSpeed();
  2456. SetEventHandler(CActorInstance::IEventHandler::GetEmptyPtr());
  2457. m_kAffectFlagContainer.Clear();
  2458. m_dwLevel = 0;
  2459. m_dwGuildID = 0;
  2460. m_dwEmpireID = 0;
  2461. m_eType = 0;
  2462. m_eRaceType = 0;
  2463. m_eShape = 0;
  2464. m_dwRace = 0;
  2465. m_dwVirtualNumber = 0;
  2466. m_dwBaseCmdTime=0;
  2467. m_dwBaseChkTime=0;
  2468. m_dwSkipTime=0;
  2469. m_GraphicThingInstance.Initialize();
  2470. m_dwAdvActorVID=0;
  2471. m_dwLastDmgActorVID=0;
  2472. m_nAverageNetworkGap=0;
  2473. m_dwNextUpdateHeightTime=0;
  2474. // Moving by keyboard
  2475. m_iRotatingDirection = DEGREE_DIRECTION_SAME;
  2476. // Moving by mouse
  2477. m_isTextTail = FALSE;
  2478. m_isGoing = FALSE;
  2479. NEW_SetSrcPixelPosition(TPixelPosition(0, 0, 0));
  2480. NEW_SetDstPixelPosition(TPixelPosition(0, 0, 0));
  2481. m_kPPosDust = TPixelPosition(0, 0, 0);
  2482. m_kQue_kCmdNew.clear();
  2483. m_dwLastComboIndex = 0;
  2484. m_swordRefineEffectRight = 0;
  2485. m_swordRefineEffectLeft = 0;
  2486. m_armorRefineEffect = 0;
  2487. m_sAlignment = 0;
  2488. m_byPKMode = 0;
  2489. m_isKiller = false;
  2490. m_isPartyMember = false;
  2491. m_bEnableTCPState = TRUE;
  2492. m_stName = "";
  2493. memset(m_awPart, 0, sizeof(m_awPart));
  2494. memset(m_adwCRCAffectEffect, 0, sizeof(m_adwCRCAffectEffect));
  2495. //memset(m_adwCRCEmoticonEffect, 0, sizeof(m_adwCRCEmoticonEffect));
  2496. memset(&m_kMovAfterFunc, 0, sizeof(m_kMovAfterFunc));
  2497. m_bDamageEffectType = false;
  2498. m_dwDuelMode = DUEL_NONE;
  2499. m_dwEmoticonTime = 0;
  2500. }
  2501. CInstanceBase::CInstanceBase()
  2502. {
  2503. __Initialize();
  2504. }
  2505. CInstanceBase::~CInstanceBase()
  2506. {
  2507. Destroy();
  2508. }
  2509. void CInstanceBase::GetBoundBox(D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax)
  2510. {
  2511. m_GraphicThingInstance.GetBoundBox(vtMin, vtMax);
  2512. }