Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.76 KB | None | 0 0
  1. #include "../../common/service.h"
  2. #ifdef NEW_PET_SYSTEM
  3. #ifndef __HEADER_NEWPET_SYSTEM__
  4. #define __HEADER_NEWPET_SYSTEM__
  5.  
  6.  
  7. class CHARACTER;
  8.  
  9. // TODO: 펫으로서의 능력치? 라던가 친밀도, 배고픔 기타등등... 수치
  10. struct SNewPetAbility
  11. {
  12. };
  13.  
  14. /**
  15. */
  16. class CNewPetActor //: public CHARACTER
  17. {
  18. public:
  19. enum ENewPetOptions
  20. {
  21. EPetOption_Followable = 1 << 0,
  22. EPetOption_Mountable = 1 << 1,
  23. EPetOption_Summonable = 1 << 2,
  24. EPetOption_Combatable = 1 << 3,
  25. };
  26.  
  27.  
  28. protected:
  29. friend class CNewPetSystem;
  30.  
  31. CNewPetActor(LPCHARACTER owner, DWORD vnum, DWORD options = EPetOption_Followable | EPetOption_Summonable);
  32. // CPetActor(LPCHARACTER owner, DWORD vnum, const SPetAbility& petAbility, DWORD options = EPetOption_Followable | EPetOption_Summonable);
  33.  
  34. virtual ~CNewPetActor();
  35.  
  36. virtual bool Update(DWORD deltaTime);
  37.  
  38. protected:
  39. virtual bool _UpdateFollowAI(); ///< 주인을 따라다니는 AI 처리
  40. virtual bool _UpdatAloneActionAI(float fMinDist, float fMaxDist); ///< 주인 근처에서 혼자 노는 AI 처리
  41.  
  42. /// @TODO
  43. //virtual bool _UpdateCombatAI();
  44.  
  45. private:
  46. bool Follow(float fMinDistance = 50.f);
  47.  
  48. public:
  49. LPCHARACTER GetCharacter() const { return m_pkChar; }
  50. LPCHARACTER GetOwner() const { return m_pkOwner; }
  51. DWORD GetVID() const { return m_dwVID; }
  52. DWORD GetVnum() const { return m_dwVnum; }
  53.  
  54. bool HasOption(ENewPetOptions option) const { return m_dwOptions & option; }
  55.  
  56. void SetName(const char* petName);
  57. void SetLevel(DWORD level);
  58.  
  59. bool Mount();
  60. void Unmount();
  61.  
  62. DWORD Summon(const char* petName, LPITEM pSummonItem, bool bSpawnFar = false);
  63. void Unsummon();
  64.  
  65. bool IsSummoned() const { return 0 != m_pkChar; }
  66. void SetSummonItem (LPITEM pItem);
  67. DWORD GetSummonItemVID () { return m_dwSummonItemVID; }
  68. DWORD GetSummonItemID () { return m_dwSummonItemID; }
  69. DWORD GetEvolution() { return m_dwevolution; }
  70. DWORD GetLevel() { return m_dwlevel; }
  71. void SetEvolution(int lv);
  72. void SetExp(DWORD exp, int mode);
  73. DWORD GetExp() { return m_dwexp; }
  74. DWORD GetExpI() { return m_dwexpitem; }
  75. int GetPetYasi(){ return m_dwdurationYas/60/24; } //dakika->gun
  76. void SetNextExp(int nextExp);
  77. int GetNextExpFromMob() { return m_dwExpFromMob; }
  78. int GetNextExpFromItem() { return m_dwExpFromItem; }
  79. int GetLevelStep() { return m_dwlevelstep; }
  80.  
  81. void IncreasePetBonus();
  82. void SetItemCube(int pos, int invpos);
  83. void ItemCubeFeed(int type);
  84. void DoPetSkill(int skillslot);
  85. void UpdateTime();
  86.  
  87. bool IncreasePetSkill(int skill);
  88. bool IncreasePetEvolution();
  89.  
  90. // 버프 주는 함수와 거두는 함수.
  91. // 이게 좀 괴랄한게, 서버가 ㅄ라서,
  92. // POINT_MOV_SPEED, POINT_ATT_SPEED, POINT_CAST_SPEED는 PointChange()란 함수만 써서 변경해 봐야 소용이 없는게,
  93. // PointChange() 이후에 어디선가 ComputePoints()를 하면 싹다 초기화되고,
  94. // 더 웃긴건, ComputePoints()를 부르지 않으면 클라의 POINT는 전혀 변하지 않는다는 거다.
  95. // 그래서 버프를 주는 것은 ComputePoints() 내부에서 petsystem->RefreshBuff()를 부르도록 하였고,
  96. // 버프를 빼는 것은 ClearBuff()를 부르고, ComputePoints를 하는 것으로 한다.
  97. void GiveBuff();
  98. void ClearBuff();
  99.  
  100. private:
  101. int m_dwlevelstep; //Step livello del pet da da 0 a 4
  102. int m_dwExpFromMob; //Exp richiesta per il level 90% del tot
  103. int m_dwExpFromItem; //Exp richiesta per il level 10% del tot
  104. int m_dwexpitem; // Exp corrente presa dagli item
  105. int m_dwevolution; //Stato evoluzione del pet da 1 a 4
  106. int m_dwTimePet; //Tempo per il pet
  107. int m_dwslotimm;
  108.  
  109. DWORD m_dwImmTime;
  110.  
  111. int m_dwpetslotitem[9];
  112. int m_dwskill[3];
  113. int m_dwskillslot[3];
  114. int m_dwbonuspet[3][2];
  115. DWORD m_dwVnum;
  116. DWORD m_dwVID;
  117. DWORD m_dwlevel;
  118. DWORD m_dwexp;
  119. DWORD m_dwOptions;
  120. DWORD m_dwLastActionTime;
  121. DWORD m_dwSummonItemVID;
  122. DWORD m_dwSummonItemID;
  123. DWORD m_dwSummonItemVnum;
  124.  
  125. DWORD m_dwduration;
  126. DWORD m_dwtduration;
  127. //Pet Yas Bugu Fixi//
  128. DWORD m_dwdurationYas;
  129. //Pet Yas Bugu Fixi//
  130.  
  131. short m_originalMoveSpeed;
  132.  
  133. std::string m_name;
  134.  
  135. LPCHARACTER m_pkChar; // Instance of pet(CHARACTER)
  136. LPCHARACTER m_pkOwner;
  137.  
  138. // SPetAbility m_petAbility; // 능력치
  139. };
  140.  
  141. /**
  142. */
  143. class CNewPetSystem
  144. {
  145. public:
  146. typedef boost::unordered_map<DWORD, CNewPetActor*> TNewPetActorMap; /// <VNUM, NewPetActor> map. (한 캐릭터가 같은 vnum의 펫을 여러개 가질 일이 있을까..??)
  147.  
  148. public:
  149. CNewPetSystem(LPCHARACTER owner);
  150. virtual ~CNewPetSystem();
  151.  
  152. CNewPetActor* GetByVID(DWORD vid) const;
  153. CNewPetActor* GetByVnum(DWORD vnum) const;
  154.  
  155. bool Update(DWORD deltaTime);
  156. void Destroy();
  157.  
  158. size_t CountSummoned() const; ///< 현재 소환된(실체화 된 캐릭터가 있는) 펫의 개수
  159.  
  160. public:
  161. void SetUpdatePeriod(DWORD ms);
  162.  
  163. CNewPetActor* Summon(DWORD mobVnum, LPITEM pSummonItem, const char* petName, bool bSpawnFar, DWORD options = CNewPetActor::EPetOption_Followable | CNewPetActor::EPetOption_Summonable);
  164.  
  165. void Unsummon(DWORD mobVnum, bool bDeleteFromList = false);
  166. void Unsummon(CNewPetActor* petActor, bool bDeleteFromList = false);
  167.  
  168. // TODO: 진짜 펫 시스템이 들어갈 때 구현. (캐릭터가 보유한 펫의 정보를 추가할 때 라던가...)
  169. CNewPetActor* AddPet(DWORD mobVnum, const char* petName, const SNewPetAbility& ability, DWORD options = CNewPetActor::EPetOption_Followable | CNewPetActor::EPetOption_Summonable | CNewPetActor::EPetOption_Combatable);
  170.  
  171.  
  172. bool IncreasePetSkill(int skill);
  173. bool IncreasePetEvolution();
  174.  
  175. void DeletePet(DWORD mobVnum);
  176. void DeletePet(CNewPetActor* petActor);
  177. void RefreshBuff();
  178. bool IsActivePet();
  179. DWORD GetNewPetITemID();
  180. void SetExp(int iExp, int mode);
  181. int GetEvolution();
  182. int GetLevel();
  183. int GetYas();
  184. int GetExp();
  185. int GetLevelStep();
  186. void SetItemCube(int pos, int invpos);
  187. void ItemCubeFeed(int type);
  188. void DoPetSkill(int skillslot);
  189. void UpdateTime();
  190.  
  191. private:
  192. TNewPetActorMap m_petActorMap;
  193. LPCHARACTER m_pkOwner; ///< 펫 시스템의 Owner
  194. DWORD m_dwUpdatePeriod; ///< 업데이트 주기 (ms단위)
  195. DWORD m_dwLastUpdateTime;
  196. LPEVENT m_pkNewPetSystemUpdateEvent;
  197. LPEVENT m_pkNewPetSystemExpireEvent;
  198. };
  199.  
  200. /**
  201. // Summon Pet
  202. CPetSystem* petSystem = mainChar->GetPetSystem();
  203. CPetActor* petActor = petSystem->Summon(~~~);
  204.  
  205. DWORD petVID = petActor->GetVID();
  206. if (0 == petActor)
  207. {
  208. ERROR_LOG(...)
  209. };
  210.  
  211.  
  212. // Unsummon Pet
  213. petSystem->Unsummon(petVID);
  214.  
  215. // Mount Pet
  216. petActor->Mount()..
  217.  
  218.  
  219. CPetActor::Update(...)
  220. {
  221. // AI : Follow, actions, etc...
  222. }
  223.  
  224. */
  225.  
  226.  
  227.  
  228. #endif //__HEADER_PET_SYSTEM__
  229. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement