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