Guest User

InstanceBase.cpp

a guest
Nov 11th, 2024
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 76.16 KB | None | 0 0
  1. #include "StdAfx.h"
  2. #include "InstanceBase.h"
  3. #include "PythonBackground.h"
  4. #include "PythonNonPlayer.h"
  5. #include "PythonPlayer.h"
  6. #include "PythonCharacterManager.h"
  7. #include "AbstractPlayer.h"
  8. #include "AbstractApplication.h"
  9. #include "packet.h"
  10. #include "PythonSystem.h"
  11. #include "PythonTextTail.h"
  12.  
  13. #include "../eterlib/StateManager.h"
  14. #include "../gamelib/ItemManager.h"
  15.  
  16. #include "../gamelib/RaceManager.h"
  17.  
  18. BOOL HAIR_COLOR_ENABLE = TRUE;
  19. BOOL USE_ARMOR_SPECULAR = FALSE;
  20. BOOL RIDE_HORSE_ENABLE = FALSE;
  21.  
  22. const float c_fDefaultRotationSpeed = 1200.0f;
  23. const float c_fDefaultHorseRotationSpeed = 300.0f;
  24.  
  25. bool IsWall(uint16_t race)
  26. {
  27. return race >= 14201 && race <= 14204;
  28. }
  29.  
  30. CInstanceBase::SHORSE::SHORSE()
  31. {
  32. Initialize();
  33. }
  34.  
  35. CInstanceBase::SHORSE::~SHORSE()
  36. {
  37. assert(actorPointer == nullptr);
  38. }
  39.  
  40. void CInstanceBase::SHORSE::Initialize()
  41. {
  42. isCurrentlyMounting = false;
  43. actorPointer = nullptr;
  44. }
  45.  
  46. void CInstanceBase::SHORSE::SetAttackSpeed(uint32_t attackSpeed)
  47. {
  48. if (!IsMounting())
  49. {
  50. return;
  51. }
  52.  
  53. CActorInstance& actorReference = GetActorRef();
  54. actorReference.SetAttackSpeed(static_cast<float>(attackSpeed) / 100.0f);
  55. }
  56.  
  57. void CInstanceBase::SHORSE::SetMoveSpeed(uint32_t moveSpeed)
  58. {
  59. if (!IsMounting())
  60. {
  61. return;
  62. }
  63.  
  64. CActorInstance& actorReference = GetActorRef();
  65. actorReference.SetMoveSpeed(static_cast<float>(moveSpeed) / 100.0f);
  66. }
  67.  
  68. void CInstanceBase::SHORSE::Create(const TPixelPosition& pixelPosition, uint32_t raceType, uint32_t hitEffectType)
  69. {
  70. assert(nullptr == actorPointer && "CInstanceBase::SHORSE::Create - ALREADY MOUNT");
  71.  
  72. actorPointer = std::make_unique<CActorInstance>();
  73.  
  74. CActorInstance& actorReference = GetActorRef();
  75.  
  76. actorReference.SetEventHandler(CActorInstance::IEventHandler::GetEmptyPtr());
  77.  
  78. if (!actorReference.SetRace(raceType))
  79. {
  80. actorPointer.reset();
  81. return;
  82. }
  83.  
  84. actorReference.SetShape(0);
  85. actorReference.SetAlphaValue(0.0f);
  86. actorReference.BlendAlphaValue(1.0f, 0.5f);
  87. actorReference.SetMoveSpeed(1.0f);
  88. actorReference.SetAttackSpeed(1.0f);
  89. actorReference.SetMotionMode(CRaceMotionData::MODE_GENERAL);
  90. actorReference.Stop();
  91. actorReference.RefreshActorInstance();
  92. actorReference.SetCurPixelPosition(pixelPosition);
  93.  
  94. isCurrentlyMounting = true;
  95. }
  96.  
  97. void CInstanceBase::SHORSE::Destroy()
  98. {
  99. actorPointer.reset();
  100. Initialize();
  101. }
  102.  
  103. CActorInstance& CInstanceBase::SHORSE::GetActorRef() const
  104. {
  105. assert(actorPointer != nullptr && "CInstanceBase::SHORSE::GetActorRef - ACTOR POINTER IS NULLPTR");
  106. return *actorPointer;
  107. }
  108.  
  109. CActorInstance* CInstanceBase::SHORSE::GetActorPtr() const
  110. {
  111. return actorPointer.get();
  112. }
  113.  
  114. uint32_t CInstanceBase::SHORSE::GetLevel() const
  115. {
  116. if (actorPointer)
  117. {
  118. uint32_t mount = actorPointer->GetRace();
  119.  
  120. switch (mount)
  121. {
  122. case 20101: //Kon
  123. case 20102: //Kon
  124. case 20103: //Kon
  125. return 1;
  126. case 20104: //Bojowy
  127. case 20105: //Bojowy
  128. case 20106: //Bojowy
  129. return 2;
  130. case 20107: //Militar
  131. case 20108: //Militar
  132. case 20109: //Militar
  133.  
  134. case 20110: // mount test for metin2.dev
  135.  
  136. case 20111: //Wierzchowiec
  137. case 20112: //Wierzchowiec
  138. case 20113: //Wierzchowiec
  139. case 20114: //Wierzchowiec
  140. case 20115: //Wierzchowiec
  141. case 20116: //Wierzchowiec
  142. case 20117: //Wierzchowiec
  143. case 20118: //Wierzchowiec
  144. case 20119: //Wierzchowiec
  145. case 20120: //Wierzchowiec
  146. case 20121: //Wierzchowiec
  147. case 20122: //Wierzchowiec
  148. case 20123: //Wierzchowiec
  149. case 20124: //Wierzchowiec
  150. case 20125: //Wierzchowiec
  151. case 20126: //Wierzchowiec
  152. case 20127: //Wierzchowiec
  153. case 20128: //Wierzchowiec
  154.  
  155. case 20201: //Wierzchowiec
  156. case 20202: //Wierzchowiec
  157. case 20203: //Wierzchowiec
  158. case 20204: //Wierzchowiec
  159. case 20205: //Wierzchowiec
  160. case 20206: //Wierzchowiec
  161. case 20207: //Wierzchowiec
  162. case 20208: //Wierzchowiec
  163. case 20209: //Wierzchowiec
  164. case 20210: //Wierzchowiec
  165. case 20211: //Wierzchowiec
  166. case 20212: //Wierzchowiec
  167. case 20213: //Wierzchowiec
  168. case 20214: //Wierzchowiec
  169. case 20215: //Wierzchowiec
  170. case 20216: //Wierzchowiec
  171. case 20217: //Wierzchowiec
  172. case 20218: //Wierzchowiec
  173. case 20219: //Wierzchowiec
  174. case 20220: //Wierzchowiec
  175. case 20221: //Wierzchowiec
  176. case 20222: //Wierzchowiec
  177.  
  178. return 3;
  179. }
  180. /*/
  181. {
  182. if ((20101 <= mount && 20151 >= mount))
  183. {
  184. return 3;
  185. }
  186. }/*/
  187. }
  188. return 0;
  189. }
  190.  
  191. bool CInstanceBase::SHORSE::IsNewMount() const
  192. {
  193. if (!actorPointer)
  194. {
  195. return false;
  196. }
  197.  
  198. uint32_t mount = actorPointer->GetRace();
  199.  
  200. /*/
  201. if (20110 <= mount && mount >= 20130)
  202. {
  203. return true;
  204. }
  205. /*/
  206. return false;
  207. }
  208.  
  209. bool CInstanceBase::SHORSE::CanUseSkill() const
  210. {
  211. if (IsMounting())
  212. {
  213. return GetLevel() > 2;
  214. }
  215.  
  216. return true;
  217. }
  218.  
  219. bool CInstanceBase::SHORSE::CanAttack() const
  220. {
  221. if (IsMounting())
  222. {
  223. if (GetLevel() <= 1)
  224. {
  225. return false;
  226. }
  227. }
  228.  
  229. return true;
  230. }
  231.  
  232.  
  233. bool CInstanceBase::SHORSE::IsMounting() const
  234. {
  235. return isCurrentlyMounting;
  236. }
  237.  
  238. void CInstanceBase::SHORSE::Deform() const
  239. {
  240. if (!IsMounting())
  241. {
  242. return;
  243. }
  244.  
  245. CActorInstance& actorReference = GetActorRef();
  246. actorReference.INSTANCEBASE_Deform();
  247. }
  248.  
  249. void CInstanceBase::SHORSE::Render() const
  250. {
  251. if (!IsMounting())
  252. {
  253. return;
  254. }
  255.  
  256. CActorInstance& actorReference = GetActorRef();
  257. actorReference.Render();
  258. }
  259.  
  260. void CInstanceBase::__AttachHorseSaddle()
  261. {
  262. if (!IsMountingHorse())
  263. {
  264. return;
  265. }
  266.  
  267. m_kHorse.actorPointer->AttachModelInstance(CRaceData::PART_MAIN, "saddle", m_GraphicThingInstance, CRaceData::PART_MAIN);
  268. }
  269.  
  270. void CInstanceBase::__DetachHorseSaddle()
  271. {
  272. if (!IsMountingHorse())
  273. {
  274. return;
  275. }
  276.  
  277. m_kHorse.actorPointer->DetachModelInstance(CRaceData::PART_MAIN, m_GraphicThingInstance, CRaceData::PART_MAIN);
  278. }
  279.  
  280. void CInstanceBase::BlockMovement()
  281. {
  282. m_GraphicThingInstance.BlockMovement();
  283. }
  284.  
  285. bool CInstanceBase::IsBlockObject(const CGraphicObjectInstance& c_rkBGObj)
  286. {
  287. return m_GraphicThingInstance.IsBlockObject(c_rkBGObj);
  288. }
  289.  
  290. bool CInstanceBase::AvoidObject(const CGraphicObjectInstance& c_rkBGObj)
  291. {
  292. return m_GraphicThingInstance.AvoidObject(c_rkBGObj);
  293. }
  294.  
  295. ///////////////////////////////////////////////////////////////////////////////////
  296.  
  297. bool __ArmorVnumToShape(int iVnum, DWORD * pdwShape)
  298. {
  299. *pdwShape = iVnum;
  300.  
  301. /////////////////////////////////////////
  302.  
  303. if (0 == iVnum || 1 == iVnum)
  304. return false;
  305.  
  306. if (!USE_ARMOR_SPECULAR)
  307. return false;
  308.  
  309. CItemData * pItemData;
  310. if (!CItemManager::Instance().GetItemDataPointer(iVnum, &pItemData))
  311. return false;
  312.  
  313. enum
  314. {
  315. SHAPE_VALUE_SLOT_INDEX = 3,
  316. };
  317.  
  318. *pdwShape = pItemData->GetValue(SHAPE_VALUE_SLOT_INDEX);
  319.  
  320. return true;
  321. }
  322.  
  323. class CActorInstanceBackground : public IBackground
  324. {
  325. public:
  326. CActorInstanceBackground() = default;
  327. virtual ~CActorInstanceBackground() override = default;
  328.  
  329. bool IsBlock(int x, int y) override
  330. {
  331. auto& rkBG = CPythonBackground::Instance();
  332. return rkBG.isAttrOn(x, y, CTerrainImpl::ATTRIBUTE_BLOCK);
  333. }
  334. };
  335.  
  336. static CActorInstanceBackground gs_kActorInstBG;
  337.  
  338. bool CInstanceBase::LessRenderOrder(CInstanceBase* otherInstance)
  339. {
  340. int32_t currentAlphaFlag = (GetAlphaValue() < 1.0f) ? 1 : 0;
  341. int32_t otherAlphaFlag = (otherInstance->GetAlphaValue() < 1.0f) ? 1 : 0;
  342.  
  343. if (currentAlphaFlag < otherAlphaFlag)
  344. {
  345. return true;
  346. }
  347.  
  348. if (currentAlphaFlag > otherAlphaFlag)
  349. {
  350. return false;
  351. }
  352.  
  353. if (GetRace() < otherInstance->GetRace())
  354. {
  355. return true;
  356. }
  357.  
  358. if (GetRace() > otherInstance->GetRace())
  359. {
  360. return false;
  361. }
  362.  
  363. if (GetShape() < otherInstance->GetShape())
  364. {
  365. return true;
  366. }
  367.  
  368. if (GetShape() > otherInstance->GetShape())
  369. {
  370. return false;
  371. }
  372.  
  373. uint32_t currentLODLevel = __LessRenderOrder_GetLODLevel();
  374. uint32_t otherLODLevel = otherInstance->__LessRenderOrder_GetLODLevel();
  375.  
  376. if (currentLODLevel < otherLODLevel)
  377. {
  378. return true;
  379. }
  380.  
  381. if (currentLODLevel > otherLODLevel)
  382. {
  383. return false;
  384. }
  385.  
  386. if (m_awPart[CRaceData::PART_WEAPON] < otherInstance->m_awPart[CRaceData::PART_WEAPON])
  387. {
  388. return true;
  389. }
  390.  
  391. return false;
  392. }
  393.  
  394. uint32_t CInstanceBase::__LessRenderOrder_GetLODLevel()
  395. {
  396. auto* lodController = m_GraphicThingInstance.GetLODControllerPointer(0);
  397.  
  398. if (!lodController)
  399. {
  400. return 0;
  401. }
  402.  
  403. return lodController->GetLODLevel();
  404. }
  405.  
  406. bool CInstanceBase::__Background_GetWaterHeight(const TPixelPosition& pixelPosition, float* height)
  407. {
  408. long waterHeight;
  409.  
  410. if (!CPythonBackground::Instance().GetWaterHeight(static_cast<int32_t>(pixelPosition.x), static_cast<int32_t>(pixelPosition.y), &waterHeight))
  411. {
  412. return false;
  413. }
  414.  
  415. *height = static_cast<float>(waterHeight);
  416.  
  417. return true;
  418. }
  419.  
  420. bool CInstanceBase::__Background_IsWaterPixelPosition(const TPixelPosition& c_rkPPos)
  421. {
  422. return CPythonBackground::Instance().isAttrOn(c_rkPPos.x, c_rkPPos.y, CTerrainImpl::ATTRIBUTE_WATER);
  423. }
  424.  
  425. DWORD CInstanceBase::ms_dwUpdateCounter=0;
  426. DWORD CInstanceBase::ms_dwRenderCounter=0;
  427. DWORD CInstanceBase::ms_dwDeformCounter=0;
  428.  
  429. CDynamicPool<CInstanceBase> CInstanceBase::ms_kPool;
  430.  
  431. const float PC_DUST_RANGE = 2000.0f;
  432. const float NPC_DUST_RANGE = 1000.0f;
  433.  
  434. bool CInstanceBase::__IsInDustRange()
  435. {
  436. if (!ExistsMainInstance())
  437. {
  438. return false;
  439. }
  440.  
  441. auto* mainInstance = GetMainInstancePtr();
  442. float distance = NEW_GetDistanceFromDestInstance(*mainInstance);
  443. float dustRange = IsPC() ? PC_DUST_RANGE : NPC_DUST_RANGE;
  444.  
  445. return distance <= dustRange;
  446. }
  447.  
  448. void CInstanceBase::__EnableSkipCollision()
  449. {
  450. if (IsMainInstance())
  451. {
  452. TraceError("CInstanceBase::__EnableSkipCollision - Cannot skip collision for the main instance!");
  453. return;
  454. }
  455.  
  456. m_GraphicThingInstance.EnableSkipCollision();
  457. }
  458.  
  459. void CInstanceBase::__DisableSkipCollision()
  460. {
  461. m_GraphicThingInstance.DisableSkipCollision();
  462. }
  463.  
  464. uint32_t CInstanceBase::__GetShadowMapColor(float x, float y)
  465. {
  466. auto& background = CPythonBackground::Instance();
  467. return background.GetShadowMapColor(x, y);
  468. }
  469.  
  470. float CInstanceBase::__GetBackgroundHeight(float x, float y)
  471. {
  472. auto& background = CPythonBackground::Instance();
  473. return background.GetHeight(x, y);
  474. }
  475.  
  476. bool CInstanceBase::IsInvisibility()
  477. {
  478. if ((IsAffect(AFFECT_INVISIBILITY) || IsAffect(AFFECT_EUNHYEONG) || IsAffect(AFFECT_REVIVE_INVISIBILITY)))
  479. {
  480. return true;
  481. }
  482.  
  483. return false;
  484. }
  485.  
  486. bool CInstanceBase::IsParalysis()
  487. {
  488. return m_GraphicThingInstance.IsParalysis();
  489. }
  490.  
  491. bool CInstanceBase::IsGameMaster()
  492. {
  493. return affectFlagContainer.IsSet(AFFECT_YMIR);
  494. }
  495.  
  496. bool CInstanceBase::IsSameEmpire(CInstanceBase& otherInstance)
  497. {
  498. return otherInstance.m_dwEmpireID == 0 || IsGameMaster() || otherInstance.IsGameMaster() || otherInstance.m_dwEmpireID == m_dwEmpireID;
  499. }
  500.  
  501. uint32_t CInstanceBase::GetEmpireID() const
  502. {
  503. return m_dwEmpireID;
  504. }
  505.  
  506. uint32_t CInstanceBase::GetGuildID() const
  507. {
  508. return m_dwGuildID;
  509. }
  510.  
  511. int32_t CInstanceBase::GetAlignment() const
  512. {
  513. return m_sAlignment;
  514. }
  515.  
  516. uint32_t CInstanceBase::GetAlignmentGrade() const
  517. {
  518. if (m_sAlignment >= 12000)
  519. {
  520. return 0;
  521. }
  522.  
  523. if (m_sAlignment >= 8000)
  524. {
  525. return 1;
  526. }
  527.  
  528. if (m_sAlignment >= 4000)
  529. {
  530. return 2;
  531. }
  532.  
  533. if (m_sAlignment >= 1000)
  534. {
  535. return 3;
  536. }
  537.  
  538. if (m_sAlignment >= 0)
  539. {
  540. return 4;
  541. }
  542.  
  543. if (m_sAlignment > -4000)
  544. {
  545. return 5;
  546. }
  547.  
  548. if (m_sAlignment > -8000)
  549. {
  550. return 6;
  551. }
  552.  
  553. if (m_sAlignment > -12000)
  554. {
  555. return 7;
  556. }
  557.  
  558. return 8;
  559. }
  560.  
  561. int32_t CInstanceBase::GetAlignmentType() const
  562. {
  563. uint32_t alignmentGrade = GetAlignmentGrade();
  564.  
  565. if (alignmentGrade <= 3)
  566. {
  567. return ALIGNMENT_TYPE_WHITE;
  568. }
  569.  
  570. if (alignmentGrade >= 5 && alignmentGrade <= 8)
  571. {
  572. return ALIGNMENT_TYPE_DARK;
  573. }
  574.  
  575. return ALIGNMENT_TYPE_NORMAL;
  576. }
  577.  
  578. uint8_t CInstanceBase::GetPKMode() const
  579. {
  580. return m_byPKMode;
  581. }
  582.  
  583. bool CInstanceBase::IsKiller() const
  584. {
  585. return m_isKiller;
  586. }
  587.  
  588. bool CInstanceBase::IsPartyMember() const
  589. {
  590. return m_isPartyMember;
  591. }
  592.  
  593. bool CInstanceBase::IsInSafe()
  594. {
  595. const TPixelPosition& currentPixelPosition = m_GraphicThingInstance.NEW_GetCurPixelPositionRef();
  596. return CPythonBackground::Instance().isAttrOn(currentPixelPosition.x, currentPixelPosition.y, CTerrainImpl::ATTRIBUTE_BANPK);
  597. }
  598.  
  599. float CInstanceBase::CalculateDistanceSq3d(const TPixelPosition& destinationPixelPosition)
  600. {
  601. const TPixelPosition& sourcePixelPosition = m_GraphicThingInstance.NEW_GetCurPixelPositionRef();
  602. return SPixelPosition_CalculateDistanceSq3d(sourcePixelPosition, destinationPixelPosition);
  603. }
  604.  
  605. void CInstanceBase::OnSelected()
  606. {
  607. if (!IsStoneDoor() && !IsDead())
  608. {
  609. AttachSelectEffect();
  610. }
  611. }
  612.  
  613. void CInstanceBase::OnUnselected()
  614. {
  615. DetachSelectEffect();
  616. }
  617.  
  618. void CInstanceBase::OnTargeted()
  619. {
  620. if (!IsStoneDoor() && !IsDead())
  621. {
  622. AttachTargetEffect();
  623. }
  624. }
  625.  
  626. void CInstanceBase::OnUntargeted()
  627. {
  628. DetachTargetEffect();
  629. }
  630.  
  631. void CInstanceBase::DestroySystem()
  632. {
  633. ms_kPool.Clear();
  634. }
  635.  
  636. void CInstanceBase::CreateSystem(uint32_t capacity)
  637. {
  638. ms_kPool.Create(capacity);
  639.  
  640. std::fill(std::begin(ms_adwCRCAffectEffect), std::end(ms_adwCRCAffectEffect), 0);
  641.  
  642. constexpr float kDustGap_Min = 250.0f;
  643. constexpr float kDustGap_Max = 500.0f;
  644.  
  645. ms_fDustGap = kDustGap_Min;
  646. ms_fHorseDustGap = kDustGap_Max;
  647. }
  648.  
  649. CInstanceBase* CInstanceBase::New()
  650. {
  651. return ms_kPool.Alloc();
  652. }
  653.  
  654. void CInstanceBase::Delete(CInstanceBase* pkInst)
  655. {
  656. pkInst->Destroy();
  657. ms_kPool.Free(pkInst);
  658. }
  659.  
  660. void CInstanceBase::SetMainInstance()
  661. {
  662. auto& characterManager = CPythonCharacterManager::Instance();
  663. auto virtualID = GetVirtualID();
  664. characterManager.SetMainInstance(virtualID);
  665. m_GraphicThingInstance.SetMainInstance();
  666. }
  667.  
  668. CInstanceBase* CInstanceBase::GetMainInstancePtr() const
  669. {
  670. auto& characterManager = CPythonCharacterManager::Instance();
  671. return characterManager.GetMainInstancePtr();
  672. }
  673.  
  674. void CInstanceBase::ClearMainInstance()
  675. {
  676. auto& characterManager = CPythonCharacterManager::Instance();
  677. characterManager.ClearMainInstance();
  678. }
  679.  
  680. bool CInstanceBase::IsMainInstance() const
  681. {
  682. return this == GetMainInstancePtr();
  683. }
  684.  
  685. bool CInstanceBase::ExistsMainInstance() const
  686. {
  687. return GetMainInstancePtr() != nullptr;
  688. }
  689.  
  690. bool CInstanceBase::MainCanSeeHiddenThing() const
  691. {
  692. return false;
  693. }
  694.  
  695. float CInstanceBase::GetBowRange() const
  696. {
  697. float baseRange = BASE_BOW_RANGE;
  698.  
  699. if (IsMainInstance())
  700. {
  701. auto& player = IAbstractPlayer::GetSingleton();
  702. baseRange += static_cast<float>(player.GetStatus(POINT_BOW_DISTANCE));
  703. }
  704.  
  705. return baseRange;
  706. }
  707.  
  708. CInstanceBase* CInstanceBase::FindInstancePtr(uint32_t virtualID) const
  709. {
  710. auto& characterManager = CPythonCharacterManager::Instance();
  711. return characterManager.GetInstancePtr(virtualID);
  712. }
  713.  
  714. bool CInstanceBase::FindRaceType(uint32_t raceID, uint8_t* typePtr) const
  715. {
  716. auto& nonPlayerManager = CPythonNonPlayer::Instance();
  717. return nonPlayerManager.GetInstanceType(raceID, typePtr);
  718. }
  719.  
  720. bool CInstanceBase::Create(const SCreateData& createData)
  721. {
  722. IAbstractApplication::GetSingleton().SkipRenderBuffering(300);
  723.  
  724. SetInstanceType(createData.m_bType);
  725.  
  726. if (!SetRace(createData.m_dwRace))
  727. {
  728. return false;
  729. }
  730.  
  731. if (IsPC())
  732. {
  733. SetJob(createData.m_bJob);
  734. }
  735.  
  736. SetVirtualID(createData.m_dwVID);
  737.  
  738. #ifdef ENABLE_DOG_MODE
  739. // SetOriginalRace(c_rkCreateData.m_dwRace);
  740. SetOriginalRace(createData.m_dwRace);
  741. #endif
  742.  
  743.  
  744. if (createData.m_isMain)
  745. {
  746. SetMainInstance();
  747. }
  748.  
  749. const bool isGuildWall = IsGuildWall();
  750. const bool isPC = IsPC();
  751.  
  752. if (isGuildWall)
  753. {
  754. HandleGuildWall(createData);
  755. }
  756. else
  757. {
  758. SCRIPT_SetPixelPosition(float(createData.m_lPosX), float(createData.m_lPosY));
  759. }
  760.  
  761. if (createData.m_dwMountVnum)
  762. {
  763. MountHorse(createData.m_dwMountVnum);
  764. }
  765.  
  766. SetArmor(createData.m_dwArmor);
  767.  
  768. if (IsPC() || (IsNPC() && createData.m_dwHair))
  769. {
  770. SetHair(createData.m_dwHair);
  771. }
  772.  
  773. if (IsPC())
  774. {
  775. SetWeapon(createData.m_dwWeapon);
  776. }
  777.  
  778. CreateSetName(createData);
  779.  
  780. #if defined(WJ_SHOW_MOB_INFO) && defined(ENABLE_SHOW_MOBLEVEL)
  781. m_dwLevel = (IsEnemy() && CPythonSystem::Instance().IsShowMobLevel()) ? CPythonNonPlayer::Instance().GetMonsterLevel(GetRace()) : createData.m_dwLevel;
  782. #else
  783. m_dwLevel = createData.m_dwLevel;
  784. #endif
  785.  
  786. m_dwGuildID = createData.m_dwGuildID;
  787. m_dwEmpireID = createData.m_dwEmpireID;
  788. SetVirtualNumber(createData.m_dwRace);
  789. SetRotation(createData.m_fRot);
  790. SetAlignment(createData.m_sAlignment);
  791. SetPKMode(createData.m_byPKMode);
  792. SetMoveSpeed(createData.m_dwMovSpd);
  793. SetAttackSpeed(createData.m_dwAtkSpd);
  794.  
  795. if (!IsWearingDress())
  796. {
  797. m_GraphicThingInstance.SetAlphaValue(0.0f);
  798. m_GraphicThingInstance.BlendAlphaValue(1.0f, 0.5f);
  799. }
  800.  
  801. if (!IsGuildWall())
  802. {
  803. SetAffectFlagContainer(createData.m_kAffectFlags);
  804. }
  805.  
  806. AttachTextTail();
  807. RefreshTextTail();
  808.  
  809. if (createData.m_dwStateFlags & ADD_CHARACTER_STATE_SPAWN)
  810. {
  811. if (IsAffect(AFFECT_SPAWN))
  812. {
  813. AttachEffect(EFFECT_SPAWN_APPEAR);
  814. }
  815.  
  816. Refresh(isPC ? CRaceMotionData::NAME_WAIT : CRaceMotionData::NAME_SPAWN, isPC);
  817. }
  818. else
  819. {
  820. Refresh(CRaceMotionData::NAME_WAIT, true);
  821. }
  822.  
  823. AttachEmpireEffect(createData.m_dwEmpireID);
  824. RegisterBoundingSphere();
  825.  
  826. if (createData.m_dwStateFlags & ADD_CHARACTER_STATE_DEAD)
  827. {
  828. m_GraphicThingInstance.DieEnd();
  829. }
  830.  
  831. SetStateFlags(createData.m_dwStateFlags);
  832. m_GraphicThingInstance.SetBattleHitEffect(ms_adwCRCAffectEffect[EFFECT_HIT]);
  833.  
  834.  
  835.  
  836.  
  837. ////////////////// swiecenie npc itp /////////////////
  838. #ifdef WJ_ATTACH_SPECULAR_FROM_LIST
  839. struct SAttachSpecularData
  840. {
  841. DWORD race; float specularPower;
  842. };
  843.  
  844. const int SPECULAR_MAX_NUM = 400;
  845. static SAttachSpecularData structInfo[SPECULAR_MAX_NUM] =
  846. {
  847.  
  848.  
  849. { 9001, 0.4f }, // Weapon Dealer
  850. { 9003, 0.4f }, // General Store
  851. { 9004, 0.4f }, // Event Helper
  852. { 9005, 0.4f }, // Storekeeper
  853. { 20504, 0.4f }, // Gem Shop
  854. { 30308, 0.4f }, // Mailbox
  855. { 20091, 0.1f }, // Seon-Pyeong
  856. { 20001, 0.6f }, // Alchemist
  857. { 20016, 0.4f }, // Blacksmith
  858. { 9002, 0.4f }, // Armor Dealer
  859. { 20018, 0.4f }, // Baek-Go
  860. { 20095, 0.1f }, // Seon-Hae
  861. { 20429, 0.4f }, // Combat Zone Overseer (red)
  862. { 11001, 0.4f }, // Battle Bailiff (Red Kingdom)
  863. { 11005, 0.4f }, // Battle Bailiff (Blue Kingdom)
  864. { 11003, 0.4f }, // Battle Bailiff (Yellow Kingdom)
  865. { 11000, 0.4f }, // Guardian (Red Kingdom)
  866. { 11004, 0.4f }, // Guardian (Blue Kingdom)
  867. { 11002, 0.4f }, // Guardian (Yellow Kingdom)
  868. { 20354, 0.4f }, // City Guard (Red Kingdom)
  869. { 20369, 0.4f }, // Lee Chung
  870. { 20017, 0.4f }, // Yu-Hwan
  871. { 20417, 0.4f }, // Okey Table -- Need fix
  872. { 20419, 0.4f }, // Dragon Watcher Dolnarr
  873. { 20421, 0.4f }, // Dragon Watcher Jaharr
  874. { 60000, 0.4f }, // Guild Manager
  875. { 9012, 0.4f }, // Teleporter
  876. { 20010, 0.4f }, // Peddler
  877. { 20011, 0.4f }, // Uriel
  878. { 20420, 0.4f }, // Golden Dragon Chest
  879. { 20015, 0.4f }, // Deokbae
  880. { 20024, 0.4f }, // Harang
  881. { 20349, 0.4f }, // Stable Boy
  882. { 60003, 0.1f }, // Theo
  883. { 20355, 0.4f }, // Captain
  884. { 20006, 0.4f }, // Mirine
  885. // Ores
  886.  
  887. { 20300, 0.9f }, // Body Teacher
  888. { 20301, 0.9f }, // Mental Teacher
  889. { 20302, 0.9f }, // Blade Teacher
  890. { 20303, 0.9f }, // Archer Teacher
  891. { 20304, 0.9f }, // Weaponery Teacher
  892. { 20305, 0.9f }, // BM Teacher
  893. { 20306, 0.9f }, // Dragon Teacher
  894. { 20307, 0.9f }, // Healer Teacher
  895.  
  896. { 20320, 0.9f }, // Body Teacher
  897. { 20321, 0.9f }, // Mental Teacher
  898. { 20322, 0.9f }, // Blade Teacher
  899. { 20323, 0.9f }, // Archer Teacher
  900. { 20324, 0.9f }, // Weaponery Teacher
  901. { 20325, 0.9f }, // BM Teacher
  902. { 20326, 0.9f }, // Dragon Teacher
  903. { 20327, 0.9f }, // Healer Teacher
  904.  
  905. { 20340, 0.9f }, // Body Teacher
  906. { 20341, 0.9f }, // Mental Teacher
  907. { 20342, 0.9f }, // Blade Teacher
  908. { 20343, 0.9f }, // Archer Teacher
  909. { 20344, 0.9f }, // Weaponery Teacher
  910. { 20345, 0.9f }, // BM Teacher
  911. { 20346, 0.9f }, // Dragon Teacher
  912. { 20347, 0.9f }, // Healer Teacher
  913.  
  914. // Potwory z M2
  915. /*/
  916. { 395, 1.0f }, // Dispirited Mi-Jung
  917. { 396, 1.0f }, // Dispirited Eun-Jung
  918. { 397, 1.0f }, // Dispirited Se-Rang
  919. { 398, 1.0f }, // Dispirited Jin-Hee
  920. { 401, 1.0f }, // Black Wind Soldier
  921. { 402, 1.0f }, // Black Wind Maniac
  922. { 403, 1.0f }, // Black Wind Archer
  923. { 404, 1.0f }, // Black Wind Jak-To
  924. { 405, 1.0f }, // Black Wind To-Su
  925. { 406, 1.0f }, // Black Wind Gu-Ryung
  926. { 431, 1.0f }, // Black Storm Soldier
  927. { 432, 1.0f }, // Black Storm Maniac
  928. { 433, 1.0f }, // Black Storm Archer
  929. { 434, 1.0f }, // Black Storm Joh-Hwan
  930. { 435, 1.0f }, // Black Storm Kyuk-Jang
  931. { 436, 1.0f }, // Black Storm Pho-Hwan
  932. { 451, 1.0f }, // Evil Bl. Storm Soldier
  933. { 452, 1.0f }, // Evil Bl. Storm Maniac
  934. { 453, 1.0f }, // Evil Bl. Storm Archer
  935. { 454, 1.0f }, // Evil Bl. Storm Joh-Hwan
  936. { 455, 1.0f }, // Evil Bl. Storm Kyuk-Jang
  937. { 456, 1.0f }, // Evil Bl. Storm Pho-Hwa
  938. { 491, 2.5f }, // Mahon
  939. { 492, 2.5f }, // Bo
  940. { 493, 2.5f }, // Goo-Pae
  941. { 494, 2.5f }, // Chuong
  942. { 501, 1.0f }, // Savage Infantryman
  943. { 502, 1.0f }, // Savage Minion
  944. { 503, 1.0f }, // Savage Archer
  945. { 504, 1.0f }, // Savage General
  946. { 531, 1.9f }, // Bestial Soldier*
  947. { 532, 2.5f }, // Bestial Maniac*
  948. { 533, 1.9f }, // Bestial Archer*
  949. { 534, 1.9f }, // Bestial Specialist*
  950. { 551, 1.0f }, // Strong Savage Infantry
  951. { 552, 1.0f }, // Strong Savage Minion
  952. { 553, 1.0f }, // Strong Savage Archer
  953. { 554, 1.0f }, // Strong Savage General
  954. { 591, 1.9f }, // Bestial Captain*
  955. { 595, 1.0f } // Bestial Geum-Chul*
  956. /*/
  957.  
  958.  
  959.  
  960. };
  961.  
  962. for (DWORD i=0; i<SPECULAR_MAX_NUM; i++)
  963. {
  964. if (GetRace() == structInfo[i].race)
  965. {
  966. SMaterialData data;
  967. data.pImage = NULL;
  968. data.isSpecularEnable = TRUE;
  969. data.fSpecularPower = structInfo[i].specularPower;
  970. data.bSphereMapIndex = 1;
  971. m_GraphicThingInstance.SetMaterialData(0, NULL, data);
  972. }
  973. }
  974. #endif
  975.  
  976.  
  977. if (!isPC)
  978. {
  979. uint32_t dwBodyColor = CPythonNonPlayer::Instance().GetMonsterColor(createData.m_dwRace);
  980. if (0 != dwBodyColor)
  981. {
  982. SetModulateRenderMode();
  983. SetAddColor(dwBodyColor);
  984. }
  985. }
  986.  
  987. __AttachHorseSaddle();
  988.  
  989. if (GUILD_SYMBOL_RACE == GetRace())
  990. {
  991. std::string strFileName = GetGuildSymbolFileName(m_dwGuildID);
  992.  
  993. if (IsFile(strFileName.c_str()))
  994. {
  995. m_GraphicThingInstance.ChangeMaterial(strFileName.c_str());
  996. }
  997. }
  998.  
  999. return true;
  1000. }
  1001.  
  1002. void CInstanceBase::HandleGuildWall(const SCreateData& createData)
  1003. {
  1004. uint32_t center_x, center_y;
  1005. createData.m_kAffectFlags.ConvertToPosition(&center_x, &center_y);
  1006.  
  1007. float center_z = __GetBackgroundHeight(center_x, center_y);
  1008. NEW_SetPixelPosition(TPixelPosition(static_cast<float>(createData.m_lPosX), static_cast<float>(createData.m_lPosY), center_z));
  1009. }
  1010.  
  1011. void CInstanceBase::CreateSetName(const SCreateData& createData)
  1012. {
  1013. if (IsGoto() || IsWarp())
  1014. {
  1015. if (IsWarp())
  1016. {
  1017. CreateSetWarpName(createData);
  1018. }
  1019. else
  1020. {
  1021. SetNameString("", 0);
  1022. }
  1023. return;
  1024. }
  1025.  
  1026. #if defined(WJ_SHOW_MOB_INFO)
  1027. std::string name = createData.m_stName;
  1028.  
  1029. if (IsEnemy())
  1030. {
  1031. auto& pythonNonPlayer = CPythonNonPlayer::Instance();
  1032.  
  1033. #if defined(ENABLE_SHOW_MOBAIFLAG)
  1034. if (CPythonSystem::Instance().IsShowMobAIFlag() && pythonNonPlayer.IsAggressive(GetRace()))
  1035. {
  1036. name += "*";
  1037. }
  1038. #endif
  1039. }
  1040.  
  1041. SetNameString(name.c_str(), name.length());
  1042. #else
  1043. SetNameString(createData.m_stName.c_str(), createData.m_stName.length());
  1044. #endif
  1045. }
  1046.  
  1047. void CInstanceBase::CreateSetWarpName(const SCreateData& createData)
  1048. {
  1049. const char* c_szName;
  1050.  
  1051. if (CPythonNonPlayer::Instance().GetName(createData.m_dwRace, &c_szName))
  1052. {
  1053. std::string strName = c_szName;
  1054. auto iFindingPos = strName.find_first_of(' ');
  1055.  
  1056. if (iFindingPos != std::string::npos)
  1057. {
  1058. strName.resize(iFindingPos);
  1059. }
  1060.  
  1061. SetNameString(strName.c_str(), strName.length());
  1062. }
  1063. else
  1064. {
  1065. SetNameString(createData.m_stName.c_str(), createData.m_stName.length());
  1066. }
  1067. }
  1068.  
  1069. void CInstanceBase::SetNameString(const char* c_szName, int len)
  1070. {
  1071. m_stName.assign(c_szName, len);
  1072. }
  1073.  
  1074. bool CInstanceBase::SetRace(uint32_t newRace)
  1075. {
  1076. m_dwRace = newRace;
  1077.  
  1078. if (!m_GraphicThingInstance.SetRace(newRace))
  1079. return false;
  1080.  
  1081. if (!FindRaceType(m_dwRace, &m_eRaceType))
  1082. m_eRaceType=CActorInstance::TYPE_PC;
  1083.  
  1084. return true;
  1085. }
  1086.  
  1087. bool CInstanceBase::__IsChangableWeapon(int32_t weaponID) const
  1088. {
  1089. if (IsWearingDress())
  1090. {
  1091. static const std::vector<int32_t> allowedBouquets = {50201};
  1092. return std::find(allowedBouquets.begin(), allowedBouquets.end(), weaponID) != allowedBouquets.end();
  1093. constexpr int32_t allowedBouquetID = 50201;
  1094. return weaponID == allowedBouquetID;
  1095. }
  1096. else
  1097. {
  1098. return true;
  1099. }
  1100. }
  1101.  
  1102. bool CInstanceBase::IsWearingDress() const
  1103. {
  1104. // static constexpr int32_t WeddingDressShape = 201;
  1105. static constexpr int32_t WeddingDressShape = 5000; //fix
  1106. return WeddingDressShape == m_eShape;
  1107. }
  1108.  
  1109. bool CInstanceBase::IsHoldingPickAxe() const
  1110. {
  1111. static constexpr int32_t PickAxeStart = 29101;
  1112. static constexpr int32_t PickAxeEnd = 29110;
  1113. return m_awPart[CRaceData::PART_WEAPON] >= PickAxeStart && m_awPart[CRaceData::PART_WEAPON] <= PickAxeEnd;
  1114. }
  1115.  
  1116. bool CInstanceBase::IsNewMount()
  1117. {
  1118. return m_kHorse.IsNewMount();
  1119. }
  1120.  
  1121. bool CInstanceBase::IsMountingHorse()
  1122. {
  1123. return m_kHorse.IsMounting();
  1124. }
  1125.  
  1126. void CInstanceBase::MountHorse(UINT eRace)
  1127. {
  1128. m_kHorse.Destroy();
  1129. m_kHorse.Create(m_GraphicThingInstance.NEW_GetCurPixelPositionRef(), eRace, ms_adwCRCAffectEffect[EFFECT_HIT]);
  1130.  
  1131. SetMotionMode(CRaceMotionData::MODE_HORSE);
  1132. SetRotationSpeed(c_fDefaultHorseRotationSpeed);
  1133.  
  1134. m_GraphicThingInstance.MountHorse(m_kHorse.GetActorPtr());
  1135. m_GraphicThingInstance.Stop();
  1136. m_GraphicThingInstance.RefreshActorInstance();
  1137. }
  1138.  
  1139. void CInstanceBase::DismountHorse()
  1140. {
  1141. m_kHorse.Destroy();
  1142. }
  1143.  
  1144. void CInstanceBase::GetInfo(std::string* pstInfo)
  1145. {
  1146. char szInfo[256];
  1147. sprintf(szInfo, "Inst - UC %d, RC %d Pool - %d ",
  1148. ms_dwUpdateCounter,
  1149. ms_dwRenderCounter,
  1150. ms_kPool.GetCapacity()
  1151. );
  1152.  
  1153. pstInfo->append(szInfo);
  1154. }
  1155.  
  1156. void CInstanceBase::ResetPerformanceCounter()
  1157. {
  1158. ms_dwUpdateCounter=0;
  1159. ms_dwRenderCounter=0;
  1160. ms_dwDeformCounter=0;
  1161. }
  1162.  
  1163. bool CInstanceBase::NEW_IsLastPixelPosition()
  1164. {
  1165. return m_GraphicThingInstance.IsPushing();
  1166. }
  1167.  
  1168. const TPixelPosition& CInstanceBase::NEW_GetLastPixelPositionRef()
  1169. {
  1170. return m_GraphicThingInstance.NEW_GetLastPixelPositionRef();
  1171. }
  1172.  
  1173. void CInstanceBase::NEW_SetDstPixelPositionZ(FLOAT z)
  1174. {
  1175. m_GraphicThingInstance.NEW_SetDstPixelPositionZ(z);
  1176. }
  1177.  
  1178. void CInstanceBase::NEW_SetDstPixelPosition(const TPixelPosition& c_rkPPosDst)
  1179. {
  1180. m_GraphicThingInstance.NEW_SetDstPixelPosition(c_rkPPosDst);
  1181. }
  1182.  
  1183. void CInstanceBase::NEW_SetSrcPixelPosition(const TPixelPosition& c_rkPPosSrc)
  1184. {
  1185. m_GraphicThingInstance.NEW_SetSrcPixelPosition(c_rkPPosSrc);
  1186. }
  1187.  
  1188. const TPixelPosition& CInstanceBase::NEW_GetCurPixelPositionRef()
  1189. {
  1190. return m_GraphicThingInstance.NEW_GetCurPixelPositionRef();
  1191. }
  1192.  
  1193. const TPixelPosition& CInstanceBase::NEW_GetDstPixelPositionRef()
  1194. {
  1195. return m_GraphicThingInstance.NEW_GetDstPixelPositionRef();
  1196. }
  1197.  
  1198. const TPixelPosition& CInstanceBase::NEW_GetSrcPixelPositionRef()
  1199. {
  1200. return m_GraphicThingInstance.NEW_GetSrcPixelPositionRef();
  1201. }
  1202.  
  1203. /////////////////////////////////////////////////////////////////////////////////////////////////
  1204. void CInstanceBase::OnSyncing()
  1205. {
  1206. m_GraphicThingInstance.__OnSyncing();
  1207. }
  1208.  
  1209. void CInstanceBase::OnWaiting()
  1210. {
  1211. m_GraphicThingInstance.__OnWaiting();
  1212. }
  1213.  
  1214. void CInstanceBase::OnMoving()
  1215. {
  1216. m_GraphicThingInstance.__OnMoving();
  1217. }
  1218.  
  1219. void CInstanceBase::ChangeGuild(DWORD dwGuildID)
  1220. {
  1221. m_dwGuildID=dwGuildID;
  1222.  
  1223. DetachTextTail();
  1224. AttachTextTail();
  1225. RefreshTextTail();
  1226. }
  1227.  
  1228. DWORD CInstanceBase::GetPart(CRaceData::EParts part)
  1229. {
  1230. assert(part >= 0 && part < CRaceData::PART_MAX_NUM);
  1231. return m_awPart[part];
  1232. }
  1233.  
  1234. DWORD CInstanceBase::GetShape()
  1235. {
  1236. return m_eShape;
  1237. }
  1238.  
  1239. bool CInstanceBase::CanAct()
  1240. {
  1241. return m_GraphicThingInstance.CanAct();
  1242. }
  1243.  
  1244. bool CInstanceBase::CanMove()
  1245. {
  1246. return m_GraphicThingInstance.CanMove();
  1247. }
  1248.  
  1249. bool CInstanceBase::CanUseSkill()
  1250. {
  1251. if (IsPoly())
  1252. return false;
  1253.  
  1254. if (IsWearingDress())
  1255. return false;
  1256.  
  1257. if (IsHoldingPickAxe())
  1258. return false;
  1259.  
  1260. if (!m_kHorse.CanUseSkill())
  1261. return false;
  1262.  
  1263. if (!m_GraphicThingInstance.CanUseSkill())
  1264. return false;
  1265.  
  1266. return true;
  1267. }
  1268.  
  1269. bool CInstanceBase::CanAttack()
  1270. {
  1271. if (!m_kHorse.CanAttack())
  1272. return false;
  1273.  
  1274. if (IsWearingDress())
  1275. return false;
  1276.  
  1277. if (IsHoldingPickAxe())
  1278. return false;
  1279.  
  1280. return m_GraphicThingInstance.CanAttack();
  1281. }
  1282.  
  1283.  
  1284.  
  1285. bool CInstanceBase::CanFishing()
  1286. {
  1287. return m_GraphicThingInstance.CanFishing();
  1288. }
  1289.  
  1290.  
  1291. BOOL CInstanceBase::IsBowMode()
  1292. {
  1293. return m_GraphicThingInstance.IsBowMode();
  1294. }
  1295.  
  1296. BOOL CInstanceBase::IsHandMode()
  1297. {
  1298. return m_GraphicThingInstance.IsHandMode();
  1299. }
  1300.  
  1301. BOOL CInstanceBase::IsFishingMode()
  1302. {
  1303. if (CRaceMotionData::MODE_FISHING == m_GraphicThingInstance.GetMotionMode())
  1304. return true;
  1305.  
  1306. return false;
  1307. }
  1308.  
  1309. BOOL CInstanceBase::IsFishing()
  1310. {
  1311. return m_GraphicThingInstance.IsFishing();
  1312. }
  1313.  
  1314. BOOL CInstanceBase::IsDead()
  1315. {
  1316. return m_GraphicThingInstance.IsDead();
  1317. }
  1318.  
  1319. BOOL CInstanceBase::IsStun()
  1320. {
  1321. return m_GraphicThingInstance.IsStun();
  1322. }
  1323.  
  1324. BOOL CInstanceBase::IsSleep()
  1325. {
  1326. return m_GraphicThingInstance.IsSleep();
  1327. }
  1328.  
  1329. bool CInstanceBase::IsMining()
  1330. {
  1331. return m_GraphicThingInstance.IsMining();
  1332. }
  1333.  
  1334. BOOL CInstanceBase::__IsSyncing()
  1335. {
  1336. return m_GraphicThingInstance.__IsSyncing();
  1337. }
  1338.  
  1339. void CInstanceBase::NEW_SetOwner(DWORD dwVIDOwner)
  1340. {
  1341. m_GraphicThingInstance.SetOwner(dwVIDOwner);
  1342. }
  1343.  
  1344. float CInstanceBase::GetLocalTime()
  1345. {
  1346. return m_GraphicThingInstance.GetLocalTime();
  1347. }
  1348.  
  1349.  
  1350. void CInstanceBase::PushUDPState(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg)
  1351. {
  1352. }
  1353.  
  1354. DWORD ELTimer_GetServerFrameMSec();
  1355.  
  1356. void CInstanceBase::PushTCPStateExpanded(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg, UINT uTargetVID)
  1357. {
  1358. SCommand kCmdNew;
  1359. kCmdNew.m_kPPosDst = c_rkPPosDst;
  1360. kCmdNew.m_dwChkTime = dwCmdTime+100;
  1361. kCmdNew.m_dwCmdTime = dwCmdTime;
  1362. kCmdNew.m_fDstRot = fDstRot;
  1363. kCmdNew.m_eFunc = eFunc;
  1364. kCmdNew.m_uArg = uArg;
  1365. kCmdNew.m_uTargetVID = uTargetVID;
  1366. m_kQue_kCmdNew.push_back(kCmdNew);
  1367. }
  1368.  
  1369. void CInstanceBase::PushTCPState(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg)
  1370. {
  1371. if (IsMainInstance())
  1372. {
  1373. return;
  1374. }
  1375.  
  1376. int nNetworkGap=ELTimer_GetServerFrameMSec()-dwCmdTime;
  1377.  
  1378. m_nAverageNetworkGap=(m_nAverageNetworkGap*70+nNetworkGap*30)/100;
  1379.  
  1380. /*
  1381. if (m_dwBaseCmdTime == 0)
  1382. {
  1383. m_dwBaseChkTime = ELTimer_GetFrameMSec()-nNetworkGap;
  1384. m_dwBaseCmdTime = dwCmdTime;
  1385.  
  1386. Tracenf("VID[%d] ł×Ć®ż÷°¸ [%d]", GetVirtualID(), nNetworkGap);
  1387. }
  1388. */
  1389.  
  1390. //m_dwBaseChkTime-m_dwBaseCmdTime+ELTimer_GetServerMSec();
  1391.  
  1392. SCommand kCmdNew;
  1393. kCmdNew.m_kPPosDst = c_rkPPosDst;
  1394. kCmdNew.m_dwChkTime = dwCmdTime+m_nAverageNetworkGap;//m_dwBaseChkTime + (dwCmdTime - m_dwBaseCmdTime);// + nNetworkGap;
  1395. kCmdNew.m_dwCmdTime = dwCmdTime;
  1396. kCmdNew.m_fDstRot = fDstRot;
  1397. kCmdNew.m_eFunc = eFunc;
  1398. kCmdNew.m_uArg = uArg;
  1399. m_kQue_kCmdNew.push_back(kCmdNew);
  1400.  
  1401. //int nApplyGap=kCmdNew.m_dwChkTime-ELTimer_GetServerFrameMSec();
  1402.  
  1403. //if (nApplyGap<-500 || nApplyGap>500)
  1404. // Tracenf("VID[%d] NAME[%s] ł×Ć®ż÷°¸ [cur:%d ave:%d] Ŕ۵ż˝Ă°Ł (%d)", GetVirtualID(), GetNameString(), nNetworkGap, m_nAverageNetworkGap, nApplyGap);
  1405. }
  1406.  
  1407. /*
  1408. CInstanceBase::TStateQueue::iterator CInstanceBase::FindSameState(TStateQueue& rkQuekStt, DWORD dwCmdTime, UINT eFunc, UINT uArg)
  1409. {
  1410. TStateQueue::iterator i=rkQuekStt.begin();
  1411. while (rkQuekStt.end()!=i)
  1412. {
  1413. SState& rkSttEach=*i;
  1414. if (rkSttEach.m_dwCmdTime==dwCmdTime)
  1415. if (rkSttEach.m_eFunc==eFunc)
  1416. if (rkSttEach.m_uArg==uArg)
  1417. break;
  1418. ++i;
  1419. }
  1420.  
  1421. return i;
  1422. }
  1423. */
  1424.  
  1425. BOOL CInstanceBase::__CanProcessNetworkStatePacket()
  1426. {
  1427. if (m_GraphicThingInstance.IsDead())
  1428. return FALSE;
  1429. if (m_GraphicThingInstance.IsKnockDown())
  1430. return FALSE;
  1431. if (m_GraphicThingInstance.IsUsingSkill())
  1432. if (!m_GraphicThingInstance.CanCancelSkill())
  1433. return FALSE;
  1434.  
  1435. return TRUE;
  1436. }
  1437.  
  1438. BOOL CInstanceBase::__IsEnableTCPProcess(UINT eCurFunc)
  1439. {
  1440. if (m_GraphicThingInstance.IsActEmotion())
  1441. {
  1442. return FALSE;
  1443. }
  1444.  
  1445. if (!m_bEnableTCPState)
  1446. {
  1447. if (FUNC_EMOTION != eCurFunc)
  1448. {
  1449. return FALSE;
  1450. }
  1451. }
  1452.  
  1453. return TRUE;
  1454. }
  1455.  
  1456. void CInstanceBase::StateProcess()
  1457. {
  1458. while (1)
  1459. {
  1460. if (m_kQue_kCmdNew.empty())
  1461. return;
  1462.  
  1463. DWORD dwDstChkTime = m_kQue_kCmdNew.front().m_dwChkTime;
  1464. DWORD dwCurChkTime = ELTimer_GetServerFrameMSec();
  1465.  
  1466. if (dwCurChkTime < dwDstChkTime)
  1467. return;
  1468.  
  1469. SCommand kCmdTop = m_kQue_kCmdNew.front();
  1470. m_kQue_kCmdNew.pop_front();
  1471.  
  1472. TPixelPosition kPPosDst = kCmdTop.m_kPPosDst;
  1473. //DWORD dwCmdTime = kCmdTop.m_dwCmdTime;
  1474. FLOAT fRotDst = kCmdTop.m_fDstRot;
  1475. UINT eFunc = kCmdTop.m_eFunc;
  1476. UINT uArg = kCmdTop.m_uArg;
  1477. UINT uVID = GetVirtualID();
  1478. UINT uTargetVID = kCmdTop.m_uTargetVID;
  1479.  
  1480. TPixelPosition kPPosCur;
  1481. NEW_GetPixelPosition(&kPPosCur);
  1482.  
  1483. /*
  1484. if (IsPC())
  1485. Tracenf("%d cmd: vid=%d[%s] func=%d arg=%d curPos=(%f, %f) dstPos=(%f, %f) rot=%f (time %d)",
  1486. ELTimer_GetMSec(),
  1487. uVID, m_stName.c_str(), eFunc, uArg,
  1488. kPPosCur.x, kPPosCur.y,
  1489. kPPosDst.x, kPPosDst.y, fRotDst, dwCmdTime-m_dwBaseCmdTime);
  1490. */
  1491.  
  1492. TPixelPosition kPPosDir = kPPosDst - kPPosCur;
  1493. float fDirLen = (float)sqrt(kPPosDir.x * kPPosDir.x + kPPosDir.y * kPPosDir.y);
  1494.  
  1495. //Tracenf("°Ĺ¸® %f", fDirLen);
  1496.  
  1497. if (!__CanProcessNetworkStatePacket())
  1498. {
  1499. Lognf(0, "vid=%d żňÁ÷ŔĎ Ľö ľř´Â »óĹÂ¶ó ˝şĹµ IsDead=%d, IsKnockDown=%d", uVID, m_GraphicThingInstance.IsDead(), m_GraphicThingInstance.IsKnockDown());
  1500. return;
  1501. }
  1502.  
  1503. if (!__IsEnableTCPProcess(eFunc))
  1504. {
  1505. return;
  1506. }
  1507.  
  1508. switch (eFunc)
  1509. {
  1510. case FUNC_WAIT:
  1511. {
  1512. //Tracenf("%s (%f, %f) -> (%f, %f) ł˛Ŕş°Ĺ¸® %f", GetNameString(), kPPosCur.x, kPPosCur.y, kPPosDst.x, kPPosDst.y, fDirLen);
  1513. if (fDirLen > 1.0f)
  1514. {
  1515. //NEW_GetSrcPixelPositionRef() = kPPosCur;
  1516. //NEW_GetDstPixelPositionRef() = kPPosDst;
  1517. NEW_SetSrcPixelPosition(kPPosCur);
  1518. NEW_SetDstPixelPosition(kPPosDst);
  1519.  
  1520. __EnableSkipCollision();
  1521.  
  1522. m_fDstRot = fRotDst;
  1523. m_isGoing = TRUE;
  1524.  
  1525. m_kMovAfterFunc.eFunc = FUNC_WAIT;
  1526.  
  1527. if (!IsWalking())
  1528. StartWalking();
  1529.  
  1530. //Tracen("¸ńÇĄÁ¤Áö");
  1531. }
  1532. else
  1533. {
  1534. //Tracen("ÇöŔç Á¤Áö");
  1535.  
  1536. m_isGoing = FALSE;
  1537.  
  1538. if (!IsWaiting())
  1539. EndWalking();
  1540.  
  1541. SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
  1542. SetAdvancingRotation(fRotDst);
  1543. SetRotation(fRotDst);
  1544. }
  1545. break;
  1546. }
  1547.  
  1548. case FUNC_MOVE:
  1549. {
  1550. //NEW_GetSrcPixelPositionRef() = kPPosCur;
  1551. //NEW_GetDstPixelPositionRef() = kPPosDst;
  1552. NEW_SetSrcPixelPosition(kPPosCur);
  1553. NEW_SetDstPixelPosition(kPPosDst);
  1554. m_fDstRot = fRotDst;
  1555. m_isGoing = TRUE;
  1556. __EnableSkipCollision();
  1557. //m_isSyncMov = TRUE;
  1558.  
  1559. m_kMovAfterFunc.eFunc = FUNC_MOVE;
  1560.  
  1561. if (!IsWalking())
  1562. {
  1563. //Tracen("°Č°í ŔÖÁö ľĘľĆ °Č±â ˝ĂŔŰ");
  1564. StartWalking();
  1565. }
  1566. else
  1567. {
  1568. //Tracen("ŔĚąĚ °Č´ÂÁß ");
  1569. }
  1570. break;
  1571. }
  1572.  
  1573. case FUNC_COMBO:
  1574. {
  1575. if (fDirLen >= 50.0f)
  1576. {
  1577. NEW_SetSrcPixelPosition(kPPosCur);
  1578. NEW_SetDstPixelPosition(kPPosDst);
  1579. m_fDstRot=fRotDst;
  1580. m_isGoing = TRUE;
  1581. __EnableSkipCollision();
  1582.  
  1583. m_kMovAfterFunc.eFunc = FUNC_COMBO;
  1584. m_kMovAfterFunc.uArg = uArg;
  1585.  
  1586. if (!IsWalking())
  1587. StartWalking();
  1588. }
  1589. else
  1590. {
  1591. //Tracen("´ë±â °ř°Ý Á¤Áö");
  1592.  
  1593. m_isGoing = FALSE;
  1594.  
  1595. if (IsWalking())
  1596. EndWalking();
  1597.  
  1598. SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
  1599. RunComboAttack(fRotDst, uArg);
  1600. }
  1601. break;
  1602. }
  1603.  
  1604. case FUNC_ATTACK:
  1605. {
  1606. if (fDirLen>=50.0f)
  1607. {
  1608. //NEW_GetSrcPixelPositionRef() = kPPosCur;
  1609. //NEW_GetDstPixelPositionRef() = kPPosDst;
  1610. NEW_SetSrcPixelPosition(kPPosCur);
  1611. NEW_SetDstPixelPosition(kPPosDst);
  1612. m_fDstRot = fRotDst;
  1613. m_isGoing = TRUE;
  1614. __EnableSkipCollision();
  1615. //m_isSyncMov = TRUE;
  1616.  
  1617. m_kMovAfterFunc.eFunc = FUNC_ATTACK;
  1618.  
  1619. if (!IsWalking())
  1620. StartWalking();
  1621.  
  1622. //Tracen("łĘą« ¸ÖľîĽ­ Ŕ̵ż ČÄ °ř°Ý");
  1623. }
  1624. else
  1625. {
  1626. //Tracen("łë¸» °ř°Ý Á¤Áö");
  1627.  
  1628. m_isGoing = FALSE;
  1629.  
  1630. if (IsWalking())
  1631. EndWalking();
  1632.  
  1633. SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
  1634. BlendRotation(fRotDst);
  1635.  
  1636. RunNormalAttack(fRotDst);
  1637.  
  1638. //Tracen("°ˇ±ő±â ¶§ą®żˇ żöÇÁ °ř°Ý");
  1639. }
  1640. break;
  1641. }
  1642.  
  1643. case FUNC_MOB_SKILL:
  1644. {
  1645. if (fDirLen >= 50.0f)
  1646. {
  1647. NEW_SetSrcPixelPosition(kPPosCur);
  1648. NEW_SetDstPixelPosition(kPPosDst);
  1649. m_fDstRot = fRotDst;
  1650. m_isGoing = TRUE;
  1651. __EnableSkipCollision();
  1652.  
  1653. m_kMovAfterFunc.eFunc = FUNC_MOB_SKILL;
  1654. m_kMovAfterFunc.uArg = uArg;
  1655.  
  1656. if (!IsWalking())
  1657. StartWalking();
  1658. }
  1659. else
  1660. {
  1661. m_isGoing = FALSE;
  1662.  
  1663. if (IsWalking())
  1664. EndWalking();
  1665.  
  1666. SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
  1667. BlendRotation(fRotDst);
  1668.  
  1669. m_GraphicThingInstance.InterceptOnceMotion(CRaceMotionData::NAME_SPECIAL_1 + uArg);
  1670. }
  1671. break;
  1672. }
  1673.  
  1674. case FUNC_EMOTION:
  1675. {
  1676. if (fDirLen>100.0f)
  1677. {
  1678. NEW_SetSrcPixelPosition(kPPosCur);
  1679. NEW_SetDstPixelPosition(kPPosDst);
  1680. m_fDstRot = fRotDst;
  1681. m_isGoing = TRUE;
  1682.  
  1683. if (IsMainInstance())
  1684. __EnableSkipCollision();
  1685.  
  1686. m_kMovAfterFunc.eFunc = FUNC_EMOTION;
  1687. m_kMovAfterFunc.uArg = uArg;
  1688. m_kMovAfterFunc.uArgExpanded = uTargetVID;
  1689. m_kMovAfterFunc.kPosDst = kPPosDst;
  1690.  
  1691. if (!IsWalking())
  1692. StartWalking();
  1693. }
  1694. else
  1695. {
  1696. __ProcessFunctionEmotion(uArg, uTargetVID, kPPosDst);
  1697. }
  1698. break;
  1699. }
  1700.  
  1701. default:
  1702. {
  1703. if (eFunc & FUNC_SKILL)
  1704. {
  1705. if (fDirLen >= 50.0f)
  1706. {
  1707. //NEW_GetSrcPixelPositionRef() = kPPosCur;
  1708. //NEW_GetDstPixelPositionRef() = kPPosDst;
  1709. NEW_SetSrcPixelPosition(kPPosCur);
  1710. NEW_SetDstPixelPosition(kPPosDst);
  1711. m_fDstRot = fRotDst;
  1712. m_isGoing = TRUE;
  1713. //m_isSyncMov = TRUE;
  1714. __EnableSkipCollision();
  1715.  
  1716. m_kMovAfterFunc.eFunc = eFunc;
  1717. m_kMovAfterFunc.uArg = uArg;
  1718.  
  1719. if (!IsWalking())
  1720. StartWalking();
  1721.  
  1722. //Tracen("łĘą« ¸ÖľîĽ­ Ŕ̵ż ČÄ °ř°Ý");
  1723. }
  1724. else
  1725. {
  1726. //Tracen("˝şĹł Á¤Áö");
  1727.  
  1728. m_isGoing = FALSE;
  1729.  
  1730. if (IsWalking())
  1731. EndWalking();
  1732.  
  1733. SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y);
  1734. SetAdvancingRotation(fRotDst);
  1735. SetRotation(fRotDst);
  1736.  
  1737. NEW_UseSkill(0, eFunc & 0x7f, uArg&0x0f, (uArg>>4) ? true : false);
  1738. //Tracen("°ˇ±ő±â ¶§ą®żˇ żöÇÁ °ř°Ý");
  1739. }
  1740. }
  1741. break;
  1742. }
  1743. }
  1744. }
  1745. }
  1746.  
  1747.  
  1748. void CInstanceBase::MovementProcess()
  1749. {
  1750. TPixelPosition kPPosCur;
  1751. NEW_GetPixelPosition(&kPPosCur);
  1752.  
  1753. // ·»´ő¸µ ÁÂÇĄ°čŔ̹ǷΠy¸¦ -Č­ÇŘĽ­ ´őÇŃ´Ů.
  1754.  
  1755. TPixelPosition kPPosNext;
  1756. {
  1757. const D3DXVECTOR3 & c_rkV3Mov = m_GraphicThingInstance.GetMovementVectorRef();
  1758.  
  1759. kPPosNext.x = kPPosCur.x + (+c_rkV3Mov.x);
  1760. kPPosNext.y = kPPosCur.y + (-c_rkV3Mov.y);
  1761. kPPosNext.z = kPPosCur.z + (+c_rkV3Mov.z);
  1762. }
  1763.  
  1764. TPixelPosition kPPosDeltaSC = kPPosCur - NEW_GetSrcPixelPositionRef();
  1765. TPixelPosition kPPosDeltaSN = kPPosNext - NEW_GetSrcPixelPositionRef();
  1766. TPixelPosition kPPosDeltaSD = NEW_GetDstPixelPositionRef() - NEW_GetSrcPixelPositionRef();
  1767.  
  1768. float fCurLen = sqrtf(kPPosDeltaSC.x * kPPosDeltaSC.x + kPPosDeltaSC.y * kPPosDeltaSC.y);
  1769. float fNextLen = sqrtf(kPPosDeltaSN.x * kPPosDeltaSN.x + kPPosDeltaSN.y * kPPosDeltaSN.y);
  1770. float fTotalLen = sqrtf(kPPosDeltaSD.x * kPPosDeltaSD.x + kPPosDeltaSD.y * kPPosDeltaSD.y);
  1771. float fRestLen = fTotalLen - fCurLen;
  1772.  
  1773. if (IsMainInstance())
  1774. {
  1775. if (m_isGoing && IsWalking())
  1776. {
  1777. float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(NEW_GetSrcPixelPositionRef(), NEW_GetDstPixelPositionRef());
  1778.  
  1779. SetAdvancingRotation(fDstRot);
  1780.  
  1781. if (fRestLen<=0.0)
  1782. {
  1783. if (IsWalking())
  1784. EndWalking();
  1785.  
  1786. //Tracen("¸ńÇĄ µµ´Ţ Á¤Áö");
  1787.  
  1788. m_isGoing = FALSE;
  1789.  
  1790. BlockMovement();
  1791.  
  1792. if (FUNC_EMOTION == m_kMovAfterFunc.eFunc)
  1793. {
  1794. DWORD dwMotionNumber = m_kMovAfterFunc.uArg;
  1795. DWORD dwTargetVID = m_kMovAfterFunc.uArgExpanded;
  1796. __ProcessFunctionEmotion(dwMotionNumber, dwTargetVID, m_kMovAfterFunc.kPosDst);
  1797. m_kMovAfterFunc.eFunc = FUNC_WAIT;
  1798. return;
  1799. }
  1800. }
  1801. }
  1802. }
  1803. else
  1804. {
  1805. if (m_isGoing && IsWalking())
  1806. {
  1807. float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(NEW_GetSrcPixelPositionRef(), NEW_GetDstPixelPositionRef());
  1808.  
  1809. SetAdvancingRotation(fDstRot);
  1810.  
  1811. // ¸¸ľŕ ·»ĹϽðˇ ´Ęľî łĘą« ¸ąŔĚ Ŕ̵żÇߴٸé..
  1812. if (fRestLen < -100.0f)
  1813. {
  1814. NEW_SetSrcPixelPosition(kPPosCur);
  1815.  
  1816. float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(kPPosCur, NEW_GetDstPixelPositionRef());
  1817. SetAdvancingRotation(fDstRot);
  1818. //Tracenf("VID %d żŔąö ąćÇ⼳Á¤ (%f, %f) %f rest %f", GetVirtualID(), kPPosCur.x, kPPosCur.y, fDstRot, fRestLen);
  1819.  
  1820. // Ŕ̵żÁßŔ̶ó¸é ´ŮŔ˝ąřżˇ ¸ŘĂß°Ô ÇŃ´Ů
  1821. if (FUNC_MOVE == m_kMovAfterFunc.eFunc)
  1822. {
  1823. m_kMovAfterFunc.eFunc = FUNC_WAIT;
  1824. }
  1825. }
  1826. // µµÂřÇߴٸé...
  1827. else if (fCurLen <= fTotalLen && fTotalLen <= fNextLen)
  1828. {
  1829. if (m_GraphicThingInstance.IsDead() || m_GraphicThingInstance.IsKnockDown())
  1830. {
  1831. __DisableSkipCollision();
  1832.  
  1833. //Tracen("»ç¸Á »óĹÂ¶ó µżŔŰ ˝şĹµ");
  1834.  
  1835. m_isGoing = FALSE;
  1836.  
  1837. //Tracen("Çൿ şŇ´É »óŶó ŔĚČÄ µżŔŰ ˝şĹµ");
  1838. }
  1839. else
  1840. {
  1841. switch (m_kMovAfterFunc.eFunc)
  1842. {
  1843. case FUNC_ATTACK:
  1844. {
  1845. if (IsWalking())
  1846. EndWalking();
  1847.  
  1848. __DisableSkipCollision();
  1849. m_isGoing = FALSE;
  1850.  
  1851. BlockMovement();
  1852. SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
  1853. SetAdvancingRotation(m_fDstRot);
  1854. SetRotation(m_fDstRot);
  1855.  
  1856. RunNormalAttack(m_fDstRot);
  1857. break;
  1858. }
  1859.  
  1860. case FUNC_COMBO:
  1861. {
  1862. if (IsWalking())
  1863. EndWalking();
  1864.  
  1865. __DisableSkipCollision();
  1866. m_isGoing = FALSE;
  1867.  
  1868. BlockMovement();
  1869. SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
  1870. RunComboAttack(m_fDstRot, m_kMovAfterFunc.uArg);
  1871. break;
  1872. }
  1873.  
  1874. case FUNC_EMOTION:
  1875. {
  1876. m_isGoing = FALSE;
  1877. m_kMovAfterFunc.eFunc = FUNC_WAIT;
  1878. __DisableSkipCollision();
  1879. BlockMovement();
  1880.  
  1881. DWORD dwMotionNumber = m_kMovAfterFunc.uArg;
  1882. DWORD dwTargetVID = m_kMovAfterFunc.uArgExpanded;
  1883. __ProcessFunctionEmotion(dwMotionNumber, dwTargetVID, m_kMovAfterFunc.kPosDst);
  1884. break;
  1885. }
  1886.  
  1887. case FUNC_MOVE:
  1888. {
  1889. #ifdef ENABLE_MOVEMENT_FIX
  1890. if (!IsWaiting())
  1891. EndWalkingWithoutBlending();
  1892. #endif
  1893. break;
  1894. }
  1895.  
  1896. case FUNC_MOB_SKILL:
  1897. {
  1898. if (IsWalking())
  1899. EndWalking();
  1900.  
  1901. __DisableSkipCollision();
  1902. m_isGoing = FALSE;
  1903.  
  1904. BlockMovement();
  1905. SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
  1906. SetAdvancingRotation(m_fDstRot);
  1907. SetRotation(m_fDstRot);
  1908.  
  1909. m_GraphicThingInstance.InterceptOnceMotion(CRaceMotionData::NAME_SPECIAL_1 + m_kMovAfterFunc.uArg);
  1910. break;
  1911. }
  1912.  
  1913. default:
  1914. {
  1915. if (m_kMovAfterFunc.eFunc & FUNC_SKILL)
  1916. {
  1917. SetAdvancingRotation(m_fDstRot);
  1918. BlendRotation(m_fDstRot);
  1919. NEW_UseSkill(0, m_kMovAfterFunc.eFunc & 0x7f, m_kMovAfterFunc.uArg&0x0f, (m_kMovAfterFunc.uArg>>4) ? true : false);
  1920. }
  1921. else
  1922. {
  1923. //Tracenf("VID %d ˝şĹł °ř°Ý (%f, %f) rot %f", GetVirtualID(), NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y, m_fDstRot);
  1924.  
  1925. __DisableSkipCollision();
  1926. m_isGoing = FALSE;
  1927.  
  1928. BlockMovement();
  1929. SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y);
  1930. SetAdvancingRotation(m_fDstRot);
  1931. BlendRotation(m_fDstRot);
  1932. if (!IsWaiting())
  1933. {
  1934. EndWalking();
  1935. }
  1936.  
  1937. //Tracenf("VID %d Á¤Áö (%f, %f) rot %f IsWalking %d", GetVirtualID(), NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y, m_fDstRot, IsWalking());
  1938. }
  1939. break;
  1940. }
  1941. }
  1942.  
  1943. }
  1944. }
  1945.  
  1946. }
  1947. }
  1948.  
  1949. if (IsWalking() || m_GraphicThingInstance.IsUsingMovingSkill())
  1950. {
  1951. float fRotation = m_GraphicThingInstance.GetRotation();
  1952. float fAdvancingRotation = m_GraphicThingInstance.GetAdvancingRotation();
  1953. int iDirection = GetRotatingDirection(fRotation, fAdvancingRotation);
  1954.  
  1955. if (DEGREE_DIRECTION_SAME != m_iRotatingDirection)
  1956. {
  1957. if (DEGREE_DIRECTION_LEFT == iDirection)
  1958. {
  1959. fRotation = fmodf(fRotation + m_fRotSpd*m_GraphicThingInstance.GetSecondElapsed(), 360.0f);
  1960. }
  1961. else if (DEGREE_DIRECTION_RIGHT == iDirection)
  1962. {
  1963. fRotation = fmodf(fRotation - m_fRotSpd*m_GraphicThingInstance.GetSecondElapsed() + 360.0f, 360.0f);
  1964. }
  1965.  
  1966. if (m_iRotatingDirection != GetRotatingDirection(fRotation, fAdvancingRotation))
  1967. {
  1968. m_iRotatingDirection = DEGREE_DIRECTION_SAME;
  1969. fRotation = fAdvancingRotation;
  1970. }
  1971.  
  1972. m_GraphicThingInstance.SetRotation(fRotation);
  1973. }
  1974.  
  1975. if (__IsInDustRange() && !IsAffect(AFFECT_EUNHYEONG))
  1976. {
  1977. float fDustDistance = NEW_GetDistanceFromDestPixelPosition(m_kPPosDust);
  1978. if (IsMountingHorse())
  1979. {
  1980. if (fDustDistance > ms_fHorseDustGap)
  1981. {
  1982. NEW_GetPixelPosition(&m_kPPosDust);
  1983. AttachEffect(EFFECT_HORSE_DUST);
  1984. }
  1985. }
  1986. else
  1987. {
  1988. if (fDustDistance > ms_fDustGap)
  1989. {
  1990. NEW_GetPixelPosition(&m_kPPosDust);
  1991. AttachEffect(EFFECT_DUST);
  1992. }
  1993. }
  1994. }
  1995. }
  1996. }
  1997.  
  1998. void CInstanceBase::__ProcessFunctionEmotion(DWORD dwMotionNumber, DWORD dwTargetVID, const TPixelPosition & c_rkPosDst)
  1999. {
  2000. if (IsWalking())
  2001. EndWalkingWithoutBlending();
  2002.  
  2003. __EnableChangingTCPState();
  2004. SCRIPT_SetPixelPosition(c_rkPosDst.x, c_rkPosDst.y);
  2005.  
  2006. CInstanceBase * pTargetInstance = CPythonCharacterManager::Instance().GetInstancePtr(dwTargetVID);
  2007. if (pTargetInstance)
  2008. {
  2009. pTargetInstance->__EnableChangingTCPState();
  2010.  
  2011. if (pTargetInstance->IsWalking())
  2012. pTargetInstance->EndWalkingWithoutBlending();
  2013.  
  2014. WORD wMotionNumber1 = HIWORD(dwMotionNumber);
  2015. WORD wMotionNumber2 = LOWORD(dwMotionNumber);
  2016.  
  2017. int src_job = RaceToJob(GetRace());
  2018. int dst_job = RaceToJob(pTargetInstance->GetRace());
  2019.  
  2020. NEW_LookAtDestInstance(*pTargetInstance);
  2021. m_GraphicThingInstance.InterceptOnceMotion(wMotionNumber1 + dst_job);
  2022. m_GraphicThingInstance.SetRotation(m_GraphicThingInstance.GetTargetRotation());
  2023. m_GraphicThingInstance.SetAdvancingRotation(m_GraphicThingInstance.GetTargetRotation());
  2024.  
  2025. pTargetInstance->NEW_LookAtDestInstance(*this);
  2026. pTargetInstance->m_GraphicThingInstance.InterceptOnceMotion(wMotionNumber2 + src_job);
  2027. pTargetInstance->m_GraphicThingInstance.SetRotation(pTargetInstance->m_GraphicThingInstance.GetTargetRotation());
  2028. pTargetInstance->m_GraphicThingInstance.SetAdvancingRotation(pTargetInstance->m_GraphicThingInstance.GetTargetRotation());
  2029.  
  2030. if (pTargetInstance->IsMainInstance())
  2031. {
  2032. IAbstractPlayer & rPlayer=IAbstractPlayer::GetSingleton();
  2033. rPlayer.EndEmotionProcess();
  2034. }
  2035. }
  2036.  
  2037. if (IsMainInstance())
  2038. {
  2039. IAbstractPlayer & rPlayer=IAbstractPlayer::GetSingleton();
  2040. rPlayer.EndEmotionProcess();
  2041. }
  2042. }
  2043.  
  2044. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2045. // Update & Deform & Render
  2046.  
  2047. int g_iAccumulationTime = 0;
  2048.  
  2049. void CInstanceBase::Update()
  2050. {
  2051. ++ms_dwUpdateCounter;
  2052.  
  2053. StateProcess();
  2054. m_GraphicThingInstance.PhysicsProcess();
  2055. m_GraphicThingInstance.RotationProcess();
  2056. m_GraphicThingInstance.ComboProcess();
  2057. m_GraphicThingInstance.AccumulationMovement();
  2058.  
  2059. if (m_GraphicThingInstance.IsMovement())
  2060. {
  2061. TPixelPosition kPPosCur;
  2062. NEW_GetPixelPosition(&kPPosCur);
  2063.  
  2064. DWORD dwCurTime=ELTimer_GetFrameMSec();
  2065. //if (m_dwNextUpdateHeightTime<dwCurTime)
  2066. {
  2067. m_dwNextUpdateHeightTime=dwCurTime;
  2068. kPPosCur.z = __GetBackgroundHeight(kPPosCur.x, kPPosCur.y);
  2069. NEW_SetPixelPosition(kPPosCur);
  2070. }
  2071.  
  2072. // SetMaterialColor
  2073. {
  2074. DWORD dwMtrlColor=__GetShadowMapColor(kPPosCur.x, kPPosCur.y);
  2075. m_GraphicThingInstance.SetMaterialColor(dwMtrlColor);
  2076. }
  2077. }
  2078.  
  2079. m_GraphicThingInstance.UpdateAdvancingPointInstance();
  2080.  
  2081. AttackProcess();
  2082. MovementProcess();
  2083.  
  2084. m_GraphicThingInstance.MotionProcess(IsPC());
  2085. if (IsMountingHorse())
  2086. {
  2087. m_kHorse.actorPointer->HORSE_MotionProcess(FALSE);
  2088. }
  2089.  
  2090. while (ProcessDamage());
  2091. }
  2092.  
  2093. void CInstanceBase::Transform()
  2094. {
  2095. if (__IsSyncing())
  2096. {
  2097. //OnSyncing();
  2098. }
  2099. else
  2100. {
  2101. if (IsWalking() || m_GraphicThingInstance.IsUsingMovingSkill())
  2102. {
  2103. const D3DXVECTOR3& c_rv3Movment=m_GraphicThingInstance.GetMovementVectorRef();
  2104.  
  2105. float len=(c_rv3Movment.x*c_rv3Movment.x)+(c_rv3Movment.y*c_rv3Movment.y);
  2106. if (len>1.0f)
  2107. OnMoving();
  2108. else
  2109. OnWaiting();
  2110. }
  2111. }
  2112.  
  2113. m_GraphicThingInstance.INSTANCEBASE_Transform();
  2114. }
  2115.  
  2116.  
  2117. void CInstanceBase::Deform()
  2118. {
  2119. // 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Î şŻ°ć
  2120. if (!__CanRender())
  2121. return;
  2122.  
  2123. ++ms_dwDeformCounter;
  2124.  
  2125. m_GraphicThingInstance.INSTANCEBASE_Deform();
  2126.  
  2127. m_kHorse.Deform();
  2128. }
  2129.  
  2130. void CInstanceBase::RenderTrace()
  2131. {
  2132. if (!__CanRender())
  2133. return;
  2134.  
  2135. m_GraphicThingInstance.RenderTrace();
  2136. }
  2137.  
  2138.  
  2139.  
  2140.  
  2141. void CInstanceBase::Render()
  2142. {
  2143. // 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Î şŻ°ć
  2144. if (!__CanRender())
  2145. return;
  2146.  
  2147. ++ms_dwRenderCounter;
  2148.  
  2149. m_kHorse.Render();
  2150. m_GraphicThingInstance.Render();
  2151.  
  2152. if (CActorInstance::IsDirLine())
  2153. {
  2154. if (NEW_GetDstPixelPositionRef().x != 0.0f)
  2155. {
  2156. static CScreen s_kScreen;
  2157.  
  2158. STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
  2159. STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
  2160. STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  2161. STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, FALSE);
  2162. STATEMANAGER.SetRenderState(D3DRS_FOGENABLE, FALSE);
  2163. STATEMANAGER.SetRenderState(D3DRS_LIGHTING, FALSE);
  2164.  
  2165. TPixelPosition px;
  2166. m_GraphicThingInstance.GetPixelPosition(&px);
  2167. D3DXVECTOR3 kD3DVt3Cur(px.x, px.y, px.z);
  2168. //D3DXVECTOR3 kD3DVt3Cur(NEW_GetSrcPixelPositionRef().x, -NEW_GetSrcPixelPositionRef().y, NEW_GetSrcPixelPositionRef().z);
  2169. D3DXVECTOR3 kD3DVt3Dest(NEW_GetDstPixelPositionRef().x, -NEW_GetDstPixelPositionRef().y, NEW_GetDstPixelPositionRef().z);
  2170.  
  2171. //printf("%s %f\n", GetNameString(), kD3DVt3Cur.y - kD3DVt3Dest.y);
  2172. //float fdx = NEW_GetDstPixelPositionRef().x - NEW_GetSrcPixelPositionRef().x;
  2173. //float fdy = NEW_GetDstPixelPositionRef().y - NEW_GetSrcPixelPositionRef().y;
  2174.  
  2175. s_kScreen.SetDiffuseColor(0.0f, 0.0f, 1.0f);
  2176. s_kScreen.RenderLine3d(kD3DVt3Cur.x, kD3DVt3Cur.y, px.z, kD3DVt3Dest.x, kD3DVt3Dest.y, px.z);
  2177. STATEMANAGER.RestoreRenderState(D3DRS_ZENABLE);
  2178. STATEMANAGER.SetRenderState(D3DRS_FOGENABLE, TRUE);
  2179. STATEMANAGER.SetRenderState(D3DRS_LIGHTING, TRUE);
  2180. }
  2181. }
  2182. }
  2183.  
  2184. void CInstanceBase::RenderToShadowMap()
  2185. {
  2186. if (IsDoor())
  2187. return;
  2188.  
  2189. if (IsBuilding())
  2190. return;
  2191.  
  2192. if (!__CanRender())
  2193. return;
  2194.  
  2195. if (!ExistsMainInstance())
  2196. return;
  2197.  
  2198. CInstanceBase* pkInstMain=GetMainInstancePtr();
  2199.  
  2200. // const float SHADOW_APPLY_DISTANCE = 2500.0f;
  2201.  
  2202. //zwiekszenie dystansu
  2203. const float SHADOW_APPLY_DISTANCE = 2500.0f * SHADOW_DISTANCE_MULTIPLIER;
  2204.  
  2205. float fDistance=NEW_GetDistanceFromDestInstance(*pkInstMain);
  2206. if (fDistance>=SHADOW_APPLY_DISTANCE)
  2207. return;
  2208.  
  2209. m_GraphicThingInstance.RenderToShadowMap();
  2210. }
  2211.  
  2212. void CInstanceBase::RenderCollision()
  2213. {
  2214. m_GraphicThingInstance.RenderCollisionData();
  2215. }
  2216.  
  2217. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2218. // Setting & Getting Data
  2219.  
  2220. void CInstanceBase::SetVirtualID(DWORD dwVirtualID)
  2221. {
  2222. m_GraphicThingInstance.SetVirtualID(dwVirtualID);
  2223. }
  2224.  
  2225. void CInstanceBase::SetVirtualNumber(DWORD dwVirtualNumber)
  2226. {
  2227. m_dwVirtualNumber = dwVirtualNumber;
  2228. }
  2229.  
  2230. void CInstanceBase::SetInstanceType(int iInstanceType)
  2231. {
  2232. m_GraphicThingInstance.SetActorType(iInstanceType);
  2233. }
  2234.  
  2235. void CInstanceBase::SetAlignment(short sAlignment)
  2236. {
  2237. m_sAlignment = sAlignment;
  2238. RefreshTextTailTitle();
  2239. }
  2240.  
  2241. void CInstanceBase::SetPKMode(BYTE byPKMode)
  2242. {
  2243. if (m_byPKMode == byPKMode)
  2244. return;
  2245.  
  2246. m_byPKMode = byPKMode;
  2247.  
  2248. if (IsMainInstance())
  2249. {
  2250. IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton();
  2251. rPlayer.NotifyChangePKMode();
  2252. }
  2253. }
  2254.  
  2255. void CInstanceBase::SetKiller(bool bFlag)
  2256. {
  2257. if (m_isKiller == bFlag)
  2258. return;
  2259.  
  2260. m_isKiller = bFlag;
  2261. RefreshTextTail();
  2262. }
  2263.  
  2264. void CInstanceBase::SetPartyMemberFlag(bool bFlag)
  2265. {
  2266. m_isPartyMember = bFlag;
  2267. }
  2268.  
  2269. void CInstanceBase::SetStateFlags(DWORD dwStateFlags)
  2270. {
  2271. if (dwStateFlags & ADD_CHARACTER_STATE_KILLER)
  2272. SetKiller(TRUE);
  2273. else
  2274. SetKiller(FALSE);
  2275.  
  2276. if (dwStateFlags & ADD_CHARACTER_STATE_PARTY)
  2277. SetPartyMemberFlag(TRUE);
  2278. else
  2279. SetPartyMemberFlag(FALSE);
  2280. }
  2281.  
  2282. void CInstanceBase::SetComboType(UINT uComboType)
  2283. {
  2284. m_GraphicThingInstance.SetComboType(uComboType);
  2285. }
  2286.  
  2287. const char * CInstanceBase::GetNameString()
  2288. {
  2289. return m_stName.c_str();
  2290. }
  2291.  
  2292. DWORD CInstanceBase::GetLevel()
  2293. {
  2294. return m_dwLevel;
  2295. }
  2296.  
  2297. void CInstanceBase::SetLevel(DWORD dwLevel)
  2298. {
  2299. m_dwLevel = dwLevel;
  2300. }
  2301.  
  2302. #if defined(WJ_SHOW_MOB_INFO) && defined(ENABLE_SHOW_MOBAIFLAG)
  2303. void CInstanceBase::MobInfoAiFlagRefresh()
  2304. {
  2305. std::string strName = CPythonNonPlayer::Instance().GetMonsterName(GetRace());
  2306.  
  2307. if (CPythonSystem::Instance().IsShowMobAIFlag() && CPythonNonPlayer::Instance().IsAggressive(GetRace()))
  2308. {
  2309. strName += "*";
  2310. }
  2311.  
  2312. SetNameString(strName.c_str(), strName.length());
  2313.  
  2314. DetachTextTail();
  2315. AttachTextTail();
  2316. RefreshTextTail();
  2317. }
  2318. #endif
  2319.  
  2320. #if defined(WJ_SHOW_MOB_INFO) && defined(ENABLE_SHOW_MOBLEVEL)
  2321. void CInstanceBase::MobInfoLevelRefresh()
  2322. {
  2323. if (CPythonSystem::Instance().IsShowMobLevel())
  2324. {
  2325. m_dwLevel = CPythonNonPlayer::Instance().GetMonsterLevel(GetRace());
  2326. }
  2327. else
  2328. {
  2329. m_dwLevel = 0;
  2330. }
  2331.  
  2332. if (m_dwLevel)
  2333. {
  2334. UpdateTextTailLevel(m_dwLevel);
  2335. }
  2336. else
  2337. {
  2338. CPythonTextTail::Instance().DetachLevel(GetVirtualID());
  2339. }
  2340. }
  2341. #endif
  2342.  
  2343. DWORD CInstanceBase::GetRace()
  2344. {
  2345. return m_dwRace;
  2346. }
  2347.  
  2348. bool CInstanceBase::IsConflictAlignmentInstance(CInstanceBase& rkInstVictim)
  2349. {
  2350. if (PK_MODE_PROTECT == rkInstVictim.GetPKMode())
  2351. return false;
  2352.  
  2353. switch (GetAlignmentType())
  2354. {
  2355. case ALIGNMENT_TYPE_NORMAL:
  2356. case ALIGNMENT_TYPE_WHITE:
  2357. if (ALIGNMENT_TYPE_DARK == rkInstVictim.GetAlignmentType())
  2358. return true;
  2359. break;
  2360. case ALIGNMENT_TYPE_DARK:
  2361. if (GetAlignmentType() != rkInstVictim.GetAlignmentType())
  2362. return true;
  2363. break;
  2364. }
  2365.  
  2366. return false;
  2367. }
  2368.  
  2369. void CInstanceBase::SetDuelMode(DWORD type)
  2370. {
  2371. m_dwDuelMode = type;
  2372. }
  2373.  
  2374. DWORD CInstanceBase::GetDuelMode()
  2375. {
  2376. return m_dwDuelMode;
  2377. }
  2378.  
  2379. bool CInstanceBase::IsAttackableInstance(CInstanceBase& rkInstVictim)
  2380. {
  2381. if (IsPC() && rkInstVictim.IsPC())
  2382. {
  2383. if (PK_MODE_PROTECT == GetPKMode() || PK_MODE_PROTECT == rkInstVictim.GetPKMode())
  2384. {
  2385. return false;
  2386. }
  2387. }
  2388.  
  2389. if (rkInstVictim.IsMining())
  2390. {
  2391. return false;
  2392. }
  2393.  
  2394. if (IsMainInstance())
  2395. {
  2396. CPythonPlayer& rkPlayer=CPythonPlayer::Instance();
  2397. if(rkPlayer.IsObserverMode())
  2398. return false;
  2399. }
  2400.  
  2401. if (GetVirtualID() == rkInstVictim.GetVirtualID())
  2402. return false;
  2403.  
  2404. if (IsStone())
  2405. {
  2406. if (rkInstVictim.IsPC())
  2407. return true;
  2408. }
  2409. else if (IsPC())
  2410. {
  2411. if (rkInstVictim.IsStone())
  2412. return true;
  2413.  
  2414. if (rkInstVictim.IsPC())
  2415. {
  2416. if (GetDuelMode())
  2417. {
  2418. switch(GetDuelMode())
  2419. {
  2420. case DUEL_CANNOTATTACK:
  2421. return false;
  2422. case DUEL_START:
  2423. if(FindDUELKey(GetVirtualID(),rkInstVictim.GetVirtualID()))
  2424. return true;
  2425. else
  2426. return false;
  2427. }
  2428. }
  2429. if (PK_MODE_GUILD == GetPKMode())
  2430. if (GetGuildID() == rkInstVictim.GetGuildID())
  2431. return false;
  2432.  
  2433. if (rkInstVictim.IsKiller())
  2434. if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
  2435. return true;
  2436.  
  2437. if (PK_MODE_PROTECT != GetPKMode())
  2438. {
  2439. if (PK_MODE_FREE == GetPKMode())
  2440. {
  2441. if (PK_MODE_PROTECT != rkInstVictim.GetPKMode())
  2442. if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
  2443. return true;
  2444. }
  2445. if (PK_MODE_GUILD == GetPKMode())
  2446. {
  2447. if (PK_MODE_PROTECT != rkInstVictim.GetPKMode())
  2448. if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
  2449. if (GetGuildID() != rkInstVictim.GetGuildID())
  2450. return true;
  2451. }
  2452. }
  2453.  
  2454. if (IsSameEmpire(rkInstVictim))
  2455. {
  2456. if (IsPVPInstance(rkInstVictim))
  2457. return true;
  2458.  
  2459. if (PK_MODE_REVENGE == GetPKMode())
  2460. if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID()))
  2461. if (IsConflictAlignmentInstance(rkInstVictim))
  2462. return true;
  2463. }
  2464. else
  2465. {
  2466. return true;
  2467. }
  2468. }
  2469.  
  2470. if (rkInstVictim.IsEnemy())
  2471. return true;
  2472.  
  2473. if (rkInstVictim.IsWoodenDoor())
  2474. return true;
  2475. }
  2476. else if (IsEnemy())
  2477. {
  2478. if (rkInstVictim.IsPC())
  2479. return true;
  2480.  
  2481. if (rkInstVictim.IsBuilding())
  2482. return true;
  2483.  
  2484. }
  2485. else if (IsPoly())
  2486. {
  2487. if (rkInstVictim.IsPC())
  2488. return true;
  2489.  
  2490. if (rkInstVictim.IsEnemy())
  2491. return true;
  2492. }
  2493. return false;
  2494. }
  2495.  
  2496. bool CInstanceBase::IsTargetableInstance(CInstanceBase& rkInstVictim)
  2497. {
  2498. return rkInstVictim.CanPickInstance();
  2499. }
  2500.  
  2501. // 2004. 07. 07. [levites] - ˝şĹł »çżëÁß Ĺ¸°ŮŔĚ ąŮ˛î´Â ą®Á¦ ÇذáŔ» Ŕ§ÇŃ ÄÚµĺ
  2502. bool CInstanceBase::CanChangeTarget()
  2503. {
  2504. return m_GraphicThingInstance.CanChangeTarget();
  2505. }
  2506.  
  2507. // 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Î şŻ°ć
  2508. bool CInstanceBase::CanPickInstance()
  2509. {
  2510. if (!__IsInViewFrustum())
  2511. return false;
  2512.  
  2513. if (IsDoor())
  2514. {
  2515. if (IsDead())
  2516. return false;
  2517. }
  2518.  
  2519. if (IsPC())
  2520. {
  2521. if (IsAffect(AFFECT_EUNHYEONG))
  2522. {
  2523. if (!MainCanSeeHiddenThing())
  2524. return false;
  2525. }
  2526. if (IsAffect(AFFECT_REVIVE_INVISIBILITY))
  2527. return false;
  2528. if (IsAffect(AFFECT_INVISIBILITY))
  2529. return false;
  2530. }
  2531.  
  2532. if (IsDead())
  2533. return false;
  2534.  
  2535. return true;
  2536. }
  2537.  
  2538. bool CInstanceBase::CanViewTargetHP(CInstanceBase& rkInstVictim)
  2539. {
  2540. if (rkInstVictim.IsStone())
  2541. return true;
  2542. if (rkInstVictim.IsWoodenDoor())
  2543. return true;
  2544. if (rkInstVictim.IsEnemy())
  2545. return true;
  2546.  
  2547. return false;
  2548. }
  2549.  
  2550. BOOL CInstanceBase::IsPoly()
  2551. {
  2552. return m_GraphicThingInstance.IsPoly();
  2553. }
  2554.  
  2555. BOOL CInstanceBase::IsPC()
  2556. {
  2557. return m_GraphicThingInstance.IsPC();
  2558. }
  2559.  
  2560. BOOL CInstanceBase::IsNPC()
  2561. {
  2562. return m_GraphicThingInstance.IsNPC();
  2563. }
  2564.  
  2565. BOOL CInstanceBase::IsEnemy()
  2566. {
  2567. return m_GraphicThingInstance.IsEnemy();
  2568. }
  2569.  
  2570. BOOL CInstanceBase::IsStone()
  2571. {
  2572. return m_GraphicThingInstance.IsStone();
  2573. }
  2574.  
  2575.  
  2576. BOOL CInstanceBase::IsGuildWall() //IsBuilding ±ćµĺ°Çą°ŔüĂĽ IsGuildWallŔş ´ăŔĺş®¸¸(ą®Ŕş Á¦żÜ)
  2577. {
  2578. return IsWall(m_dwRace);
  2579. }
  2580.  
  2581.  
  2582. BOOL CInstanceBase::IsResource()
  2583. {
  2584. switch (m_dwVirtualNumber)
  2585. {
  2586. case 20047:
  2587. case 20048:
  2588. case 20049:
  2589. case 20050:
  2590. case 20051:
  2591. case 20052:
  2592. case 20053:
  2593. case 20054:
  2594. case 20055:
  2595. case 20056:
  2596. case 20057:
  2597. case 20058:
  2598. case 20059:
  2599. case 30301:
  2600. case 30302:
  2601. case 30303:
  2602. case 30304:
  2603. case 30305:
  2604. return TRUE;
  2605. }
  2606.  
  2607. return FALSE;
  2608. }
  2609.  
  2610. BOOL CInstanceBase::IsWarp()
  2611. {
  2612. return m_GraphicThingInstance.IsWarp();
  2613. }
  2614.  
  2615. BOOL CInstanceBase::IsGoto()
  2616. {
  2617. return m_GraphicThingInstance.IsGoto();
  2618. }
  2619.  
  2620. BOOL CInstanceBase::IsObject()
  2621. {
  2622. return m_GraphicThingInstance.IsObject();
  2623. }
  2624.  
  2625. BOOL CInstanceBase::IsBuilding()
  2626. {
  2627. return m_GraphicThingInstance.IsBuilding();
  2628. }
  2629.  
  2630. BOOL CInstanceBase::IsDoor()
  2631. {
  2632. return m_GraphicThingInstance.IsDoor();
  2633. }
  2634.  
  2635. BOOL CInstanceBase::IsWoodenDoor()
  2636. {
  2637. if (m_GraphicThingInstance.IsDoor())
  2638. {
  2639. int vnum = GetVirtualNumber();
  2640. if (vnum == 13000) // łŞą«ą®
  2641. return true;
  2642. else if (vnum >= 30111 && vnum <= 30119) // »ç±Íą®
  2643. return true;
  2644. else
  2645. return false;
  2646. }
  2647. else
  2648. {
  2649. return false;
  2650. }
  2651. }
  2652.  
  2653. BOOL CInstanceBase::IsStoneDoor()
  2654. {
  2655. return m_GraphicThingInstance.IsDoor() && 13001 == GetVirtualNumber();
  2656. }
  2657.  
  2658. BOOL CInstanceBase::IsFlag()
  2659. {
  2660. if (GetRace() == 20035)
  2661. return TRUE;
  2662. if (GetRace() == 20036)
  2663. return TRUE;
  2664. if (GetRace() == 20037)
  2665. return TRUE;
  2666.  
  2667. return FALSE;
  2668. }
  2669.  
  2670. BOOL CInstanceBase::IsForceVisible()
  2671. {
  2672. if (IsAffect(AFFECT_SHOW_ALWAYS))
  2673. return TRUE;
  2674.  
  2675. if (IsObject() || IsBuilding() || IsDoor() )
  2676. return TRUE;
  2677.  
  2678. return FALSE;
  2679. }
  2680.  
  2681. int CInstanceBase::GetInstanceType()
  2682. {
  2683. return m_GraphicThingInstance.GetActorType();
  2684. }
  2685.  
  2686. DWORD CInstanceBase::GetVirtualID()
  2687. {
  2688. return m_GraphicThingInstance.GetVirtualID();
  2689. }
  2690.  
  2691. DWORD CInstanceBase::GetVirtualNumber()
  2692. {
  2693. return m_dwVirtualNumber;
  2694. }
  2695.  
  2696. // 2004.07.17.levites.isShow¸¦ ViewFrustumCheck·Î şŻ°ć
  2697. bool CInstanceBase::__IsInViewFrustum()
  2698. {
  2699. return m_GraphicThingInstance.isShow();
  2700. }
  2701.  
  2702. bool CInstanceBase::__CanRender()
  2703. {
  2704. if (IsAlwaysRender())
  2705. {
  2706. return true;
  2707. }
  2708.  
  2709. if (!__IsInViewFrustum())
  2710. return false;
  2711. if (IsAffect(AFFECT_INVISIBILITY))
  2712. return false;
  2713.  
  2714. return true;
  2715. }
  2716.  
  2717.  
  2718. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2719. // Graphic Control
  2720.  
  2721. bool CInstanceBase::IntersectBoundingBox()
  2722. {
  2723. float u, v, t;
  2724. return m_GraphicThingInstance.Intersect(&u, &v, &t);
  2725. }
  2726.  
  2727. bool CInstanceBase::IntersectDefendingSphere()
  2728. {
  2729. return m_GraphicThingInstance.IntersectDefendingSphere();
  2730. }
  2731.  
  2732. float CInstanceBase::GetDistance(CInstanceBase * pkTargetInst)
  2733. {
  2734. TPixelPosition TargetPixelPosition;
  2735. pkTargetInst->m_GraphicThingInstance.GetPixelPosition(&TargetPixelPosition);
  2736. return GetDistance(TargetPixelPosition);
  2737. }
  2738.  
  2739. float CInstanceBase::GetDistance(const TPixelPosition & c_rPixelPosition)
  2740. {
  2741. TPixelPosition PixelPosition;
  2742. m_GraphicThingInstance.GetPixelPosition(&PixelPosition);
  2743.  
  2744. float fdx = PixelPosition.x - c_rPixelPosition.x;
  2745. float fdy = PixelPosition.y - c_rPixelPosition.y;
  2746.  
  2747. return sqrtf((fdx*fdx) + (fdy*fdy));
  2748. }
  2749.  
  2750. float CInstanceBase::GetBaseHeight()
  2751. {
  2752. CActorInstance* pkHorse = m_kHorse.GetActorPtr();
  2753. if (!m_kHorse.IsMounting() || !pkHorse)
  2754. return 0.0f;
  2755.  
  2756. DWORD dwHorseVnum = m_kHorse.actorPointer->GetRace();
  2757.  
  2758. float fRaceHeight = CRaceManager::instance().GetRaceHeight(dwHorseVnum);
  2759.  
  2760. if (fRaceHeight == 0.0f)
  2761. return 100.0f;
  2762. else
  2763. return fRaceHeight;
  2764. }
  2765.  
  2766. CActorInstance& CInstanceBase::GetGraphicThingInstanceRef()
  2767. {
  2768. return m_GraphicThingInstance;
  2769. }
  2770.  
  2771. CActorInstance* CInstanceBase::GetGraphicThingInstancePtr()
  2772. {
  2773. return &m_GraphicThingInstance;
  2774. }
  2775.  
  2776. void CInstanceBase::RefreshActorInstance()
  2777. {
  2778. m_GraphicThingInstance.RefreshActorInstance();
  2779. }
  2780.  
  2781. void CInstanceBase::Refresh(DWORD dwMotIndex, bool isLoop)
  2782. {
  2783. RefreshState(dwMotIndex, isLoop);
  2784. }
  2785.  
  2786. void CInstanceBase::RestoreRenderMode()
  2787. {
  2788. m_GraphicThingInstance.RestoreRenderMode();
  2789. }
  2790.  
  2791. void CInstanceBase::SetAddRenderMode()
  2792. {
  2793. m_GraphicThingInstance.SetAddRenderMode();
  2794. }
  2795.  
  2796. void CInstanceBase::SetModulateRenderMode()
  2797. {
  2798. m_GraphicThingInstance.SetModulateRenderMode();
  2799. }
  2800.  
  2801. void CInstanceBase::SetRenderMode(int iRenderMode)
  2802. {
  2803. m_GraphicThingInstance.SetRenderMode(iRenderMode);
  2804. }
  2805.  
  2806. void CInstanceBase::SetAddColor(const D3DXCOLOR & c_rColor)
  2807. {
  2808. m_GraphicThingInstance.SetAddColor(c_rColor);
  2809. }
  2810.  
  2811. void CInstanceBase::SetBlendRenderingMode()
  2812. {
  2813. m_GraphicThingInstance.SetBlendRenderMode();
  2814. }
  2815.  
  2816. void CInstanceBase::SetAlphaValue(float alpha)
  2817. {
  2818. m_GraphicThingInstance.SetAlphaValue(alpha);
  2819. }
  2820.  
  2821. float CInstanceBase::GetAlphaValue()
  2822. {
  2823. return m_GraphicThingInstance.GetAlphaValue();
  2824. }
  2825.  
  2826. // Part
  2827. void CInstanceBase::SetHair(DWORD eHair)
  2828. {
  2829. if (!HAIR_COLOR_ENABLE)
  2830. {
  2831. return;
  2832. }
  2833.  
  2834. if (IsPC() == false)
  2835. {
  2836. return;
  2837. }
  2838.  
  2839. m_awPart[CRaceData::PART_HAIR] = eHair;
  2840. m_GraphicThingInstance.SetHair(eHair);
  2841. }
  2842.  
  2843. void CInstanceBase::ChangeHair(DWORD eHair)
  2844. {
  2845. if (!HAIR_COLOR_ENABLE)
  2846. {
  2847. return;
  2848. }
  2849.  
  2850. if (IsPC() == false)
  2851. {
  2852. return;
  2853. }
  2854.  
  2855. if (GetPart(CRaceData::PART_HAIR) == eHair)
  2856. {
  2857. return;
  2858. }
  2859.  
  2860. SetHair(eHair);
  2861.  
  2862. RefreshState(CRaceMotionData::NAME_WAIT, true);
  2863. }
  2864.  
  2865.  
  2866. void CInstanceBase::SetArmor(DWORD dwArmor)
  2867. {
  2868. DWORD dwShape;
  2869.  
  2870. if (__ArmorVnumToShape(dwArmor, &dwShape))
  2871. {
  2872. CItemData* pItemData;
  2873.  
  2874. if (CItemManager::Instance().GetItemDataPointer(dwArmor, &pItemData))
  2875. {
  2876. float fSpecularPower = pItemData->GetSpecularPowerf();
  2877. SetShape(dwShape, fSpecularPower);
  2878. __GetRefinedEffect(pItemData);
  2879. return;
  2880. }
  2881.  
  2882. __ClearArmorRefineEffect();
  2883. }
  2884.  
  2885. SetShape(dwArmor);
  2886. }
  2887.  
  2888. void CInstanceBase::SetShape(DWORD eShape, float fSpecular)
  2889. {
  2890. if (IsPoly())
  2891. {
  2892. m_GraphicThingInstance.SetShape(0);
  2893. }
  2894. else
  2895. {
  2896. m_GraphicThingInstance.SetShape(eShape, fSpecular);
  2897. }
  2898.  
  2899. m_eShape = eShape;
  2900. }
  2901.  
  2902. DWORD CInstanceBase::GetWeaponType()
  2903. {
  2904. DWORD dwWeapon = GetPart(CRaceData::PART_WEAPON);
  2905. CItemData * pItemData;
  2906. if (!CItemManager::Instance().GetItemDataPointer(dwWeapon, &pItemData))
  2907. return CItemData::WEAPON_NONE;
  2908.  
  2909. return pItemData->GetWeaponType();
  2910. }
  2911.  
  2912. void CInstanceBase::__ClearWeaponRefineEffect()
  2913. {
  2914. if (m_swordRefineEffectRight)
  2915. {
  2916. DetachEffect(m_swordRefineEffectRight);
  2917. m_swordRefineEffectRight = 0;
  2918. }
  2919. if (m_swordRefineEffectLeft)
  2920. {
  2921. DetachEffect(m_swordRefineEffectLeft);
  2922. m_swordRefineEffectLeft = 0;
  2923. }
  2924. }
  2925.  
  2926. void CInstanceBase::__ClearArmorRefineEffect()
  2927. {
  2928. if (m_armorRefineEffect)
  2929. {
  2930. DetachEffect(m_armorRefineEffect);
  2931. m_armorRefineEffect = 0;
  2932. }
  2933. }
  2934.  
  2935. UINT CInstanceBase::__GetRefinedEffect(CItemData* pItem)
  2936. {
  2937. DWORD refine = max(pItem->GetRefine() + pItem->GetSocketCount(),CItemData::ITEM_SOCKET_MAX_NUM) - CItemData::ITEM_SOCKET_MAX_NUM;
  2938. switch (pItem->GetType())
  2939. {
  2940. case CItemData::ITEM_TYPE_WEAPON:
  2941. __ClearWeaponRefineEffect();
  2942. if (refine < 7) //ÇöŔç Á¦·Ăµµ 7 ŔĚ»ó¸¸ ŔĚĆĺĆ®°ˇ ŔÖ˝Ŕ´Ď´Ů.
  2943. return 0;
  2944. switch(pItem->GetSubType())
  2945. {
  2946. case CItemData::WEAPON_DAGGER:
  2947. m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7+refine-7;
  2948. m_swordRefineEffectLeft = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7_LEFT+refine-7;
  2949. break;
  2950. case CItemData::WEAPON_FAN:
  2951. m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_FANBELL_REFINED7+refine-7;
  2952. break;
  2953. case CItemData::WEAPON_ARROW:
  2954. case CItemData::WEAPON_BELL:
  2955. m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7+refine-7;
  2956. break;
  2957. case CItemData::WEAPON_BOW:
  2958. m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_BOW_REFINED7+refine-7;
  2959. break;
  2960. default:
  2961. m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SWORD_REFINED7+refine-7;
  2962. }
  2963. if (m_swordRefineEffectRight)
  2964. m_swordRefineEffectRight = AttachEffect(m_swordRefineEffectRight);
  2965. if (m_swordRefineEffectLeft)
  2966. m_swordRefineEffectLeft = AttachEffect(m_swordRefineEffectLeft);
  2967. break;
  2968. case CItemData::ITEM_TYPE_ARMOR:
  2969. __ClearArmorRefineEffect();
  2970.  
  2971. // °©żĘ ĆŻČ­ ŔĚĆĺĆ®
  2972. if (pItem->GetSubType() == CItemData::ARMOR_BODY)
  2973. {
  2974. DWORD vnum = pItem->GetIndex();
  2975.  
  2976. if (12010 <= vnum && vnum <= 12049)
  2977. {
  2978. AttachEffect(EFFECT_REFINED+EFFECT_BODYARMOR_SPECIAL);
  2979. AttachEffect(EFFECT_REFINED+EFFECT_BODYARMOR_SPECIAL2);
  2980. }
  2981. }
  2982.  
  2983. if (refine < 7)
  2984. return 0;
  2985.  
  2986. if (pItem->GetSubType() == CItemData::ARMOR_BODY)
  2987. {
  2988. m_armorRefineEffect = EFFECT_REFINED+EFFECT_BODYARMOR_REFINED7+refine-7;
  2989. AttachEffect(m_armorRefineEffect);
  2990. }
  2991. break;
  2992. }
  2993. return 0;
  2994. }
  2995.  
  2996. bool CInstanceBase::SetWeapon(DWORD eWeapon)
  2997. {
  2998. if (IsPoly())
  2999. {
  3000. return false;
  3001. }
  3002.  
  3003. if (__IsShapeAnimalWear())
  3004. {
  3005. return false;
  3006. }
  3007.  
  3008. if (__IsChangableWeapon(eWeapon) == false)
  3009. {
  3010. eWeapon = 0;
  3011. }
  3012.  
  3013. m_GraphicThingInstance.AttachWeapon(eWeapon);
  3014. m_awPart[CRaceData::PART_WEAPON] = eWeapon;
  3015.  
  3016. CItemData* pItemData;
  3017. if (CItemManager::Instance().GetItemDataPointer(eWeapon, &pItemData))
  3018. {
  3019. __GetRefinedEffect(pItemData);
  3020. }
  3021. else
  3022. {
  3023. __ClearWeaponRefineEffect();
  3024. }
  3025.  
  3026. return true;
  3027. }
  3028.  
  3029. void CInstanceBase::ChangeWeapon(DWORD eWeapon)
  3030. {
  3031. if (eWeapon == m_GraphicThingInstance.GetPartItemID(CRaceData::PART_WEAPON))
  3032. {
  3033. return;
  3034. }
  3035.  
  3036. if (SetWeapon(eWeapon))
  3037. {
  3038. RefreshState(CRaceMotionData::NAME_WAIT, true);
  3039. }
  3040. }
  3041.  
  3042. bool CInstanceBase::ChangeArmor(DWORD dwArmor)
  3043. {
  3044. DWORD eShape;
  3045. __ArmorVnumToShape(dwArmor, &eShape);
  3046.  
  3047. if (GetShape() == eShape)
  3048. {
  3049. return false;
  3050. }
  3051.  
  3052. CAffectFlagContainer kAffectFlagContainer;
  3053. kAffectFlagContainer.CopyInstance(affectFlagContainer);
  3054.  
  3055. DWORD dwVID = GetVirtualID();
  3056. DWORD dwRace = GetRace();
  3057. DWORD eHair = GetPart(CRaceData::PART_HAIR);
  3058. DWORD eWeapon = GetPart(CRaceData::PART_WEAPON);
  3059. float fRot = GetRotation();
  3060. float fAdvRot = GetAdvancingRotation();
  3061.  
  3062. // if (IsWalking())
  3063. // {
  3064. // EndWalking();
  3065. // }
  3066.  
  3067. ClearAffects();
  3068.  
  3069. if (!SetRace(dwRace))
  3070. {
  3071. TraceError("CPythonCharacterManager::ChangeArmor - SetRace VID[%d] Race[%d] ERROR", dwVID, dwRace);
  3072. return false;
  3073. }
  3074.  
  3075. SetArmor(dwArmor);
  3076. SetHair(eHair);
  3077. SetWeapon(eWeapon);
  3078. SetRotation(fRot);
  3079. SetAdvancingRotation(fAdvRot);
  3080.  
  3081. __AttachHorseSaddle();
  3082.  
  3083. RefreshState(CRaceMotionData::NAME_WAIT, true);
  3084. SetAffectFlagContainer(kAffectFlagContainer);
  3085.  
  3086. // CActorInstance::IEventHandler& rkEventHandler=GetEventHandlerRef();
  3087. // rkEventHandler.OnChangeShape();
  3088.  
  3089. return true;
  3090. }
  3091.  
  3092. bool CInstanceBase::__IsShapeAnimalWear()
  3093. {
  3094. if (100 == GetShape() ||
  3095. 101 == GetShape() ||
  3096. 102 == GetShape() ||
  3097. 103 == GetShape())
  3098. return true;
  3099.  
  3100. return false;
  3101. }
  3102.  
  3103. DWORD CInstanceBase::__GetRaceType()
  3104. {
  3105. return m_eRaceType;
  3106. }
  3107.  
  3108.  
  3109. void CInstanceBase::RefreshState(DWORD dwMotIndex, bool isLoop)
  3110. {
  3111. DWORD dwPartItemID = m_GraphicThingInstance.GetPartItemID(CRaceData::PART_WEAPON);
  3112.  
  3113. BYTE byItemType = 0xff;
  3114. BYTE bySubType = 0xff;
  3115.  
  3116. CItemManager & rkItemMgr = CItemManager::Instance();
  3117. CItemData * pItemData;
  3118.  
  3119. if (rkItemMgr.GetItemDataPointer(dwPartItemID, &pItemData))
  3120. {
  3121. byItemType = pItemData->GetType();
  3122. bySubType = pItemData->GetWeaponType();
  3123. }
  3124.  
  3125. if (IsPoly())
  3126. {
  3127. SetMotionMode(CRaceMotionData::MODE_GENERAL);
  3128. }
  3129. else if (IsWearingDress())
  3130. {
  3131. SetMotionMode(CRaceMotionData::MODE_WEDDING_DRESS);
  3132. }
  3133. else if (IsHoldingPickAxe())
  3134. {
  3135. if (m_kHorse.IsMounting())
  3136. {
  3137. SetMotionMode(CRaceMotionData::MODE_HORSE);
  3138. }
  3139. else
  3140. {
  3141. SetMotionMode(CRaceMotionData::MODE_GENERAL);
  3142. }
  3143. }
  3144. else if (CItemData::ITEM_TYPE_ROD == byItemType)
  3145. {
  3146. if (m_kHorse.IsMounting())
  3147. {
  3148. SetMotionMode(CRaceMotionData::MODE_HORSE);
  3149. }
  3150. else
  3151. {
  3152. SetMotionMode(CRaceMotionData::MODE_FISHING);
  3153. }
  3154. }
  3155. else if (m_kHorse.IsMounting())
  3156. {
  3157. switch (bySubType)
  3158. {
  3159. case CItemData::WEAPON_SWORD:
  3160. SetMotionMode(CRaceMotionData::MODE_HORSE_ONEHAND_SWORD);
  3161. break;
  3162.  
  3163. case CItemData::WEAPON_TWO_HANDED:
  3164. SetMotionMode(CRaceMotionData::MODE_HORSE_TWOHAND_SWORD); // Only Warrior
  3165. break;
  3166.  
  3167. case CItemData::WEAPON_DAGGER:
  3168. SetMotionMode(CRaceMotionData::MODE_HORSE_DUALHAND_SWORD); // Only Assassin
  3169. break;
  3170.  
  3171. case CItemData::WEAPON_FAN:
  3172. SetMotionMode(CRaceMotionData::MODE_HORSE_FAN); // Only Shaman
  3173. break;
  3174.  
  3175. case CItemData::WEAPON_BELL:
  3176. SetMotionMode(CRaceMotionData::MODE_HORSE_BELL); // Only Shaman
  3177. break;
  3178.  
  3179. case CItemData::WEAPON_BOW:
  3180. SetMotionMode(CRaceMotionData::MODE_HORSE_BOW); // Only Shaman
  3181. break;
  3182.  
  3183. default:
  3184. SetMotionMode(CRaceMotionData::MODE_HORSE);
  3185. break;
  3186. }
  3187. }
  3188. else
  3189. {
  3190. switch (bySubType)
  3191. {
  3192. case CItemData::WEAPON_SWORD:
  3193. SetMotionMode(CRaceMotionData::MODE_ONEHAND_SWORD);
  3194. break;
  3195.  
  3196. case CItemData::WEAPON_TWO_HANDED:
  3197. SetMotionMode(CRaceMotionData::MODE_TWOHAND_SWORD); // Only Warrior
  3198. break;
  3199.  
  3200. case CItemData::WEAPON_DAGGER:
  3201. SetMotionMode(CRaceMotionData::MODE_DUALHAND_SWORD); // Only Assassin
  3202. break;
  3203.  
  3204. case CItemData::WEAPON_BOW:
  3205. SetMotionMode(CRaceMotionData::MODE_BOW); // Only Assassin
  3206. break;
  3207.  
  3208. case CItemData::WEAPON_FAN:
  3209. SetMotionMode(CRaceMotionData::MODE_FAN); // Only Shaman
  3210. break;
  3211.  
  3212. case CItemData::WEAPON_BELL:
  3213. SetMotionMode(CRaceMotionData::MODE_BELL); // Only Shaman
  3214. break;
  3215.  
  3216. case CItemData::WEAPON_ARROW:
  3217. default:
  3218. SetMotionMode(CRaceMotionData::MODE_GENERAL);
  3219. break;
  3220. }
  3221. }
  3222.  
  3223. if (isLoop)
  3224. m_GraphicThingInstance.InterceptLoopMotion(dwMotIndex);
  3225. else
  3226. m_GraphicThingInstance.InterceptOnceMotion(dwMotIndex);
  3227.  
  3228. RefreshActorInstance();
  3229. }
  3230.  
  3231. ///////////////////////////////////////////////////////////////////////////////////////////////////
  3232. // Device
  3233.  
  3234. void CInstanceBase::RegisterBoundingSphere()
  3235. {
  3236. // Stone ŔĎ °ćżě DeforomNoSkin Ŕ» Çϸé
  3237. // ł«ÇĎÇĎ´Â ľÖ´Ď¸ŢŔĚĽÇ °°Ŕş °ćżě ľÖ´Ď¸ŢŔĚĽÇŔĚ
  3238. // ąŮżîµĺ ąÚ˝şżˇ żµÇâŔ» ąĚĂÄ ÄøµŔĚ Á¦´ë·Î ŔĚ·çľîÁöÁö ľĘ´Â´Ů.
  3239. if (!IsStone())
  3240. {
  3241. m_GraphicThingInstance.DeformNoSkin();
  3242. }
  3243.  
  3244. m_GraphicThingInstance.RegisterBoundingSphere();
  3245. }
  3246.  
  3247. bool CInstanceBase::CreateDeviceObjects()
  3248. {
  3249. return m_GraphicThingInstance.CreateDeviceObjects();
  3250. }
  3251.  
  3252. void CInstanceBase::DestroyDeviceObjects()
  3253. {
  3254. m_GraphicThingInstance.DestroyDeviceObjects();
  3255. }
  3256.  
  3257. void CInstanceBase::Destroy()
  3258. {
  3259. DetachTextTail();
  3260.  
  3261. DismountHorse();
  3262.  
  3263. m_kQue_kCmdNew.clear();
  3264.  
  3265. EffectContainerDestroy();
  3266. StoneSmokeDestroy();
  3267.  
  3268. if (IsMainInstance())
  3269. ClearMainInstance();
  3270.  
  3271. m_GraphicThingInstance.Destroy();
  3272.  
  3273. __Initialize();
  3274. }
  3275.  
  3276. void CInstanceBase::__InitializeRotationSpeed()
  3277. {
  3278. SetRotationSpeed(c_fDefaultRotationSpeed);
  3279. }
  3280.  
  3281. void CInstanceBase::__Warrior_Initialize()
  3282. {
  3283. m_kWarrior.m_dwGeomgyeongEffect=0;
  3284. }
  3285.  
  3286. void CInstanceBase::__Initialize()
  3287. {
  3288. __Warrior_Initialize();
  3289. StoneSmokeInialize();
  3290. EffectContainerInitialize();
  3291. __InitializeRotationSpeed();
  3292.  
  3293. SetEventHandler(CActorInstance::IEventHandler::GetEmptyPtr());
  3294.  
  3295. affectFlagContainer.Clear();
  3296.  
  3297. m_dwLevel = 0;
  3298. m_dwGuildID = 0;
  3299. m_dwEmpireID = 0;
  3300.  
  3301. m_eType = 0;
  3302. m_eRaceType = 0;
  3303. m_eShape = 0;
  3304. m_dwRace = 0;
  3305. m_bJob = 0;
  3306. m_dwVirtualNumber = 0;
  3307.  
  3308. m_dwBaseCmdTime=0;
  3309. m_dwBaseChkTime=0;
  3310. m_dwSkipTime=0;
  3311.  
  3312. m_GraphicThingInstance.Initialize();
  3313.  
  3314. m_dwAdvActorVID=0;
  3315. m_dwLastDmgActorVID=0;
  3316.  
  3317. m_nAverageNetworkGap=0;
  3318. m_dwNextUpdateHeightTime=0;
  3319.  
  3320. // Moving by keyboard
  3321. m_iRotatingDirection = DEGREE_DIRECTION_SAME;
  3322.  
  3323. // Moving by mouse
  3324. m_isTextTail = FALSE;
  3325. m_isGoing = FALSE;
  3326. NEW_SetSrcPixelPosition(TPixelPosition(0, 0, 0));
  3327. NEW_SetDstPixelPosition(TPixelPosition(0, 0, 0));
  3328.  
  3329. m_kPPosDust = TPixelPosition(0, 0, 0);
  3330.  
  3331.  
  3332. m_kQue_kCmdNew.clear();
  3333.  
  3334. m_dwLastComboIndex = 0;
  3335.  
  3336. m_swordRefineEffectRight = 0;
  3337. m_swordRefineEffectLeft = 0;
  3338. m_armorRefineEffect = 0;
  3339.  
  3340. m_sAlignment = 0;
  3341. m_byPKMode = 0;
  3342. m_isKiller = false;
  3343. m_isPartyMember = false;
  3344.  
  3345. m_bEnableTCPState = TRUE;
  3346.  
  3347. m_stName = "";
  3348.  
  3349. memset(m_awPart, 0, sizeof(m_awPart));
  3350. memset(m_adwCRCAffectEffect, 0, sizeof(m_adwCRCAffectEffect));
  3351. //memset(m_adwCRCEmoticonEffect, 0, sizeof(m_adwCRCEmoticonEffect));
  3352. memset(&m_kMovAfterFunc, 0, sizeof(m_kMovAfterFunc));
  3353.  
  3354. m_bDamageEffectType = false;
  3355. m_dwDuelMode = DUEL_NONE;
  3356. m_dwEmoticonTime = 0;
  3357. #ifdef ENABLE_DOG_MODE
  3358. m_dwOriginalRace = 0;
  3359. #endif
  3360. m_IsAlwaysRender = false;
  3361. }
  3362.  
  3363. CInstanceBase::CInstanceBase()
  3364. {
  3365. __Initialize();
  3366. }
  3367.  
  3368. CInstanceBase::~CInstanceBase()
  3369. {
  3370. Destroy();
  3371. }
  3372.  
  3373. #ifdef ENABLE_DOG_MODE
  3374. DWORD CInstanceBase::GetOriginalRace()
  3375. {
  3376. return m_dwOriginalRace;
  3377. }
  3378.  
  3379. void CInstanceBase::SetOriginalRace(DWORD race)
  3380. {
  3381. m_dwOriginalRace = race;
  3382. }
  3383.  
  3384. void CInstanceBase::ChangeRace(DWORD eRace, DWORD eShape)
  3385. {
  3386. m_dwRace = eRace;
  3387.  
  3388. if (!m_GraphicThingInstance.SetRace(eRace))
  3389. return;
  3390.  
  3391. m_GraphicThingInstance.SetShape(eShape, 0.0f);
  3392.  
  3393. m_GraphicThingInstance.RefreshActorInstance();
  3394. Refresh(CRaceMotionData::NAME_WAIT, false);
  3395. }
  3396. #endif
  3397.  
  3398.  
  3399. bool CInstanceBase::IsAlwaysRender()
  3400. {
  3401. return m_IsAlwaysRender;
  3402. }
  3403.  
  3404. void CInstanceBase::SetAlwaysRender(bool val)
  3405. {
  3406. m_IsAlwaysRender = val;
  3407. }
  3408.  
  3409. void CInstanceBase::GetBoundBox(D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax)
  3410. {
  3411. m_GraphicThingInstance.GetBoundBox(vtMin, vtMax);
  3412. }
  3413.  
  3414. bool CInstanceBase::IsMiningVID(uint32_t vid)
  3415. {
  3416. return m_dwMiningVID == vid && GetGraphicThingInstancePtr()->IsMining();
  3417. }
  3418.  
  3419. void CInstanceBase::StartMining(uint32_t vid)
  3420. {
  3421. m_dwMiningVID = vid;
  3422. }
  3423.  
  3424. void CInstanceBase::CancelMining()
  3425. {
  3426. GetGraphicThingInstancePtr()->InterceptLoopMotion(CRaceMotionData::NAME_WAIT);
  3427. }
Advertisement
Add Comment
Please, Sign In to add comment