Endymionek

Untitled

Aug 28th, 2014
358
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 69.29 KB | None | 0 0
  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.  
  11. #include "../eterlib/StateManager.h"
  12. #include "../gamelib/ItemManager.h"
  13.  
  14. BOOL HAIR_COLOR_ENABLE=FALSE;
  15. BOOL USE_ARMOR_SPECULAR=FALSE;
  16. BOOL RIDE_HORSE_ENABLE=TRUE;
  17. const float c_fDefaultRotationSpeed = 1200.0f;
  18. const float c_fDefaultHorseRotationSpeed = 300.0f;
  19.  
  20.  
  21. bool IsWall(unsigned race)
  22. {
  23. switch (race)
  24. {
  25. case 14201:
  26. case 14202:
  27. case 14203:
  28. case 14204:
  29. return true;
  30. break;
  31. }
  32. return false;
  33. }
  34.  
  35. //////////////////////////////////////////////////////////////////////////////////////
  36.  
  37.  
  38. CInstanceBase::SHORSE::SHORSE()
  39. {
  40. __Initialize();
  41. }
  42.  
  43. CInstanceBase::SHORSE::~SHORSE()
  44. {
  45. assert(m_pkActor==NULL);
  46. }
  47.  
  48. void CInstanceBase::SHORSE::__Initialize()
  49. {
  50. m_isMounting=false;
  51. m_pkActor=NULL;
  52. }
  53.  
  54. void CInstanceBase::SHORSE::SetAttackSpeed(UINT uAtkSpd)
  55. {
  56. if (!IsMounting())
  57. return;
  58.  
  59. CActorInstance& rkActor=GetActorRef();
  60. rkActor.SetAttackSpeed(uAtkSpd/100.0f);
  61. }
  62.  
  63. void CInstanceBase::SHORSE::SetMoveSpeed(UINT uMovSpd)
  64. {
  65. if (!IsMounting())
  66. return;
  67.  
  68. CActorInstance& rkActor=GetActorRef();
  69. rkActor.SetMoveSpeed(uMovSpd/100.0f);
  70. }
  71.  
  72. void CInstanceBase::SHORSE::Create(const TPixelPosition& c_rkPPos, UINT eRace, UINT eHitEffect)
  73. {
  74. assert(NULL==m_pkActor && "CInstanceBase::SHORSE::Create - ALREADY MOUNT");
  75.  
  76. m_pkActor=new CActorInstance;
  77.  
  78. CActorInstance& rkActor=GetActorRef();
  79. rkActor.SetEventHandler(CActorInstance::IEventHandler::GetEmptyPtr());
  80. if (!rkActor.SetRace(eRace))
  81. {
  82. delete m_pkActor;
  83. m_pkActor=NULL;
  84. return;
  85. }
  86.  
  87. rkActor.SetShape(0);
  88. rkActor.SetBattleHitEffect(eHitEffect);
  89. rkActor.SetAlphaValue(0.0f);
  90. rkActor.BlendAlphaValue(1.0f, 0.5f);
  91. rkActor.SetMoveSpeed(1.0f);
  92. rkActor.SetAttackSpeed(1.0f);
  93. rkActor.SetMotionMode(CRaceMotionData::MODE_GENERAL);
  94. rkActor.Stop();
  95. rkActor.RefreshActorInstance();
  96.  
  97. rkActor.SetCurPixelPosition(c_rkPPos);
  98.  
  99. m_isMounting=true;
  100. }
  101.  
  102. void CInstanceBase::SHORSE::Destroy()
  103. {
  104. if (m_pkActor)
  105. {
  106. m_pkActor->Destroy();
  107. delete m_pkActor;
  108. }
  109.  
  110. __Initialize();
  111. }
  112.  
  113. CActorInstance& CInstanceBase::SHORSE::GetActorRef()
  114. {
  115. assert(NULL!=m_pkActor && "CInstanceBase::SHORSE::GetActorRef");
  116. return *m_pkActor;
  117. }
  118.  
  119. CActorInstance* CInstanceBase::SHORSE::GetActorPtr()
  120. {
  121. return m_pkActor;
  122. }
  123.  
  124. UINT CInstanceBase::SHORSE::GetLevel()
  125. {
  126. if (m_pkActor)
  127. {
  128. DWORD mount = m_pkActor->GetRace();
  129. switch (mount)
  130. {
  131. case 20101:
  132. case 20102:
  133. case 20103:
  134. return 1;
  135. case 20104:
  136. case 20105:
  137. case 20106:
  138. return 2;
  139. case 20107:
  140. case 20108:
  141. case 20109:
  142. case 20110: // #0000673: [M2EU] 새로운 탈것 타고 공격 안됨
  143. case 20111: // #0000673: [M2EU] 새로운 탈것 타고 공격 안됨
  144. case 20112: // #0000673: [M2EU] 새로운 탈것 타고 공격 안됨
  145. case 20113: // #0000673: [M2EU] 새로운 탈것 타고 공격 안됨
  146. case 20114:
  147. case 20115:
  148. case 20116:
  149. case 20117:
  150. case 20118:
  151. case 20120:
  152. case 20121:
  153. case 20122:
  154. case 20123:
  155. case 20124:
  156. case 20125:
  157. return 3;
  158. case 20119: // 라마단 이벤트용 흑마는 스킬불가, 공격가능한 레벨2로 설정
  159. case 20219: // 할로윈 이벤트용 흑마는 스킬불가, 공격가능한 레벨2로 설정 (=라마단 흑마 클론)
  160. case 20220:
  161. case 20221:
  162. case 20222:
  163. return 2;
  164. }
  165.  
  166. // 마운트 확장 시스템용 특수 처리 (20201 ~ 20212 대역을 사용하고 순서대로 4개씩 나눠서 초급, 중급, 고급임)
  167. // -- 탈것 레벨을 클라에서 측정하고 공격/스킬 사용가능 여부도 클라에서 처리하는 것 자체에 문제가 있는 듯.. [hyo]
  168. {
  169. // 중급 탈것은 레벨2 (공격 가능, 스킬 불가)
  170. if ((20205 <= mount && 20208 >= mount) ||
  171. (20214 == mount) || (20217 == mount) // 난폭한 전갑순순록, 난폭한 전갑암순록
  172. )
  173. return 2;
  174.  
  175. // 고급 탈것은 레벨3 (공격 가능, 스킬 가능)
  176. if ((20209 <= mount && 20212 >= mount) ||
  177. (20215 == mount) || (20218 == mount) || // 용맹한 전갑순순록, 용맹한 전갑암순록
  178. (20220 == mount)
  179. )
  180. return 3;
  181. }
  182. }
  183. return 0;
  184. }
  185.  
  186. bool CInstanceBase::SHORSE::IsNewMount()
  187. {
  188. if (!m_pkActor)
  189. return false;
  190. DWORD mount = m_pkActor->GetRace();
  191.  
  192. if ((20205 <= mount && 20208 >= mount) ||
  193. (20214 == mount) || (20217 == mount) // 난폭한 전갑순순록, 난폭한 전갑암순록
  194. )
  195. return true;
  196.  
  197. // 고급 탈것
  198. if ((20209 <= mount && 20212 >= mount) ||
  199. (20215 == mount) || (20218 == mount) || // 용맹한 전갑순순록, 용맹한 전갑암순록
  200. (20220 == mount)
  201. )
  202. return true;
  203.  
  204. return false;
  205. }
  206. bool CInstanceBase::SHORSE::CanUseSkill()
  207. {
  208. // 마상스킬은 말의 레벨이 3 이상이어야만 함.
  209. if (IsMounting())
  210. return 2 < GetLevel();
  211.  
  212. return true;
  213. }
  214.  
  215. bool CInstanceBase::SHORSE::CanAttack()
  216. {
  217. if (IsMounting())
  218. if (GetLevel()<=1)
  219. return false;
  220.  
  221. return true;
  222. }
  223.  
  224. bool CInstanceBase::SHORSE::IsMounting()
  225. {
  226. return m_isMounting;
  227. }
  228.  
  229. void CInstanceBase::SHORSE::Deform()
  230. {
  231. if (!IsMounting())
  232. return;
  233.  
  234. CActorInstance& rkActor=GetActorRef();
  235. rkActor.INSTANCEBASE_Deform();
  236. }
  237.  
  238. void CInstanceBase::SHORSE::Render()
  239. {
  240. if (!IsMounting())
  241. return;
  242.  
  243. CActorInstance& rkActor=GetActorRef();
  244. rkActor.Render();
  245. }
  246.  
  247. void CInstanceBase::__AttachHorseSaddle()
  248. {
  249. if (!IsMountingHorse())
  250. return;
  251. m_kHorse.m_pkActor->AttachModelInstance(CRaceData::PART_MAIN, "saddle", m_GraphicThingInstance, CRaceData::PART_MAIN);
  252. }
  253.  
  254. void CInstanceBase::__DetachHorseSaddle()
  255. {
  256. if (!IsMountingHorse())
  257. return;
  258. m_kHorse.m_pkActor->DetachModelInstance(CRaceData::PART_MAIN, m_GraphicThingInstance, CRaceData::PART_MAIN);
  259. }
  260.  
  261. //////////////////////////////////////////////////////////////////////////////////////
  262.  
  263. void CInstanceBase::BlockMovement()
  264. {
  265. m_GraphicThingInstance.BlockMovement();
  266. }
  267.  
  268. bool CInstanceBase::IsBlockObject(const CGraphicObjectInstance& c_rkBGObj)
  269. {
  270. return m_GraphicThingInstance.IsBlockObject(c_rkBGObj);
  271. }
  272.  
  273. bool CInstanceBase::AvoidObject(const CGraphicObjectInstance& c_rkBGObj)
  274. {
  275. return m_GraphicThingInstance.AvoidObject(c_rkBGObj);
  276. }
  277.  
  278. ///////////////////////////////////////////////////////////////////////////////////
  279.  
  280. bool __ArmorVnumToShape(int iVnum, DWORD * pdwShape)
  281. {
  282. *pdwShape = iVnum;
  283.  
  284. /////////////////////////////////////////
  285.  
  286. if (0 == iVnum || 1 == iVnum)
  287. return false;
  288.  
  289. if (!USE_ARMOR_SPECULAR)
  290. return false;
  291.  
  292. CItemData * pItemData;
  293. if (!CItemManager::Instance().GetItemDataPointer(iVnum, &pItemData))
  294. return false;
  295.  
  296. enum
  297. {
  298. SHAPE_VALUE_SLOT_INDEX = 3,
  299. };
  300.  
  301. *pdwShape = pItemData->GetValue(SHAPE_VALUE_SLOT_INDEX);
  302.  
  303. return true;
  304. }
  305.  
  306. // 2004.07.05.myevan.궁신탄영 끼이는 문제
  307. class CActorInstanceBackground : public IBackground
  308. {
  309. public:
  310. CActorInstanceBackground() {}
  311. virtual ~CActorInstanceBackground() {}
  312. bool IsBlock(int x, int y)
  313. {
  314. CPythonBackground& rkBG=CPythonBackground::Instance();
  315. return rkBG.isAttrOn(x, y, CTerrainImpl::ATTRIBUTE_BLOCK);
  316. }
  317. };
  318.  
  319. static CActorInstanceBackground gs_kActorInstBG;
  320.  
  321. bool CInstanceBase::LessRenderOrder(CInstanceBase* pkInst)
  322. {
  323. int nMainAlpha=(__GetAlphaValue() < 1.0f) ? 1 : 0;
  324. int nTestAlpha=(pkInst->__GetAlphaValue() < 1.0f) ? 1 : 0;
  325. if (nMainAlpha < nTestAlpha)
  326. return true;
  327. if (nMainAlpha > nTestAlpha)
  328. return false;
  329.  
  330. if (GetRace()<pkInst->GetRace())
  331. return true;
  332. if (GetRace()>pkInst->GetRace())
  333. return false;
  334.  
  335. if (GetShape()<pkInst->GetShape())
  336. return true;
  337.  
  338. if (GetShape()>pkInst->GetShape())
  339. return false;
  340.  
  341. UINT uLeftLODLevel=__LessRenderOrder_GetLODLevel();
  342. UINT uRightLODLevel=pkInst->__LessRenderOrder_GetLODLevel();
  343. if (uLeftLODLevel<uRightLODLevel)
  344. return true;
  345. if (uLeftLODLevel>uRightLODLevel)
  346. return false;
  347.  
  348. if (m_awPart[CRaceData::PART_WEAPON]<pkInst->m_awPart[CRaceData::PART_WEAPON])
  349. return true;
  350.  
  351. return false;
  352. }
  353.  
  354. UINT CInstanceBase::__LessRenderOrder_GetLODLevel()
  355. {
  356. CGrannyLODController* pLODCtrl=m_GraphicThingInstance.GetLODControllerPointer(0);
  357. if (!pLODCtrl)
  358. return 0;
  359.  
  360. return pLODCtrl->GetLODLevel();
  361. }
  362.  
  363. bool CInstanceBase::__Background_GetWaterHeight(const TPixelPosition& c_rkPPos, float* pfHeight)
  364. {
  365. long lHeight;
  366. if (!CPythonBackground::Instance().GetWaterHeight(int(c_rkPPos.x), int(c_rkPPos.y), &lHeight))
  367. return false;
  368.  
  369. *pfHeight = float(lHeight);
  370.  
  371. return true;
  372. }
  373.  
  374. bool CInstanceBase::__Background_IsWaterPixelPosition(const TPixelPosition& c_rkPPos)
  375. {
  376. return CPythonBackground::Instance().isAttrOn(c_rkPPos.x, c_rkPPos.y, CTerrainImpl::ATTRIBUTE_WATER);
  377. }
  378.  
  379. const float PC_DUST_RANGE = 2000.0f;
  380. const float NPC_DUST_RANGE = 1000.0f;
  381.  
  382. DWORD CInstanceBase::ms_dwUpdateCounter=0;
  383. DWORD CInstanceBase::ms_dwRenderCounter=0;
  384. DWORD CInstanceBase::ms_dwDeformCounter=0;
  385.  
  386. CDynamicPool<CInstanceBase> CInstanceBase::ms_kPool;
  387.  
  388. bool CInstanceBase::__IsInDustRange()
  389. {
  390. if (!__IsExistMainInstance())
  391. return false;
  392.  
  393. CInstanceBase* pkInstMain=__GetMainInstancePtr();
  394.  
  395. float fDistance=NEW_GetDistanceFromDestInstance(*pkInstMain);
  396.  
  397. if (IsPC())
  398. {
  399. if (fDistance<=PC_DUST_RANGE)
  400. return true;
  401. }
  402.  
  403. if (fDistance<=NPC_DUST_RANGE)
  404. return true;
  405.  
  406. return false;
  407. }
  408.  
  409. void CInstanceBase::__EnableSkipCollision()
  410. {
  411. if (__IsMainInstance())
  412. {
  413. TraceError("CInstanceBase::__EnableSkipCollision - 자신은 충돌검사스킵이 되면 안된다!!");
  414. return;
  415. }
  416. m_GraphicThingInstance.EnableSkipCollision();
  417. }
  418.  
  419. void CInstanceBase::__DisableSkipCollision()
  420. {
  421. m_GraphicThingInstance.DisableSkipCollision();
  422. }
  423.  
  424. DWORD CInstanceBase::__GetShadowMapColor(float x, float y)
  425. {
  426. CPythonBackground& rkBG=CPythonBackground::Instance();
  427. return rkBG.GetShadowMapColor(x, y);
  428. }
  429.  
  430. float CInstanceBase::__GetBackgroundHeight(float x, float y)
  431. {
  432. CPythonBackground& rkBG=CPythonBackground::Instance();
  433. return rkBG.GetHeight(x, y);
  434. }
  435.  
  436. #ifdef __MOVIE_MODE__
  437.  
  438. BOOL CInstanceBase::IsMovieMode()
  439. {
  440. if (IsAffect(AFFECT_INVISIBILITY))
  441. return true;
  442.  
  443. return false;
  444. }
  445.  
  446. #endif
  447.  
  448. BOOL CInstanceBase::IsInvisibility()
  449. {
  450. if (IsAffect(AFFECT_INVISIBILITY))
  451. return true;
  452.  
  453. return false;
  454. }
  455.  
  456. BOOL CInstanceBase::IsParalysis()
  457. {
  458. return m_GraphicThingInstance.IsParalysis();
  459. }
  460.  
  461. BOOL CInstanceBase::IsGameMaster()
  462. {
  463. if (m_kAffectFlagContainer.IsSet(AFFECT_YMIR))
  464. return true;
  465. return false;
  466. }
  467.  
  468.  
  469. BOOL CInstanceBase::IsSameEmpire(CInstanceBase& rkInstDst)
  470. {
  471. if (0 == rkInstDst.m_dwEmpireID)
  472. return TRUE;
  473.  
  474. if (IsGameMaster())
  475. return TRUE;
  476.  
  477. if (rkInstDst.IsGameMaster())
  478. return TRUE;
  479.  
  480. if (rkInstDst.m_dwEmpireID==m_dwEmpireID)
  481. return TRUE;
  482.  
  483. return FALSE;
  484. }
  485.  
  486. DWORD CInstanceBase::GetEmpireID()
  487. {
  488. return m_dwEmpireID;
  489. }
  490.  
  491. DWORD CInstanceBase::GetGuildID()
  492. {
  493. return m_dwGuildID;
  494. }
  495.  
  496. int CInstanceBase::GetAlignment()
  497. {
  498. return m_sAlignment;
  499. }
  500.  
  501. UINT CInstanceBase::GetAlignmentGrade()
  502. {
  503. if (m_sAlignment >= 12000)
  504. return 0;
  505. else if (m_sAlignment >= 8000)
  506. return 1;
  507. else if (m_sAlignment >= 4000)
  508. return 2;
  509. else if (m_sAlignment >= 1000)
  510. return 3;
  511. else if (m_sAlignment >= 0)
  512. return 4;
  513. else if (m_sAlignment > -4000)
  514. return 5;
  515. else if (m_sAlignment > -8000)
  516. return 6;
  517. else if (m_sAlignment > -12000)
  518. return 7;
  519.  
  520. return 8;
  521. }
  522.  
  523. int CInstanceBase::GetAlignmentType()
  524. {
  525. switch (GetAlignmentGrade())
  526. {
  527. case 0:
  528. case 1:
  529. case 2:
  530. case 3:
  531. {
  532. return ALIGNMENT_TYPE_WHITE;
  533. break;
  534. }
  535.  
  536. case 5:
  537. case 6:
  538. case 7:
  539. case 8:
  540. {
  541. return ALIGNMENT_TYPE_DARK;
  542. break;
  543. }
  544. }
  545.  
  546. return ALIGNMENT_TYPE_NORMAL;
  547. }
  548.  
  549. BYTE CInstanceBase::GetPKMode()
  550. {
  551. return m_byPKMode;
  552. }
  553.  
  554. bool CInstanceBase::IsKiller()
  555. {
  556. return m_isKiller;
  557. }
  558.  
  559. bool CInstanceBase::IsPartyMember()
  560. {
  561. return m_isPartyMember;
  562. }
  563.  
  564. BOOL CInstanceBase::IsInSafe()
  565. {
  566. const TPixelPosition& c_rkPPosCur=m_GraphicThingInstance.NEW_GetCurPixelPositionRef();
  567. if (CPythonBackground::Instance().isAttrOn(c_rkPPosCur.x, c_rkPPosCur.y, CTerrainImpl::ATTRIBUTE_BANPK))
  568. return TRUE;
  569.  
  570. return FALSE;
  571. }
  572.  
  573. float CInstanceBase::CalculateDistanceSq3d(const TPixelPosition& c_rkPPosDst)
  574. {
  575. const TPixelPosition& c_rkPPosSrc=m_GraphicThingInstance.NEW_GetCurPixelPositionRef();
  576. return SPixelPosition_CalculateDistanceSq3d(c_rkPPosSrc, c_rkPPosDst);
  577. }
  578.  
  579. void CInstanceBase::OnSelected()
  580. {
  581. #ifdef __MOVIE_MODE__
  582. if (!__IsExistMainInstance())
  583. return;
  584. #endif
  585.  
  586. if (IsStoneDoor())
  587. return;
  588.  
  589. if (IsDead())
  590. return;
  591.  
  592. __AttachSelectEffect();
  593. }
  594.  
  595. void CInstanceBase::OnUnselected()
  596. {
  597. __DetachSelectEffect();
  598. }
  599.  
  600. void CInstanceBase::OnTargeted()
  601. {
  602. #ifdef __MOVIE_MODE__
  603. if (!__IsExistMainInstance())
  604. return;
  605. #endif
  606.  
  607. if (IsStoneDoor())
  608. return;
  609.  
  610. if (IsDead())
  611. return;
  612.  
  613. __AttachTargetEffect();
  614. }
  615.  
  616. void CInstanceBase::OnUntargeted()
  617. {
  618. __DetachTargetEffect();
  619. }
  620.  
  621. void CInstanceBase::DestroySystem()
  622. {
  623. ms_kPool.Clear();
  624. }
  625.  
  626. void CInstanceBase::CreateSystem(UINT uCapacity)
  627. {
  628. ms_kPool.Create(uCapacity);
  629.  
  630. memset(ms_adwCRCAffectEffect, 0, sizeof(ms_adwCRCAffectEffect));
  631.  
  632. ms_fDustGap=250.0f;
  633. ms_fHorseDustGap=500.0f;
  634. }
  635.  
  636. CInstanceBase* CInstanceBase::New()
  637. {
  638. return ms_kPool.Alloc();
  639. }
  640.  
  641. void CInstanceBase::Delete(CInstanceBase* pkInst)
  642. {
  643. pkInst->Destroy();
  644. ms_kPool.Free(pkInst);
  645. }
  646.  
  647. void CInstanceBase::SetMainInstance()
  648. {
  649. CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
  650.  
  651. DWORD dwVID=GetVirtualID();
  652. rkChrMgr.SetMainInstance(dwVID);
  653.  
  654. m_GraphicThingInstance.SetMainInstance();
  655. }
  656.  
  657. CInstanceBase* CInstanceBase::__GetMainInstancePtr()
  658. {
  659. CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
  660. return rkChrMgr.GetMainInstancePtr();
  661. }
  662.  
  663. void CInstanceBase::__ClearMainInstance()
  664. {
  665. CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
  666. rkChrMgr.ClearMainInstance();
  667. }
  668.  
  669. /* 실제 플레이어 캐릭터인지 조사.*/
  670. bool CInstanceBase::__IsMainInstance()
  671. {
  672. if (this==__GetMainInstancePtr())
  673. return true;
  674.  
  675. return false;
  676. }
  677.  
  678. bool CInstanceBase::__IsExistMainInstance()
  679. {
  680. if(__GetMainInstancePtr())
  681. return true;
  682. else
  683. return false;
  684. }
  685.  
  686. bool CInstanceBase::__MainCanSeeHiddenThing()
  687. {
  688. return false;
  689. // CInstanceBase * pInstance = __GetMainInstancePtr();
  690. // return pInstance->IsAffect(AFFECT_GAMJI);
  691. }
  692.  
  693. float CInstanceBase::__GetBowRange()
  694. {
  695. float fRange = 2500.0f - 100.0f;
  696.  
  697. if (__IsMainInstance())
  698. {
  699. IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
  700. fRange += float(rPlayer.GetStatus(POINT_BOW_DISTANCE));
  701. }
  702.  
  703. return fRange;
  704. }
  705.  
  706. CInstanceBase* CInstanceBase::__FindInstancePtr(DWORD dwVID)
  707. {
  708. CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
  709. return rkChrMgr.GetInstancePtr(dwVID);
  710. }
  711.  
  712. bool CInstanceBase::__FindRaceType(DWORD dwRace, BYTE* pbType)
  713. {
  714. CPythonNonPlayer& rkNonPlayer=CPythonNonPlayer::Instance();
  715. return rkNonPlayer.GetInstanceType(dwRace, pbType);
  716. }
  717.  
  718. bool CInstanceBase::Create(const SCreateData& c_rkCreateData)
  719. {
  720. IAbstractApplication::GetSingleton().SkipRenderBuffering(300);
  721.  
  722. SetInstanceType(c_rkCreateData.m_bType);
  723.  
  724.  
  725. if (!SetRace(c_rkCreateData.m_dwRace))
  726. return false;
  727.  
  728. SetVirtualID(c_rkCreateData.m_dwVID);
  729.  
  730. if (c_rkCreateData.m_isMain)
  731. SetMainInstance();
  732.  
  733. if (IsGuildWall())
  734. {
  735. unsigned center_x;
  736. unsigned center_y;
  737.  
  738. c_rkCreateData.m_kAffectFlags.ConvertToPosition(&center_x, &center_y);
  739.  
  740. float center_z = __GetBackgroundHeight(center_x, center_y);
  741. NEW_SetPixelPosition(TPixelPosition(float(c_rkCreateData.m_lPosX), float(c_rkCreateData.m_lPosY), center_z));
  742. }
  743. else
  744. {
  745. SCRIPT_SetPixelPosition(float(c_rkCreateData.m_lPosX), float(c_rkCreateData.m_lPosY));
  746. }
  747.  
  748. if (0 != c_rkCreateData.m_dwMountVnum)
  749. MountHorse(c_rkCreateData.m_dwMountVnum);
  750.  
  751. SetArmor(c_rkCreateData.m_dwArmor);
  752.  
  753. if (IsPC())
  754. {
  755. SetHair(c_rkCreateData.m_dwHair);
  756. SetWeapon(c_rkCreateData.m_dwWeapon);
  757. }
  758.  
  759. __Create_SetName(c_rkCreateData);
  760.  
  761. m_dwLevel = c_rkCreateData.m_dwLevel;
  762. m_dwGuildID = c_rkCreateData.m_dwGuildID;
  763. m_dwEmpireID = c_rkCreateData.m_dwEmpireID;
  764.  
  765. SetVirtualNumber(c_rkCreateData.m_dwRace);
  766. SetRotation(c_rkCreateData.m_fRot);
  767.  
  768. SetAlignment(c_rkCreateData.m_sAlignment);
  769. SetPKMode(c_rkCreateData.m_byPKMode);
  770.  
  771. SetMoveSpeed(c_rkCreateData.m_dwMovSpd);
  772. SetAttackSpeed(c_rkCreateData.m_dwAtkSpd);
  773.  
  774. // NOTE : Dress 를 입고 있으면 Alpha 를 넣지 않는다.
  775. if (!IsWearingDress())
  776. {
  777. // NOTE : 반드시 Affect 셋팅 윗쪽에 있어야 함
  778. m_GraphicThingInstance.SetAlphaValue(0.0f);
  779. m_GraphicThingInstance.BlendAlphaValue(1.0f, 0.5f);
  780. }
  781.  
  782. if (!IsGuildWall())
  783. {
  784. SetAffectFlagContainer(c_rkCreateData.m_kAffectFlags);
  785. }
  786.  
  787. // NOTE : 반드시 Affect 셋팅 후에 해야 함
  788. AttachTextTail();
  789. RefreshTextTail();
  790.  
  791. if (c_rkCreateData.m_dwStateFlags & ADD_CHARACTER_STATE_SPAWN)
  792. {
  793. if (IsAffect(AFFECT_SPAWN))
  794. __AttachEffect(EFFECT_SPAWN_APPEAR);
  795.  
  796. if (IsPC())
  797. {
  798. Refresh(CRaceMotionData::NAME_WAIT, true);
  799. }
  800. else
  801. {
  802. Refresh(CRaceMotionData::NAME_SPAWN, false);
  803. }
  804. }
  805. else
  806. {
  807. Refresh(CRaceMotionData::NAME_WAIT, true);
  808. }
  809.  
  810. __AttachEmpireEffect(c_rkCreateData.m_dwEmpireID);
  811.  
  812. RegisterBoundingSphere();
  813.  
  814. if (c_rkCreateData.m_dwStateFlags & ADD_CHARACTER_STATE_DEAD)
  815. m_GraphicThingInstance.DieEnd();
  816.  
  817. SetStateFlags(c_rkCreateData.m_dwStateFlags);
  818.  
  819. m_GraphicThingInstance.SetBattleHitEffect(ms_adwCRCAffectEffect[EFFECT_HIT]);
  820.  
  821. if (!IsPC())
  822. {
  823. DWORD dwBodyColor = CPythonNonPlayer::Instance().GetMonsterColor(c_rkCreateData.m_dwRace);
  824. if (0 != dwBodyColor)
  825. {
  826. SetModulateRenderMode();
  827. SetAddColor(dwBodyColor);
  828. }
  829. }
  830.  
  831. __AttachHorseSaddle();
  832.  
  833. // 길드 심볼을 위한 임시 코드, 적정 위치를 찾는 중
  834. const int c_iGuildSymbolRace = 14200;
  835. if (c_iGuildSymbolRace == GetRace())
  836. {
  837. std::string strFileName = GetGuildSymbolFileName(m_dwGuildID);
  838. if (IsFile(strFileName.c_str()))
  839. m_GraphicThingInstance.ChangeMaterial(strFileName.c_str());
  840. }
  841.  
  842. return true;
  843. }
  844.  
  845.  
  846. void CInstanceBase::__Create_SetName(const SCreateData& c_rkCreateData)
  847. {
  848. if (IsGoto())
  849. {
  850. SetNameString("", 0);
  851. return;
  852. }
  853. if (IsWarp())
  854. {
  855. __Create_SetWarpName(c_rkCreateData);
  856. return;
  857. }
  858.  
  859. SetNameString(c_rkCreateData.m_stName.c_str(), c_rkCreateData.m_stName.length());
  860. }
  861.  
  862. void CInstanceBase::__Create_SetWarpName(const SCreateData& c_rkCreateData)
  863. {
  864. const char * c_szName;
  865. if (CPythonNonPlayer::Instance().GetName(c_rkCreateData.m_dwRace, &c_szName))
  866. {
  867. std::string strName = c_szName;
  868. int iFindingPos = strName.find_first_of(" ", 0);
  869. if (iFindingPos > 0)
  870. {
  871. strName.resize(iFindingPos);
  872. }
  873. SetNameString(strName.c_str(), strName.length());
  874. }
  875. else
  876. {
  877. SetNameString(c_rkCreateData.m_stName.c_str(), c_rkCreateData.m_stName.length());
  878. }
  879. }
  880.  
  881. void CInstanceBase::SetNameString(const char* c_szName, int len)
  882. {
  883. m_stName.assign(c_szName, len);
  884. }
  885.  
  886.  
  887. bool CInstanceBase::SetRace(DWORD eRace)
  888. {
  889. m_dwRace = eRace;
  890.  
  891. if (!m_GraphicThingInstance.SetRace(eRace))
  892. return false;
  893.  
  894. if (!__FindRaceType(m_dwRace, &m_eRaceType))
  895. m_eRaceType=CActorInstance::TYPE_PC;
  896.  
  897. return true;
  898. }
  899.  
  900. BOOL CInstanceBase::__IsChangableWeapon(int iWeaponID)
  901. {
  902. // 드레스 입고 있을때는 부케외의 장비는 나오지 않게..
  903. if (IsWearingDress())
  904. {
  905. const int c_iBouquets[] =
  906. {
  907. 50201, // Bouquet for Assassin
  908. 50202, // Bouquet for Shaman
  909. 50203,
  910. 50204,
  911. 0, // #0000545: [M2CN] 웨딩 드레스와 장비 착용 문제
  912. };
  913.  
  914. for (int i = 0; c_iBouquets[i] != 0; ++i)
  915. if (iWeaponID == c_iBouquets[i])
  916. return true;
  917.  
  918. return false;
  919. }
  920. else
  921. return true;
  922. }
  923.  
  924. BOOL CInstanceBase::IsWearingDress()
  925. {
  926. const int c_iWeddingDressShape = 201;
  927. return c_iWeddingDressShape == m_eShape;
  928. }
  929.  
  930. BOOL CInstanceBase::IsHoldingPickAxe()
  931. {
  932. const int c_iPickAxeStart = 29101;
  933. const int c_iPickAxeEnd = 29110;
  934. return m_awPart[CRaceData::PART_WEAPON] >= c_iPickAxeStart && m_awPart[CRaceData::PART_WEAPON] <= c_iPickAxeEnd;
  935. }
  936.  
  937. BOOL CInstanceBase::IsNewMount()
  938. {
  939. return m_kHorse.IsNewMount();
  940. }
  941.  
  942. BOOL CInstanceBase::IsMountingHorse()
  943. {
  944. return m_kHorse.IsMounting();
  945. }
  946.  
  947. void CInstanceBase::MountHorse(UINT eRace)
  948. {
  949. m_kHorse.Destroy();
  950. m_kHorse.Create(m_GraphicThingInstance.NEW_GetCurPixelPositionRef(), eRace, ms_adwCRCAffectEffect[EFFECT_HIT]);
  951.  
  952. SetMotionMode(CRaceMotionData::MODE_HORSE);
  953. SetRotationSpeed(c_fDefaultHorseRotationSpeed);
  954.  
  955. m_GraphicThingInstance.MountHorse(m_kHorse.GetActorPtr());
  956. m_GraphicThingInstance.Stop();
  957. m_GraphicThingInstance.RefreshActorInstance();
  958. }
  959.  
  960. void CInstanceBase::DismountHorse()
  961. {
  962. m_kHorse.Destroy();
  963. }
  964.  
  965. void CInstanceBase::GetInfo(std::string* pstInfo)
  966. {
  967. char szInfo[256];
  968. sprintf(szInfo, "Inst - UC %d, RC %d Pool - %d ",
  969. ms_dwUpdateCounter,
  970. ms_dwRenderCounter,
  971. ms_kPool.GetCapacity()
  972. );
  973.  
  974. pstInfo->append(szInfo);
  975. }
  976.  
  977. void CInstanceBase::ResetPerformanceCounter()
  978. {
  979. ms_dwUpdateCounter=0;
  980. ms_dwRenderCounter=0;
  981. ms_dwDeformCounter=0;
  982. }
  983.  
  984. bool CInstanceBase::NEW_IsLastPixelPosition()
  985. {
  986. return m_GraphicThingInstance.IsPushing();
  987. }
  988.  
  989. const TPixelPosition& CInstanceBase::NEW_GetLastPixelPositionRef()
  990. {
  991. return m_GraphicThingInstance.NEW_GetLastPixelPositionRef();
  992. }
  993.  
  994. void CInstanceBase::NEW_SetDstPixelPositionZ(FLOAT z)
  995. {
  996. m_GraphicThingInstance.NEW_SetDstPixelPositionZ(z);
  997. }
  998.  
  999. void CInstanceBase::NEW_SetDstPixelPosition(const TPixelPosition& c_rkPPosDst)
  1000. {
  1001. m_GraphicThingInstance.NEW_SetDstPixelPosition(c_rkPPosDst);
  1002. }
  1003.  
  1004. void CInstanceBase::NEW_SetSrcPixelPosition(const TPixelPosition& c_rkPPosSrc)
  1005. {
  1006. m_GraphicThingInstance.NEW_SetSrcPixelPosition(c_rkPPosSrc);
  1007. }
  1008.  
  1009. const TPixelPosition& CInstanceBase::NEW_GetCurPixelPositionRef()
  1010. {
  1011. return m_GraphicThingInstance.NEW_GetCurPixelPositionRef();
  1012. }
  1013.  
  1014. const TPixelPosition& CInstanceBase::NEW_GetDstPixelPositionRef()
  1015. {
  1016. return m_GraphicThingInstance.NEW_GetDstPixelPositionRef();
  1017. }
  1018.  
  1019. const TPixelPosition& CInstanceBase::NEW_GetSrcPixelPositionRef()
  1020. {
  1021. return m_GraphicThingInstance.NEW_GetSrcPixelPositionRef();
  1022. }
  1023.  
  1024. /////////////////////////////////////////////////////////////////////////////////////////////////
  1025. void CInstanceBase::OnSyncing()
  1026. {
  1027. m_GraphicThingInstance.__OnSyncing();
  1028. }
  1029.  
  1030. void CInstanceBase::OnWaiting()
  1031. {
  1032. m_GraphicThingInstance.__OnWaiting();
  1033. }
  1034.  
  1035. void CInstanceBase::OnMoving()
  1036. {
  1037. m_GraphicThingInstance.__OnMoving();
  1038. }
  1039.  
  1040. void CInstanceBase::ChangeGuild(DWORD dwGuildID)
  1041. {
  1042. m_dwGuildID=dwGuildID;
  1043.  
  1044. DetachTextTail();
  1045. AttachTextTail();
  1046. RefreshTextTail();
  1047. }
  1048.  
  1049. DWORD CInstanceBase::GetPart(CRaceData::EParts part)
  1050. {
  1051. assert(part >= 0 && part < CRaceData::PART_MAX_NUM);
  1052. return m_awPart[part];
  1053. }
  1054.  
  1055. DWORD CInstanceBase::GetShape()
  1056. {
  1057. return m_eShape;
  1058. }
  1059.  
  1060. bool CInstanceBase::CanAct()
  1061. {
  1062. return m_GraphicThingInstance.CanAct();
  1063. }
  1064.  
  1065. bool CInstanceBase::CanMove()
  1066. {
  1067. return m_GraphicThingInstance.CanMove();
  1068. }
  1069.  
  1070. bool CInstanceBase::CanUseSkill()
  1071. {
  1072. if (IsPoly())
  1073. return false;
  1074.  
  1075. if (IsWearingDress())
  1076. return false;
  1077.  
  1078. if (IsHoldingPickAxe())
  1079. return false;
  1080.  
  1081. if (!m_kHorse.CanUseSkill())
  1082. return false;
  1083.  
  1084. if (!m_GraphicThingInstance.CanUseSkill())
  1085. return false;
  1086.  
  1087. return true;
  1088. }
  1089.  
  1090. bool CInstanceBase::CanAttack()
  1091. {
  1092. if (!m_kHorse.CanAttack())
  1093. return false;
  1094.  
  1095. if (IsWearingDress())
  1096. return false;
  1097.  
  1098. if (IsHoldingPickAxe())
  1099. return false;
  1100.  
  1101. return m_GraphicThingInstance.CanAttack();
  1102. }
  1103.  
  1104.  
  1105.  
  1106. bool CInstanceBase::CanFishing()
  1107. {
  1108. return m_GraphicThingInstance.CanFishing();
  1109. }
  1110.  
  1111.  
  1112. BOOL CInstanceBase::IsBowMode()
  1113. {
  1114. return m_GraphicThingInstance.IsBowMode();
  1115. }
  1116.  
  1117. BOOL CInstanceBase::IsHandMode()
  1118. {
  1119. return m_GraphicThingInstance.IsHandMode();
  1120. }
  1121.  
  1122. BOOL CInstanceBase::IsFishingMode()
  1123. {
  1124. if (CRaceMotionData::MODE_FISHING == m_GraphicThingInstance.GetMotionMode())
  1125. return true;
  1126.  
  1127. return false;
  1128. }
  1129.  
  1130. BOOL CInstanceBase::IsFishing()
  1131. {
  1132. return m_GraphicThingInstance.IsFishing();
  1133. }
  1134.  
  1135. BOOL CInstanceBase::IsDead()
  1136. {
  1137. return m_GraphicThingInstance.IsDead();
  1138. }
  1139.  
  1140. BOOL CInstanceBase::IsStun()
  1141. {
  1142. return m_GraphicThingInstance.IsStun();
  1143. }
  1144.  
  1145. BOOL CInstanceBase::IsSleep()
  1146. {
  1147. return m_GraphicThingInstance.IsSleep();
  1148. }
  1149.  
  1150.  
  1151. BOOL CInstanceBase::__IsSyncing()
  1152. {
  1153. return m_GraphicThingInstance.__IsSyncing();
  1154. }
  1155.  
  1156.  
  1157.  
  1158. void CInstanceBase::NEW_SetOwner(DWORD dwVIDOwner)
  1159. {
  1160. m_GraphicThingInstance.SetOwner(dwVIDOwner);
  1161. }
  1162.  
  1163. float CInstanceBase::GetLocalTime()
  1164. {
  1165. return m_GraphicThingInstance.GetLocalTime();
  1166. }
  1167.  
  1168.  
  1169. void CInstanceBase::PushUDPState(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg)
  1170. {
  1171. }
  1172.  
  1173. DWORD ELTimer_GetServerFrameMSec();
  1174.  
  1175. void CInstanceBase::PushTCPStateExpanded(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg, UINT uTargetVID)
  1176. {
  1177. SCommand kCmdNew;
  1178. kCmdNew.m_kPPosDst = c_rkPPosDst;
  1179. kCmdNew.m_dwChkTime = dwCmdTime+100;
  1180. kCmdNew.m_dwCmdTime = dwCmdTime;
  1181. kCmdNew.m_fDstRot = fDstRot;
  1182. kCmdNew.m_eFunc = eFunc;
  1183. kCmdNew.m_uArg = uArg;
  1184. kCmdNew.m_uTargetVID = uTargetVID;
  1185. m_kQue_kCmdNew.push_back(kCmdNew);
  1186. }
  1187.  
  1188. void CInstanceBase::PushTCPState(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg)
  1189. {
  1190. if (__IsMainInstance())
  1191. {
  1192. //assert(!"CInstanceBase::PushTCPState 플레이어 자신에게 이동패킷은 오면 안된다!");
  1193. TraceError("CInstanceBase::PushTCPState 플레이어 자신에게 이동패킷은 오면 안된다!");
  1194. return;
  1195. }
  1196.  
  1197. int nNetworkGap=ELTimer_GetServerFrameMSec()-dwCmdTime;
  1198.  
  1199. m_nAverageNetworkGap=(m_nAverageNetworkGap*70+nNetworkGap*30)/100;
  1200.  
  1201. /*
  1202. if (m_dwBaseCmdTime == 0)
  1203. {
  1204. m_dwBaseChkTime = ELTimer_GetFrameMSec()-nNetworkGap;
  1205. m_dwBaseCmdTime = dwCmdTime;
  1206.  
  1207. Tracenf("VID[%d] 네트웍갭 [%d]", GetVirtualID(), nNetworkGap);
  1208. }
  1209. */
  1210.  
  1211. //m_dwBaseChkTime-m_dwBaseCmdTime+ELTimer_GetServerMSec();
  1212.  
  1213. SCommand kCmdNew;
  1214. kCmdNew.m_kPPosDst = c_rkPPosDst;
  1215. kCmdNew.m_dwChkTime = dwCmdTime+m_nAverageNetworkGap;//m_dwBaseChkTime + (dwCmdTime - m_dwBaseCmdTime);// + nNetworkGap;
  1216. kCmdNew.m_dwCmdTime = dwCmdTime;
  1217. kCmdNew.m_fDstRot = fDstRot;
  1218. kCmdNew.m_eFunc = eFunc;
  1219. kCmdNew.m_uArg = uArg;
  1220. m_kQue_kCmdNew.push_back(kCmdNew);
  1221.  
  1222. //int nApplyGap=kCmdNew.m_dwChkTime-ELTimer_GetServerFrameMSec();
  1223.  
  1224. //if (nApplyGap<-500 || nApplyGap>500)
  1225. // Tracenf("VID[%d] NAME[%s] 네트웍갭 [cur:%d ave:%d] 작동시간 (%d)", GetVirtualID(), GetNameString(), nNetworkGap, m_nAverageNetworkGap, nApplyGap);
  1226. }
  1227.  
  1228. /*
  1229. CInstanceBase::TStateQueue::iterator CInstanceBase::FindSameState(TStateQueue& rkQuekStt, DWORD dwCmdTime, UINT eFunc, UINT uArg)
  1230. {
  1231. TStateQueue::iterator i=rkQuekStt.begin();
  1232. while (rkQuekStt.end()!=i)
  1233. {
  1234. SState& rkSttEach=*i;
  1235. if (rkSttEach.m_dwCmdTime==dwCmdTime)
  1236. if (rkSttEach.m_eFunc==eFunc)
  1237. if (rkSttEach.m_uArg==uArg)
  1238. break;
  1239. ++i;
  1240. }
  1241.  
  1242. return i;
  1243. }
  1244. */
  1245.  
  1246. BOOL CInstanceBase::__CanProcessNetworkStatePacket()
  1247. {
  1248. if (m_GraphicThingInstance.IsDead())
  1249. return FALSE;
  1250. if (m_GraphicThingInstance.IsKnockDown())
  1251. return FALSE;
  1252. if (m_GraphicThingInstance.IsUsingSkill())
  1253. if (!m_GraphicThingInstance.CanCancelSkill())
  1254. return FALSE;
  1255.  
  1256. return TRUE;
  1257. }
  1258.  
  1259. BOOL CInstanceBase::__IsEnableTCPProcess(UINT eCurFunc)
  1260. {
  1261. if (m_GraphicThingInstance.IsActEmotion())
  1262. {
  1263. return FALSE;
  1264. }
  1265.  
  1266. if (!m_bEnableTCPState)
  1267. {
  1268. if (FUNC_EMOTION != eCurFunc)
  1269. {
  1270. return FALSE;
  1271. }
  1272. }
  1273.  
  1274. return TRUE;
  1275. }
  1276.  
  1277. void CInstanceBase::StateProcess()
  1278. {
  1279. while (1)
  1280. {
  1281. if (m_kQue_kCmdNew.empty())
  1282. return;
  1283.  
  1284. DWORD dwDstChkTime = m_kQue_kCmdNew.front().m_dwChkTime;
  1285. DWORD dwCurChkTime = ELTimer_GetServerFrameMSec();
  1286.  
  1287. if (dwCurChkTime < dwDstChkTime)
  1288. return;
  1289.  
  1290. SCommand kCmdTop = m_kQue_kCmdNew.front();
  1291. m_kQue_kCmdNew.pop_front();
  1292.  
  1293. TPixelPosition kPPosDst = kCmdTop.m_kPPosDst;
  1294. //DWORD dwCmdTime = kCmdTop.m_dwCmdTime;
  1295. FLOAT fRotDst = kCmdTop.m_fDstRot;
  1296. UINT eFunc = kCmdTop.m_eFunc;
  1297. UINT uArg = kCmdTop.m_uArg;
  1298. UINT uVID = GetVirtualID();
  1299. UINT uTargetVID = kCmdTop.m_uTargetVID;
  1300.  
  1301. TPixelPosition kPPosCur;
  1302. NEW_GetPixelPosition(&kPPosCur);
  1303.  
  1304. /*
  1305. if (IsPC())
  1306. Tracenf("%d cmd: vid=%d[%s] func=%d arg=%d curPos=(%f, %f) dstPos=(%f, %f) rot=%f (time %d)",
  1307. ELTimer_GetMSec(),
  1308. uVID, m_stName.c_str(), eFunc, uArg,
  1309. kPPosCur.x, kPPosCur.y,
  1310. kPPosDst.x, kPPosDst.y, fRotDst, dwCmdTime-m_dwBaseCmdTime);
  1311. */
  1312.  
  1313. TPixelPosition kPPosDir = kPPosDst - kPPosCur;
  1314. float fDirLen = (float)sqrt(kPPosDir.x * kPPosDir.x + kPPosDir.y * kPPosDir.y);
  1315.  
  1316. //Tracenf("거리 %f", fDirLen);
  1317.  
  1318. if (!__CanProcessNetworkStatePacket())
  1319. {
  1320. Lognf(0, "vid=%d 움직일 수 없는 상태라 스킵 IsDead=%d, IsKnockDown=%d", uVID, m_GraphicThingInstance.IsDead(), m_GraphicThingInstance.IsKnockDown());
  1321. return;
  1322. }
  1323.  
  1324. if (!__IsEnableTCPProcess(eFunc))
  1325. {
  1326. return;
  1327. }
  1328.  
  1329. switch (eFunc)
  1330. {
  1331. case FUNC_WAIT:
  1332. {
  1333. //Tracenf("%s (%f, %f) -> (%f, %f) 남은거리 %f", GetNameString(), kPPosCur.x, kPPosCur.y, kPPosDst.x, kPPosDst.y, fDirLen);
  1334. if (fDirLen > 1.0f)
  1335. {
  1336. //NEW_GetSrcPixelPositionRef() = kPPosCur;
  1337. //NEW_GetDstPixelPositionRef() = kPPosDst;
  1338. NEW_SetSrcPixelPosition(kPPosCur);
  1339. NEW_SetDstPixelPosition(kPPosDst);
  1340.  
  1341. __EnableSkipCollision();
  1342.  
  1343. m_fDstRot = fRotDst;
  1344. m_isGoing = TRUE;
  1345.  
  1346. m_kMovAfterFunc.eFunc = FUNC_WAIT;
  1347.  
  1348. if (!IsWalking())
  1349. StartWalking();
  1350.  
  1351. //Tracen("목표정지");
  1352. }
  1353. else
  1354. {
  1355. //Tracen("현재 정지");
  1356.  
  1357. m_isGoing = FALSE;
  1358.  
  1359. if (!IsWaiting())
  1360. EndWalking();
  1361.  
  1362. SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
  1363. SetAdvancingRotation(fRotDst);
  1364. SetRotation(fRotDst);
  1365. }
  1366. break;
  1367. }
  1368.  
  1369. case FUNC_MOVE:
  1370. {
  1371. //NEW_GetSrcPixelPositionRef() = kPPosCur;
  1372. //NEW_GetDstPixelPositionRef() = kPPosDst;
  1373. NEW_SetSrcPixelPosition(kPPosCur);
  1374. NEW_SetDstPixelPosition(kPPosDst);
  1375. m_fDstRot = fRotDst;
  1376. m_isGoing = TRUE;
  1377. __EnableSkipCollision();
  1378. //m_isSyncMov = TRUE;
  1379.  
  1380. m_kMovAfterFunc.eFunc = FUNC_MOVE;
  1381.  
  1382. if (!IsWalking())
  1383. {
  1384. //Tracen("걷고 있지 않아 걷기 시작");
  1385. StartWalking();
  1386. }
  1387. else
  1388. {
  1389. //Tracen("이미 걷는중 ");
  1390. }
  1391. break;
  1392. }
  1393.  
  1394. case FUNC_COMBO:
  1395. {
  1396. if (fDirLen >= 50.0f)
  1397. {
  1398. NEW_SetSrcPixelPosition(kPPosCur);
  1399. NEW_SetDstPixelPosition(kPPosDst);
  1400. m_fDstRot=fRotDst;
  1401. m_isGoing = TRUE;
  1402. __EnableSkipCollision();
  1403.  
  1404. m_kMovAfterFunc.eFunc = FUNC_COMBO;
  1405. m_kMovAfterFunc.uArg = uArg;
  1406.  
  1407. if (!IsWalking())
  1408. StartWalking();
  1409. }
  1410. else
  1411. {
  1412. //Tracen("대기 공격 정지");
  1413.  
  1414. m_isGoing = FALSE;
  1415.  
  1416. if (IsWalking())
  1417. EndWalking();
  1418.  
  1419. SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
  1420. RunComboAttack(fRotDst, uArg);
  1421. }
  1422. break;
  1423. }
  1424.  
  1425. case FUNC_ATTACK:
  1426. {
  1427. if (fDirLen>=50.0f)
  1428. {
  1429. //NEW_GetSrcPixelPositionRef() = kPPosCur;
  1430. //NEW_GetDstPixelPositionRef() = kPPosDst;
  1431. NEW_SetSrcPixelPosition(kPPosCur);
  1432. NEW_SetDstPixelPosition(kPPosDst);
  1433. m_fDstRot = fRotDst;
  1434. m_isGoing = TRUE;
  1435. __EnableSkipCollision();
  1436. //m_isSyncMov = TRUE;
  1437.  
  1438. m_kMovAfterFunc.eFunc = FUNC_ATTACK;
  1439.  
  1440. if (!IsWalking())
  1441. StartWalking();
  1442.  
  1443. //Tracen("너무 멀어서 이동 후 공격");
  1444. }
  1445. else
  1446. {
  1447. //Tracen("노말 공격 정지");
  1448.  
  1449. m_isGoing = FALSE;
  1450.  
  1451. if (IsWalking())
  1452. EndWalking();
  1453.  
  1454. SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
  1455. BlendRotation(fRotDst);
  1456.  
  1457. RunNormalAttack(fRotDst);
  1458.  
  1459. //Tracen("가깝기 때문에 워프 공격");
  1460. }
  1461. break;
  1462. }
  1463.  
  1464. case FUNC_MOB_SKILL:
  1465. {
  1466. if (fDirLen >= 50.0f)
  1467. {
  1468. NEW_SetSrcPixelPosition(kPPosCur);
  1469. NEW_SetDstPixelPosition(kPPosDst);
  1470. m_fDstRot = fRotDst;
  1471. m_isGoing = TRUE;
  1472. __EnableSkipCollision();
  1473.  
  1474. m_kMovAfterFunc.eFunc = FUNC_MOB_SKILL;
  1475. m_kMovAfterFunc.uArg = uArg;
  1476.  
  1477. if (!IsWalking())
  1478. StartWalking();
  1479. }
  1480. else
  1481. {
  1482. m_isGoing = FALSE;
  1483.  
  1484. if (IsWalking())
  1485. EndWalking();
  1486.  
  1487. SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
  1488. BlendRotation(fRotDst);
  1489.  
  1490. m_GraphicThingInstance.InterceptOnceMotion(CRaceMotionData::NAME_SPECIAL_1 + uArg);
  1491. }
  1492. break;
  1493. }
  1494.  
  1495. case FUNC_EMOTION:
  1496. {
  1497. if (fDirLen>100.0f)
  1498. {
  1499. NEW_SetSrcPixelPosition(kPPosCur);
  1500. NEW_SetDstPixelPosition(kPPosDst);
  1501. m_fDstRot = fRotDst;
  1502. m_isGoing = TRUE;
  1503.  
  1504. if (__IsMainInstance())
  1505. __EnableSkipCollision();
  1506.  
  1507. m_kMovAfterFunc.eFunc = FUNC_EMOTION;
  1508. m_kMovAfterFunc.uArg = uArg;
  1509. m_kMovAfterFunc.uArgExpanded = uTargetVID;
  1510. m_kMovAfterFunc.kPosDst = kPPosDst;
  1511.  
  1512. if (!IsWalking())
  1513. StartWalking();
  1514. }
  1515. else
  1516. {
  1517. __ProcessFunctionEmotion(uArg, uTargetVID, kPPosDst);
  1518. }
  1519. break;
  1520. }
  1521.  
  1522. default:
  1523. {
  1524. if (eFunc & FUNC_SKILL)
  1525. {
  1526. if (fDirLen >= 50.0f)
  1527. {
  1528. //NEW_GetSrcPixelPositionRef() = kPPosCur;
  1529. //NEW_GetDstPixelPositionRef() = kPPosDst;
  1530. NEW_SetSrcPixelPosition(kPPosCur);
  1531. NEW_SetDstPixelPosition(kPPosDst);
  1532. m_fDstRot = fRotDst;
  1533. m_isGoing = TRUE;
  1534. //m_isSyncMov = TRUE;
  1535. __EnableSkipCollision();
  1536.  
  1537. m_kMovAfterFunc.eFunc = eFunc;
  1538. m_kMovAfterFunc.uArg = uArg;
  1539.  
  1540. if (!IsWalking())
  1541. StartWalking();
  1542.  
  1543. //Tracen("너무 멀어서 이동 후 공격");
  1544. }
  1545. else
  1546. {
  1547. //Tracen("스킬 정지");
  1548.  
  1549. m_isGoing = FALSE;
  1550.  
  1551. if (IsWalking())
  1552. EndWalking();
  1553.  
  1554. SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
  1555. SetAdvancingRotation(fRotDst);
  1556. SetRotation(fRotDst);
  1557.  
  1558. NEW_UseSkill(0, eFunc & 0x7f, uArg&0x0f, (uArg>>4) ? true : false);
  1559. //Tracen("가깝기 때문에 워프 공격");
  1560. }
  1561. }
  1562. break;
  1563. }
  1564. }
  1565. }
  1566. }
  1567.  
  1568.  
  1569. void CInstanceBase::MovementProcess()
  1570. {
  1571. TPixelPosition kPPosCur;
  1572. NEW_GetPixelPosition(&kPPosCur);
  1573.  
  1574. // 렌더링 좌표계이므로 y를 -화해서 더한다.
  1575.  
  1576. TPixelPosition kPPosNext;
  1577. {
  1578. const D3DXVECTOR3 & c_rkV3Mov = m_GraphicThingInstance.GetMovementVectorRef();
  1579.  
  1580. kPPosNext.x = kPPosCur.x + (+c_rkV3Mov.x);
  1581. kPPosNext.y = kPPosCur.y + (-c_rkV3Mov.y);
  1582. kPPosNext.z = kPPosCur.z + (+c_rkV3Mov.z);
  1583. }
  1584.  
  1585. TPixelPosition kPPosDeltaSC = kPPosCur - NEW_GetSrcPixelPositionRef();
  1586. TPixelPosition kPPosDeltaSN = kPPosNext - NEW_GetSrcPixelPositionRef();
  1587. TPixelPosition kPPosDeltaSD = NEW_GetDstPixelPositionRef() - NEW_GetSrcPixelPositionRef();
  1588.  
  1589. float fCurLen = sqrtf(kPPosDeltaSC.x * kPPosDeltaSC.x + kPPosDeltaSC.y * kPPosDeltaSC.y);
  1590. float fNextLen = sqrtf(kPPosDeltaSN.x * kPPosDeltaSN.x + kPPosDeltaSN.y * kPPosDeltaSN.y);
  1591. float fTotalLen = sqrtf(kPPosDeltaSD.x * kPPosDeltaSD.x + kPPosDeltaSD.y * kPPosDeltaSD.y);
  1592. float fRestLen = fTotalLen - fCurLen;
  1593.  
  1594. if (__IsMainInstance())
  1595. {
  1596. if (m_isGoing && IsWalking())
  1597. {
  1598. float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(NEW_GetSrcPixelPositionRef(), NEW_GetDstPixelPositionRef());
  1599.  
  1600. SetAdvancingRotation(fDstRot);
  1601.  
  1602. if (fRestLen<=0.0)
  1603. {
  1604. if (IsWalking())
  1605. EndWalking();
  1606.  
  1607. //Tracen("목표 도달 정지");
  1608.  
  1609. m_isGoing = FALSE;
  1610.  
  1611. BlockMovement();
  1612.  
  1613. if (FUNC_EMOTION == m_kMovAfterFunc.eFunc)
  1614. {
  1615. DWORD dwMotionNumber = m_kMovAfterFunc.uArg;
  1616. DWORD dwTargetVID = m_kMovAfterFunc.uArgExpanded;
  1617. __ProcessFunctionEmotion(dwMotionNumber, dwTargetVID, m_kMovAfterFunc.kPosDst);
  1618. m_kMovAfterFunc.eFunc = FUNC_WAIT;
  1619. return;
  1620. }
  1621. }
  1622. }
  1623. }
  1624. else
  1625. {
  1626. if (m_isGoing && IsWalking())
  1627. {
  1628. float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(NEW_GetSrcPixelPositionRef(), NEW_GetDstPixelPositionRef());
  1629.  
  1630. SetAdvancingRotation(fDstRot);
  1631.  
  1632. // 만약 렌턴시가 늦어 너무 많이 이동했다면..
  1633. if (fRestLen < -100.0f)
  1634. {
  1635. NEW_SetSrcPixelPosition(kPPosCur);
  1636.  
  1637. float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(kPPosCur, NEW_GetDstPixelPositionRef());
  1638. SetAdvancingRotation(fDstRot);
  1639. //Tracenf("VID %d 오버 방향설정 (%f, %f) %f rest %f", GetVirtualID(), kPPosCur.x, kPPosCur.y, fDstRot, fRestLen);
  1640.  
  1641. // 이동중이라면 다음번에 멈추게 한다
  1642. if (FUNC_MOVE == m_kMovAfterFunc.eFunc)
  1643. {
  1644. m_kMovAfterFunc.eFunc = FUNC_WAIT;
  1645. }
  1646. }
  1647. // 도착했다면...
  1648. else if (fCurLen <= fTotalLen && fTotalLen <= fNextLen)
  1649. {
  1650. if (m_GraphicThingInstance.IsDead() || m_GraphicThingInstance.IsKnockDown())
  1651. {
  1652. __DisableSkipCollision();
  1653.  
  1654. //Tracen("사망 상태라 동작 스킵");
  1655.  
  1656. m_isGoing = FALSE;
  1657.  
  1658. //Tracen("행동 불능 상태라 이후 동작 스킵");
  1659. }
  1660. else
  1661. {
  1662. switch (m_kMovAfterFunc.eFunc)
  1663. {
  1664. case FUNC_ATTACK:
  1665. {
  1666. if (IsWalking())
  1667. EndWalking();
  1668.  
  1669. __DisableSkipCollision();
  1670. m_isGoing = FALSE;
  1671.  
  1672. BlockMovement();
  1673. SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
  1674. SetAdvancingRotation(m_fDstRot);
  1675. SetRotation(m_fDstRot);
  1676.  
  1677. RunNormalAttack(m_fDstRot);
  1678. break;
  1679. }
  1680.  
  1681. case FUNC_COMBO:
  1682. {
  1683. if (IsWalking())
  1684. EndWalking();
  1685.  
  1686. __DisableSkipCollision();
  1687. m_isGoing = FALSE;
  1688.  
  1689. BlockMovement();
  1690. SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
  1691. RunComboAttack(m_fDstRot, m_kMovAfterFunc.uArg);
  1692. break;
  1693. }
  1694.  
  1695. case FUNC_EMOTION:
  1696. {
  1697. m_isGoing = FALSE;
  1698. m_kMovAfterFunc.eFunc = FUNC_WAIT;
  1699. __DisableSkipCollision();
  1700. BlockMovement();
  1701.  
  1702. DWORD dwMotionNumber = m_kMovAfterFunc.uArg;
  1703. DWORD dwTargetVID = m_kMovAfterFunc.uArgExpanded;
  1704. __ProcessFunctionEmotion(dwMotionNumber, dwTargetVID, m_kMovAfterFunc.kPosDst);
  1705. break;
  1706. }
  1707.  
  1708. case FUNC_MOVE:
  1709. {
  1710. break;
  1711. }
  1712.  
  1713. case FUNC_MOB_SKILL:
  1714. {
  1715. if (IsWalking())
  1716. EndWalking();
  1717.  
  1718. __DisableSkipCollision();
  1719. m_isGoing = FALSE;
  1720.  
  1721. BlockMovement();
  1722. SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
  1723. SetAdvancingRotation(m_fDstRot);
  1724. SetRotation(m_fDstRot);
  1725.  
  1726. m_GraphicThingInstance.InterceptOnceMotion(CRaceMotionData::NAME_SPECIAL_1 + m_kMovAfterFunc.uArg);
  1727. break;
  1728. }
  1729.  
  1730. default:
  1731. {
  1732. if (m_kMovAfterFunc.eFunc & FUNC_SKILL)
  1733. {
  1734. SetAdvancingRotation(m_fDstRot);
  1735. BlendRotation(m_fDstRot);
  1736. NEW_UseSkill(0, m_kMovAfterFunc.eFunc & 0x7f, m_kMovAfterFunc.uArg&0x0f, (m_kMovAfterFunc.uArg>>4) ? true : false);
  1737. }
  1738. else
  1739. {
  1740. //Tracenf("VID %d 스킬 공격 (%f, %f) rot %f", GetVirtualID(), NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y, m_fDstRot);
  1741.  
  1742. __DisableSkipCollision();
  1743. m_isGoing = FALSE;
  1744.  
  1745. BlockMovement();
  1746. SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
  1747. SetAdvancingRotation(m_fDstRot);
  1748. BlendRotation(m_fDstRot);
  1749. if (!IsWaiting())
  1750. {
  1751. EndWalking();
  1752. }
  1753.  
  1754. //Tracenf("VID %d 정지 (%f, %f) rot %f IsWalking %d", GetVirtualID(), NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y, m_fDstRot, IsWalking());
  1755. }
  1756. break;
  1757. }
  1758. }
  1759.  
  1760. }
  1761. }
  1762.  
  1763. }
  1764. }
  1765.  
  1766. if (IsWalking() || m_GraphicThingInstance.IsUsingMovingSkill())
  1767. {
  1768. float fRotation = m_GraphicThingInstance.GetRotation();
  1769. float fAdvancingRotation = m_GraphicThingInstance.GetAdvancingRotation();
  1770. int iDirection = GetRotatingDirection(fRotation, fAdvancingRotation);
  1771.  
  1772. if (DEGREE_DIRECTION_SAME != m_iRotatingDirection)
  1773. {
  1774. if (DEGREE_DIRECTION_LEFT == iDirection)
  1775. {
  1776. fRotation = fmodf(fRotation + m_fRotSpd*m_GraphicThingInstance.GetSecondElapsed(), 360.0f);
  1777. }
  1778. else if (DEGREE_DIRECTION_RIGHT == iDirection)
  1779. {
  1780. fRotation = fmodf(fRotation - m_fRotSpd*m_GraphicThingInstance.GetSecondElapsed() + 360.0f, 360.0f);
  1781. }
  1782.  
  1783. if (m_iRotatingDirection != GetRotatingDirection(fRotation, fAdvancingRotation))
  1784. {
  1785. m_iRotatingDirection = DEGREE_DIRECTION_SAME;
  1786. fRotation = fAdvancingRotation;
  1787. }
  1788.  
  1789. m_GraphicThingInstance.SetRotation(fRotation);
  1790. }
  1791.  
  1792. if (__IsInDustRange())
  1793. {
  1794. float fDustDistance = NEW_GetDistanceFromDestPixelPosition(m_kPPosDust);
  1795. if (IsMountingHorse())
  1796. {
  1797. if (fDustDistance > ms_fHorseDustGap)
  1798. {
  1799. NEW_GetPixelPosition(&m_kPPosDust);
  1800. __AttachEffect(EFFECT_HORSE_DUST);
  1801. }
  1802. }
  1803. else
  1804. {
  1805. if (fDustDistance > ms_fDustGap)
  1806. {
  1807. NEW_GetPixelPosition(&m_kPPosDust);
  1808. __AttachEffect(EFFECT_DUST);
  1809. }
  1810. }
  1811. }
  1812. }
  1813. }
  1814.  
  1815. void CInstanceBase::__ProcessFunctionEmotion(DWORD dwMotionNumber, DWORD dwTargetVID, const TPixelPosition & c_rkPosDst)
  1816. {
  1817. if (IsWalking())
  1818. EndWalkingWithoutBlending();
  1819.  
  1820. __EnableChangingTCPState();
  1821. SCRIPT_SetPixelPosition(c_rkPosDst.x, c_rkPosDst.y);
  1822.  
  1823. CInstanceBase * pTargetInstance = CPythonCharacterManager::Instance().GetInstancePtr(dwTargetVID);
  1824. if (pTargetInstance)
  1825. {
  1826. pTargetInstance->__EnableChangingTCPState();
  1827.  
  1828. if (pTargetInstance->IsWalking())
  1829. pTargetInstance->EndWalkingWithoutBlending();
  1830.  
  1831. WORD wMotionNumber1 = HIWORD(dwMotionNumber);
  1832. WORD wMotionNumber2 = LOWORD(dwMotionNumber);
  1833.  
  1834. int src_job = RaceToJob(GetRace());
  1835. int dst_job = RaceToJob(pTargetInstance->GetRace());
  1836.  
  1837. NEW_LookAtDestInstance(*pTargetInstance);
  1838. m_GraphicThingInstance.InterceptOnceMotion(wMotionNumber1 + dst_job);
  1839. m_GraphicThingInstance.SetRotation(m_GraphicThingInstance.GetTargetRotation());
  1840. m_GraphicThingInstance.SetAdvancingRotation(m_GraphicThingInstance.GetTargetRotation());
  1841.  
  1842. pTargetInstance->NEW_LookAtDestInstance(*this);
  1843. pTargetInstance->m_GraphicThingInstance.InterceptOnceMotion(wMotionNumber2 + src_job);
  1844. pTargetInstance->m_GraphicThingInstance.SetRotation(pTargetInstance->m_GraphicThingInstance.GetTargetRotation());
  1845. pTargetInstance->m_GraphicThingInstance.SetAdvancingRotation(pTargetInstance->m_GraphicThingInstance.GetTargetRotation());
  1846.  
  1847. if (pTargetInstance->__IsMainInstance())
  1848. {
  1849. IAbstractPlayer & rPlayer=IAbstractPlayer::GetSingleton();
  1850. rPlayer.EndEmotionProcess();
  1851. }
  1852. }
  1853.  
  1854. if (__IsMainInstance())
  1855. {
  1856. IAbstractPlayer & rPlayer=IAbstractPlayer::GetSingleton();
  1857. rPlayer.EndEmotionProcess();
  1858. }
  1859. }
  1860.  
  1861. ///////////////////////////////////////////////////////////////////////////////////////////////////
  1862. // Update & Deform & Render
  1863.  
  1864. int g_iAccumulationTime = 0;
  1865.  
  1866. void CInstanceBase::Update()
  1867. {
  1868. ++ms_dwUpdateCounter;
  1869.  
  1870. StateProcess();
  1871. m_GraphicThingInstance.PhysicsProcess();
  1872. m_GraphicThingInstance.RotationProcess();
  1873. m_GraphicThingInstance.ComboProcess();
  1874. m_GraphicThingInstance.AccumulationMovement();
  1875.  
  1876. if (m_GraphicThingInstance.IsMovement())
  1877. {
  1878. TPixelPosition kPPosCur;
  1879. NEW_GetPixelPosition(&kPPosCur);
  1880.  
  1881. DWORD dwCurTime=ELTimer_GetFrameMSec();
  1882. //if (m_dwNextUpdateHeightTime<dwCurTime)
  1883. {
  1884. m_dwNextUpdateHeightTime=dwCurTime;
  1885. kPPosCur.z = __GetBackgroundHeight(kPPosCur.x, kPPosCur.y);
  1886. NEW_SetPixelPosition(kPPosCur);
  1887. }
  1888.  
  1889. // SetMaterialColor
  1890. {
  1891. DWORD dwMtrlColor=__GetShadowMapColor(kPPosCur.x, kPPosCur.y);
  1892. m_GraphicThingInstance.SetMaterialColor(dwMtrlColor);
  1893. }
  1894. }
  1895.  
  1896. m_GraphicThingInstance.UpdateAdvancingPointInstance();
  1897.  
  1898. AttackProcess();
  1899. MovementProcess();
  1900.  
  1901. m_GraphicThingInstance.MotionProcess(IsPC());
  1902. if (IsMountingHorse())
  1903. {
  1904. m_kHorse.m_pkActor->HORSE_MotionProcess(FALSE);
  1905. }
  1906.  
  1907. __ComboProcess();
  1908.  
  1909. ProcessDamage();
  1910.  
  1911. }
  1912.  
  1913. void CInstanceBase::Transform()
  1914. {
  1915. if (__IsSyncing())
  1916. {
  1917. //OnSyncing();
  1918. }
  1919. else
  1920. {
  1921. if (IsWalking() || m_GraphicThingInstance.IsUsingMovingSkill())
  1922. {
  1923. const D3DXVECTOR3& c_rv3Movment=m_GraphicThingInstance.GetMovementVectorRef();
  1924.  
  1925. float len=(c_rv3Movment.x*c_rv3Movment.x)+(c_rv3Movment.y*c_rv3Movment.y);
  1926. if (len>1.0f)
  1927. OnMoving();
  1928. else
  1929. OnWaiting();
  1930. }
  1931. }
  1932.  
  1933. m_GraphicThingInstance.INSTANCEBASE_Transform();
  1934. }
  1935.  
  1936.  
  1937. void CInstanceBase::Deform()
  1938. {
  1939. // 2004.07.17.levites.isShow를 ViewFrustumCheck로 변경
  1940. if (!__CanRender())
  1941. return;
  1942.  
  1943. ++ms_dwDeformCounter;
  1944.  
  1945. m_GraphicThingInstance.INSTANCEBASE_Deform();
  1946.  
  1947. m_kHorse.Deform();
  1948. }
  1949.  
  1950. void CInstanceBase::RenderTrace()
  1951. {
  1952. if (!__CanRender())
  1953. return;
  1954.  
  1955. m_GraphicThingInstance.RenderTrace();
  1956. }
  1957.  
  1958.  
  1959.  
  1960.  
  1961. void CInstanceBase::Render()
  1962. {
  1963. // 2004.07.17.levites.isShow를 ViewFrustumCheck로 변경
  1964. if (!__CanRender())
  1965. return;
  1966.  
  1967. ++ms_dwRenderCounter;
  1968.  
  1969. m_kHorse.Render();
  1970. m_GraphicThingInstance.Render();
  1971.  
  1972. if (CActorInstance::IsDirLine())
  1973. {
  1974. if (NEW_GetDstPixelPositionRef().x != 0.0f)
  1975. {
  1976. static CScreen s_kScreen;
  1977.  
  1978. STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
  1979. STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
  1980. STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  1981. STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, FALSE);
  1982. STATEMANAGER.SetRenderState(D3DRS_FOGENABLE, FALSE);
  1983. STATEMANAGER.SetRenderState(D3DRS_LIGHTING, FALSE);
  1984.  
  1985. TPixelPosition px;
  1986. m_GraphicThingInstance.GetPixelPosition(&px);
  1987. D3DXVECTOR3 kD3DVt3Cur(px.x, px.y, px.z);
  1988. //D3DXVECTOR3 kD3DVt3Cur(NEW_GetSrcPixelPositionRef().x, -NEW_GetSrcPixelPositionRef().y, NEW_GetSrcPixelPositionRef().z);
  1989. D3DXVECTOR3 kD3DVt3Dest(NEW_GetDstPixelPositionRef().x, -NEW_GetDstPixelPositionRef().y, NEW_GetDstPixelPositionRef().z);
  1990.  
  1991. //printf("%s %f\n", GetNameString(), kD3DVt3Cur.y - kD3DVt3Dest.y);
  1992. //float fdx = NEW_GetDstPixelPositionRef().x - NEW_GetSrcPixelPositionRef().x;
  1993. //float fdy = NEW_GetDstPixelPositionRef().y - NEW_GetSrcPixelPositionRef().y;
  1994.  
  1995. s_kScreen.SetDiffuseColor(0.0f, 0.0f, 1.0f);
  1996. s_kScreen.RenderLine3d(kD3DVt3Cur.x, kD3DVt3Cur.y, px.z, kD3DVt3Dest.x, kD3DVt3Dest.y, px.z);
  1997. STATEMANAGER.RestoreRenderState(D3DRS_ZENABLE);
  1998. STATEMANAGER.SetRenderState(D3DRS_FOGENABLE, TRUE);
  1999. STATEMANAGER.SetRenderState(D3DRS_LIGHTING, TRUE);
  2000. }
  2001. }
  2002. }
  2003.  
  2004. void CInstanceBase::RenderToShadowMap()
  2005. {
  2006. if (IsDoor())
  2007. return;
  2008.  
  2009. if (IsBuilding())
  2010. return;
  2011.  
  2012. if (!__CanRender())
  2013. return;
  2014.  
  2015. if (!__IsExistMainInstance())
  2016. return;
  2017.  
  2018. CInstanceBase* pkInstMain=__GetMainInstancePtr();
  2019.  
  2020. const float SHADOW_APPLY_DISTANCE = 2500.0f;
  2021.  
  2022. float fDistance=NEW_GetDistanceFromDestInstance(*pkInstMain);
  2023. if (fDistance>=SHADOW_APPLY_DISTANCE)
  2024. return;
  2025.  
  2026. m_GraphicThingInstance.RenderToShadowMap();
  2027. }
  2028.  
  2029. void CInstanceBase::RenderCollision()
  2030. {
  2031. m_GraphicThingInstance.RenderCollisionData();
  2032. }
  2033.  
  2034. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2035. // Setting & Getting Data
  2036.  
  2037. void CInstanceBase::SetVirtualID(DWORD dwVirtualID)
  2038. {
  2039. m_GraphicThingInstance.SetVirtualID(dwVirtualID);
  2040. }
  2041.  
  2042. void CInstanceBase::SetVirtualNumber(DWORD dwVirtualNumber)
  2043. {
  2044. m_dwVirtualNumber = dwVirtualNumber;
  2045. }
  2046.  
  2047. void CInstanceBase::SetInstanceType(int iInstanceType)
  2048. {
  2049. m_GraphicThingInstance.SetActorType(iInstanceType);
  2050. }
  2051.  
  2052. void CInstanceBase::SetAlignment(short sAlignment)
  2053. {
  2054. m_sAlignment = sAlignment;
  2055. RefreshTextTailTitle();
  2056. }
  2057.  
  2058. void CInstanceBase::SetPKMode(BYTE byPKMode)
  2059. {
  2060. if (m_byPKMode == byPKMode)
  2061. return;
  2062.  
  2063. m_byPKMode = byPKMode;
  2064.  
  2065. if (__IsMainInstance())
  2066. {
  2067. IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
  2068. rPlayer.NotifyChangePKMode();
  2069. }
  2070. }
  2071.  
  2072. void CInstanceBase::SetKiller(bool bFlag)
  2073. {
  2074. if (m_isKiller == bFlag)
  2075. return;
  2076.  
  2077. m_isKiller = bFlag;
  2078. RefreshTextTail();
  2079. }
  2080.  
  2081. void CInstanceBase::SetPartyMemberFlag(bool bFlag)
  2082. {
  2083. m_isPartyMember = bFlag;
  2084. }
  2085.  
  2086. void CInstanceBase::SetStateFlags(DWORD dwStateFlags)
  2087. {
  2088. if (dwStateFlags & ADD_CHARACTER_STATE_KILLER)
  2089. SetKiller(TRUE);
  2090. else
  2091. SetKiller(FALSE);
  2092.  
  2093. if (dwStateFlags & ADD_CHARACTER_STATE_PARTY)
  2094. SetPartyMemberFlag(TRUE);
  2095. else
  2096. SetPartyMemberFlag(FALSE);
  2097. }
  2098.  
  2099. void CInstanceBase::SetComboType(UINT uComboType)
  2100. {
  2101. m_GraphicThingInstance.SetComboType(uComboType);
  2102. }
  2103.  
  2104. const char * CInstanceBase::GetNameString()
  2105. {
  2106. return m_stName.c_str();
  2107. }
  2108.  
  2109. DWORD CInstanceBase::GetRace()
  2110. {
  2111. return m_dwRace;
  2112. }
  2113.  
  2114.  
  2115. bool CInstanceBase::IsConflictAlignmentInstance(CInstanceBase& rkInstVictim)
  2116. {
  2117. if (PK_MODE_PROTECT == rkInstVictim.GetPKMode())
  2118. return false;
  2119.  
  2120. switch (GetAlignmentType())
  2121. {
  2122. case ALIGNMENT_TYPE_NORMAL:
  2123. case ALIGNMENT_TYPE_WHITE:
  2124. if (ALIGNMENT_TYPE_DARK == rkInstVictim.GetAlignmentType())
  2125. return true;
  2126. break;
  2127. case ALIGNMENT_TYPE_DARK:
  2128. if (GetAlignmentType() != rkInstVictim.GetAlignmentType())
  2129. return true;
  2130. break;
  2131. }
  2132.  
  2133. return false;
  2134. }
  2135.  
  2136. void CInstanceBase::SetDuelMode(DWORD type)
  2137. {
  2138. m_dwDuelMode = type;
  2139. }
  2140.  
  2141. DWORD CInstanceBase::GetDuelMode()
  2142. {
  2143. return m_dwDuelMode;
  2144. }
  2145.  
  2146. bool CInstanceBase::IsAttackableInstance(CInstanceBase& rkInstVictim)
  2147. {
  2148. if (__IsMainInstance())
  2149. {
  2150. CPythonPlayer& rkPlayer=CPythonPlayer::Instance();
  2151. if(rkPlayer.IsObserverMode())
  2152. return false;
  2153. }
  2154.  
  2155. if (GetVirtualID() == rkInstVictim.GetVirtualID())
  2156. return false;
  2157.  
  2158. if (IsStone())
  2159. {
  2160. if (rkInstVictim.IsPC())
  2161. return true;
  2162. }
  2163. else if (IsPC())
  2164. {
  2165. if (rkInstVictim.IsStone())
  2166. return true;
  2167.  
  2168. if (rkInstVictim.IsPC())
  2169. {
  2170. if (GetDuelMode())
  2171. {
  2172. switch(GetDuelMode())
  2173. {
  2174. case DUEL_CANNOTATTACK:
  2175. return false;
  2176. case DUEL_START:
  2177. if(__FindDUELKey(GetVirtualID(),rkInstVictim.GetVirtualID()))
  2178. return true;
  2179. else
  2180. return false;
  2181. }
  2182. }
  2183. if (PK_MODE_GUILD == GetPKMode())
  2184. if (GetGuildID() == rkInstVictim.GetGuildID())
  2185. return false;
  2186.  
  2187. if (rkInstVictim.IsKiller())
  2188. if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
  2189. return true;
  2190.  
  2191. if (PK_MODE_PROTECT != GetPKMode())
  2192. {
  2193. if (PK_MODE_FREE == GetPKMode())
  2194. {
  2195. if (PK_MODE_PROTECT != rkInstVictim.GetPKMode())
  2196. if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
  2197. return true;
  2198. }
  2199. if (PK_MODE_GUILD == GetPKMode())
  2200. {
  2201. if (PK_MODE_PROTECT != rkInstVictim.GetPKMode())
  2202. if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
  2203. if (GetGuildID() != rkInstVictim.GetGuildID())
  2204. return true;
  2205. }
  2206. }
  2207.  
  2208. if (IsSameEmpire(rkInstVictim))
  2209. {
  2210. if (IsPVPInstance(rkInstVictim))
  2211. return true;
  2212.  
  2213. if (PK_MODE_REVENGE == GetPKMode())
  2214. if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
  2215. if (IsConflictAlignmentInstance(rkInstVictim))
  2216. return true;
  2217. }
  2218. else
  2219. {
  2220. return true;
  2221. }
  2222. }
  2223.  
  2224. if (rkInstVictim.IsEnemy())
  2225. return true;
  2226.  
  2227. if (rkInstVictim.IsWoodenDoor())
  2228. return true;
  2229. }
  2230. else if (IsEnemy())
  2231. {
  2232. if (rkInstVictim.IsPC())
  2233. return true;
  2234.  
  2235. if (rkInstVictim.IsBuilding())
  2236. return true;
  2237.  
  2238. }
  2239. else if (IsPoly())
  2240. {
  2241. if (rkInstVictim.IsPC())
  2242. return true;
  2243.  
  2244. if (rkInstVictim.IsEnemy())
  2245. return true;
  2246. }
  2247. return false;
  2248. }
  2249.  
  2250. bool CInstanceBase::IsTargetableInstance(CInstanceBase& rkInstVictim)
  2251. {
  2252. return rkInstVictim.CanPickInstance();
  2253. }
  2254.  
  2255. // 2004. 07. 07. [levites] - 스킬 사용중 타겟이 바뀌는 문제 해결을 위한 코드
  2256. bool CInstanceBase::CanChangeTarget()
  2257. {
  2258. return m_GraphicThingInstance.CanChangeTarget();
  2259. }
  2260.  
  2261. // 2004.07.17.levites.isShow를 ViewFrustumCheck로 변경
  2262. bool CInstanceBase::CanPickInstance()
  2263. {
  2264. if (!__IsInViewFrustum())
  2265. return false;
  2266.  
  2267. if (IsDoor())
  2268. {
  2269. if (IsDead())
  2270. return false;
  2271. }
  2272.  
  2273. if (IsPC())
  2274. {
  2275. if (IsAffect(AFFECT_EUNHYEONG))
  2276. {
  2277. if (!__MainCanSeeHiddenThing())
  2278. return false;
  2279. }
  2280. if (IsAffect(AFFECT_REVIVE_INVISIBILITY))
  2281. return false;
  2282. if (IsAffect(AFFECT_INVISIBILITY))
  2283. return false;
  2284. }
  2285.  
  2286. if (IsDead())
  2287. return false;
  2288.  
  2289. return true;
  2290. }
  2291.  
  2292. bool CInstanceBase::CanViewTargetHP(CInstanceBase& rkInstVictim)
  2293. {
  2294. if (rkInstVictim.IsStone())
  2295. return true;
  2296. if (rkInstVictim.IsWoodenDoor())
  2297. return true;
  2298. if (rkInstVictim.IsEnemy())
  2299. return true;
  2300.  
  2301. return false;
  2302. }
  2303.  
  2304. BOOL CInstanceBase::IsPoly()
  2305. {
  2306. return m_GraphicThingInstance.IsPoly();
  2307. }
  2308.  
  2309. BOOL CInstanceBase::IsPC()
  2310. {
  2311. return m_GraphicThingInstance.IsPC();
  2312. }
  2313.  
  2314. BOOL CInstanceBase::IsNPC()
  2315. {
  2316. return m_GraphicThingInstance.IsNPC();
  2317. }
  2318.  
  2319. BOOL CInstanceBase::IsEnemy()
  2320. {
  2321. return m_GraphicThingInstance.IsEnemy();
  2322. }
  2323.  
  2324. BOOL CInstanceBase::IsStone()
  2325. {
  2326. return m_GraphicThingInstance.IsStone();
  2327. }
  2328.  
  2329.  
  2330. BOOL CInstanceBase::IsGuildWall() //IsBuilding 길드건물전체 IsGuildWall은 담장벽만(문은 제외)
  2331. {
  2332. return IsWall(m_dwRace);
  2333. }
  2334.  
  2335.  
  2336. BOOL CInstanceBase::IsResource()
  2337. {
  2338. switch (m_dwVirtualNumber)
  2339. {
  2340. case 20047:
  2341. case 20048:
  2342. case 20049:
  2343. case 20050:
  2344. case 20051:
  2345. case 20052:
  2346. case 20053:
  2347. case 20054:
  2348. case 20055:
  2349. case 20056:
  2350. case 20057:
  2351. case 20058:
  2352. case 20059:
  2353. case 30301:
  2354. case 30302:
  2355. case 30303:
  2356. case 30304:
  2357. case 30305:
  2358. return TRUE;
  2359. }
  2360.  
  2361. return FALSE;
  2362. }
  2363.  
  2364. BOOL CInstanceBase::IsWarp()
  2365. {
  2366. return m_GraphicThingInstance.IsWarp();
  2367. }
  2368.  
  2369. BOOL CInstanceBase::IsGoto()
  2370. {
  2371. return m_GraphicThingInstance.IsGoto();
  2372. }
  2373.  
  2374. BOOL CInstanceBase::IsObject()
  2375. {
  2376. return m_GraphicThingInstance.IsObject();
  2377. }
  2378.  
  2379. BOOL CInstanceBase::IsBuilding()
  2380. {
  2381. return m_GraphicThingInstance.IsBuilding();
  2382. }
  2383.  
  2384. BOOL CInstanceBase::IsDoor()
  2385. {
  2386. return m_GraphicThingInstance.IsDoor();
  2387. }
  2388.  
  2389. BOOL CInstanceBase::IsWoodenDoor()
  2390. {
  2391. if (m_GraphicThingInstance.IsDoor())
  2392. {
  2393. int vnum = GetVirtualNumber();
  2394. if (vnum == 13000) // 나무문
  2395. return true;
  2396. else if (vnum >= 30111 && vnum <= 30119) // 사귀문
  2397. return true;
  2398. else
  2399. return false;
  2400. }
  2401. else
  2402. {
  2403. return false;
  2404. }
  2405. }
  2406.  
  2407. BOOL CInstanceBase::IsStoneDoor()
  2408. {
  2409. return m_GraphicThingInstance.IsDoor() && 13001 == GetVirtualNumber();
  2410. }
  2411.  
  2412. BOOL CInstanceBase::IsFlag()
  2413. {
  2414. if (GetRace() == 20035)
  2415. return TRUE;
  2416. if (GetRace() == 20036)
  2417. return TRUE;
  2418. if (GetRace() == 20037)
  2419. return TRUE;
  2420.  
  2421. return FALSE;
  2422. }
  2423.  
  2424. BOOL CInstanceBase::IsForceVisible()
  2425. {
  2426. if (IsAffect(AFFECT_SHOW_ALWAYS))
  2427. return TRUE;
  2428.  
  2429. if (IsObject() || IsBuilding() || IsDoor() )
  2430. return TRUE;
  2431.  
  2432. return FALSE;
  2433. }
  2434.  
  2435. int CInstanceBase::GetInstanceType()
  2436. {
  2437. return m_GraphicThingInstance.GetActorType();
  2438. }
  2439.  
  2440. DWORD CInstanceBase::GetVirtualID()
  2441. {
  2442. return m_GraphicThingInstance.GetVirtualID();
  2443. }
  2444.  
  2445. DWORD CInstanceBase::GetVirtualNumber()
  2446. {
  2447. return m_dwVirtualNumber;
  2448. }
  2449.  
  2450. // 2004.07.17.levites.isShow를 ViewFrustumCheck로 변경
  2451. bool CInstanceBase::__IsInViewFrustum()
  2452. {
  2453. return m_GraphicThingInstance.isShow();
  2454. }
  2455.  
  2456. bool CInstanceBase::__CanRender()
  2457. {
  2458. if (!__IsInViewFrustum())
  2459. return false;
  2460. if (IsAffect(AFFECT_INVISIBILITY))
  2461. return false;
  2462.  
  2463. return true;
  2464. }
  2465.  
  2466.  
  2467. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2468. // Graphic Control
  2469.  
  2470. bool CInstanceBase::IntersectBoundingBox()
  2471. {
  2472. float u, v, t;
  2473. return m_GraphicThingInstance.Intersect(&u, &v, &t);
  2474. }
  2475.  
  2476. bool CInstanceBase::IntersectDefendingSphere()
  2477. {
  2478. return m_GraphicThingInstance.IntersectDefendingSphere();
  2479. }
  2480.  
  2481. float CInstanceBase::GetDistance(CInstanceBase * pkTargetInst)
  2482. {
  2483. TPixelPosition TargetPixelPosition;
  2484. pkTargetInst->m_GraphicThingInstance.GetPixelPosition(&TargetPixelPosition);
  2485. return GetDistance(TargetPixelPosition);
  2486. }
  2487.  
  2488. float CInstanceBase::GetDistance(const TPixelPosition & c_rPixelPosition)
  2489. {
  2490. TPixelPosition PixelPosition;
  2491. m_GraphicThingInstance.GetPixelPosition(&PixelPosition);
  2492.  
  2493. float fdx = PixelPosition.x - c_rPixelPosition.x;
  2494. float fdy = PixelPosition.y - c_rPixelPosition.y;
  2495.  
  2496. return sqrtf((fdx*fdx) + (fdy*fdy));
  2497. }
  2498.  
  2499. CActorInstance& CInstanceBase::GetGraphicThingInstanceRef()
  2500. {
  2501. return m_GraphicThingInstance;
  2502. }
  2503.  
  2504. CActorInstance* CInstanceBase::GetGraphicThingInstancePtr()
  2505. {
  2506. return &m_GraphicThingInstance;
  2507. }
  2508.  
  2509. void CInstanceBase::RefreshActorInstance()
  2510. {
  2511. m_GraphicThingInstance.RefreshActorInstance();
  2512. }
  2513.  
  2514. void CInstanceBase::Refresh(DWORD dwMotIndex, bool isLoop)
  2515. {
  2516. RefreshState(dwMotIndex, isLoop);
  2517. }
  2518.  
  2519. void CInstanceBase::RestoreRenderMode()
  2520. {
  2521. m_GraphicThingInstance.RestoreRenderMode();
  2522. }
  2523.  
  2524. void CInstanceBase::SetAddRenderMode()
  2525. {
  2526. m_GraphicThingInstance.SetAddRenderMode();
  2527. }
  2528.  
  2529. void CInstanceBase::SetModulateRenderMode()
  2530. {
  2531. m_GraphicThingInstance.SetModulateRenderMode();
  2532. }
  2533.  
  2534. void CInstanceBase::SetRenderMode(int iRenderMode)
  2535. {
  2536. m_GraphicThingInstance.SetRenderMode(iRenderMode);
  2537. }
  2538.  
  2539. void CInstanceBase::SetAddColor(const D3DXCOLOR & c_rColor)
  2540. {
  2541. m_GraphicThingInstance.SetAddColor(c_rColor);
  2542. }
  2543.  
  2544. void CInstanceBase::__SetBlendRenderingMode()
  2545. {
  2546. m_GraphicThingInstance.SetBlendRenderMode();
  2547. }
  2548.  
  2549. void CInstanceBase::__SetAlphaValue(float fAlpha)
  2550. {
  2551. m_GraphicThingInstance.SetAlphaValue(fAlpha);
  2552. }
  2553.  
  2554. float CInstanceBase::__GetAlphaValue()
  2555. {
  2556. return m_GraphicThingInstance.GetAlphaValue();
  2557. }
  2558.  
  2559. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2560. // Part
  2561.  
  2562. void CInstanceBase::SetHair(DWORD eHair)
  2563. {
  2564. if (!HAIR_COLOR_ENABLE)
  2565. return;
  2566.  
  2567. if (IsPC()==false)
  2568. return;
  2569. m_awPart[CRaceData::PART_HAIR] = eHair;
  2570. m_GraphicThingInstance.SetHair(eHair);
  2571. }
  2572.  
  2573. void CInstanceBase::ChangeHair(DWORD eHair)
  2574. {
  2575. if (!HAIR_COLOR_ENABLE)
  2576. return;
  2577.  
  2578. if (IsPC()==false)
  2579. return;
  2580.  
  2581. if (GetPart(CRaceData::PART_HAIR)==eHair)
  2582. return;
  2583.  
  2584. SetHair(eHair);
  2585.  
  2586. //int type = m_GraphicThingInstance.GetMotionMode();
  2587.  
  2588. RefreshState(CRaceMotionData::NAME_WAIT, true);
  2589. //RefreshState(type, true);
  2590. }
  2591.  
  2592. void CInstanceBase::SetArmor(DWORD dwArmor)
  2593. {
  2594. DWORD dwShape;
  2595. if (__ArmorVnumToShape(dwArmor, &dwShape))
  2596. {
  2597. CItemData * pItemData;
  2598. if (CItemManager::Instance().GetItemDataPointer(dwArmor, &pItemData))
  2599. {
  2600. float fSpecularPower=pItemData->GetSpecularPowerf();
  2601. SetShape(dwShape, fSpecularPower);
  2602. __GetRefinedEffect(pItemData);
  2603. return;
  2604. }
  2605. else
  2606. __ClearArmorRefineEffect();
  2607. }
  2608.  
  2609. SetShape(dwArmor);
  2610. }
  2611.  
  2612. void CInstanceBase::SetShape(DWORD eShape, float fSpecular)
  2613. {
  2614. if (IsPoly())
  2615. {
  2616. m_GraphicThingInstance.SetShape(0);
  2617. }
  2618. else
  2619. {
  2620. m_GraphicThingInstance.SetShape(eShape, fSpecular);
  2621. }
  2622.  
  2623. m_eShape = eShape;
  2624. }
  2625.  
  2626.  
  2627.  
  2628. DWORD CInstanceBase::GetWeaponType()
  2629. {
  2630. DWORD dwWeapon = GetPart(CRaceData::PART_WEAPON);
  2631. CItemData * pItemData;
  2632. if (!CItemManager::Instance().GetItemDataPointer(dwWeapon, &pItemData))
  2633. return CItemData::WEAPON_NONE;
  2634.  
  2635. return pItemData->GetWeaponType();
  2636. }
  2637.  
  2638. /*
  2639. void CInstanceBase::SetParts(const WORD * c_pParts)
  2640. {
  2641. if (IsPoly())
  2642. return;
  2643.  
  2644. if (__IsShapeAnimalWear())
  2645. return;
  2646.  
  2647. UINT eWeapon=c_pParts[CRaceData::PART_WEAPON];
  2648.  
  2649. if (__IsChangableWeapon(eWeapon) == false)
  2650. eWeapon = 0;
  2651.  
  2652. if (eWeapon != m_GraphicThingInstance.GetPartItemID(CRaceData::PART_WEAPON))
  2653. {
  2654. m_GraphicThingInstance.AttachPart(CRaceData::PART_MAIN, CRaceData::PART_WEAPON, eWeapon);
  2655. m_awPart[CRaceData::PART_WEAPON] = eWeapon;
  2656. }
  2657.  
  2658. __AttachHorseSaddle();
  2659. }
  2660. */
  2661.  
  2662. void CInstanceBase::__ClearWeaponRefineEffect()
  2663. {
  2664. if (m_swordRefineEffectRight)
  2665. {
  2666. __DetachEffect(m_swordRefineEffectRight);
  2667. m_swordRefineEffectRight = 0;
  2668. }
  2669. if (m_swordRefineEffectLeft)
  2670. {
  2671. __DetachEffect(m_swordRefineEffectLeft);
  2672. m_swordRefineEffectLeft = 0;
  2673. }
  2674. }
  2675.  
  2676. void CInstanceBase::__ClearArmorRefineEffect()
  2677. {
  2678. if (m_armorRefineEffect)
  2679. {
  2680. __DetachEffect(m_armorRefineEffect);
  2681. m_armorRefineEffect = 0;
  2682. }
  2683. }
  2684.  
  2685. UINT CInstanceBase::__GetRefinedEffect(CItemData* pItem)
  2686. {
  2687. DWORD refine = max(pItem->GetRefine() + pItem->GetSocketCount(),CItemData::ITEM_SOCKET_MAX_NUM) - CItemData::ITEM_SOCKET_MAX_NUM;
  2688. switch (pItem->GetType())
  2689. {
  2690. case CItemData::ITEM_TYPE_WEAPON:
  2691. __ClearWeaponRefineEffect();
  2692. if (refine < 7) //현재 제련도 7 이상만 이펙트가 있습니다.
  2693. return 0;
  2694. switch(pItem->GetSubType())
  2695. {
  2696. case CItemData::WEAPON_DAGGER:
  2697. m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7+refine-7;
  2698. m_swordRefineEffectLeft = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7_LEFT+refine-7;
  2699. break;
  2700. case CItemData::WEAPON_FAN:
  2701. m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_FANBELL_REFINED7+refine-7;
  2702. break;
  2703. case CItemData::WEAPON_ARROW:
  2704. case CItemData::WEAPON_BELL:
  2705. m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7+refine-7;
  2706. break;
  2707. case CItemData::WEAPON_BOW:
  2708. m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_BOW_REFINED7+refine-7;
  2709. break;
  2710. default:
  2711. m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SWORD_REFINED7+refine-7;
  2712. }
  2713. if (m_swordRefineEffectRight)
  2714. m_swordRefineEffectRight = __AttachEffect(m_swordRefineEffectRight);
  2715. if (m_swordRefineEffectLeft)
  2716. m_swordRefineEffectLeft = __AttachEffect(m_swordRefineEffectLeft);
  2717. break;
  2718. case CItemData::ITEM_TYPE_ARMOR:
  2719. __ClearArmorRefineEffect();
  2720.  
  2721. // 갑옷 특화 이펙트
  2722. if (pItem->GetSubType() == CItemData::ARMOR_BODY)
  2723. {
  2724. DWORD vnum = pItem->GetIndex();
  2725.  
  2726. if (12010 <= vnum && vnum <= 12049)
  2727. {
  2728. __AttachEffect(EFFECT_REFINED+EFFECT_BODYARMOR_SPECIAL);
  2729. __AttachEffect(EFFECT_REFINED+EFFECT_BODYARMOR_SPECIAL2);
  2730. }
  2731. }
  2732.  
  2733. if (refine < 7) //현재 제련도 7 이상만 이펙트가 있습니다.
  2734. return 0;
  2735.  
  2736. if (pItem->GetSubType() == CItemData::ARMOR_BODY)
  2737. {
  2738. m_armorRefineEffect = EFFECT_REFINED+EFFECT_BODYARMOR_REFINED7+refine-7;
  2739. __AttachEffect(m_armorRefineEffect);
  2740. }
  2741. break;
  2742. }
  2743. return 0;
  2744. }
  2745.  
  2746. bool CInstanceBase::SetWeapon(DWORD eWeapon)
  2747. {
  2748. if (IsPoly())
  2749. return false;
  2750.  
  2751. if (__IsShapeAnimalWear())
  2752. return false;
  2753.  
  2754. if (__IsChangableWeapon(eWeapon) == false)
  2755. eWeapon = 0;
  2756.  
  2757. m_GraphicThingInstance.AttachWeapon(eWeapon);
  2758. m_awPart[CRaceData::PART_WEAPON] = eWeapon;
  2759.  
  2760. //Weapon Effect
  2761. CItemData * pItemData;
  2762. if (CItemManager::Instance().GetItemDataPointer(eWeapon, &pItemData))
  2763. __GetRefinedEffect(pItemData);
  2764. else
  2765. __ClearWeaponRefineEffect();
  2766.  
  2767. return true;
  2768. }
  2769.  
  2770. void CInstanceBase::ChangeWeapon(DWORD eWeapon)
  2771. {
  2772. if (eWeapon == m_GraphicThingInstance.GetPartItemID(CRaceData::PART_WEAPON))
  2773. return;
  2774.  
  2775. if (SetWeapon(eWeapon))
  2776. RefreshState(CRaceMotionData::NAME_WAIT, true);
  2777. }
  2778.  
  2779. bool CInstanceBase::ChangeArmor(DWORD dwArmor)
  2780. {
  2781. DWORD eShape;
  2782. __ArmorVnumToShape(dwArmor, &eShape);
  2783.  
  2784. if (GetShape()==eShape)
  2785. return false;
  2786.  
  2787. CAffectFlagContainer kAffectFlagContainer;
  2788. kAffectFlagContainer.CopyInstance(m_kAffectFlagContainer);
  2789.  
  2790. DWORD dwVID = GetVirtualID();
  2791. DWORD dwRace = GetRace();
  2792. DWORD eHair = GetPart(CRaceData::PART_HAIR);
  2793. DWORD eWeapon = GetPart(CRaceData::PART_WEAPON);
  2794. float fRot = GetRotation();
  2795. float fAdvRot = GetAdvancingRotation();
  2796.  
  2797. if (IsWalking())
  2798. EndWalking();
  2799.  
  2800. // 2004.07.25.myevan.이펙트 안 붙는 문제
  2801. //////////////////////////////////////////////////////
  2802. __ClearAffects();
  2803. //////////////////////////////////////////////////////
  2804.  
  2805. if (!SetRace(dwRace))
  2806. {
  2807. TraceError("CPythonCharacterManager::ChangeArmor - SetRace VID[%d] Race[%d] ERROR", dwVID, dwRace);
  2808. return false;
  2809. }
  2810.  
  2811. SetArmor(dwArmor);
  2812. SetHair(eHair);
  2813. SetWeapon(eWeapon);
  2814.  
  2815. SetRotation(fRot);
  2816. SetAdvancingRotation(fAdvRot);
  2817.  
  2818. __AttachHorseSaddle();
  2819.  
  2820. RefreshState(CRaceMotionData::NAME_WAIT, TRUE);
  2821.  
  2822. // 2004.07.25.myevan.이펙트 안 붙는 문제
  2823. /////////////////////////////////////////////////
  2824. SetAffectFlagContainer(kAffectFlagContainer);
  2825. /////////////////////////////////////////////////
  2826.  
  2827. CActorInstance::IEventHandler& rkEventHandler=GetEventHandlerRef();
  2828. rkEventHandler.OnChangeShape();
  2829.  
  2830. return true;
  2831. }
  2832.  
  2833. bool CInstanceBase::__IsShapeAnimalWear()
  2834. {
  2835. if (100 == GetShape() ||
  2836. 101 == GetShape() ||
  2837. 102 == GetShape() ||
  2838. 103 == GetShape())
  2839. return true;
  2840.  
  2841. return false;
  2842. }
  2843.  
  2844. DWORD CInstanceBase::__GetRaceType()
  2845. {
  2846. return m_eRaceType;
  2847. }
  2848.  
  2849.  
  2850. void CInstanceBase::RefreshState(DWORD dwMotIndex, bool isLoop)
  2851. {
  2852. DWORD dwPartItemID = m_GraphicThingInstance.GetPartItemID(CRaceData::PART_WEAPON);
  2853.  
  2854. BYTE byItemType = 0xff;
  2855. BYTE bySubType = 0xff;
  2856.  
  2857. CItemManager & rkItemMgr = CItemManager::Instance();
  2858. CItemData * pItemData;
  2859.  
  2860. if (rkItemMgr.GetItemDataPointer(dwPartItemID, &pItemData))
  2861. {
  2862. byItemType = pItemData->GetType();
  2863. bySubType = pItemData->GetWeaponType();
  2864. }
  2865.  
  2866. if (IsPoly())
  2867. {
  2868. SetMotionMode(CRaceMotionData::MODE_GENERAL);
  2869. }
  2870. else if (IsWearingDress())
  2871. {
  2872. SetMotionMode(CRaceMotionData::MODE_WEDDING_DRESS);
  2873. }
  2874. else if (IsHoldingPickAxe())
  2875. {
  2876. if (m_kHorse.IsMounting())
  2877. {
  2878. SetMotionMode(CRaceMotionData::MODE_HORSE);
  2879. }
  2880. else
  2881. {
  2882. SetMotionMode(CRaceMotionData::MODE_GENERAL);
  2883. }
  2884. }
  2885. else if (CItemData::ITEM_TYPE_ROD == byItemType)
  2886. {
  2887. if (m_kHorse.IsMounting())
  2888. {
  2889. SetMotionMode(CRaceMotionData::MODE_HORSE);
  2890. }
  2891. else
  2892. {
  2893. SetMotionMode(CRaceMotionData::MODE_FISHING);
  2894. }
  2895. }
  2896. else if (m_kHorse.IsMounting())
  2897. {
  2898. switch (bySubType)
  2899. {
  2900. case CItemData::WEAPON_SWORD:
  2901. SetMotionMode(CRaceMotionData::MODE_HORSE_ONEHAND_SWORD);
  2902. break;
  2903.  
  2904. case CItemData::WEAPON_TWO_HANDED:
  2905. SetMotionMode(CRaceMotionData::MODE_HORSE_TWOHAND_SWORD); // Only Warrior
  2906. break;
  2907.  
  2908. case CItemData::WEAPON_DAGGER:
  2909. SetMotionMode(CRaceMotionData::MODE_HORSE_DUALHAND_SWORD); // Only Assassin
  2910. break;
  2911.  
  2912. case CItemData::WEAPON_FAN:
  2913. SetMotionMode(CRaceMotionData::MODE_HORSE_FAN); // Only Shaman
  2914. break;
  2915.  
  2916. case CItemData::WEAPON_BELL:
  2917. SetMotionMode(CRaceMotionData::MODE_HORSE_BELL); // Only Shaman
  2918. break;
  2919.  
  2920. case CItemData::WEAPON_BOW:
  2921. SetMotionMode(CRaceMotionData::MODE_HORSE_BOW); // Only Shaman
  2922. break;
  2923.  
  2924. default:
  2925. SetMotionMode(CRaceMotionData::MODE_HORSE);
  2926. break;
  2927. }
  2928. }
  2929. else
  2930. {
  2931. switch (bySubType)
  2932. {
  2933. case CItemData::WEAPON_SWORD:
  2934. SetMotionMode(CRaceMotionData::MODE_ONEHAND_SWORD);
  2935. break;
  2936.  
  2937. case CItemData::WEAPON_TWO_HANDED:
  2938. SetMotionMode(CRaceMotionData::MODE_TWOHAND_SWORD); // Only Warrior
  2939. break;
  2940.  
  2941. case CItemData::WEAPON_DAGGER:
  2942. SetMotionMode(CRaceMotionData::MODE_DUALHAND_SWORD); // Only Assassin
  2943. break;
  2944.  
  2945. case CItemData::WEAPON_BOW:
  2946. SetMotionMode(CRaceMotionData::MODE_BOW); // Only Assassin
  2947. break;
  2948.  
  2949. case CItemData::WEAPON_FAN:
  2950. SetMotionMode(CRaceMotionData::MODE_FAN); // Only Shaman
  2951. break;
  2952.  
  2953. case CItemData::WEAPON_BELL:
  2954. SetMotionMode(CRaceMotionData::MODE_BELL); // Only Shaman
  2955. break;
  2956.  
  2957. case CItemData::WEAPON_ARROW:
  2958. default:
  2959. SetMotionMode(CRaceMotionData::MODE_GENERAL);
  2960. break;
  2961. }
  2962. }
  2963.  
  2964. if (isLoop)
  2965. m_GraphicThingInstance.InterceptLoopMotion(dwMotIndex);
  2966. else
  2967. m_GraphicThingInstance.InterceptOnceMotion(dwMotIndex);
  2968.  
  2969. RefreshActorInstance();
  2970. }
  2971.  
  2972. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2973. // Device
  2974.  
  2975. void CInstanceBase::RegisterBoundingSphere()
  2976. {
  2977. // Stone 일 경우 DeforomNoSkin 을 하면
  2978. // 낙하하는 애니메이션 같은 경우 애니메이션이
  2979. // 바운드 박스에 영향을 미쳐 컬링이 제대로 이루어지지 않는다.
  2980. if (!IsStone())
  2981. {
  2982. m_GraphicThingInstance.DeformNoSkin();
  2983. }
  2984.  
  2985. m_GraphicThingInstance.RegisterBoundingSphere();
  2986. }
  2987.  
  2988. bool CInstanceBase::CreateDeviceObjects()
  2989. {
  2990. return m_GraphicThingInstance.CreateDeviceObjects();
  2991. }
  2992.  
  2993. void CInstanceBase::DestroyDeviceObjects()
  2994. {
  2995. m_GraphicThingInstance.DestroyDeviceObjects();
  2996. }
  2997.  
  2998. void CInstanceBase::Destroy()
  2999. {
  3000. DetachTextTail();
  3001.  
  3002. DismountHorse();
  3003.  
  3004. m_kQue_kCmdNew.clear();
  3005.  
  3006. __EffectContainer_Destroy();
  3007. __StoneSmoke_Destroy();
  3008.  
  3009. if (__IsMainInstance())
  3010. __ClearMainInstance();
  3011.  
  3012. m_GraphicThingInstance.Destroy();
  3013.  
  3014. __Initialize();
  3015. }
  3016.  
  3017. void CInstanceBase::__InitializeRotationSpeed()
  3018. {
  3019. SetRotationSpeed(c_fDefaultRotationSpeed);
  3020. }
  3021.  
  3022. void CInstanceBase::__Warrior_Initialize()
  3023. {
  3024. m_kWarrior.m_dwGeomgyeongEffect=0;
  3025. }
  3026.  
  3027. void CInstanceBase::__Initialize()
  3028. {
  3029. __Warrior_Initialize();
  3030. __StoneSmoke_Inialize();
  3031. __EffectContainer_Initialize();
  3032. __InitializeRotationSpeed();
  3033.  
  3034. SetEventHandler(CActorInstance::IEventHandler::GetEmptyPtr());
  3035.  
  3036. m_kAffectFlagContainer.Clear();
  3037.  
  3038. m_dwLevel = 0;
  3039. m_dwGuildID = 0;
  3040. m_dwEmpireID = 0;
  3041.  
  3042. m_eType = 0;
  3043. m_eRaceType = 0;
  3044. m_eShape = 0;
  3045. m_dwRace = 0;
  3046. m_dwVirtualNumber = 0;
  3047.  
  3048. m_dwBaseCmdTime=0;
  3049. m_dwBaseChkTime=0;
  3050. m_dwSkipTime=0;
  3051.  
  3052. m_GraphicThingInstance.Initialize();
  3053.  
  3054. m_dwAdvActorVID=0;
  3055. m_dwLastDmgActorVID=0;
  3056.  
  3057. m_nAverageNetworkGap=0;
  3058. m_dwNextUpdateHeightTime=0;
  3059.  
  3060. // Moving by keyboard
  3061. m_iRotatingDirection = DEGREE_DIRECTION_SAME;
  3062.  
  3063. // Moving by mouse
  3064. m_isTextTail = FALSE;
  3065. m_isGoing = FALSE;
  3066. NEW_SetSrcPixelPosition(TPixelPosition(0, 0, 0));
  3067. NEW_SetDstPixelPosition(TPixelPosition(0, 0, 0));
  3068.  
  3069. m_kPPosDust = TPixelPosition(0, 0, 0);
  3070.  
  3071.  
  3072. m_kQue_kCmdNew.clear();
  3073.  
  3074. m_dwLastComboIndex = 0;
  3075.  
  3076. m_swordRefineEffectRight = 0;
  3077. m_swordRefineEffectLeft = 0;
  3078. m_armorRefineEffect = 0;
  3079.  
  3080. m_sAlignment = 0;
  3081. m_byPKMode = 0;
  3082. m_isKiller = false;
  3083. m_isPartyMember = false;
  3084.  
  3085. m_bEnableTCPState = TRUE;
  3086.  
  3087. m_stName = "";
  3088.  
  3089. memset(m_awPart, 0, sizeof(m_awPart));
  3090. memset(m_adwCRCAffectEffect, 0, sizeof(m_adwCRCAffectEffect));
  3091. //memset(m_adwCRCEmoticonEffect, 0, sizeof(m_adwCRCEmoticonEffect));
  3092. memset(&m_kMovAfterFunc, 0, sizeof(m_kMovAfterFunc));
  3093.  
  3094. m_bDamageEffectType = false;
  3095. m_dwDuelMode = DUEL_NONE;
  3096. m_dwEmoticonTime = 0;
  3097. }
  3098.  
  3099. CInstanceBase::CInstanceBase()
  3100. {
  3101. __Initialize();
  3102. }
  3103.  
  3104. CInstanceBase::~CInstanceBase()
  3105. {
  3106. Destroy();
  3107. }
  3108.  
  3109.  
  3110. void CInstanceBase::GetBoundBox(D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax)
  3111. {
  3112. m_GraphicThingInstance.GetBoundBox(vtMin, vtMax);
  3113. }
Advertisement
Add Comment
Please, Sign In to add comment