MrP0wers

PythonPlayer.cpp

Jan 10th, 2026
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 43.51 KB | None | 0 0
  1. #include "StdAfx.h"
  2. #include "PythonPlayerEventHandler.h"
  3. #include "PythonApplication.h"
  4. #include "PythonItem.h"
  5. #include "AbstractPlayer.h"
  6.  
  7. #include "../eterbase/Timer.h"
  8.  
  9. enum
  10. {
  11. MAIN_RACE_WARRIOR_M,
  12. MAIN_RACE_ASSASSIN_W,
  13. MAIN_RACE_SURA_M,
  14. MAIN_RACE_SHAMAN_W,
  15. MAIN_RACE_WARRIOR_W,
  16. MAIN_RACE_ASSASSIN_M,
  17. MAIN_RACE_SURA_W,
  18. MAIN_RACE_SHAMAN_M,
  19. MAIN_RACE_MAX_NUM,
  20. };
  21.  
  22. #ifdef ENABLE_TITLE_SYSTEM
  23. void CPythonPlayer::RequestChangeTitle(int iTitle)
  24. {
  25. CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
  26. rkNetStream.SendChangeTitle((int)iTitle);
  27. }
  28. #endif
  29.  
  30. const long long POINT_MAGIC_NUMBER = 0xe73ac1da;
  31.  
  32. void CPythonPlayer::SPlayerStatus::SetPoint(UINT ePoint, long long lPoint)
  33. {
  34. m_alPoint[ePoint]=lPoint ^ POINT_MAGIC_NUMBER;
  35. }
  36.  
  37. long long CPythonPlayer::SPlayerStatus::GetPoint(UINT ePoint)
  38. {
  39. return m_alPoint[ePoint] ^ POINT_MAGIC_NUMBER;
  40. }
  41.  
  42. bool CPythonPlayer::AffectIndexToSkillIndex(DWORD dwAffectIndex, DWORD * pdwSkillIndex)
  43. {
  44. if (m_kMap_dwAffectIndexToSkillIndex.end() == m_kMap_dwAffectIndexToSkillIndex.find(dwAffectIndex))
  45. return false;
  46.  
  47. *pdwSkillIndex = m_kMap_dwAffectIndexToSkillIndex[dwAffectIndex];
  48.  
  49. return true;
  50. }
  51.  
  52. bool CPythonPlayer::AffectIndexToSkillSlotIndex(UINT uAffect, DWORD* pdwSkillSlotIndex)
  53. {
  54. DWORD dwSkillIndex=m_kMap_dwAffectIndexToSkillIndex[uAffect];
  55.  
  56. return GetSkillSlotIndex(dwSkillIndex, pdwSkillSlotIndex);
  57. }
  58.  
  59. bool CPythonPlayer::__GetPickedActorPtr(CInstanceBase** ppkInstPicked)
  60. {
  61. CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
  62. CInstanceBase* pkInstPicked=rkChrMgr.OLD_GetPickedInstancePtr();
  63.  
  64. if (!pkInstPicked)
  65. return false;
  66.  
  67. *ppkInstPicked=pkInstPicked;
  68.  
  69. return true;
  70. }
  71.  
  72. bool CPythonPlayer::__GetPickedActorID(DWORD* pdwActorID)
  73. {
  74. CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance();
  75.  
  76. return rkChrMgr.OLD_GetPickedInstanceVID(pdwActorID);
  77. }
  78.  
  79. bool CPythonPlayer::__GetPickedItemID(DWORD* pdwItemID)
  80. {
  81. CPythonItem& rkItemMgr=CPythonItem::Instance();
  82.  
  83. return rkItemMgr.GetPickedItemID(pdwItemID);
  84. }
  85.  
  86. bool CPythonPlayer::__GetPickedGroundPos(TPixelPosition* pkPPosPicked)
  87. {
  88. CPythonBackground& rkBG=CPythonBackground::Instance();
  89.  
  90. TPixelPosition kPPosPicked;
  91. if (rkBG.GetPickingPoint(pkPPosPicked))
  92. {
  93. pkPPosPicked->y=-pkPPosPicked->y;
  94. return true;
  95. }
  96.  
  97. return false;
  98. }
  99.  
  100. void CPythonPlayer::NEW_GetMainActorPosition(TPixelPosition* pkPPosActor)
  101. {
  102. TPixelPosition kPPosMainActor;
  103.  
  104. IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton();
  105. CInstanceBase * pInstance = rkPlayer.NEW_GetMainActorPtr();
  106.  
  107. if (pInstance)
  108. {
  109. pInstance->NEW_GetPixelPosition(pkPPosActor);
  110. }
  111.  
  112. else
  113. {
  114. CPythonApplication::Instance().GetCenterPosition(pkPPosActor);
  115. }
  116. }
  117.  
  118. bool CPythonPlayer::RegisterEffect(DWORD dwEID, const char* c_szFileName, bool isCache)
  119. {
  120. if (dwEID>=EFFECT_NUM)
  121. return false;
  122.  
  123. CEffectManager& rkEftMgr=CEffectManager::Instance();
  124. rkEftMgr.RegisterEffect2(c_szFileName, &m_adwEffect[dwEID], isCache);
  125.  
  126. return true;
  127. }
  128.  
  129. void CPythonPlayer::NEW_ShowEffect(int dwEID, TPixelPosition kPPosDst)
  130. {
  131. if (dwEID>=EFFECT_NUM)
  132. return;
  133.  
  134. D3DXVECTOR3 kD3DVt3Pos(kPPosDst.x, -kPPosDst.y, kPPosDst.z);
  135. D3DXVECTOR3 kD3DVt3Dir(0.0f, 0.0f, 1.0f);
  136.  
  137. CEffectManager& rkEftMgr=CEffectManager::Instance();
  138. rkEftMgr.CreateEffect(m_adwEffect[dwEID], kD3DVt3Pos, kD3DVt3Dir);
  139. }
  140.  
  141. CInstanceBase* CPythonPlayer::NEW_FindActorPtr(DWORD dwVID)
  142. {
  143. CPythonCharacterManager& rkChrMgr = CPythonCharacterManager::Instance();
  144.  
  145. return rkChrMgr.GetInstancePtr(dwVID);
  146. }
  147.  
  148. CInstanceBase* CPythonPlayer::NEW_GetMainActorPtr()
  149. {
  150. return NEW_FindActorPtr(m_dwMainCharacterIndex);
  151. }
  152.  
  153. void CPythonPlayer::Update()
  154. {
  155. NEW_RefreshMouseWalkingDirection();
  156.  
  157. #ifdef __AUTO_QUQUE_ATTACK__
  158. AutoFarmLoop();
  159. #endif
  160.  
  161. CPythonPlayerEventHandler& rkPlayerEventHandler=CPythonPlayerEventHandler::GetSingleton();
  162. rkPlayerEventHandler.FlushVictimList();
  163.  
  164. if (m_isDestPosition)
  165. {
  166. CInstanceBase * pInstance = NEW_GetMainActorPtr();
  167. if (pInstance)
  168. {
  169. TPixelPosition PixelPosition;
  170. pInstance->NEW_GetPixelPosition(&PixelPosition);
  171.  
  172. if (abs(int(PixelPosition.x) - m_ixDestPos) + abs(int(PixelPosition.y) - m_iyDestPos) < 10000)
  173. {
  174. m_isDestPosition = FALSE;
  175. }
  176.  
  177. else
  178. {
  179. if (CTimer::Instance().GetCurrentMillisecond() - m_iLastAlarmTime > 20000)
  180. {
  181. AlarmHaveToGo();
  182. }
  183. }
  184. }
  185. }
  186.  
  187. if (m_isConsumingStamina)
  188. {
  189. float fElapsedTime = CTimer::Instance().GetElapsedSecond();
  190.  
  191. m_fCurrentStamina -= (fElapsedTime * m_fConsumeStaminaPerSec);
  192.  
  193. SetStatus(POINT_STAMINA, DWORD(m_fCurrentStamina));
  194.  
  195. PyCallClassMemberFunc(m_ppyGameWindow, "RefreshStamina", Py_BuildValue("()"));
  196. }
  197.  
  198. __Update_AutoAttack();
  199. __Update_NotifyGuildAreaEvent();
  200. }
  201.  
  202. bool CPythonPlayer::__IsUsingChargeSkill()
  203. {
  204. CInstanceBase * pkInstMain = NEW_GetMainActorPtr();
  205. if (!pkInstMain)
  206. return false;
  207.  
  208. if (__CheckDashAffect(*pkInstMain))
  209. return true;
  210.  
  211. if (MODE_USE_SKILL != m_eReservedMode)
  212. return false;
  213.  
  214. if (m_dwSkillSlotIndexReserved >= SKILL_MAX_NUM)
  215. return false;
  216.  
  217. TSkillInstance & rkSkillInst = m_playerStatus.aSkill[m_dwSkillSlotIndexReserved];
  218.  
  219. CPythonSkill::TSkillData * pSkillData;
  220. if (!CPythonSkill::Instance().GetSkillData(rkSkillInst.dwIndex, &pSkillData))
  221. return false;
  222.  
  223. return pSkillData->IsChargeSkill() ? true : false;
  224. }
  225.  
  226. void CPythonPlayer::__Update_AutoAttack()
  227. {
  228. if (0 == m_dwAutoAttackTargetVID)
  229. return;
  230.  
  231. CInstanceBase * pkInstMain = NEW_GetMainActorPtr();
  232. if (!pkInstMain)
  233. return;
  234.  
  235. if (pkInstMain->GetPart(CRaceData::PART_WEAPON) <= 29110 && pkInstMain->GetPart(CRaceData::PART_WEAPON) >= 29101)
  236. return;
  237.  
  238. if (pkInstMain->GetPart(CRaceData::PART_WEAPON) <= 27590 && pkInstMain->GetPart(CRaceData::PART_WEAPON) >= 27400)
  239. return;
  240.  
  241. if (pkInstMain->IsBowMode() && !__HasEnoughArrow())
  242. return;
  243.  
  244. if (pkInstMain->IsInSafe())
  245. return;
  246.  
  247. if (__IsUsingChargeSkill())
  248. return;
  249.  
  250. CInstanceBase* pkInstVictim=NEW_FindActorPtr(m_dwAutoAttackTargetVID);
  251. if (!pkInstVictim)
  252. {
  253. __ClearAutoAttackTargetActorID();
  254. }
  255.  
  256. else
  257. {
  258. // Fix target in safe-zone
  259. if (pkInstVictim->IsInSafe())
  260. return;
  261.  
  262. if (pkInstVictim->IsDead())
  263. {
  264. __ClearAutoAttackTargetActorID();
  265. }
  266.  
  267. else if (pkInstMain->IsMountingHorse() && !pkInstMain->CanAttackHorseLevel())
  268. {
  269. __ClearAutoAttackTargetActorID();
  270. }
  271.  
  272. else if (pkInstMain->IsAttackableInstance(*pkInstVictim))
  273. {
  274. if (pkInstMain->IsSleep())
  275. {
  276.  
  277. }
  278.  
  279. else
  280. {
  281. __ReserveClickActor(m_dwAutoAttackTargetVID);
  282. }
  283. }
  284. }
  285. }
  286.  
  287. void CPythonPlayer::__Update_NotifyGuildAreaEvent()
  288. {
  289. CInstanceBase * pkInstMain = NEW_GetMainActorPtr();
  290. if (pkInstMain)
  291. {
  292. TPixelPosition kPixelPosition;
  293. pkInstMain->NEW_GetPixelPosition(&kPixelPosition);
  294.  
  295. DWORD dwAreaID = CPythonMiniMap::Instance().GetGuildAreaID(
  296. ULONG(kPixelPosition.x), ULONG(kPixelPosition.y));
  297.  
  298. if (dwAreaID != m_inGuildAreaID)
  299. {
  300. if (0xffffffff != dwAreaID)
  301. {
  302. PyCallClassMemberFunc(m_ppyGameWindow, "BINARY_Guild_EnterGuildArea", Py_BuildValue("(i)", dwAreaID));
  303. }
  304.  
  305. else
  306. {
  307. PyCallClassMemberFunc(m_ppyGameWindow, "BINARY_Guild_ExitGuildArea", Py_BuildValue("(i)", dwAreaID));
  308. }
  309.  
  310. m_inGuildAreaID = dwAreaID;
  311. }
  312. }
  313. }
  314.  
  315. void CPythonPlayer::SetMainCharacterIndex(int iIndex)
  316. {
  317. m_dwMainCharacterIndex = iIndex;
  318.  
  319. CInstanceBase* pkInstMain=NEW_GetMainActorPtr();
  320. if (pkInstMain)
  321. {
  322. CPythonPlayerEventHandler& rkPlayerEventHandler=CPythonPlayerEventHandler::GetSingleton();
  323. pkInstMain->SetEventHandler(&rkPlayerEventHandler);
  324. }
  325. }
  326.  
  327. DWORD CPythonPlayer::GetMainCharacterIndex()
  328. {
  329. return m_dwMainCharacterIndex;
  330. }
  331.  
  332. bool CPythonPlayer::IsMainCharacterIndex(DWORD dwIndex)
  333. {
  334. return (m_dwMainCharacterIndex == dwIndex);
  335. }
  336.  
  337. DWORD CPythonPlayer::GetGuildID()
  338. {
  339. CInstanceBase* pkInstMain=NEW_GetMainActorPtr();
  340. if (!pkInstMain)
  341. return 0xffffffff;
  342.  
  343. return pkInstMain->GetGuildID();
  344. }
  345.  
  346. void CPythonPlayer::SetWeaponPower(DWORD dwMinPower, DWORD dwMaxPower, DWORD dwMinMagicPower, DWORD dwMaxMagicPower, DWORD dwAddPower)
  347. {
  348. m_dwWeaponMinPower=dwMinPower;
  349. m_dwWeaponMaxPower=dwMaxPower;
  350. m_dwWeaponMinMagicPower=dwMinMagicPower;
  351. m_dwWeaponMaxMagicPower=dwMaxMagicPower;
  352. m_dwWeaponAddPower=dwAddPower;
  353.  
  354. __UpdateBattleStatus();
  355. }
  356.  
  357. void CPythonPlayer::SetRace(DWORD dwRace)
  358. {
  359. m_dwRace=dwRace;
  360. }
  361.  
  362. DWORD CPythonPlayer::GetRace()
  363. {
  364. return m_dwRace;
  365. }
  366.  
  367. DWORD CPythonPlayer::__GetRaceStat()
  368. {
  369. switch (GetRace())
  370. {
  371. case MAIN_RACE_WARRIOR_M:
  372. case MAIN_RACE_WARRIOR_W:
  373. return GetStatus(POINT_ST);
  374. break;
  375.  
  376. case MAIN_RACE_ASSASSIN_M:
  377. case MAIN_RACE_ASSASSIN_W:
  378. return GetStatus(POINT_DX);
  379. break;
  380.  
  381. case MAIN_RACE_SURA_M:
  382. case MAIN_RACE_SURA_W:
  383. return GetStatus(POINT_ST);
  384. break;
  385.  
  386. case MAIN_RACE_SHAMAN_M:
  387. case MAIN_RACE_SHAMAN_W:
  388. return GetStatus(POINT_IQ);
  389. break;
  390. }
  391.  
  392. return GetStatus(POINT_ST);
  393. }
  394.  
  395. DWORD CPythonPlayer::__GetLevelAtk()
  396. {
  397. return 2*GetStatus(POINT_LEVEL);
  398. }
  399.  
  400. DWORD CPythonPlayer::__GetStatAtk()
  401. {
  402. return (4*GetStatus(POINT_ST)+2*__GetRaceStat())/3;
  403. }
  404.  
  405. DWORD CPythonPlayer::__GetWeaponAtk(DWORD dwWeaponPower)
  406. {
  407. return 2*dwWeaponPower;
  408. }
  409.  
  410. DWORD CPythonPlayer::__GetTotalAtk(DWORD dwWeaponPower, DWORD dwRefineBonus)
  411. {
  412. DWORD dwLvAtk=__GetLevelAtk();
  413. DWORD dwStAtk=__GetStatAtk();
  414.  
  415. DWORD dwWepAtk;
  416. DWORD dwTotalAtk;
  417.  
  418. int hr = __GetHitRate();
  419.  
  420. dwWepAtk = __GetWeaponAtk(dwWeaponPower+dwRefineBonus);
  421. dwTotalAtk = dwLvAtk+(dwStAtk+dwWepAtk)*hr/100;
  422.  
  423. return dwTotalAtk;
  424. }
  425.  
  426. DWORD CPythonPlayer::__GetHitRate()
  427. {
  428. int src = 0;
  429. src = (GetStatus(POINT_DX) * 4 + GetStatus(POINT_LEVEL) * 2)/6;
  430.  
  431. return 100*(min(90, src)+210)/300;
  432. }
  433.  
  434. DWORD CPythonPlayer::__GetEvadeRate()
  435. {
  436. return 30*(2*GetStatus(POINT_DX)+5)/(GetStatus(POINT_DX)+95);
  437. }
  438.  
  439. void CPythonPlayer::__UpdateBattleStatus()
  440. {
  441. m_playerStatus.SetPoint(POINT_NONE, 0);
  442. m_playerStatus.SetPoint(POINT_EVADE_RATE, __GetEvadeRate());
  443. m_playerStatus.SetPoint(POINT_HIT_RATE, __GetHitRate());
  444. m_playerStatus.SetPoint(POINT_MIN_WEP, m_dwWeaponMinPower+m_dwWeaponAddPower);
  445. m_playerStatus.SetPoint(POINT_MAX_WEP, m_dwWeaponMaxPower+m_dwWeaponAddPower);
  446. m_playerStatus.SetPoint(POINT_MIN_MAGIC_WEP, m_dwWeaponMinMagicPower+m_dwWeaponAddPower);
  447. m_playerStatus.SetPoint(POINT_MAX_MAGIC_WEP, m_dwWeaponMaxMagicPower+m_dwWeaponAddPower);
  448. m_playerStatus.SetPoint(POINT_MIN_ATK, __GetTotalAtk(m_dwWeaponMinPower, m_dwWeaponAddPower));
  449. m_playerStatus.SetPoint(POINT_MAX_ATK, __GetTotalAtk(m_dwWeaponMaxPower, m_dwWeaponAddPower));
  450. }
  451.  
  452. void CPythonPlayer::SetStatus(DWORD dwType, long long lValue)
  453. {
  454. if (dwType >= POINT_MAX_NUM)
  455. {
  456. assert(!" CPythonPlayer::SetStatus - Strange Status Type!");
  457. Tracef("CPythonPlayer::SetStatus - Set Status Type Error\n");
  458. return;
  459. }
  460.  
  461. if (dwType == POINT_LEVEL)
  462. {
  463. CInstanceBase* pkPlayer = NEW_GetMainActorPtr();
  464.  
  465. if (pkPlayer)
  466. {
  467. pkPlayer->UpdateTextTailLevel(lValue);
  468. pkPlayer->SetLevel(lValue);
  469. }
  470. }
  471.  
  472. switch (dwType)
  473. {
  474. case POINT_MIN_WEP:
  475. case POINT_MAX_WEP:
  476. case POINT_MIN_ATK:
  477. case POINT_MAX_ATK:
  478. case POINT_HIT_RATE:
  479. case POINT_EVADE_RATE:
  480. case POINT_LEVEL:
  481. case POINT_ST:
  482. case POINT_DX:
  483. case POINT_IQ:
  484. m_playerStatus.SetPoint(dwType, lValue);
  485. __UpdateBattleStatus();
  486. break;
  487.  
  488. default:
  489. m_playerStatus.SetPoint(dwType, lValue);
  490. break;
  491. }
  492. }
  493.  
  494. long long CPythonPlayer::GetStatus(DWORD dwType)
  495. {
  496. if (dwType >= POINT_MAX_NUM)
  497. {
  498. assert(!" CPythonPlayer::GetStatus - Strange Status Type!");
  499. Tracef("CPythonPlayer::GetStatus - Get Status Type Error\n");
  500.  
  501. return 0;
  502. }
  503.  
  504. return m_playerStatus.GetPoint(dwType);
  505. }
  506.  
  507. const char* CPythonPlayer::GetName()
  508. {
  509. return m_stName.c_str();
  510. }
  511.  
  512. void CPythonPlayer::SetName(const char *name)
  513. {
  514. m_stName = name;
  515. }
  516.  
  517. void CPythonPlayer::NotifyDeletingCharacterInstance(DWORD dwVID)
  518. {
  519. if (m_dwMainCharacterIndex == dwVID)
  520. m_dwMainCharacterIndex = 0;
  521. }
  522.  
  523. void CPythonPlayer::NotifyCharacterDead(DWORD dwVID)
  524. {
  525. if (__IsSameTargetVID(dwVID))
  526. {
  527. SetTarget(0);
  528. }
  529. }
  530.  
  531. void CPythonPlayer::NotifyCharacterUpdate(DWORD dwVID)
  532. {
  533. if (__IsSameTargetVID(dwVID))
  534. {
  535. CInstanceBase * pMainInstance = NEW_GetMainActorPtr();
  536. CInstanceBase * pTargetInstance = CPythonCharacterManager::Instance().GetInstancePtr(dwVID);
  537.  
  538. if (pMainInstance && pTargetInstance)
  539. {
  540. if (!pMainInstance->IsTargetableInstance(*pTargetInstance))
  541. {
  542. SetTarget(0);
  543. PyCallClassMemberFunc(m_ppyGameWindow, "CloseTargetBoard", Py_BuildValue("()"));
  544. }
  545.  
  546. else
  547. {
  548. PyCallClassMemberFunc(m_ppyGameWindow, "RefreshTargetBoardByVID", Py_BuildValue("(i)", dwVID));
  549. }
  550. }
  551. }
  552. }
  553.  
  554. void CPythonPlayer::NotifyDeadMainCharacter()
  555. {
  556. __ClearAutoAttackTargetActorID();
  557. }
  558.  
  559. void CPythonPlayer::NotifyChangePKMode()
  560. {
  561. PyCallClassMemberFunc(m_ppyGameWindow, "OnChangePKMode", Py_BuildValue("()"));
  562. }
  563.  
  564.  
  565. void CPythonPlayer::MoveItemData(TItemPos SrcCell, TItemPos DstCell)
  566. {
  567. if (!SrcCell.IsValidCell() || !DstCell.IsValidCell())
  568. return;
  569.  
  570. TItemData src_item(*GetItemData(SrcCell));
  571. TItemData dst_item(*GetItemData(DstCell));
  572. SetItemData(DstCell, src_item);
  573. SetItemData(SrcCell, dst_item);
  574. }
  575.  
  576. const TItemData * CPythonPlayer::GetItemData(TItemPos Cell) const
  577. {
  578. if (!Cell.IsValidCell())
  579. return NULL;
  580.  
  581. switch (Cell.window_type)
  582. {
  583. case INVENTORY:
  584. case EQUIPMENT:
  585. return &m_playerStatus.aItem[Cell.cell];
  586.  
  587. case DRAGON_SOUL_INVENTORY:
  588. return &m_playerStatus.aDSItem[Cell.cell];
  589.  
  590. #ifdef ENABLE_SWITCHBOT
  591. case SWITCHBOT:
  592. return &m_playerStatus.aSwitchbotItem[Cell.cell];
  593. #endif
  594. default:
  595. return NULL;
  596. }
  597. }
  598.  
  599. void CPythonPlayer::SetItemData(TItemPos Cell, const TItemData & c_rkItemInst)
  600. {
  601. if (!Cell.IsValidCell())
  602. return;
  603.  
  604. if (c_rkItemInst.vnum != 0)
  605. {
  606. CItemData * pItemData;
  607. if (!CItemManager::Instance().GetItemDataPointer(c_rkItemInst.vnum, &pItemData))
  608. {
  609. TraceError("CPythonPlayer::SetItemData(window_type : %d, dwSlotIndex=%d, itemIndex=%d) - Failed to item data\n", Cell.window_type, Cell.cell, c_rkItemInst.vnum);
  610. return;
  611. }
  612. }
  613.  
  614. switch (Cell.window_type)
  615. {
  616. case INVENTORY:
  617. case EQUIPMENT:
  618. m_playerStatus.aItem[Cell.cell] = c_rkItemInst;
  619. break;
  620.  
  621. case DRAGON_SOUL_INVENTORY:
  622. m_playerStatus.aDSItem[Cell.cell] = c_rkItemInst;
  623. break;
  624.  
  625. #ifdef ENABLE_SWITCHBOT
  626. case SWITCHBOT:
  627. m_playerStatus.aSwitchbotItem[Cell.cell] = c_rkItemInst;
  628. break;
  629. #endif
  630. }
  631. }
  632.  
  633. DWORD CPythonPlayer::GetItemIndex(TItemPos Cell)
  634. {
  635. if (!Cell.IsValidCell())
  636. return 0;
  637.  
  638. return GetItemData(Cell)->vnum;
  639. }
  640.  
  641. DWORD CPythonPlayer::GetItemFlags(TItemPos Cell)
  642. {
  643. if (!Cell.IsValidCell())
  644. return 0;
  645.  
  646. const TItemData * pItem = GetItemData(Cell);
  647.  
  648. assert (pItem != NULL);
  649.  
  650. return pItem->flags;
  651. }
  652.  
  653. DWORD CPythonPlayer::GetItemCount(TItemPos Cell)
  654. {
  655. if (!Cell.IsValidCell())
  656. return 0;
  657.  
  658. const TItemData * pItem = GetItemData(Cell);
  659.  
  660. if (pItem == NULL)
  661. return 0;
  662. else
  663. return pItem->count;
  664. }
  665.  
  666. DWORD CPythonPlayer::GetItemCountByVnum(DWORD dwVnum)
  667. {
  668. DWORD dwCount = 0;
  669.  
  670. for (int i = 0; i < c_Inventory_Count; ++i)
  671. {
  672. const TItemData & c_rItemData = m_playerStatus.aItem[i];
  673. if (c_rItemData.vnum == dwVnum)
  674. {
  675. dwCount += c_rItemData.count;
  676. }
  677. }
  678.  
  679. return dwCount;
  680. }
  681.  
  682. DWORD CPythonPlayer::GetItemMetinSocket(TItemPos Cell, DWORD dwMetinSocketIndex)
  683. {
  684. if (!Cell.IsValidCell())
  685. return 0;
  686.  
  687. if (dwMetinSocketIndex >= ITEM_SOCKET_SLOT_MAX_NUM)
  688. return 0;
  689.  
  690. return GetItemData(Cell)->alSockets[dwMetinSocketIndex];
  691. }
  692.  
  693. void CPythonPlayer::GetItemAttribute(TItemPos Cell, DWORD dwAttrSlotIndex, BYTE * pbyType, short * psValue)
  694. {
  695. *pbyType = 0;
  696. *psValue = 0;
  697.  
  698. if (!Cell.IsValidCell())
  699. return;
  700.  
  701. if (dwAttrSlotIndex >= ITEM_ATTRIBUTE_SLOT_MAX_NUM)
  702. return;
  703.  
  704. *pbyType = GetItemData(Cell)->aAttr[dwAttrSlotIndex].bType;
  705. *psValue = GetItemData(Cell)->aAttr[dwAttrSlotIndex].sValue;
  706. }
  707.  
  708. void CPythonPlayer::SetItemCount(TItemPos Cell, WORD byCount)
  709. {
  710. if (!Cell.IsValidCell())
  711. return;
  712.  
  713. (const_cast <TItemData *>(GetItemData(Cell)))->count = byCount;
  714. PyCallClassMemberFunc(m_ppyGameWindow, "RefreshInventory", Py_BuildValue("()"));
  715. }
  716.  
  717. void CPythonPlayer::SetItemMetinSocket(TItemPos Cell, DWORD dwMetinSocketIndex, DWORD dwMetinNumber)
  718. {
  719. if (!Cell.IsValidCell())
  720. return;
  721.  
  722. if (dwMetinSocketIndex >= ITEM_SOCKET_SLOT_MAX_NUM)
  723. return;
  724.  
  725. (const_cast <TItemData *>(GetItemData(Cell)))->alSockets[dwMetinSocketIndex] = dwMetinNumber;
  726. }
  727.  
  728. void CPythonPlayer::SetItemAttribute(TItemPos Cell, DWORD dwAttrIndex, BYTE byType, short sValue)
  729. {
  730. if (!Cell.IsValidCell())
  731. return;
  732.  
  733. if (dwAttrIndex >= ITEM_ATTRIBUTE_SLOT_MAX_NUM)
  734. return;
  735.  
  736. (const_cast <TItemData *>(GetItemData(Cell)))->aAttr[dwAttrIndex].bType = byType;
  737. (const_cast <TItemData *>(GetItemData(Cell)))->aAttr[dwAttrIndex].sValue = sValue;
  738. }
  739.  
  740. int CPythonPlayer::GetQuickPage()
  741. {
  742. return m_playerStatus.lQuickPageIndex;
  743. }
  744.  
  745. void CPythonPlayer::SetQuickPage(int nQuickPageIndex)
  746. {
  747. if (nQuickPageIndex<0)
  748. m_playerStatus.lQuickPageIndex=QUICKSLOT_MAX_LINE+nQuickPageIndex;
  749.  
  750. else if (nQuickPageIndex>=QUICKSLOT_MAX_LINE)
  751. m_playerStatus.lQuickPageIndex=nQuickPageIndex%QUICKSLOT_MAX_LINE;
  752.  
  753. else
  754. m_playerStatus.lQuickPageIndex=nQuickPageIndex;
  755.  
  756. PyCallClassMemberFunc(m_ppyGameWindow, "RefreshInventory", Py_BuildValue("()"));
  757. }
  758.  
  759. DWORD CPythonPlayer::LocalQuickSlotIndexToGlobalQuickSlotIndex(DWORD dwLocalSlotIndex)
  760. {
  761. return m_playerStatus.lQuickPageIndex*QUICKSLOT_MAX_COUNT_PER_LINE+dwLocalSlotIndex;
  762. }
  763.  
  764. void CPythonPlayer::GetGlobalQuickSlotData(DWORD dwGlobalSlotIndex, DWORD* pdwWndType, DWORD* pdwWndItemPos)
  765. {
  766. TQuickSlot& rkQuickSlot=__RefGlobalQuickSlot(dwGlobalSlotIndex);
  767. *pdwWndType=rkQuickSlot.Type;
  768. *pdwWndItemPos=rkQuickSlot.Position;
  769. }
  770.  
  771. void CPythonPlayer::GetLocalQuickSlotData(DWORD dwSlotPos, DWORD* pdwWndType, DWORD* pdwWndItemPos)
  772. {
  773. TQuickSlot& rkQuickSlot=__RefLocalQuickSlot(dwSlotPos);
  774. *pdwWndType=rkQuickSlot.Type;
  775. *pdwWndItemPos=rkQuickSlot.Position;
  776. }
  777.  
  778. TQuickSlot & CPythonPlayer::__RefLocalQuickSlot(int SlotIndex)
  779. {
  780. return __RefGlobalQuickSlot(LocalQuickSlotIndexToGlobalQuickSlotIndex(SlotIndex));
  781. }
  782.  
  783. TQuickSlot & CPythonPlayer::__RefGlobalQuickSlot(int SlotIndex)
  784. {
  785. if (SlotIndex < 0 || SlotIndex >= QUICKSLOT_MAX_NUM)
  786. {
  787. static TQuickSlot s_kQuickSlot;
  788. s_kQuickSlot.Type = 0;
  789. s_kQuickSlot.Position = 0;
  790.  
  791. return s_kQuickSlot;
  792. }
  793.  
  794. return m_playerStatus.aQuickSlot[SlotIndex];
  795. }
  796.  
  797. void CPythonPlayer::RemoveQuickSlotByValue(int iType, int iPosition)
  798. {
  799. for (UINT i = 0; i < QUICKSLOT_MAX_NUM; ++i)
  800. {
  801. if (iType == m_playerStatus.aQuickSlot[i].Type)
  802. if (iPosition == m_playerStatus.aQuickSlot[i].Position)
  803. CPythonNetworkStream::Instance().SendQuickSlotDelPacket(i);
  804. }
  805. }
  806.  
  807. char CPythonPlayer::IsItem(TItemPos Cell)
  808. {
  809. if (!Cell.IsValidCell())
  810. return 0;
  811.  
  812. return 0 != GetItemData(Cell)->vnum;
  813. }
  814.  
  815. void CPythonPlayer::RequestMoveGlobalQuickSlotToLocalQuickSlot(DWORD dwGlobalSrcSlotIndex, DWORD dwLocalDstSlotIndex)
  816. {
  817. DWORD dwGlobalDstSlotIndex=LocalQuickSlotIndexToGlobalQuickSlotIndex(dwLocalDstSlotIndex);
  818.  
  819. CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
  820. rkNetStream.SendQuickSlotMovePacket((UINT) dwGlobalSrcSlotIndex, (UINT)dwGlobalDstSlotIndex);
  821. }
  822.  
  823. void CPythonPlayer::RequestAddLocalQuickSlot(DWORD dwLocalSlotIndex, DWORD dwWndType, DWORD dwWndItemPos)
  824. {
  825. if (dwLocalSlotIndex>=QUICKSLOT_MAX_COUNT_PER_LINE)
  826. return;
  827.  
  828. DWORD dwGlobalSlotIndex=LocalQuickSlotIndexToGlobalQuickSlotIndex(dwLocalSlotIndex);
  829.  
  830. CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
  831. rkNetStream.SendQuickSlotAddPacket((UINT)dwGlobalSlotIndex, (BYTE)dwWndType, (UINT)dwWndItemPos);
  832. }
  833.  
  834. void CPythonPlayer::RequestAddToEmptyLocalQuickSlot(DWORD dwWndType, DWORD dwWndItemPos)
  835. {
  836. for (int i = 0; i < QUICKSLOT_MAX_COUNT_PER_LINE; ++i)
  837. {
  838. TQuickSlot& rkQuickSlot=__RefLocalQuickSlot(i);
  839.  
  840. if (0 == rkQuickSlot.Type)
  841. {
  842. DWORD dwGlobalQuickSlotIndex=LocalQuickSlotIndexToGlobalQuickSlotIndex(i);
  843. CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
  844. rkNetStream.SendQuickSlotAddPacket((BYTE)dwGlobalQuickSlotIndex, (BYTE)dwWndType, (BYTE)dwWndItemPos);
  845. return;
  846. }
  847. }
  848.  
  849. }
  850.  
  851. void CPythonPlayer::RequestDeleteGlobalQuickSlot(DWORD dwGlobalSlotIndex)
  852. {
  853. if (dwGlobalSlotIndex>=QUICKSLOT_MAX_COUNT)
  854. return;
  855.  
  856. CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
  857. rkNetStream.SendQuickSlotDelPacket((UINT)dwGlobalSlotIndex);
  858. }
  859.  
  860. void CPythonPlayer::RequestUseLocalQuickSlot(DWORD dwLocalSlotIndex)
  861. {
  862. if (dwLocalSlotIndex>=QUICKSLOT_MAX_COUNT_PER_LINE)
  863. return;
  864.  
  865. DWORD dwRegisteredType;
  866. DWORD dwRegisteredItemPos;
  867.  
  868. GetLocalQuickSlotData(dwLocalSlotIndex, &dwRegisteredType, &dwRegisteredItemPos);
  869.  
  870. switch (dwRegisteredType)
  871. {
  872. case SLOT_TYPE_INVENTORY:
  873. {
  874. CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
  875. rkNetStream.SendItemUsePacket(TItemPos(INVENTORY, (WORD)dwRegisteredItemPos));
  876. break;
  877. }
  878.  
  879. case SLOT_TYPE_SKILL:
  880. {
  881. ClickSkillSlot(dwRegisteredItemPos);
  882. break;
  883. }
  884.  
  885. case SLOT_TYPE_EMOTION:
  886. {
  887. PyCallClassMemberFunc(m_ppyGameWindow, "BINARY_ActEmotion", Py_BuildValue("(i)", dwRegisteredItemPos));
  888. break;
  889. }
  890. }
  891. }
  892.  
  893. void CPythonPlayer::AddQuickSlot(int QuickSlotIndex, char IconType, INT IconPosition)
  894. {
  895. if (QuickSlotIndex < 0 || QuickSlotIndex >= QUICKSLOT_MAX_NUM)
  896. return;
  897.  
  898. m_playerStatus.aQuickSlot[QuickSlotIndex].Type = IconType;
  899. m_playerStatus.aQuickSlot[QuickSlotIndex].Position = IconPosition;
  900. }
  901.  
  902. void CPythonPlayer::DeleteQuickSlot(int QuickSlotIndex)
  903. {
  904. if (QuickSlotIndex < 0 || QuickSlotIndex >= QUICKSLOT_MAX_NUM)
  905. return;
  906.  
  907. m_playerStatus.aQuickSlot[QuickSlotIndex].Type = 0;
  908. m_playerStatus.aQuickSlot[QuickSlotIndex].Position = 0;
  909. }
  910.  
  911. void CPythonPlayer::MoveQuickSlot(int Source, int Target)
  912. {
  913. if (Source < 0 || Source >= QUICKSLOT_MAX_NUM)
  914. return;
  915.  
  916. if (Target < 0 || Target >= QUICKSLOT_MAX_NUM)
  917. return;
  918.  
  919. TQuickSlot& rkSrcSlot=__RefGlobalQuickSlot(Source);
  920. TQuickSlot& rkDstSlot=__RefGlobalQuickSlot(Target);
  921.  
  922. std::swap(rkSrcSlot, rkDstSlot);
  923. }
  924.  
  925. #ifdef ENABLE_NEW_EQUIPMENT_SYSTEM
  926. bool CPythonPlayer::IsBeltInventorySlot(TItemPos Cell)
  927. {
  928. return Cell.IsBeltInventoryCell();
  929. }
  930. #endif
  931.  
  932. bool CPythonPlayer::IsInventorySlot(TItemPos Cell)
  933. {
  934. return !Cell.IsEquipCell() && Cell.IsValidCell();
  935. }
  936.  
  937. bool CPythonPlayer::IsEquipmentSlot(TItemPos Cell)
  938. {
  939. return Cell.IsEquipCell();
  940. }
  941.  
  942. bool CPythonPlayer::IsEquipItemInSlot(TItemPos Cell)
  943. {
  944. if (!Cell.IsEquipCell())
  945. {
  946. return false;
  947. }
  948.  
  949. const TItemData * pData = GetItemData(Cell);
  950.  
  951. if (NULL == pData)
  952. {
  953. return false;
  954. }
  955.  
  956. DWORD dwItemIndex = pData->vnum;
  957.  
  958. CItemManager::Instance().SelectItemData(dwItemIndex);
  959. CItemData * pItemData = CItemManager::Instance().GetSelectedItemDataPointer();
  960.  
  961. if (!pItemData)
  962. {
  963. TraceError("Failed to find ItemData - CPythonPlayer::IsEquipItem(window_type=%d, iSlotindex=%d)\n", Cell.window_type, Cell.cell);
  964. return false;
  965. }
  966.  
  967. return pItemData->IsEquipment() ? true : false;
  968. }
  969.  
  970.  
  971. void CPythonPlayer::SetSkill(DWORD dwSlotIndex, DWORD dwSkillIndex)
  972. {
  973. if (dwSlotIndex >= SKILL_MAX_NUM)
  974. return;
  975.  
  976. m_playerStatus.aSkill[dwSlotIndex].dwIndex = dwSkillIndex;
  977. m_skillSlotDict[dwSkillIndex] = dwSlotIndex;
  978. }
  979.  
  980. int CPythonPlayer::GetSkillIndex(DWORD dwSlotIndex)
  981. {
  982. if (dwSlotIndex >= SKILL_MAX_NUM)
  983. return 0;
  984.  
  985. return m_playerStatus.aSkill[dwSlotIndex].dwIndex;
  986. }
  987.  
  988. bool CPythonPlayer::GetSkillSlotIndex(DWORD dwSkillIndex, DWORD* pdwSlotIndex)
  989. {
  990. std::map<DWORD, DWORD>::iterator f=m_skillSlotDict.find(dwSkillIndex);
  991. if (m_skillSlotDict.end()==f)
  992. {
  993. return false;
  994. }
  995.  
  996. *pdwSlotIndex=f->second;
  997.  
  998. return true;
  999. }
  1000.  
  1001. int CPythonPlayer::GetSkillGrade(DWORD dwSlotIndex)
  1002. {
  1003. if (dwSlotIndex >= SKILL_MAX_NUM)
  1004. return 0;
  1005.  
  1006. return m_playerStatus.aSkill[dwSlotIndex].iGrade;
  1007. }
  1008.  
  1009. int CPythonPlayer::GetSkillLevel(DWORD dwSlotIndex)
  1010. {
  1011. if (dwSlotIndex >= SKILL_MAX_NUM)
  1012. return 0;
  1013.  
  1014. return m_playerStatus.aSkill[dwSlotIndex].iLevel;
  1015. }
  1016.  
  1017. float CPythonPlayer::GetSkillCurrentEfficientPercentage(DWORD dwSlotIndex)
  1018. {
  1019. if (dwSlotIndex >= SKILL_MAX_NUM)
  1020. return 0;
  1021.  
  1022. return m_playerStatus.aSkill[dwSlotIndex].fcurEfficientPercentage;
  1023. }
  1024.  
  1025. float CPythonPlayer::GetSkillNextEfficientPercentage(DWORD dwSlotIndex)
  1026. {
  1027. if (dwSlotIndex >= SKILL_MAX_NUM)
  1028. return 0;
  1029.  
  1030. return m_playerStatus.aSkill[dwSlotIndex].fnextEfficientPercentage;
  1031. }
  1032.  
  1033. void CPythonPlayer::SetSkillLevel(DWORD dwSlotIndex, DWORD dwSkillLevel)
  1034. {
  1035. assert(!"CPythonPlayer::SetSkillLevel - 사용하지 않는 함수");
  1036.  
  1037. if (dwSlotIndex >= SKILL_MAX_NUM)
  1038. return;
  1039.  
  1040. m_playerStatus.aSkill[dwSlotIndex].iGrade = -1;
  1041. m_playerStatus.aSkill[dwSlotIndex].iLevel = dwSkillLevel;
  1042. }
  1043.  
  1044. void CPythonPlayer::SetSkillLevel_(DWORD dwSkillIndex, DWORD dwSkillGrade, DWORD dwSkillLevel)
  1045. {
  1046. DWORD dwSlotIndex;
  1047. if (!GetSkillSlotIndex(dwSkillIndex, &dwSlotIndex))
  1048. return;
  1049.  
  1050. if (dwSlotIndex >= SKILL_MAX_NUM)
  1051. return;
  1052.  
  1053. switch (dwSkillGrade)
  1054. {
  1055. case 0:
  1056. m_playerStatus.aSkill[dwSlotIndex].iGrade = dwSkillGrade;
  1057. m_playerStatus.aSkill[dwSlotIndex].iLevel = dwSkillLevel;
  1058. break;
  1059.  
  1060. case 1:
  1061. m_playerStatus.aSkill[dwSlotIndex].iGrade = dwSkillGrade;
  1062. m_playerStatus.aSkill[dwSlotIndex].iLevel = dwSkillLevel-20+1;
  1063. break;
  1064.  
  1065. case 2:
  1066. m_playerStatus.aSkill[dwSlotIndex].iGrade = dwSkillGrade;
  1067. m_playerStatus.aSkill[dwSlotIndex].iLevel = dwSkillLevel-30+1;
  1068. break;
  1069.  
  1070. case 3:
  1071. m_playerStatus.aSkill[dwSlotIndex].iGrade = dwSkillGrade;
  1072. m_playerStatus.aSkill[dwSlotIndex].iLevel = dwSkillLevel-40+1;
  1073. break;
  1074. }
  1075.  
  1076. const DWORD SKILL_MAX_LEVEL = 40;
  1077.  
  1078. if (dwSkillLevel>SKILL_MAX_LEVEL)
  1079. {
  1080. m_playerStatus.aSkill[dwSlotIndex].fcurEfficientPercentage = 0.0f;
  1081. m_playerStatus.aSkill[dwSlotIndex].fnextEfficientPercentage = 0.0f;
  1082.  
  1083. TraceError("CPythonPlayer::SetSkillLevel(SlotIndex=%d, SkillLevel=%d)", dwSlotIndex, dwSkillLevel);
  1084.  
  1085. return;
  1086. }
  1087.  
  1088. m_playerStatus.aSkill[dwSlotIndex].fcurEfficientPercentage = LocaleService_GetSkillPower(dwSkillLevel)/100.0f;
  1089. m_playerStatus.aSkill[dwSlotIndex].fnextEfficientPercentage = LocaleService_GetSkillPower(dwSkillLevel+1)/100.0f;
  1090.  
  1091. }
  1092.  
  1093. void CPythonPlayer::SetSkillCoolTime(DWORD dwSkillIndex)
  1094. {
  1095. DWORD dwSlotIndex;
  1096. if (!GetSkillSlotIndex(dwSkillIndex, &dwSlotIndex))
  1097. {
  1098. Tracenf("CPythonPlayer::SetSkillCoolTime(dwSkillIndex=%d) - FIND SLOT ERROR", dwSkillIndex);
  1099.  
  1100. return;
  1101. }
  1102.  
  1103. if (dwSlotIndex>=SKILL_MAX_NUM)
  1104. {
  1105. Tracenf("CPythonPlayer::SetSkillCoolTime(dwSkillIndex=%d) - dwSlotIndex=%d/%d OUT OF RANGE", dwSkillIndex, dwSlotIndex, SKILL_MAX_NUM);
  1106.  
  1107. return;
  1108. }
  1109.  
  1110. m_playerStatus.aSkill[dwSlotIndex].isCoolTime=true;
  1111. }
  1112.  
  1113. void CPythonPlayer::EndSkillCoolTime(DWORD dwSkillIndex)
  1114. {
  1115. DWORD dwSlotIndex;
  1116. if (!GetSkillSlotIndex(dwSkillIndex, &dwSlotIndex))
  1117. {
  1118. Tracenf("CPythonPlayer::EndSkillCoolTime(dwSkillIndex=%d) - FIND SLOT ERROR", dwSkillIndex);
  1119.  
  1120. return;
  1121. }
  1122.  
  1123. if (dwSlotIndex>=SKILL_MAX_NUM)
  1124. {
  1125. Tracenf("CPythonPlayer::EndSkillCoolTime(dwSkillIndex=%d) - dwSlotIndex=%d/%d OUT OF RANGE", dwSkillIndex, dwSlotIndex, SKILL_MAX_NUM);
  1126.  
  1127. return;
  1128. }
  1129.  
  1130. m_playerStatus.aSkill[dwSlotIndex].isCoolTime=false;
  1131. }
  1132.  
  1133. float CPythonPlayer::GetSkillCoolTime(DWORD dwSlotIndex)
  1134. {
  1135. if (dwSlotIndex >= SKILL_MAX_NUM)
  1136. return 0.0f;
  1137.  
  1138. return m_playerStatus.aSkill[dwSlotIndex].fCoolTime;
  1139. }
  1140.  
  1141. float CPythonPlayer::GetSkillElapsedCoolTime(DWORD dwSlotIndex)
  1142. {
  1143. if (dwSlotIndex >= SKILL_MAX_NUM)
  1144. return 0.0f;
  1145.  
  1146. return CTimer::Instance().GetCurrentSecond() - m_playerStatus.aSkill[dwSlotIndex].fLastUsedTime;
  1147. }
  1148.  
  1149. void CPythonPlayer::__ActivateSkillSlot(DWORD dwSlotIndex)
  1150. {
  1151. if (dwSlotIndex>=SKILL_MAX_NUM)
  1152. {
  1153. Tracenf("CPythonPlayer::ActivavteSkill(dwSlotIndex=%d/%d) - OUT OF RANGE", dwSlotIndex, SKILL_MAX_NUM);
  1154. return;
  1155. }
  1156.  
  1157. m_playerStatus.aSkill[dwSlotIndex].bActive = TRUE;
  1158. PyCallClassMemberFunc(m_ppyGameWindow, "ActivateSkillSlot", Py_BuildValue("(i)", dwSlotIndex));
  1159. }
  1160.  
  1161. void CPythonPlayer::__DeactivateSkillSlot(DWORD dwSlotIndex)
  1162. {
  1163. if (dwSlotIndex>=SKILL_MAX_NUM)
  1164. {
  1165. Tracenf("CPythonPlayer::DeactivavteSkill(dwSlotIndex=%d/%d) - OUT OF RANGE", dwSlotIndex, SKILL_MAX_NUM);
  1166. return;
  1167. }
  1168.  
  1169. m_playerStatus.aSkill[dwSlotIndex].bActive = FALSE;
  1170. PyCallClassMemberFunc(m_ppyGameWindow, "DeactivateSkillSlot", Py_BuildValue("(i)", dwSlotIndex));
  1171. }
  1172.  
  1173. BOOL CPythonPlayer::IsSkillCoolTime(DWORD dwSlotIndex)
  1174. {
  1175. if (!__CheckRestSkillCoolTime(dwSlotIndex))
  1176. return FALSE;
  1177.  
  1178. return TRUE;
  1179. }
  1180.  
  1181. BOOL CPythonPlayer::IsSkillActive(DWORD dwSlotIndex)
  1182. {
  1183. if (dwSlotIndex >= SKILL_MAX_NUM)
  1184. return FALSE;
  1185.  
  1186. return m_playerStatus.aSkill[dwSlotIndex].bActive;
  1187. }
  1188.  
  1189. BOOL CPythonPlayer::IsToggleSkill(DWORD dwSlotIndex)
  1190. {
  1191. if (dwSlotIndex >= SKILL_MAX_NUM)
  1192. return FALSE;
  1193.  
  1194. DWORD dwSkillIndex = m_playerStatus.aSkill[dwSlotIndex].dwIndex;
  1195.  
  1196. CPythonSkill::TSkillData * pSkillData;
  1197. if (!CPythonSkill::Instance().GetSkillData(dwSkillIndex, &pSkillData))
  1198. return FALSE;
  1199.  
  1200. return pSkillData->IsToggleSkill();
  1201. }
  1202.  
  1203. void CPythonPlayer::SetPlayTime(DWORD dwPlayTime)
  1204. {
  1205. m_dwPlayTime = dwPlayTime;
  1206. }
  1207.  
  1208. DWORD CPythonPlayer::GetPlayTime()
  1209. {
  1210. return m_dwPlayTime;
  1211. }
  1212.  
  1213. void CPythonPlayer::SendClickItemPacket(DWORD dwIID)
  1214. {
  1215. if (IsObserverMode())
  1216. return;
  1217.  
  1218. const char * c_szOwnerName;
  1219.  
  1220. if (!CPythonItem::Instance().GetOwnership(dwIID, &c_szOwnerName))
  1221. return;
  1222.  
  1223. if (strlen(c_szOwnerName) > 0)
  1224. if (0 != strcmp(c_szOwnerName, GetName()))
  1225. {
  1226. CItemData * pItemData;
  1227. if (!CItemManager::Instance().GetItemDataPointer(CPythonItem::Instance().GetVirtualNumberOfGroundItem(dwIID), &pItemData))
  1228. {
  1229. Tracenf("CPythonPlayer::SendClickItemPacket(dwIID=%d) : Non-exist item.", dwIID);
  1230.  
  1231. return;
  1232. }
  1233.  
  1234. if (!IsPartyMemberByName(c_szOwnerName) || pItemData->IsAntiFlag(CItemData::ITEM_ANTIFLAG_DROP | CItemData::ITEM_ANTIFLAG_GIVE))
  1235. {
  1236. PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotPickItem", Py_BuildValue("()"));
  1237.  
  1238. return;
  1239. }
  1240. }
  1241.  
  1242. CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
  1243. rkNetStream.SendItemPickUpPacket(dwIID);
  1244. }
  1245.  
  1246. void CPythonPlayer::__SendClickActorPacket(CInstanceBase& rkInstVictim)
  1247. {
  1248. CInstanceBase* pkInstMain=NEW_GetMainActorPtr();
  1249.  
  1250. if (pkInstMain)
  1251. if (pkInstMain->IsHoldingPickAxe())
  1252. if (pkInstMain->IsMountingHorse())
  1253. if (rkInstVictim.IsResource())
  1254. {
  1255. PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotMining", Py_BuildValue("()"));
  1256.  
  1257. return;
  1258. }
  1259.  
  1260. static DWORD s_dwNextTCPTime = 0;
  1261.  
  1262. DWORD dwCurTime=ELTimer_GetMSec();
  1263.  
  1264. if (dwCurTime >= s_dwNextTCPTime)
  1265. {
  1266. s_dwNextTCPTime=dwCurTime+1000;
  1267.  
  1268. CPythonNetworkStream& rkNetStream=CPythonNetworkStream::Instance();
  1269.  
  1270. DWORD dwVictimVID=rkInstVictim.GetVirtualID();
  1271. rkNetStream.SendOnClickPacket(dwVictimVID);
  1272. }
  1273. }
  1274.  
  1275. void CPythonPlayer::ActEmotion(DWORD dwEmotionID)
  1276. {
  1277. CInstanceBase * pkInstTarget = __GetAliveTargetInstancePtr();
  1278. if (!pkInstTarget)
  1279. {
  1280. PyCallClassMemberFunc(m_ppyGameWindow, "OnCannotShotError", Py_BuildValue("(is)", GetMainCharacterIndex(), "NEED_TARGET"));
  1281. return;
  1282. }
  1283.  
  1284. CPythonNetworkStream::Instance().SendChatPacket(_getf("/kiss %s", pkInstTarget->GetNameString()));
  1285. }
  1286.  
  1287. void CPythonPlayer::StartEmotionProcess()
  1288. {
  1289. __ClearReservedAction();
  1290. __ClearAutoAttackTargetActorID();
  1291.  
  1292. m_bisProcessingEmotion = TRUE;
  1293. }
  1294.  
  1295. void CPythonPlayer::EndEmotionProcess()
  1296. {
  1297. m_bisProcessingEmotion = FALSE;
  1298. }
  1299.  
  1300. BOOL CPythonPlayer::__IsProcessingEmotion()
  1301. {
  1302. return m_bisProcessingEmotion;
  1303. }
  1304.  
  1305. void CPythonPlayer::SetDungeonDestinationPosition(int ix, int iy)
  1306. {
  1307. m_isDestPosition = TRUE;
  1308. m_ixDestPos = ix;
  1309. m_iyDestPos = iy;
  1310.  
  1311. AlarmHaveToGo();
  1312. }
  1313.  
  1314. void CPythonPlayer::AlarmHaveToGo()
  1315. {
  1316. m_iLastAlarmTime = CTimer::Instance().GetCurrentMillisecond();
  1317.  
  1318. CInstanceBase * pInstance = NEW_GetMainActorPtr();
  1319. if (!pInstance)
  1320. return;
  1321.  
  1322. TPixelPosition PixelPosition;
  1323. pInstance->NEW_GetPixelPosition(&PixelPosition);
  1324.  
  1325. float fAngle = GetDegreeFromPosition2(PixelPosition.x, PixelPosition.y, float(m_ixDestPos), float(m_iyDestPos));
  1326. fAngle = fmod(540.0f - fAngle, 360.0f);
  1327. D3DXVECTOR3 v3Rotation(0.0f, 0.0f, fAngle);
  1328.  
  1329. PixelPosition.y *= -1.0f;
  1330.  
  1331. CEffectManager::Instance().RegisterEffect("d:/ymir work/effect/etc/compass/appear_middle.mse");
  1332. CEffectManager::Instance().CreateEffect("d:/ymir work/effect/etc/compass/appear_middle.mse", PixelPosition, v3Rotation);
  1333. }
  1334.  
  1335. void CPythonPlayer::ExitParty()
  1336. {
  1337. m_PartyMemberMap.clear();
  1338.  
  1339. CPythonCharacterManager::Instance().RefreshAllPCTextTail();
  1340. }
  1341.  
  1342. void CPythonPlayer::AppendPartyMember(DWORD dwPID, const char * c_szName)
  1343. {
  1344. m_PartyMemberMap.insert(make_pair(dwPID, TPartyMemberInfo(dwPID, c_szName)));
  1345. }
  1346.  
  1347. void CPythonPlayer::LinkPartyMember(DWORD dwPID, DWORD dwVID)
  1348. {
  1349. TPartyMemberInfo * pPartyMemberInfo;
  1350. if (!GetPartyMemberPtr(dwPID, &pPartyMemberInfo))
  1351. {
  1352. TraceError(" CPythonPlayer::LinkPartyMember(dwPID=%d, dwVID=%d) - Failed to find party member", dwPID, dwVID);
  1353. return;
  1354. }
  1355.  
  1356. pPartyMemberInfo->dwVID = dwVID;
  1357.  
  1358. CInstanceBase * pInstance = NEW_FindActorPtr(dwVID);
  1359. if (pInstance)
  1360. pInstance->RefreshTextTail();
  1361. }
  1362.  
  1363. void CPythonPlayer::UnlinkPartyMember(DWORD dwPID)
  1364. {
  1365. TPartyMemberInfo * pPartyMemberInfo;
  1366. if (!GetPartyMemberPtr(dwPID, &pPartyMemberInfo))
  1367. {
  1368. TraceError(" CPythonPlayer::UnlinkPartyMember(dwPID=%d) - Failed to find party member", dwPID);
  1369. return;
  1370. }
  1371.  
  1372. pPartyMemberInfo->dwVID = 0;
  1373. }
  1374.  
  1375. void CPythonPlayer::UpdatePartyMemberInfo(DWORD dwPID, BYTE byState, BYTE byHPPercentage)
  1376. {
  1377. TPartyMemberInfo * pPartyMemberInfo;
  1378. if (!GetPartyMemberPtr(dwPID, &pPartyMemberInfo))
  1379. {
  1380. TraceError(" CPythonPlayer::UpdatePartyMemberInfo(dwPID=%d, byState=%d, byHPPercentage=%d) - Failed to find character", dwPID, byState, byHPPercentage);
  1381. return;
  1382. }
  1383.  
  1384. pPartyMemberInfo->byState = byState;
  1385. pPartyMemberInfo->byHPPercentage = byHPPercentage;
  1386. }
  1387.  
  1388. void CPythonPlayer::UpdatePartyMemberAffect(DWORD dwPID, BYTE byAffectSlotIndex, short sAffectNumber)
  1389. {
  1390. if (byAffectSlotIndex >= PARTY_AFFECT_SLOT_MAX_NUM)
  1391. {
  1392. TraceError(" CPythonPlayer::UpdatePartyMemberAffect(dwPID=%d, byAffectSlotIndex=%d, sAffectNumber=%d) - Strange affect slot index", dwPID, byAffectSlotIndex, sAffectNumber);
  1393. return;
  1394. }
  1395.  
  1396. TPartyMemberInfo * pPartyMemberInfo;
  1397. if (!GetPartyMemberPtr(dwPID, &pPartyMemberInfo))
  1398. {
  1399. TraceError(" CPythonPlayer::UpdatePartyMemberAffect(dwPID=%d, byAffectSlotIndex=%d, sAffectNumber=%d) - Failed to find character", dwPID, byAffectSlotIndex, sAffectNumber);
  1400. return;
  1401. }
  1402.  
  1403. pPartyMemberInfo->sAffects[byAffectSlotIndex] = sAffectNumber;
  1404. }
  1405.  
  1406. void CPythonPlayer::RemovePartyMember(DWORD dwPID)
  1407. {
  1408. DWORD dwVID = 0;
  1409. TPartyMemberInfo * pPartyMemberInfo;
  1410. if (GetPartyMemberPtr(dwPID, &pPartyMemberInfo))
  1411. {
  1412. dwVID = pPartyMemberInfo->dwVID;
  1413. }
  1414.  
  1415. m_PartyMemberMap.erase(dwPID);
  1416.  
  1417. if (dwVID > 0)
  1418. {
  1419. CInstanceBase * pInstance = NEW_FindActorPtr(dwVID);
  1420. if (pInstance)
  1421. pInstance->RefreshTextTail();
  1422. }
  1423. }
  1424.  
  1425. bool CPythonPlayer::IsPartyMemberByVID(DWORD dwVID)
  1426. {
  1427. std::map<DWORD, TPartyMemberInfo>::iterator itor = m_PartyMemberMap.begin();
  1428. for (; itor != m_PartyMemberMap.end(); ++itor)
  1429. {
  1430. TPartyMemberInfo & rPartyMemberInfo = itor->second;
  1431. if (dwVID == rPartyMemberInfo.dwVID)
  1432. return true;
  1433. }
  1434.  
  1435. return false;
  1436. }
  1437.  
  1438. bool CPythonPlayer::IsPartyMemberByName(const char * c_szName)
  1439. {
  1440. std::map<DWORD, TPartyMemberInfo>::iterator itor = m_PartyMemberMap.begin();
  1441. for (; itor != m_PartyMemberMap.end(); ++itor)
  1442. {
  1443. TPartyMemberInfo & rPartyMemberInfo = itor->second;
  1444. if (0 == rPartyMemberInfo.strName.compare(c_szName))
  1445. return true;
  1446. }
  1447.  
  1448. return false;
  1449. }
  1450.  
  1451. bool CPythonPlayer::GetPartyMemberPtr(DWORD dwPID, TPartyMemberInfo ** ppPartyMemberInfo)
  1452. {
  1453. std::map<DWORD, TPartyMemberInfo>::iterator itor = m_PartyMemberMap.find(dwPID);
  1454.  
  1455. if (m_PartyMemberMap.end() == itor)
  1456. return false;
  1457.  
  1458. *ppPartyMemberInfo = &(itor->second);
  1459.  
  1460. return true;
  1461. }
  1462.  
  1463. bool CPythonPlayer::PartyMemberPIDToVID(DWORD dwPID, DWORD * pdwVID)
  1464. {
  1465. std::map<DWORD, TPartyMemberInfo>::iterator itor = m_PartyMemberMap.find(dwPID);
  1466.  
  1467. if (m_PartyMemberMap.end() == itor)
  1468. return false;
  1469.  
  1470. const TPartyMemberInfo & c_rPartyMemberInfo = itor->second;
  1471. *pdwVID = c_rPartyMemberInfo.dwVID;
  1472.  
  1473. return true;
  1474. }
  1475.  
  1476. bool CPythonPlayer::PartyMemberVIDToPID(DWORD dwVID, DWORD * pdwPID)
  1477. {
  1478. std::map<DWORD, TPartyMemberInfo>::iterator itor = m_PartyMemberMap.begin();
  1479. for (; itor != m_PartyMemberMap.end(); ++itor)
  1480. {
  1481. TPartyMemberInfo & rPartyMemberInfo = itor->second;
  1482. if (dwVID == rPartyMemberInfo.dwVID)
  1483. {
  1484. *pdwPID = rPartyMemberInfo.dwPID;
  1485.  
  1486. return true;
  1487. }
  1488. }
  1489.  
  1490. return false;
  1491. }
  1492.  
  1493. bool CPythonPlayer::IsSamePartyMember(DWORD dwVID1, DWORD dwVID2)
  1494. {
  1495. return (IsPartyMemberByVID(dwVID1) && IsPartyMemberByVID(dwVID2));
  1496. }
  1497.  
  1498. void CPythonPlayer::RememberChallengeInstance(DWORD dwVID)
  1499. {
  1500. m_RevengeInstanceSet.erase(dwVID);
  1501. m_ChallengeInstanceSet.insert(dwVID);
  1502. }
  1503.  
  1504. void CPythonPlayer::RememberRevengeInstance(DWORD dwVID)
  1505. {
  1506. m_ChallengeInstanceSet.erase(dwVID);
  1507. m_RevengeInstanceSet.insert(dwVID);
  1508. }
  1509.  
  1510. void CPythonPlayer::RememberCantFightInstance(DWORD dwVID)
  1511. {
  1512. m_CantFightInstanceSet.insert(dwVID);
  1513. }
  1514.  
  1515. void CPythonPlayer::ForgetInstance(DWORD dwVID)
  1516. {
  1517. m_ChallengeInstanceSet.erase(dwVID);
  1518. m_RevengeInstanceSet.erase(dwVID);
  1519. m_CantFightInstanceSet.erase(dwVID);
  1520. }
  1521.  
  1522. bool CPythonPlayer::IsChallengeInstance(DWORD dwVID)
  1523. {
  1524. return m_ChallengeInstanceSet.end() != m_ChallengeInstanceSet.find(dwVID);
  1525. }
  1526.  
  1527. bool CPythonPlayer::IsRevengeInstance(DWORD dwVID)
  1528. {
  1529. return m_RevengeInstanceSet.end() != m_RevengeInstanceSet.find(dwVID);
  1530. }
  1531.  
  1532. bool CPythonPlayer::IsCantFightInstance(DWORD dwVID)
  1533. {
  1534. return m_CantFightInstanceSet.end() != m_CantFightInstanceSet.find(dwVID);
  1535. }
  1536.  
  1537. void CPythonPlayer::OpenPrivateShop()
  1538. {
  1539. m_isOpenPrivateShop = TRUE;
  1540. }
  1541.  
  1542. void CPythonPlayer::ClosePrivateShop()
  1543. {
  1544. m_isOpenPrivateShop = FALSE;
  1545. }
  1546.  
  1547. bool CPythonPlayer::IsOpenPrivateShop()
  1548. {
  1549. return m_isOpenPrivateShop;
  1550. }
  1551.  
  1552. void CPythonPlayer::SetObserverMode(bool isEnable)
  1553. {
  1554. m_isObserverMode=isEnable;
  1555. }
  1556.  
  1557. bool CPythonPlayer::IsObserverMode()
  1558. {
  1559. return m_isObserverMode;
  1560. }
  1561.  
  1562. BOOL CPythonPlayer::__ToggleCoolTime()
  1563. {
  1564. m_sysIsCoolTime = 1 - m_sysIsCoolTime;
  1565.  
  1566. return m_sysIsCoolTime;
  1567. }
  1568.  
  1569. BOOL CPythonPlayer::__ToggleLevelLimit()
  1570. {
  1571. m_sysIsLevelLimit = 1 - m_sysIsLevelLimit;
  1572.  
  1573. return m_sysIsLevelLimit;
  1574. }
  1575.  
  1576. void CPythonPlayer::StartStaminaConsume(DWORD dwConsumePerSec, DWORD dwCurrentStamina)
  1577. {
  1578. m_isConsumingStamina = TRUE;
  1579. m_fConsumeStaminaPerSec = float(dwConsumePerSec);
  1580. m_fCurrentStamina = float(dwCurrentStamina);
  1581.  
  1582. SetStatus(POINT_STAMINA, dwCurrentStamina);
  1583. }
  1584.  
  1585. void CPythonPlayer::StopStaminaConsume(DWORD dwCurrentStamina)
  1586. {
  1587. m_isConsumingStamina = FALSE;
  1588. m_fConsumeStaminaPerSec = 0.0f;
  1589. m_fCurrentStamina = float(dwCurrentStamina);
  1590.  
  1591. SetStatus(POINT_STAMINA, dwCurrentStamina);
  1592. }
  1593.  
  1594. DWORD CPythonPlayer::GetPKMode()
  1595. {
  1596. CInstanceBase * pInstance = NEW_GetMainActorPtr();
  1597. if (!pInstance)
  1598. return 0;
  1599.  
  1600. return pInstance->GetPKMode();
  1601. }
  1602.  
  1603. void CPythonPlayer::SetGameWindow(PyObject * ppyObject)
  1604. {
  1605. m_ppyGameWindow = ppyObject;
  1606. }
  1607.  
  1608. void CPythonPlayer::NEW_ClearSkillData(bool bAll)
  1609. {
  1610. std::map<DWORD, DWORD>::iterator it;
  1611.  
  1612. for (it = m_skillSlotDict.begin(); it != m_skillSlotDict.end();)
  1613. {
  1614. if (bAll || __GetSkillType(it->first) == CPythonSkill::SKILL_TYPE_ACTIVE)
  1615. it = m_skillSlotDict.erase(it);
  1616. else
  1617. ++it;
  1618. }
  1619.  
  1620. for (int i = 0; i < SKILL_MAX_NUM; ++i)
  1621. {
  1622. ZeroMemory(&m_playerStatus.aSkill[i], sizeof(TSkillInstance));
  1623. }
  1624.  
  1625. for (int j = 0; j < SKILL_MAX_NUM; ++j)
  1626. {
  1627. m_playerStatus.aSkill[j].iGrade = 0;
  1628. m_playerStatus.aSkill[j].fcurEfficientPercentage=0.0f;
  1629. m_playerStatus.aSkill[j].fnextEfficientPercentage=0.05f;
  1630. }
  1631.  
  1632. if (m_ppyGameWindow)
  1633. PyCallClassMemberFunc(m_ppyGameWindow, "BINARY_CheckGameButton", Py_BuildNone());
  1634. }
  1635.  
  1636. void CPythonPlayer::ClearSkillDict()
  1637. {
  1638. m_skillSlotDict.clear();
  1639.  
  1640. #ifdef __AUTO_QUQUE_ATTACK__
  1641. bTotalQuqueAutoAttack = 6;
  1642. m_vecQuqueAutoAttack.clear();
  1643. #endif
  1644.  
  1645. m_isOpenPrivateShop = false;
  1646. m_isObserverMode = false;
  1647.  
  1648. m_isConsumingStamina = FALSE;
  1649. m_fConsumeStaminaPerSec = 0.0f;
  1650. m_fCurrentStamina = 0.0f;
  1651.  
  1652. __ClearAutoAttackTargetActorID();
  1653. }
  1654.  
  1655. void CPythonPlayer::Clear()
  1656. {
  1657. memset(&m_playerStatus, 0, sizeof(m_playerStatus));
  1658. NEW_ClearSkillData(true);
  1659.  
  1660. m_bisProcessingEmotion = FALSE;
  1661.  
  1662. m_dwSendingTargetVID = 0;
  1663. m_fTargetUpdateTime = 0.0f;
  1664.  
  1665. m_stName = "";
  1666. m_dwMainCharacterIndex = 0;
  1667. m_dwRace = 0;
  1668. m_dwWeaponMinPower = 0;
  1669. m_dwWeaponMaxPower = 0;
  1670. m_dwWeaponMinMagicPower = 0;
  1671. m_dwWeaponMaxMagicPower = 0;
  1672. m_dwWeaponAddPower = 0;
  1673.  
  1674. m_MovingCursorPosition = TPixelPosition(0, 0, 0);
  1675. m_fMovingCursorSettingTime = 0.0f;
  1676.  
  1677. m_eReservedMode = MODE_NONE;
  1678. m_fReservedDelayTime = 0.0f;
  1679. m_kPPosReserved = TPixelPosition(0, 0, 0);
  1680. m_dwVIDReserved = 0;
  1681. m_dwIIDReserved = 0;
  1682. m_dwSkillSlotIndexReserved = 0;
  1683. m_dwSkillRangeReserved = 0;
  1684.  
  1685. m_isUp = false;
  1686. m_isDown = false;
  1687. m_isLeft = false;
  1688. m_isRight = false;
  1689. m_isSmtMov = false;
  1690. m_isDirMov = false;
  1691. m_isDirKey = false;
  1692. m_isAtkKey = false;
  1693.  
  1694. m_isCmrRot = true;
  1695. m_fCmrRotSpd = 20.0f;
  1696.  
  1697. m_iComboOld = 0;
  1698.  
  1699. m_dwVIDPicked=0;
  1700. m_dwIIDPicked=0;
  1701.  
  1702. m_dwcurSkillSlotIndex = DWORD(-1);
  1703.  
  1704. m_dwTargetVID = 0;
  1705. m_dwTargetEndTime = 0;
  1706.  
  1707. m_PartyMemberMap.clear();
  1708.  
  1709. m_ChallengeInstanceSet.clear();
  1710. m_RevengeInstanceSet.clear();
  1711.  
  1712. m_isOpenPrivateShop = false;
  1713. m_isObserverMode = false;
  1714.  
  1715. m_isConsumingStamina = FALSE;
  1716. m_fConsumeStaminaPerSec = 0.0f;
  1717. m_fCurrentStamina = 0.0f;
  1718.  
  1719. m_inGuildAreaID = 0xffffffff;
  1720.  
  1721. __ClearAutoAttackTargetActorID();
  1722. }
  1723.  
  1724. CPythonPlayer::CPythonPlayer(void)
  1725. {
  1726. SetMovableGroundDistance(40.0f);
  1727.  
  1728. m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_JEONGWI), 3));
  1729. m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_GEOMGYEONG), 4));
  1730. m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_CHEONGEUN), 19));
  1731. m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_GYEONGGONG), 49));
  1732. m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_EUNHYEONG), 34));
  1733. m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_GONGPO), 64));
  1734. m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_JUMAGAP), 65));
  1735. m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_HOSIN), 94));
  1736. m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_BOHO), 95));
  1737. m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_KWAESOK), 110));
  1738. m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_GICHEON), 96));
  1739. m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_JEUNGRYEOK), 111));
  1740. m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_PABEOP), 66));
  1741. m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_FALLEN_CHEONGEUN), 19));
  1742.  
  1743. m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_GWIGEOM), 63));
  1744. m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_MUYEONG), 78));
  1745. m_kMap_dwAffectIndexToSkillIndex.insert(make_pair(int(CInstanceBase::AFFECT_HEUKSIN), 79));
  1746.  
  1747. m_ppyGameWindow = NULL;
  1748.  
  1749. m_sysIsCoolTime = TRUE;
  1750. m_sysIsLevelLimit = TRUE;
  1751. m_dwPlayTime = 0;
  1752.  
  1753. m_aeMBFButton[MBT_LEFT]=CPythonPlayer::MBF_SMART;
  1754. m_aeMBFButton[MBT_RIGHT]=CPythonPlayer::MBF_CAMERA;
  1755. m_aeMBFButton[MBT_MIDDLE]=CPythonPlayer::MBF_CAMERA;
  1756.  
  1757. memset(m_adwEffect, 0, sizeof(m_adwEffect));
  1758.  
  1759. m_isDestPosition = FALSE;
  1760. m_ixDestPos = 0;
  1761. m_iyDestPos = 0;
  1762. m_iLastAlarmTime = 0;
  1763.  
  1764. Clear();
  1765. }
  1766.  
  1767. CPythonPlayer::~CPythonPlayer(void)
  1768. {
  1769. }
  1770.  
Advertisement
Add Comment
Please, Sign In to add comment