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

q