trus7

char.h

Nov 20th, 2020
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 87.40 KB | None | 0 0
  1. #ifndef __INC_METIN_II_CHAR_H__
  2. #define __INC_METIN_II_CHAR_H__
  3.  
  4. #include <boost/unordered_map.hpp>
  5.  
  6. #include "../../common/stl.h"
  7. #include "entity.h"
  8. #include "FSM.h"
  9. #include "horse_rider.h"
  10. #include "vid.h"
  11. #include "constants.h"
  12. #include "affect.h"
  13. #include "affect_flag.h"
  14. #include "cube.h"
  15. #include "mining.h"
  16. #include "packet.h"
  17. #include "../../common/CommonDefines.h"
  18. #if defined(WHEEL_OF_DESTINY)
  19. #include "wheel_of_destiny.h"
  20. #endif
  21. #ifdef __UPGRADE_ITEMS_STORAGE__
  22. #include "upgrade_items_storage.h"
  23. #endif
  24. #define ENABLE_ANTI_CMD_FLOOD
  25. enum eMountType {MOUNT_TYPE_NONE=0, MOUNT_TYPE_NORMAL=1, MOUNT_TYPE_COMBAT=2, MOUNT_TYPE_MILITARY=3};
  26. int __MountAtkSkill(DWORD dwMountVnum, bool IsNew);
  27.  
  28. class CBuffOnAttributes;
  29. class CSupportSystem;
  30. class CPetSystem;
  31. #ifdef NEW_PET_SYSTEM
  32. class CNewPetSystem;
  33. #endif
  34. #ifdef ENABLE_MOUNT_COSTUME_SYSTEM
  35. class CMountSystem;
  36. #endif
  37.  
  38. #define INSTANT_FLAG_DEATH_PENALTY (1 << 0)
  39. #define INSTANT_FLAG_SHOP (1 << 1)
  40. #define INSTANT_FLAG_EXCHANGE (1 << 2)
  41. #define INSTANT_FLAG_STUN (1 << 3)
  42. #define INSTANT_FLAG_NO_REWARD (1 << 4)
  43.  
  44. #define AI_FLAG_NPC (1 << 0)
  45. #define AI_FLAG_AGGRESSIVE (1 << 1)
  46. #define AI_FLAG_HELPER (1 << 2)
  47. #define AI_FLAG_STAYZONE (1 << 3)
  48. #define MAX_CARDS_IN_HAND 5
  49. #define MAX_CARDS_IN_FIELD 3
  50.  
  51.  
  52.  
  53. #define SET_OVER_TIME(ch, time) (ch)->SetOverTime(time)
  54.  
  55. extern int g_nPortalLimitTime;
  56.  
  57. enum
  58. {
  59. MAIN_RACE_WARRIOR_M,
  60. MAIN_RACE_ASSASSIN_W,
  61. MAIN_RACE_SURA_M,
  62. MAIN_RACE_SHAMAN_W,
  63. MAIN_RACE_WARRIOR_W,
  64. MAIN_RACE_ASSASSIN_M,
  65. MAIN_RACE_SURA_W,
  66. MAIN_RACE_SHAMAN_M,
  67. #ifdef ENABLE_WOLFMAN_CHARACTER
  68. MAIN_RACE_WOLFMAN_M,
  69. #endif
  70. MAIN_RACE_MAX_NUM,
  71. };
  72.  
  73. enum
  74. {
  75. MAIN_RACE_MOB_WARRIOR_M = 12015,
  76. MAIN_RACE_MOB_ASSASSIN_W,
  77. MAIN_RACE_MOB_SURA_M,
  78. MAIN_RACE_MOB_SHAMAN_W,
  79. MAIN_RACE_MOB_WARRIOR_W,
  80. MAIN_RACE_MOB_ASSASSIN_M,
  81. MAIN_RACE_MOB_SURA_W,
  82. MAIN_RACE_MOB_SHAMAN_M,
  83. #ifdef ENABLE_WOLFMAN_CHARACTER
  84. MAIN_RACE_MOB_WOLFMAN_M,
  85. MAIN_RACE_MOB_MAX_NUM = MAIN_RACE_MOB_WOLFMAN_M,
  86. #else
  87. MAIN_RACE_MOB_MAX_NUM = MAIN_RACE_MOB_SHAMAN_M,
  88. #endif
  89. };
  90.  
  91. enum
  92. {
  93. POISON_LENGTH = 30,
  94. #ifdef ENABLE_WOLFMAN_CHARACTER
  95. BLEEDING_LENGTH = 30,
  96. #endif
  97. STAMINA_PER_STEP = 1,
  98. SAFEBOX_PAGE_SIZE = 9,
  99. AI_CHANGE_ATTACK_POISITION_TIME_NEAR = 10000,
  100. AI_CHANGE_ATTACK_POISITION_TIME_FAR = 1000,
  101. AI_CHANGE_ATTACK_POISITION_DISTANCE = 100,
  102. SUMMON_MONSTER_COUNT = 3,
  103. };
  104.  
  105. enum
  106. {
  107. FLY_NONE,
  108. FLY_EXP,
  109. FLY_HP_MEDIUM,
  110. FLY_HP_BIG,
  111. FLY_SP_SMALL,
  112. FLY_SP_MEDIUM,
  113. FLY_SP_BIG,
  114. FLY_FIREWORK1,
  115. FLY_FIREWORK2,
  116. FLY_FIREWORK3,
  117. FLY_FIREWORK4,
  118. FLY_FIREWORK5,
  119. FLY_FIREWORK6,
  120. FLY_FIREWORK_CHRISTMAS,
  121. FLY_CHAIN_LIGHTNING,
  122. FLY_HP_SMALL,
  123. FLY_SKILL_MUYEONG,
  124. };
  125.  
  126. enum EDamageType
  127. {
  128. DAMAGE_TYPE_NONE,
  129. DAMAGE_TYPE_NORMAL,
  130. DAMAGE_TYPE_NORMAL_RANGE,
  131. //½ºÅ³
  132. DAMAGE_TYPE_MELEE,
  133. DAMAGE_TYPE_RANGE,
  134. DAMAGE_TYPE_FIRE,
  135. DAMAGE_TYPE_ICE,
  136. DAMAGE_TYPE_ELEC,
  137. DAMAGE_TYPE_MAGIC,
  138. DAMAGE_TYPE_POISON,
  139. DAMAGE_TYPE_SPECIAL,
  140. #ifdef ENABLE_WOLFMAN_CHARACTER
  141. DAMAGE_TYPE_BLEEDING,
  142. #endif
  143. };
  144.  
  145. enum DamageFlag
  146. {
  147. DAMAGE_NORMAL = (1 << 0),
  148. DAMAGE_POISON = (1 << 1),
  149. DAMAGE_DODGE = (1 << 2),
  150. DAMAGE_BLOCK = (1 << 3),
  151. DAMAGE_PENETRATE= (1 << 4),
  152. DAMAGE_CRITICAL = (1 << 5),
  153. #if defined(ENABLE_WOLFMAN_CHARACTER) && !defined(USE_MOB_BLEEDING_AS_POISON)
  154. DAMAGE_BLEEDING = (1 << 6),
  155. #endif
  156. };
  157.  
  158. enum EPointTypes
  159. {
  160. POINT_NONE, // 0
  161. POINT_LEVEL, // 1
  162. POINT_VOICE, // 2
  163. POINT_EXP, // 3
  164. POINT_NEXT_EXP, // 4
  165. POINT_HP, // 5
  166. POINT_MAX_HP, // 6
  167. POINT_SP, // 7
  168. POINT_MAX_SP, // 8
  169. POINT_STAMINA, // 9 ½ºÅ׹̳Ê
  170. POINT_MAX_STAMINA, // 10 ÃÖ´ë ½ºÅ׹̳Ê
  171.  
  172. POINT_GOLD, // 11
  173. POINT_ST, // 12 ±Ù·Â
  174. POINT_HT, // 13 ü·Â
  175. POINT_DX, // 14 ¹Îø¼º
  176. POINT_IQ, // 15 Á¤½Å·Â
  177. POINT_DEF_GRADE, // 16 ...
  178. POINT_ATT_SPEED, // 17 °ø°Ý¼Óµµ
  179. POINT_ATT_GRADE, // 18 °ø°Ý·Â MAX
  180. POINT_MOV_SPEED, // 19 À̵¿¼Óµµ
  181. POINT_CLIENT_DEF_GRADE, // 20 ¹æ¾îµî±Þ
  182. POINT_CASTING_SPEED, // 21 ÁÖ¹®¼Óµµ (Äð´Ù¿îŸÀÓ*100) / (100 + À̰ª) = ÃÖÁ¾ Äð´Ù¿î ŸÀÓ
  183. POINT_MAGIC_ATT_GRADE, // 22 ¸¶¹ý°ø°Ý·Â
  184. POINT_MAGIC_DEF_GRADE, // 23 ¸¶¹ý¹æ¾î·Â
  185. POINT_EMPIRE_POINT, // 24 Á¦±¹Á¡¼ö
  186. POINT_LEVEL_STEP, // 25 ÇÑ ·¹º§¿¡¼­ÀÇ ´Ü°è.. (1 2 3 µÉ ¶§ º¸»ó, 4 µÇ¸é ·¹º§ ¾÷)
  187. POINT_STAT, // 26 ´É·ÂÄ¡ ¿Ã¸± ¼ö ÀÖ´Â °³¼ö
  188. POINT_SUB_SKILL, // 27 º¸Á¶ ½ºÅ³ Æ÷ÀÎÆ®
  189. POINT_SKILL, // 28 ¾×Ƽºê ½ºÅ³ Æ÷ÀÎÆ®
  190. POINT_WEAPON_MIN, // 29 ¹«±â ÃÖ¼Ò µ¥¹ÌÁö
  191. POINT_WEAPON_MAX, // 30 ¹«±â ÃÖ´ë µ¥¹ÌÁö
  192. POINT_PLAYTIME, // 31 Ç÷¹À̽ð£
  193. POINT_HP_REGEN, // 32 HP ȸº¹·ü
  194. POINT_SP_REGEN, // 33 SP ȸº¹·ü
  195.  
  196. POINT_BOW_DISTANCE, // 34 Ȱ »çÁ¤°Å¸® Áõ°¡Ä¡ (meter)
  197.  
  198. POINT_HP_RECOVERY, // 35 ü·Â ȸº¹ Áõ°¡·®
  199. POINT_SP_RECOVERY, // 36 Á¤½Å·Â ȸº¹ Áõ°¡·®
  200.  
  201. POINT_POISON_PCT, // 37 µ¶ È®·ü
  202. POINT_STUN_PCT, // 38 ±âÀý È®·ü
  203. POINT_SLOW_PCT, // 39 ½½·Î¿ì È®·ü
  204. POINT_CRITICAL_PCT, // 40 Å©¸®Æ¼Äà Ȯ·ü
  205. POINT_PENETRATE_PCT, // 41 °üÅëŸ°Ý È®·ü
  206. POINT_CURSE_PCT, // 42 ÀúÁÖ È®·ü
  207.  
  208. POINT_ATTBONUS_HUMAN, // 43 Àΰ£¿¡°Ô °­ÇÔ
  209. POINT_ATTBONUS_ANIMAL, // 44 µ¿¹°¿¡°Ô µ¥¹ÌÁö % Áõ°¡
  210. POINT_ATTBONUS_ORC, // 45 ¿õ±Í¿¡°Ô µ¥¹ÌÁö % Áõ°¡
  211. POINT_ATTBONUS_MILGYO, // 46 ¹Ð±³¿¡°Ô µ¥¹ÌÁö % Áõ°¡
  212. POINT_ATTBONUS_UNDEAD, // 47 ½Ãü¿¡°Ô µ¥¹ÌÁö % Áõ°¡
  213. POINT_ATTBONUS_DEVIL, // 48 ¸¶±Í(¾Ç¸¶)¿¡°Ô µ¥¹ÌÁö % Áõ°¡
  214. POINT_ATTBONUS_INSECT, // 49 ¹ú·¹Á·
  215. POINT_ATTBONUS_FIRE, // 50 È­¿°Á·
  216. POINT_ATTBONUS_ICE, // 51 ºù¼³Á·
  217. POINT_ATTBONUS_DESERT, // 52 »ç¸·Á·
  218. POINT_ATTBONUS_MONSTER, // 53 ¸ðµç ¸ó½ºÅÍ¿¡°Ô °­ÇÔ
  219. POINT_ATTBONUS_WARRIOR, // 54 ¹«»ç¿¡°Ô °­ÇÔ
  220. POINT_ATTBONUS_ASSASSIN, // 55 ÀÚ°´¿¡°Ô °­ÇÔ
  221. POINT_ATTBONUS_SURA, // 56 ¼ö¶ó¿¡°Ô °­ÇÔ
  222. POINT_ATTBONUS_SHAMAN, // 57 ¹«´ç¿¡°Ô °­ÇÔ
  223. POINT_ATTBONUS_TREE, // 58 ³ª¹«¿¡°Ô °­ÇÔ 20050729.myevan UNUSED5
  224.  
  225. POINT_RESIST_WARRIOR, // 59 ¹«»ç¿¡°Ô ÀúÇ×
  226. POINT_RESIST_ASSASSIN, // 60 ÀÚ°´¿¡°Ô ÀúÇ×
  227. POINT_RESIST_SURA, // 61 ¼ö¶ó¿¡°Ô ÀúÇ×
  228. POINT_RESIST_SHAMAN, // 62 ¹«´ç¿¡°Ô ÀúÇ×
  229.  
  230. POINT_STEAL_HP, // 63 »ý¸í·Â Èí¼ö
  231. POINT_STEAL_SP, // 64 Á¤½Å·Â Èí¼ö
  232.  
  233. POINT_MANA_BURN_PCT, // 65 ¸¶³ª ¹ø
  234.  
  235. /// ÇÇÇØ½Ã º¸³Ê½º ///
  236.  
  237. POINT_DAMAGE_SP_RECOVER, // 66 °ø°Ý´çÇÒ ½Ã Á¤½Å·Â ȸº¹ È®·ü
  238.  
  239. POINT_BLOCK, // 67 ºí·°À²
  240. POINT_DODGE, // 68 ȸÇÇÀ²
  241.  
  242. POINT_RESIST_SWORD, // 69
  243. POINT_RESIST_TWOHAND, // 70
  244. POINT_RESIST_DAGGER, // 71
  245. POINT_RESIST_BELL, // 72
  246. POINT_RESIST_FAN, // 73
  247. POINT_RESIST_BOW, // 74 È­»ì ÀúÇ× : ´ë¹ÌÁö °¨¼Ò
  248. POINT_RESIST_FIRE, // 75 È­¿° ÀúÇ× : È­¿°°ø°Ý¿¡ ´ëÇÑ ´ë¹ÌÁö °¨¼Ò
  249. POINT_RESIST_ELEC, // 76 Àü±â ÀúÇ× : Àü±â°ø°Ý¿¡ ´ëÇÑ ´ë¹ÌÁö °¨¼Ò
  250. POINT_RESIST_MAGIC, // 77 ¼ú¹ý ÀúÇ× : ¸ðµç¼ú¹ý¿¡ ´ëÇÑ ´ë¹ÌÁö °¨¼Ò
  251. POINT_RESIST_WIND, // 78 ¹Ù¶÷ ÀúÇ× : ¹Ù¶÷°ø°Ý¿¡ ´ëÇÑ ´ë¹ÌÁö °¨¼Ò
  252.  
  253. POINT_REFLECT_MELEE, // 79 °ø°Ý ¹Ý»ç
  254.  
  255. /// Ư¼ö ÇÇÇØ½Ã ///
  256. POINT_REFLECT_CURSE, // 80 ÀúÁÖ ¹Ý»ç
  257. POINT_POISON_REDUCE, // 81 µ¶µ¥¹ÌÁö °¨¼Ò
  258.  
  259. /// Àû ¼Ò¸ê½Ã ///
  260. POINT_KILL_SP_RECOVER, // 82 Àû ¼Ò¸ê½Ã MP ȸº¹
  261. POINT_EXP_DOUBLE_BONUS, // 83
  262. POINT_GOLD_DOUBLE_BONUS, // 84
  263. POINT_ITEM_DROP_BONUS, // 85
  264.  
  265. /// ȸº¹ °ü·Ã ///
  266. POINT_POTION_BONUS, // 86
  267. POINT_KILL_HP_RECOVERY, // 87
  268.  
  269. POINT_IMMUNE_STUN, // 88
  270. POINT_IMMUNE_SLOW, // 89
  271. POINT_IMMUNE_FALL, // 90
  272. //////////////////
  273.  
  274. POINT_PARTY_ATTACKER_BONUS, // 91
  275. POINT_PARTY_TANKER_BONUS, // 92
  276.  
  277. POINT_ATT_BONUS, // 93
  278. POINT_DEF_BONUS, // 94
  279.  
  280. POINT_ATT_GRADE_BONUS, // 95
  281. POINT_DEF_GRADE_BONUS, // 96
  282. POINT_MAGIC_ATT_GRADE_BONUS, // 97
  283. POINT_MAGIC_DEF_GRADE_BONUS, // 98
  284.  
  285. POINT_RESIST_NORMAL_DAMAGE, // 99
  286.  
  287. POINT_HIT_HP_RECOVERY, // 100
  288. POINT_HIT_SP_RECOVERY, // 101
  289. POINT_MANASHIELD, // 102 Èæ½Å¼öÈ£ ½ºÅ³¿¡ ÀÇÇÑ ¸¶³ª½¯µå È¿°ú Á¤µµ
  290.  
  291. POINT_PARTY_BUFFER_BONUS, // 103
  292. POINT_PARTY_SKILL_MASTER_BONUS, // 104
  293.  
  294. POINT_HP_RECOVER_CONTINUE, // 105
  295. POINT_SP_RECOVER_CONTINUE, // 106
  296.  
  297. POINT_STEAL_GOLD, // 107
  298. POINT_POLYMORPH, // 108 º¯½ÅÇÑ ¸ó½ºÅÍ ¹øÈ£
  299. POINT_MOUNT, // 109 Ÿ°íÀÖ´Â ¸ó½ºÅÍ ¹øÈ£
  300.  
  301. POINT_PARTY_HASTE_BONUS, // 110
  302. POINT_PARTY_DEFENDER_BONUS, // 111
  303. POINT_STAT_RESET_COUNT, // 112 ÇÇÀÇ ´Ü¾à »ç¿ëÀ» ÅëÇÑ ½ºÅÝ ¸®¼Â Æ÷ÀÎÆ® (1´ç 1Æ÷ÀÎÆ® ¸®¼Â°¡´É)
  304.  
  305. POINT_HORSE_SKILL, // 113
  306.  
  307. POINT_MALL_ATTBONUS, // 114 °ø°Ý·Â +x%
  308. POINT_MALL_DEFBONUS, // 115 ¹æ¾î·Â +x%
  309. POINT_MALL_EXPBONUS, // 116 °æÇèÄ¡ +x%
  310. POINT_MALL_ITEMBONUS, // 117 ¾ÆÀÌÅÛ µå·ÓÀ² x/10¹è
  311. POINT_MALL_GOLDBONUS, // 118 µ· µå·ÓÀ² x/10¹è
  312.  
  313. POINT_MAX_HP_PCT, // 119 ÃÖ´ë»ý¸í·Â +x%
  314. POINT_MAX_SP_PCT, // 120 ÃÖ´ëÁ¤½Å·Â +x%
  315.  
  316. POINT_SKILL_DAMAGE_BONUS, // 121 ½ºÅ³ µ¥¹ÌÁö *(100+x)%
  317. POINT_NORMAL_HIT_DAMAGE_BONUS, // 122 ÆòŸ µ¥¹ÌÁö *(100+x)%
  318.  
  319. // DEFEND_BONUS_ATTRIBUTES
  320. POINT_SKILL_DEFEND_BONUS, // 123 ½ºÅ³ ¹æ¾î µ¥¹ÌÁö
  321. POINT_NORMAL_HIT_DEFEND_BONUS, // 124 ÆòŸ ¹æ¾î µ¥¹ÌÁö
  322. // END_OF_DEFEND_BONUS_ATTRIBUTES
  323.  
  324. // PC_BANG_ITEM_ADD
  325. POINT_PC_BANG_EXP_BONUS, // 125 PC¹æ Àü¿ë °æÇèÄ¡ º¸³Ê½º
  326. POINT_PC_BANG_DROP_BONUS, // 126 PC¹æ Àü¿ë µå·Ó·ü º¸³Ê½º
  327. // END_PC_BANG_ITEM_ADD
  328. POINT_RAMADAN_CANDY_BONUS_EXP, // ¶ó¸¶´Ü »çÅÁ °æÇèÄ¡ Áõ°¡¿ë
  329.  
  330. POINT_ENERGY = 128, // 128 ±â·Â
  331.  
  332. // ±â·Â ui ¿ë.
  333. // ¼­¹ö¿¡¼­ ¾²Áö ¾Ê±â¸¸, Ŭ¶óÀÌ¾ðÆ®¿¡¼­ ±â·ÂÀÇ ³¡ ½Ã°£À» POINT·Î °ü¸®Çϱ⠶§¹®¿¡ ÀÌ·¸°Ô ÇÑ´Ù.
  334. // ¾Æ ºÎ²ô·´´Ù
  335. POINT_ENERGY_END_TIME = 129, // 129 ±â·Â Á¾·á ½Ã°£
  336.  
  337. POINT_COSTUME_ATTR_BONUS = 130,
  338. POINT_MAGIC_ATT_BONUS_PER = 131,
  339. POINT_MELEE_MAGIC_ATT_BONUS_PER = 132,
  340.  
  341. // Ãß°¡ ¼Ó¼º ÀúÇ×
  342. POINT_RESIST_ICE = 133, // ³Ã±â ÀúÇ× : ¾óÀ½°ø°Ý¿¡ ´ëÇÑ ´ë¹ÌÁö °¨¼Ò
  343. POINT_RESIST_EARTH = 134, // ´ëÁö ÀúÇ× : ¾óÀ½°ø°Ý¿¡ ´ëÇÑ ´ë¹ÌÁö °¨¼Ò
  344. POINT_RESIST_DARK = 135, // ¾îµÒ ÀúÇ× : ¾óÀ½°ø°Ý¿¡ ´ëÇÑ ´ë¹ÌÁö °¨¼Ò
  345.  
  346. POINT_RESIST_CRITICAL = 136, // Å©¸®Æ¼Äà ÀúÇ× : »ó´ëÀÇ Å©¸®Æ¼Äà Ȯ·üÀ» °¨¼Ò
  347. POINT_RESIST_PENETRATE = 137, // °üÅëŸ°Ý ÀúÇ× : »ó´ëÀÇ °üÅëŸ°Ý È®·üÀ» °¨¼Ò
  348. #ifdef ENABLE_GEM_SYSTEM
  349. POINT_GEM = 147,
  350. #endif
  351. #ifdef __ENABLE_BATTLE_FIELD__
  352. POINT_BATTLE_POINT = 148,
  353. POINT_TEMP_BATTLE_POINT = 149,
  354. #endif
  355.  
  356. #ifdef ENABLE_WOLFMAN_CHARACTER
  357. POINT_BLEEDING_REDUCE = 138,
  358. POINT_BLEEDING_PCT = 139,
  359.  
  360. POINT_ATTBONUS_WOLFMAN = 140, // 140 ¼öÀÎÁ·¿¡°Ô °­ÇÔ
  361. POINT_RESIST_WOLFMAN = 141, // 141 ¼öÀÎÁ·¿¡°Ô ÀúÇ×
  362. POINT_RESIST_CLAW = 142, // 142 CLAW¿¡ ÀúÇ×
  363. #endif
  364.  
  365. #ifdef ENABLE_ACCE_COSTUME_SYSTEM
  366. POINT_ACCEDRAIN_RATE = 143,
  367. #endif
  368. #ifdef ENABLE_MAGIC_REDUCTION_SYSTEM
  369. POINT_RESIST_MAGIC_REDUCTION = 144,
  370. #endif
  371.  
  372. #ifdef __TITLE_SYSTEM__
  373. POINT_TITLE = 150,
  374. POINT_TITLE_1 = 151,
  375. POINT_TITLE_2 = 152,
  376. POINT_TITLE_3 = 153,
  377. POINT_TITLE_4 = 154,
  378. POINT_TITLE_5 = 155,
  379. POINT_TITLE_6 = 156,
  380. POINT_TITLE_7 = 157,
  381. POINT_TITLE_8 = 158,
  382. POINT_TITLE_9 = 159,
  383. POINT_TITLE_10 = 160,
  384. POINT_TITLE_11 = 161,
  385. POINT_TITLE_12 = 162,
  386. POINT_TITLE_13 = 163,
  387. POINT_TITLE_14 = 164,
  388. POINT_TITLE_15 = 165,
  389. POINT_TITLE_16 = 166,
  390. POINT_TITLE_17 = 167,
  391. POINT_TITLE_18 = 168,
  392. POINT_TITLE_19 = 169,
  393. POINT_TITLE_20 = 170,
  394. #endif
  395. //POINT_MAX_NUM = 129 common/length.h
  396. };
  397.  
  398. enum EPKModes
  399. {
  400. PK_MODE_PEACE,
  401. PK_MODE_REVENGE,
  402. PK_MODE_FREE,
  403. PK_MODE_PROTECT,
  404. PK_MODE_GUILD,
  405. #ifdef __ENABLE_BATTLE_FIELD__
  406. PK_MODE_BATTLE,
  407. #endif
  408. PK_MODE_MAX_NUM
  409. };
  410.  
  411. enum EPositions
  412. {
  413. POS_DEAD,
  414. POS_SLEEPING,
  415. POS_RESTING,
  416. POS_SITTING,
  417. POS_FISHING,
  418. POS_FIGHTING,
  419. POS_MOUNTING,
  420. POS_STANDING
  421. };
  422.  
  423. enum EBlockAction
  424. {
  425. BLOCK_EXCHANGE = (1 << 0),
  426. BLOCK_PARTY_INVITE = (1 << 1),
  427. BLOCK_GUILD_INVITE = (1 << 2),
  428. BLOCK_WHISPER = (1 << 3),
  429. BLOCK_MESSENGER_INVITE = (1 << 4),
  430. BLOCK_PARTY_REQUEST = (1 << 5),
  431. };
  432.  
  433. // <Factor> Dynamically evaluated CHARACTER* equivalent.
  434. // Referring to SCharDeadEventInfo.
  435. struct DynamicCharacterPtr {
  436. DynamicCharacterPtr() : is_pc(false), id(0) {}
  437. DynamicCharacterPtr(const DynamicCharacterPtr& o)
  438. : is_pc(o.is_pc), id(o.id) {}
  439.  
  440. // Returns the LPCHARACTER found in CHARACTER_MANAGER.
  441. LPCHARACTER Get() const;
  442. // Clears the current settings.
  443. void Reset() {
  444. is_pc = false;
  445. id = 0;
  446. }
  447.  
  448. // Basic assignment operator.
  449. DynamicCharacterPtr& operator=(const DynamicCharacterPtr& rhs) {
  450. is_pc = rhs.is_pc;
  451. id = rhs.id;
  452. return *this;
  453. }
  454. // Supports assignment with LPCHARACTER type.
  455. DynamicCharacterPtr& operator=(LPCHARACTER character);
  456. // Supports type casting to LPCHARACTER.
  457. operator LPCHARACTER() const {
  458. return Get();
  459. }
  460.  
  461. bool is_pc;
  462. uint32_t id;
  463. };
  464.  
  465. /* ÀúÀåÇÏ´Â µ¥ÀÌÅÍ */
  466. typedef struct character_point
  467. {
  468. long long points[POINT_MAX_NUM];
  469.  
  470. BYTE job;
  471. BYTE voice;
  472.  
  473. BYTE level;
  474. DWORD exp;
  475. long long gold;
  476. #ifdef ENABLE_GEM_SYSTEM
  477. long gem;
  478. #endif
  479. #ifdef __ENABLE_BATTLE_FIELD__
  480. long battlePoint;
  481. #endif
  482. int hp;
  483. int sp;
  484.  
  485. int iRandomHP;
  486. int iRandomSP;
  487.  
  488. int stamina;
  489.  
  490. BYTE skill_group;
  491. } CHARACTER_POINT;
  492.  
  493. /* ÀúÀåµÇÁö ¾Ê´Â ij¸¯ÅÍ µ¥ÀÌÅÍ */
  494. typedef struct character_point_instant
  495. {
  496. long long points[POINT_MAX_NUM];
  497.  
  498. float fRot;
  499.  
  500. int iMaxHP;
  501. int iMaxSP;
  502.  
  503. long position;
  504.  
  505. long instant_flag;
  506. DWORD dwAIFlag;
  507. DWORD dwImmuneFlag;
  508. DWORD dwLastShoutPulse;
  509.  
  510. WORD parts[PART_MAX_NUM];
  511.  
  512. // ¾Æ... ÁøÂ¥ ¿åÀ» ¾È ÇÒ·¡¾ß ¾È ÇÒ ¼ö°¡ ¾ø´Ù.
  513. // char´Â Àκ¥À» BYTE array·Î grid¸¦ °ü¸®Çϰí, exchange³ª cube´Â CGrid·Î grid¸¦ °ü¸®ÇÏ°í ¹¹³Ä À̰Å...
  514. // grid¸¦ ¸¸µé¾î ³ùÀ¸¸é grid¸¦ ¾²¶õ ¸»À̾ß!!!
  515. // ¤µ¤² ¿ëÈ¥¼® Àκ¥À» ¶È°°ÀÌ µû¶ó¼­ ¸¸µç ³ªµµ À߸øÇß´Ù ¤Ð¤Ð
  516. LPITEM pItems[INVENTORY_AND_EQUIP_SLOT_MAX];
  517. BYTE bItemGrid[INVENTORY_AND_EQUIP_SLOT_MAX];
  518.  
  519. // ¿ëÈ¥¼® Àκ¥Å丮.
  520. LPITEM pDSItems[DRAGON_SOUL_INVENTORY_MAX_NUM];
  521. WORD wDSItemGrid[DRAGON_SOUL_INVENTORY_MAX_NUM];
  522. #ifdef __SPECIAL_STORAGE__
  523. LPITEM pSSUItems[SPECIAL_INVENTORY_MAX_NUM];
  524. WORD wSSUItemGrid[SPECIAL_INVENTORY_MAX_NUM];
  525. LPITEM pSSBItems[SPECIAL_INVENTORY_MAX_NUM];
  526. WORD wSSBItemGrid[SPECIAL_INVENTORY_MAX_NUM];
  527. LPITEM pSSSItems[SPECIAL_INVENTORY_MAX_NUM];
  528. WORD wSSSItemGrid[SPECIAL_INVENTORY_MAX_NUM];
  529. #endif
  530. // by mhh
  531. LPITEM pCubeItems[CUBE_MAX_NUM];
  532. LPCHARACTER pCubeNpc;
  533. #ifdef __CHANGELOOK_SYSTEM__
  534. LPITEM pClMaterials[CL_WINDOW_MAX_MATERIALS];
  535. #endif
  536.  
  537. #ifdef __SASH_SYSTEM__
  538. LPITEM pSashMaterials[SASH_WINDOW_MAX_MATERIALS];
  539. #endif
  540.  
  541. LPCHARACTER battle_victim;
  542.  
  543. BYTE gm_level;
  544.  
  545. BYTE bBasePart; // Æò»óº¹ ¹øÈ£
  546.  
  547. int iMaxStamina;
  548.  
  549. BYTE bBlockMode;
  550.  
  551. int iDragonSoulActiveDeck;
  552. LPENTITY m_pDragonSoulRefineWindowOpener;
  553. } CHARACTER_POINT_INSTANT;
  554.  
  555. #define TRIGGERPARAM LPCHARACTER ch, LPCHARACTER causer
  556.  
  557. typedef struct trigger
  558. {
  559. BYTE type;
  560. int (*func) (TRIGGERPARAM);
  561. long value;
  562. } TRIGGER;
  563.  
  564. class CTrigger
  565. {
  566. public:
  567. CTrigger() : bType(0), pFunc(NULL)
  568. {
  569. }
  570.  
  571. BYTE bType;
  572. int (*pFunc) (TRIGGERPARAM);
  573. };
  574.  
  575. EVENTINFO(char_event_info)
  576. {
  577. DynamicCharacterPtr ch;
  578. };
  579.  
  580. struct TSkillUseInfo
  581. {
  582. int iHitCount;
  583. int iMaxHitCount;
  584. int iSplashCount;
  585. DWORD dwNextSkillUsableTime;
  586. int iRange;
  587. bool bUsed;
  588. DWORD dwVID;
  589. bool isGrandMaster;
  590.  
  591. boost::unordered_map<VID, size_t> TargetVIDMap;
  592.  
  593. TSkillUseInfo()
  594. : iHitCount(0), iMaxHitCount(0), iSplashCount(0), dwNextSkillUsableTime(0), iRange(0), bUsed(false),
  595. dwVID(0), isGrandMaster(false)
  596. {}
  597.  
  598. bool HitOnce(DWORD dwVnum = 0);
  599.  
  600. bool IsCooltimeOver() const;
  601. bool UseSkill(bool isGrandMaster, DWORD vid, DWORD dwCooltime, int splashcount = 1, int hitcount = -1, int range = -1);
  602. DWORD GetMainTargetVID() const { return dwVID; }
  603. void SetMainTargetVID(DWORD vid) { dwVID=vid; }
  604. void ResetHitCount() { if (iSplashCount) { iHitCount = iMaxHitCount; iSplashCount--; } }
  605. };
  606.  
  607. typedef struct packet_party_update TPacketGCPartyUpdate;
  608. class CExchange;
  609. class CSkillProto;
  610. class CParty;
  611. class CDungeon;
  612. class CWarMap;
  613. class CAffect;
  614. class CGuild;
  615. class CSafebox;
  616. class CArena;
  617. #ifdef OFFLINE_SHOP
  618. #include "../libgame/include/grid.h"
  619. typedef struct SPrivShop
  620. {
  621. DWORD shop_id;
  622. DWORD shop_vid;
  623. char szSign[SHOP_SIGN_MAX_LEN + 1];
  624. BYTE item_count;
  625. BYTE rest_count;
  626. BYTE days;
  627. DWORD date_close;
  628. long long gold;
  629.  
  630. } TPrivShop;
  631.  
  632. typedef std::map<DWORD, TPrivShop> PSHOP_MAP;
  633. #endif
  634.  
  635. #ifdef GIFT_SYSTEM
  636. typedef struct SGiftItem
  637. {
  638. DWORD id;
  639. WORD pos;
  640. #ifdef FULL_YANG
  641. long long count;
  642. #else
  643. DWORD count;
  644. #endif
  645. DWORD vnum;
  646. long alSockets[ITEM_SOCKET_MAX_NUM]; // ??A????¨©
  647.  
  648. TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
  649. char szFrom[101];
  650. char szReason[101];
  651. DWORD dwDateAdd;
  652. } TGiftItem;
  653. typedef std::map<int, std::vector<TGiftItem> > GIFT_MAP;
  654. #endif
  655.  
  656. class CShop;
  657. typedef class CShop * LPSHOP;
  658.  
  659. class CMob;
  660. class CMobInstance;
  661. typedef struct SMobSkillInfo TMobSkillInfo;
  662.  
  663. //SKILL_POWER_BY_LEVEL
  664. extern int GetSkillPowerByLevelFromType(int job, int skillgroup, int skilllevel);
  665. //END_SKILL_POWER_BY_LEVEL
  666.  
  667. namespace marriage
  668. {
  669. class WeddingMap;
  670. }
  671. enum e_overtime
  672. {
  673. OT_NONE,
  674. OT_3HOUR,
  675. OT_5HOUR,
  676. };
  677.  
  678. #define NEW_ICEDAMAGE_SYSTEM
  679. class CHARACTER : public CEntity, public CFSM, public CHorseRider
  680. {
  681. protected:
  682. //////////////////////////////////////////////////////////////////////////////////
  683. // Entity °ü·Ã
  684. virtual void EncodeInsertPacket(LPENTITY entity);
  685. virtual void EncodeRemovePacket(LPENTITY entity);
  686. //////////////////////////////////////////////////////////////////////////////////
  687.  
  688. public:
  689. LPCHARACTER FindCharacterInView(const char * name, bool bFindPCOnly);
  690. void UpdatePacket();
  691. std::string GetLang();
  692. //////////////////////////////////////////////////////////////////////////////////
  693. // FSM (Finite State Machine) °ü·Ã
  694. protected:
  695. CStateTemplate<CHARACTER> m_stateMove;
  696. CStateTemplate<CHARACTER> m_stateBattle;
  697. CStateTemplate<CHARACTER> m_stateIdle;
  698.  
  699. public:
  700. virtual void StateMove();
  701. virtual void StateBattle();
  702. virtual void StateIdle();
  703. virtual void StateFlag();
  704. virtual void StateFlagBase();
  705. void StateHorse();
  706.  
  707. protected:
  708. // STATE_IDLE_REFACTORING
  709. void __StateIdle_Monster();
  710. void __StateIdle_Stone();
  711. void __StateIdle_NPC();
  712. // END_OF_STATE_IDLE_REFACTORING
  713.  
  714. public:
  715. DWORD GetAIFlag() const { return m_pointsInstant.dwAIFlag; }
  716.  
  717. void SetAggressive();
  718. bool IsAggressive() const;
  719.  
  720. void SetCoward();
  721. bool IsCoward() const;
  722. void CowardEscape();
  723.  
  724. void SetNoAttackShinsu();
  725. bool IsNoAttackShinsu() const;
  726.  
  727. void SetNoAttackChunjo();
  728. bool IsNoAttackChunjo() const;
  729.  
  730. void SetNoAttackJinno();
  731. bool IsNoAttackJinno() const;
  732.  
  733. void SetAttackMob();
  734. bool IsAttackMob() const;
  735.  
  736. virtual void BeginStateEmpty();
  737. virtual void EndStateEmpty() {}
  738.  
  739. void RestartAtSamePos();
  740.  
  741. protected:
  742. DWORD m_dwStateDuration;
  743. //////////////////////////////////////////////////////////////////////////////////
  744.  
  745. public:
  746. CHARACTER();
  747. virtual ~CHARACTER();
  748.  
  749. void Create(const char * c_pszName, DWORD vid, bool isPC);
  750. void Destroy();
  751.  
  752. void Disconnect(const char * c_pszReason);
  753.  
  754. protected:
  755. void Initialize();
  756.  
  757. //////////////////////////////////////////////////////////////////////////////////
  758. // Basic Points
  759. #ifdef __SEND_TARGET_INFO__
  760. private:
  761. DWORD dwLastTargetInfoPulse;
  762.  
  763. public:
  764. DWORD GetLastTargetInfoPulse() const { return dwLastTargetInfoPulse; }
  765. void SetLastTargetInfoPulse(DWORD pulse) { dwLastTargetInfoPulse = pulse; }
  766. #endif
  767. public:
  768. DWORD GetPlayerID() const { return m_dwPlayerID; }
  769. #ifdef __UPGRADE_ITEMS_STORAGE__
  770. DWORD GetID() const { return m_dwPlayerID; }
  771. #endif
  772. void SetPlayerProto(const TPlayerTable * table);
  773. void CreatePlayerProto(TPlayerTable & tab); // ÀúÀå ½Ã »ç¿ë
  774.  
  775. void SetProto(const CMob * c_pkMob);
  776. WORD GetRaceNum() const;
  777.  
  778. void Save(); // DelayedSave
  779. void SaveReal(); // ½ÇÁ¦ ÀúÀå
  780. void FlushDelayedSaveItem();
  781.  
  782. const char * GetName() const;
  783. const VID & GetVID() const { return m_vid; }
  784.  
  785. void SetName(const std::string& name) { m_stName = name; }
  786.  
  787. void SetRace(BYTE race);
  788. bool ChangeSex();
  789.  
  790. DWORD GetAID() const;
  791. DWORD Ep_Miktar();
  792. void Set_Ep(DWORD black);
  793. int GetChangeEmpireCount() const;
  794. void SetChangeEmpireCount();
  795. int ChangeEmpire(BYTE empire);
  796.  
  797. BYTE GetJob() const;
  798. BYTE GetCharType() const;
  799.  
  800. bool IsPC() const { return GetDesc() ? true : false; }
  801. bool IsNPC() const { return m_bCharType != CHAR_TYPE_PC; }
  802. bool IsMonster() const { return m_bCharType == CHAR_TYPE_MONSTER; }
  803. bool IsStone() const { return m_bCharType == CHAR_TYPE_STONE; }
  804. bool IsDoor() const { return m_bCharType == CHAR_TYPE_DOOR; }
  805. bool IsBuilding() const { return m_bCharType == CHAR_TYPE_BUILDING; }
  806. bool IsWarp() const { return m_bCharType == CHAR_TYPE_WARP; }
  807. bool IsGoto() const { return m_bCharType == CHAR_TYPE_GOTO; }
  808. // bool IsPet() const { return m_bCharType == CHAR_TYPE_PET; }
  809.  
  810. DWORD GetLastShoutPulse() const { return m_pointsInstant.dwLastShoutPulse; }
  811. void SetLastShoutPulse(DWORD pulse) { m_pointsInstant.dwLastShoutPulse = pulse; }
  812. int GetLevel() const { return m_points.level; }
  813. void SetLevel(BYTE level);
  814.  
  815. BYTE GetGMLevel() const;
  816. BOOL IsGM() const;
  817. void SetGMLevel();
  818.  
  819. DWORD GetExp() const { return m_points.exp; }
  820. void SetExp(DWORD exp) { m_points.exp = exp; }
  821. bool block_exp;
  822. DWORD GetNextExp() const;
  823. #ifdef NEW_PET_SYSTEM
  824. DWORD PetGetNextExp() const;
  825. #endif
  826. LPCHARACTER DistributeExp(); // Á¦ÀÏ ¸¹ÀÌ ¶§¸° »ç¶÷À» ¸®ÅÏÇÑ´Ù.
  827. void DistributeHP(LPCHARACTER pkKiller);
  828. void DistributeSP(LPCHARACTER pkKiller, int iMethod=0);
  829.  
  830. void SetPosition(int pos);
  831. bool IsPosition(int pos) const { return m_pointsInstant.position == pos ? true : false; }
  832. int GetPosition() const { return m_pointsInstant.position; }
  833.  
  834. void SetPart(BYTE bPartPos, WORD wVal);
  835. WORD GetPart(BYTE bPartPos) const;
  836. WORD GetOriginalPart(BYTE bPartPos) const;
  837.  
  838. void SetHP(int hp) { m_points.hp = hp; }
  839. int GetHP() const { return m_points.hp; }
  840.  
  841. void SetSP(int sp) { m_points.sp = sp; }
  842. int GetSP() const { return m_points.sp; }
  843.  
  844. void SetStamina(int stamina) { m_points.stamina = stamina; }
  845. int GetStamina() const { return m_points.stamina; }
  846.  
  847. void SetMaxHP(int iVal) { m_pointsInstant.iMaxHP = iVal; }
  848. int GetMaxHP() const { return m_pointsInstant.iMaxHP; }
  849.  
  850. void SetMaxSP(int iVal) { m_pointsInstant.iMaxSP = iVal; }
  851. int GetMaxSP() const { return m_pointsInstant.iMaxSP; }
  852.  
  853. void SetMaxStamina(int iVal) { m_pointsInstant.iMaxStamina = iVal; }
  854. int GetMaxStamina() const { return m_pointsInstant.iMaxStamina; }
  855.  
  856. void SetRandomHP(int v) { m_points.iRandomHP = v; }
  857. void SetRandomSP(int v) { m_points.iRandomSP = v; }
  858.  
  859. int GetRandomHP() const { return m_points.iRandomHP; }
  860. int GetRandomSP() const { return m_points.iRandomSP; }
  861.  
  862. int GetHPPct() const;
  863.  
  864. void SetRealPoint(BYTE idx, int val);
  865. int GetRealPoint(BYTE idx) const;
  866.  
  867. void SetPoint(BYTE idx, long long val);
  868. long long GetPoint(BYTE idx) const;
  869. int GetLimitPoint(BYTE idx) const;
  870. int GetPolymorphPoint(BYTE idx) const;
  871.  
  872. const TMobTable & GetMobTable() const;
  873. BYTE GetMobRank() const;
  874. BYTE GetMobBattleType() const;
  875. BYTE GetMobSize() const;
  876. DWORD GetMobDamageMin() const;
  877. DWORD GetMobDamageMax() const;
  878. WORD GetMobAttackRange() const;
  879. DWORD GetMobDropItemVnum() const;
  880. float GetMobDamageMultiply() const;
  881.  
  882. // NEWAI
  883. bool IsBerserker() const;
  884. bool IsBerserk() const;
  885. void SetBerserk(bool mode);
  886.  
  887. bool IsStoneSkinner() const;
  888.  
  889. bool IsGodSpeeder() const;
  890. bool IsGodSpeed() const;
  891. void SetGodSpeed(bool mode);
  892.  
  893. bool IsDeathBlower() const;
  894. bool IsDeathBlow() const;
  895.  
  896. bool IsReviver() const;
  897. bool HasReviverInParty() const;
  898. bool IsRevive() const;
  899. void SetRevive(bool mode);
  900. // NEWAI END
  901.  
  902. bool IsRaceFlag(DWORD dwBit) const;
  903. bool IsSummonMonster() const;
  904. DWORD GetSummonVnum() const;
  905.  
  906. DWORD GetPolymorphItemVnum() const;
  907. DWORD GetMonsterDrainSPPoint() const;
  908.  
  909. void MainCharacterPacket(); // ³»°¡ ¸ÞÀÎij¸¯ÅͶó°í º¸³»ÁØ´Ù.
  910.  
  911. void ComputePoints();
  912. void ComputeBattlePoints();
  913. void PointChange(BYTE type, long long amount, bool bAmount = false, bool bBroadcast = false);
  914. void PointsPacket();
  915. void ApplyPoint(BYTE bApplyType, int iVal);
  916. #ifdef NEW_PET_SYSTEM
  917. void SendPetLevelUpEffect(int vid, int type, int value, int amount);
  918. #endif
  919. void CheckMaximumPoints(); // HP, SP µîÀÇ ÇöÀç °ªÀÌ ÃÖ´ë°ª º¸´Ù ³ôÀºÁö °Ë»çÇÏ°í ³ô´Ù¸é ³·Ãá´Ù.
  920.  
  921. bool Show(long lMapIndex, long x, long y, long z = LONG_MAX, bool bShowSpawnMotion = false);
  922.  
  923. void Sitdown(int is_ground);
  924. void Standup();
  925.  
  926. void SetRotation(float fRot);
  927. void SetRotationToXY(long x, long y);
  928. float GetRotation() const { return m_pointsInstant.fRot; }
  929.  
  930. void MotionPacketEncode(BYTE motion, LPCHARACTER victim, struct packet_motion * packet);
  931. void Motion(BYTE motion, LPCHARACTER victim = NULL);
  932.  
  933. void ChatPacket(BYTE type, const char *format, ...);
  934. void MonsterChat(BYTE bMonsterChatType);
  935. void SendGreetMessage();
  936.  
  937. void ResetPoint(int iLv);
  938.  
  939. void SetBlockMode(BYTE bFlag);
  940. void SetBlockModeForce(BYTE bFlag);
  941. bool IsBlockMode(BYTE bFlag) const { return (m_pointsInstant.bBlockMode & bFlag)?true:false; }
  942.  
  943. bool IsPolymorphed() const { return m_dwPolymorphRace>0; }
  944. bool IsPolyMaintainStat() const { return m_bPolyMaintainStat; } // ÀÌÀü ½ºÅÝÀ» À¯ÁöÇÏ´Â Æú¸®¸ðÇÁ.
  945. void SetPolymorph(DWORD dwRaceNum, bool bMaintainStat = false);
  946. DWORD GetPolymorphVnum() const { return m_dwPolymorphRace; }
  947. int GetPolymorphPower() const;
  948.  
  949. // FISING
  950. void fishing();
  951. void fishing_take();
  952. // END_OF_FISHING
  953.  
  954. // MINING
  955. void mining(LPCHARACTER chLoad);
  956. void mining_cancel();
  957. void mining_take();
  958. // END_OF_MINING
  959.  
  960. void ResetPlayTime(DWORD dwTimeRemain = 0);
  961.  
  962. void CreateFly(BYTE bType, LPCHARACTER pkVictim);
  963.  
  964. void ResetChatCounter();
  965. BYTE IncreaseChatCounter();
  966. BYTE GetChatCounter() const;
  967. #ifdef __TITLE_SYSTEM__
  968. void EquipTitle(LPITEM item);
  969. void UnequipTitle(LPITEM item);
  970. void CheckTitle();
  971. void SetTitle(int iTitle, BYTE bValue);
  972. bool GetTitle(int iTitle);
  973. bool ChooseTitle(int iTitle);
  974. void pChooseTitle(int iTitle);
  975. int ChoosedTitle();
  976. const char * GetTitlesAvailable() const;
  977. #endif
  978.  
  979. protected:
  980. DWORD m_dwPolymorphRace;
  981. bool m_bPolyMaintainStat;
  982. DWORD m_dwLoginPlayTime;
  983. DWORD m_dwPlayerID;
  984. VID m_vid;
  985. std::string m_stName;
  986. #ifdef NEW_PET_SYSTEM
  987. BYTE m_stImmortalSt;
  988. #endif
  989. BYTE m_bCharType;
  990. #ifdef NEW_PET_SYSTEM
  991. DWORD m_newpetskillcd[3];
  992. #endif
  993.  
  994. CHARACTER_POINT m_points;
  995. CHARACTER_POINT_INSTANT m_pointsInstant;
  996.  
  997. int m_iMoveCount;
  998. DWORD m_dwPlayStartTime;
  999. BYTE m_bAddChrState;
  1000. bool m_bSkipSave;
  1001. std::string m_stMobile;
  1002. char m_szMobileAuth[5];
  1003. BYTE m_bChatCounter;
  1004.  
  1005. // End of Basic Points
  1006.  
  1007. //////////////////////////////////////////////////////////////////////////////////
  1008. // Move & Synchronize Positions
  1009. //////////////////////////////////////////////////////////////////////////////////
  1010. public:
  1011. bool IsStateMove() const { return IsState((CState&)m_stateMove); }
  1012. bool IsStateIdle() const { return IsState((CState&)m_stateIdle); }
  1013. bool IsWalking() const { return m_bNowWalking || GetStamina()<=0; }
  1014. void SetWalking(bool bWalkFlag) { m_bWalking=bWalkFlag; }
  1015. void SetNowWalking(bool bWalkFlag);
  1016. void ResetWalking() { SetNowWalking(m_bWalking); }
  1017.  
  1018. bool Goto(long x, long y); // ¹Ù·Î À̵¿ ½ÃŰÁö ¾Ê°í ¸ñÇ¥ À§Ä¡·Î BLENDING ½ÃŲ´Ù.
  1019. void Stop();
  1020.  
  1021. bool CanMove() const; // À̵¿ÇÒ ¼ö Àִ°¡?
  1022.  
  1023. void SyncPacket();
  1024. bool Sync(long x, long y); // ½ÇÁ¦ ÀÌ ¸Þ¼Òµå·Î À̵¿ ÇÑ´Ù (°¢ Á¾ Á¶°Ç¿¡ ÀÇÇÑ À̵¿ ºÒ°¡°¡ ¾øÀ½)
  1025. bool Move(long x, long y); // Á¶°ÇÀ» °Ë»çÇϰí Sync ¸Þ¼Òµå¸¦ ÅëÇØ À̵¿ ÇÑ´Ù.
  1026. void OnMove(bool bIsAttack = false); // ¿òÁ÷À϶§ ºÒ¸°´Ù. Move() ¸Þ¼Òµå À̿ܿ¡¼­µµ ºÒ¸± ¼ö ÀÖ´Ù.
  1027. DWORD GetMotionMode() const;
  1028. float GetMoveMotionSpeed() const;
  1029. float GetMoveSpeed() const;
  1030. void CalculateMoveDuration();
  1031. void SendMovePacket(BYTE bFunc, BYTE bArg, DWORD x, DWORD y, DWORD dwDuration, DWORD dwTime=0, int iRot=-1);
  1032. #ifdef ENABLE_SUPPORT_SYSTEM
  1033. void SendSupportSkillPacket(DWORD skill_vnum);
  1034. DWORD SupportGetNextExp() const;
  1035. #endif
  1036. DWORD GetCurrentMoveDuration() const { return m_dwMoveDuration; }
  1037. DWORD GetWalkStartTime() const { return m_dwWalkStartTime; }
  1038. DWORD GetLastMoveTime() const { return m_dwLastMoveTime; }
  1039. DWORD GetLastAttackTime() const { return m_dwLastAttackTime; }
  1040.  
  1041. void SetLastAttacked(DWORD time); // ¸¶Áö¸·À¸·Î °ø°Ý¹ÞÀº ½Ã°£ ¹× À§Ä¡¸¦ ÀúÀåÇÔ
  1042.  
  1043. bool SetSyncOwner(LPCHARACTER ch, bool bRemoveFromList = true);
  1044. bool IsSyncOwner(LPCHARACTER ch) const;
  1045.  
  1046. bool WarpSet(long x, long y, long lRealMapIndex = 0);
  1047. void SetWarpLocation(long lMapIndex, long x, long y);
  1048. void WarpEnd();
  1049. const PIXEL_POSITION & GetWarpPosition() const { return m_posWarp; }
  1050. bool WarpToPID(DWORD dwPID);
  1051.  
  1052. void SaveExitLocation();
  1053. void ExitToSavedLocation();
  1054.  
  1055. void StartStaminaConsume();
  1056. void StopStaminaConsume();
  1057. bool IsStaminaConsume() const;
  1058. bool IsStaminaHalfConsume() const;
  1059.  
  1060. void ResetStopTime();
  1061. DWORD GetStopTime() const;
  1062.  
  1063. protected:
  1064. void ClearSync();
  1065.  
  1066. float m_fSyncTime;
  1067. LPCHARACTER m_pkChrSyncOwner;
  1068. CHARACTER_LIST m_kLst_pkChrSyncOwned; // ³»°¡ SyncOwnerÀÎ ÀÚµé
  1069.  
  1070. PIXEL_POSITION m_posDest;
  1071. PIXEL_POSITION m_posStart;
  1072. PIXEL_POSITION m_posWarp;
  1073. long m_lWarpMapIndex;
  1074.  
  1075. PIXEL_POSITION m_posExit;
  1076. long m_lExitMapIndex;
  1077.  
  1078. DWORD m_dwMoveStartTime;
  1079. DWORD m_dwMoveDuration;
  1080.  
  1081. DWORD m_dwLastMoveTime;
  1082. DWORD m_dwLastAttackTime;
  1083. DWORD m_dwWalkStartTime;
  1084. DWORD m_dwStopTime;
  1085.  
  1086. bool m_bWalking;
  1087. bool m_bNowWalking;
  1088. bool m_bStaminaConsume;
  1089. // End
  1090.  
  1091. // Quickslot °ü·Ã
  1092. public:
  1093. void SyncQuickslot(BYTE bType, BYTE bOldPos, BYTE bNewPos);
  1094. bool GetQuickslot(BYTE pos, TQuickslot ** ppSlot);
  1095. bool SetQuickslot(BYTE pos, TQuickslot & rSlot);
  1096. bool DelQuickslot(BYTE pos);
  1097. bool SwapQuickslot(BYTE a, BYTE b);
  1098. void ChainQuickslotItem(LPITEM pItem, BYTE bType, BYTE bOldPos);
  1099.  
  1100. protected:
  1101. TQuickslot m_quickslot[QUICKSLOT_MAX_NUM];
  1102. #ifdef ENABLE_FISH_EVENT
  1103. TPlayerFishEventSlot* m_fishSlots;
  1104. #endif
  1105. #ifdef ENABLE_GEM_SYSTEM
  1106. TPlayerGemItems* m_gemItems;
  1107. #endif
  1108.  
  1109. ////////////////////////////////////////////////////////////////////////////////////////
  1110. // Affect
  1111. public:
  1112. void StartAffectEvent();
  1113. void ClearAffect(bool bSave=false);
  1114. void ComputeAffect(CAffect * pkAff, bool bAdd);
  1115. bool AddAffect(DWORD dwType, BYTE bApplyOn, long lApplyValue, DWORD dwFlag, long lDuration, long lSPCost, bool bOverride, bool IsCube = false);
  1116. void RefreshAffect();
  1117. bool RemoveAffect(DWORD dwType);
  1118. bool IsAffectFlag(DWORD dwAff) const;
  1119.  
  1120. bool UpdateAffect(); // called from EVENT
  1121. int ProcessAffect();
  1122.  
  1123. void LoadAffect(DWORD dwCount, TPacketAffectElement * pElements);
  1124. void SaveAffect();
  1125.  
  1126. // Affect loadingÀÌ ³¡³­ »óÅÂÀΰ¡?
  1127. bool IsLoadedAffect() const { return m_bIsLoadedAffect; }
  1128.  
  1129. bool IsGoodAffect(BYTE bAffectType) const;
  1130.  
  1131. void RemoveGoodAffect();
  1132. void RemoveBadAffect();
  1133.  
  1134. CAffect * FindAffect(DWORD dwType, BYTE bApply=APPLY_NONE) const;
  1135. const std::list<CAffect *> & GetAffectContainer() const { return m_list_pkAffect; }
  1136. bool RemoveAffect(CAffect * pkAff, bool single = true);
  1137.  
  1138. protected:
  1139. bool m_bIsLoadedAffect;
  1140. TAffectFlag m_afAffectFlag;
  1141. std::list<CAffect *> m_list_pkAffect;
  1142.  
  1143. public:
  1144. // PARTY_JOIN_BUG_FIX
  1145. void SetParty(LPPARTY pkParty);
  1146. LPPARTY GetParty() const { return m_pkParty; }
  1147.  
  1148. bool RequestToParty(LPCHARACTER leader);
  1149. void DenyToParty(LPCHARACTER member);
  1150. void AcceptToParty(LPCHARACTER member);
  1151.  
  1152. /// ÀÚ½ÅÀÇ ÆÄƼ¿¡ ´Ù¸¥ character ¸¦ ÃÊ´ëÇÑ´Ù.
  1153. /**
  1154. * @param pchInvitee ÃÊ´ëÇÒ ´ë»ó character. ÆÄƼ¿¡ Âü¿© °¡´ÉÇÑ »óÅÂÀ̾î¾ß ÇÑ´Ù.
  1155. *
  1156. * ¾çÃø character ÀÇ »óŰ¡ ÆÄƼ¿¡ ÃÊ´ëÇϰí ÃÊ´ë¹ÞÀ» ¼ö ÀÖ´Â »óŰ¡ ¾Æ´Ï¶ó¸é ÃÊ´ëÇϴ ij¸¯ÅÍ¿¡°Ô ÇØ´çÇϴ äÆÃ ¸Þ¼¼Áö¸¦ Àü¼ÛÇÑ´Ù.
  1157. */
  1158. void PartyInvite(LPCHARACTER pchInvitee);
  1159.  
  1160. /// ÃÊ´ëÇß´ø character ÀÇ ¼ö¶ôÀ» ó¸®ÇÑ´Ù.
  1161. /**
  1162. * @param pchInvitee ÆÄƼ¿¡ Âü¿©ÇÒ character. ÆÄƼ¿¡ Âü¿©°¡´ÉÇÑ »óÅÂÀ̾î¾ß ÇÑ´Ù.
  1163. *
  1164. * pchInvitee °¡ ÆÄƼ¿¡ °¡ÀÔÇÒ ¼ö ÀÖ´Â »óȲÀÌ ¾Æ´Ï¶ó¸é ÇØ´çÇϴ äÆÃ ¸Þ¼¼Áö¸¦ Àü¼ÛÇÑ´Ù.
  1165. */
  1166. void PartyInviteAccept(LPCHARACTER pchInvitee);
  1167.  
  1168. /// ÃÊ´ëÇß´ø character ÀÇ ÃÊ´ë °ÅºÎ¸¦ ó¸®ÇÑ´Ù.
  1169. /**
  1170. * @param [in] dwPID ÃÊ´ë Çß´ø character ÀÇ PID
  1171. */
  1172. void PartyInviteDeny(DWORD dwPID);
  1173.  
  1174. bool BuildUpdatePartyPacket(TPacketGCPartyUpdate & out);
  1175. int GetLeadershipSkillLevel() const;
  1176.  
  1177. bool CanSummon(int iLeaderShip);
  1178.  
  1179. void SetPartyRequestEvent(LPEVENT pkEvent) { m_pkPartyRequestEvent = pkEvent; }
  1180.  
  1181. protected:
  1182.  
  1183. /// ÆÄƼ¿¡ °¡ÀÔÇÑ´Ù.
  1184. /**
  1185. * @param pkLeader °¡ÀÔÇÒ ÆÄƼÀÇ ¸®´õ
  1186. */
  1187. void PartyJoin(LPCHARACTER pkLeader);
  1188.  
  1189. /**
  1190. * ÆÄƼ °¡ÀÔÀ» ÇÒ ¼ö ¾øÀ» °æ¿ìÀÇ ¿¡·¯ÄÚµå.
  1191. * Error code ´Â ½Ã°£¿¡ ÀÇÁ¸ÀûÀΰ¡¿¡ µû¶ó º¯°æ°¡´ÉÇÑ(mutable) type °ú Á¤Àû(static) type À¸·Î ³ª´¶´Ù.
  1192. * Error code ÀÇ °ªÀÌ PERR_SEPARATOR º¸´Ù ³·À¸¸é º¯°æ°¡´ÉÇÑ type ÀÌ°í ³ôÀ¸¸é Á¤Àû type ÀÌ´Ù.
  1193. */
  1194. enum PartyJoinErrCode {
  1195. PERR_NONE = 0, ///< 󸮼º°ø
  1196. PERR_SERVER, ///< ¼­¹ö¹®Á¦·Î ÆÄƼ°ü·Ã ó¸® ºÒ°¡
  1197. PERR_DUNGEON, ///< ij¸¯ÅͰ¡ ´øÀü¿¡ ÀÖÀ½
  1198. PERR_OBSERVER, ///< °üÀü¸ðµåÀÓ
  1199. PERR_LVBOUNDARY, ///< »ó´ë ij¸¯ÅÍ¿Í ·¹º§Â÷À̰¡ ³²
  1200. PERR_LOWLEVEL, ///< »ó´ëÆÄƼÀÇ ÃÖ°í·¹º§º¸´Ù 30·¹º§ ³·À½
  1201. PERR_HILEVEL, ///< »ó´ëÆÄƼÀÇ ÃÖÀú·¹º§º¸´Ù 30·¹º§ ³ôÀ½
  1202. PERR_ALREADYJOIN, ///< ÆÄƼ°¡ÀÔ ´ë»ó ij¸¯ÅͰ¡ ÀÌ¹Ì ÆÄƼÁß
  1203. PERR_PARTYISFULL, ///< ÆÄƼÀοø Á¦ÇÑ Ãʰú
  1204. PERR_SEPARATOR, ///< Error type separator.
  1205. PERR_DIFFEMPIRE, ///< »ó´ë ij¸¯ÅÍ¿Í ´Ù¸¥ Á¦±¹ÀÓ
  1206. PERR_MAX ///< Error code ÃÖ°íÄ¡. ÀÌ ¾Õ¿¡ Error code ¸¦ Ãß°¡ÇÑ´Ù.
  1207. };
  1208.  
  1209. /// ÆÄƼ °¡ÀÔÀ̳ª °á¼º °¡´ÉÇÑ Á¶°ÇÀ» °Ë»çÇÑ´Ù.
  1210. /**
  1211. * @param pchLeader ÆÄƼÀÇ leader À̰ųª ÃÊ´ëÇÑ character
  1212. * @param pchGuest ÃÊ´ë¹Þ´Â character
  1213. * @return ¸ðµç PartyJoinErrCode °¡ ¹ÝȯµÉ ¼ö ÀÖ´Ù.
  1214. */
  1215. static PartyJoinErrCode IsPartyJoinableCondition(const LPCHARACTER pchLeader, const LPCHARACTER pchGuest);
  1216.  
  1217. /// ÆÄƼ °¡ÀÔÀ̳ª °á¼º °¡´ÉÇÑ µ¿ÀûÀÎ Á¶°ÇÀ» °Ë»çÇÑ´Ù.
  1218. /**
  1219. * @param pchLeader ÆÄƼÀÇ leader À̰ųª ÃÊ´ëÇÑ character
  1220. * @param pchGuest ÃÊ´ë¹Þ´Â character
  1221. * @return mutable type ÀÇ code ¸¸ ¹ÝȯÇÑ´Ù.
  1222. */
  1223. static PartyJoinErrCode IsPartyJoinableMutableCondition(const LPCHARACTER pchLeader, const LPCHARACTER pchGuest);
  1224.  
  1225. LPPARTY m_pkParty;
  1226. DWORD m_dwLastDeadTime;
  1227. LPEVENT m_pkPartyRequestEvent;
  1228.  
  1229. /**
  1230. * ÆÄƼÃÊû Event map.
  1231. * key: ÃÊ´ë¹ÞÀº ij¸¯ÅÍÀÇ PID
  1232. * value: eventÀÇ pointer
  1233. *
  1234. * ÃÊ´ëÇÑ Ä³¸¯Å͵鿡 ´ëÇÑ event map.
  1235. */
  1236. typedef std::map< DWORD, LPEVENT > EventMap;
  1237. EventMap m_PartyInviteEventMap;
  1238.  
  1239. // END_OF_PARTY_JOIN_BUG_FIX
  1240.  
  1241. ////////////////////////////////////////////////////////////////////////////////////////
  1242. // Dungeon
  1243. public:
  1244. void SetDungeon(LPDUNGEON pkDungeon);
  1245. LPDUNGEON GetDungeon() const { return m_pkDungeon; }
  1246. LPDUNGEON GetDungeonForce() const;
  1247. protected:
  1248. LPDUNGEON m_pkDungeon;
  1249. int m_iEventAttr;
  1250.  
  1251. ////////////////////////////////////////////////////////////////////////////////////////
  1252. // Guild
  1253. public:
  1254. void SetGuild(CGuild * pGuild);
  1255. CGuild* GetGuild() const { return m_pGuild; }
  1256.  
  1257. void SetWarMap(CWarMap* pWarMap);
  1258. CWarMap* GetWarMap() const { return m_pWarMap; }
  1259.  
  1260. protected:
  1261. CGuild * m_pGuild;
  1262. DWORD m_dwUnderGuildWarInfoMessageTime;
  1263. CWarMap * m_pWarMap;
  1264.  
  1265. ////////////////////////////////////////////////////////////////////////////////////////
  1266. // Item related
  1267. public:
  1268. bool CanHandleItem(bool bSkipRefineCheck = false, bool bSkipObserver = false); // ¾ÆÀÌÅÛ °ü·Ã ÇàÀ§¸¦ ÇÒ ¼ö Àִ°¡?
  1269.  
  1270. bool IsItemLoaded() const { return m_bItemLoaded; }
  1271. void SetItemLoaded() { m_bItemLoaded = true; }
  1272.  
  1273. void ClearItem();
  1274. #ifdef WJ_ENABLE_PICKUP_ITEM_EFFECT
  1275. void SetItem(TItemPos Cell, LPITEM item, bool isHighLight = false);
  1276. #else
  1277. void SetItem(TItemPos Cell, LPITEM item);
  1278. #endif
  1279. LPITEM GetItem(TItemPos Cell) const;
  1280. LPITEM GetInventoryItem(WORD wCell) const;
  1281. bool IsEmptyItemGrid(TItemPos Cell, BYTE size, int iExceptionCell = -1) const;
  1282. #ifdef __SPECIAL_STORAGE__
  1283. LPITEM GetUpgradeInventoryItem(WORD wCell) const;
  1284. LPITEM GetBookInventoryItem(WORD wCell) const;
  1285. LPITEM GetStoneInventoryItem(WORD wCell) const;
  1286. #endif
  1287. bool SwapItemToItem(TItemPos srcCell, TItemPos destCell);
  1288. void SetWear(BYTE bCell, LPITEM item);
  1289. LPITEM GetWear(BYTE bCell) const;
  1290.  
  1291. // MYSHOP_PRICE_LIST
  1292. void UseSilkBotary(void); /// ºñ´Ü º¸µû¸® ¾ÆÀÌÅÛÀÇ »ç¿ë
  1293.  
  1294. /// DB ij½Ã·Î ºÎÅÍ ¹Þ¾Æ¿Â °¡°ÝÁ¤º¸ ¸®½ºÆ®¸¦ À¯Àú¿¡°Ô Àü¼ÛÇÏ°í º¸µû¸® ¾ÆÀÌÅÛ »ç¿ëÀ» ó¸®ÇÑ´Ù.
  1295. /**
  1296. * @param [in] p °¡°ÝÁ¤º¸ ¸®½ºÆ® ÆÐŶ
  1297. *
  1298. * Á¢¼ÓÇÑ ÈÄ Ã³À½ ºñ´Ü º¸µû¸® ¾ÆÀÌÅÛ »ç¿ë ½Ã UseSilkBotary ¿¡¼­ DB ij½Ã·Î °¡°ÝÁ¤º¸ ¸®½ºÆ®¸¦ ¿äûÇϰí
  1299. * ÀÀ´ä¹ÞÀº ½ÃÁ¡¿¡ ÀÌ ÇÔ¼ö¿¡¼­ ½ÇÁ¦ ºñ´Üº¸µû¸® »ç¿ëÀ» ó¸®ÇÑ´Ù.
  1300. */
  1301. void UseSilkBotaryReal(const TPacketMyshopPricelistHeader* p);
  1302. // END_OF_MYSHOP_PRICE_LIST
  1303.  
  1304. bool UseItemEx(LPITEM item, TItemPos DestCell);
  1305. bool UseItem(TItemPos Cell, TItemPos DestCell = NPOS);
  1306.  
  1307. // ADD_REFINE_BUILDING
  1308. bool IsRefineThroughGuild() const;
  1309. CGuild * GetRefineGuild() const;
  1310. int ComputeRefineFee(int iCost, int iMultiply = 5) const;
  1311. void PayRefineFee(int iTotalMoney);
  1312. void SetRefineNPC(LPCHARACTER ch);
  1313. // END_OF_ADD_REFINE_BUILDING
  1314.  
  1315. bool RefineItem(LPITEM pkItem, LPITEM pkTarget);
  1316. bool DropItem(TItemPos Cell, BYTE bCount=0);
  1317.  
  1318. bool DestroyItem(TItemPos Cell);
  1319. bool GiveRecallItem(LPITEM item);
  1320. void ProcessRecallItem(LPITEM item);
  1321.  
  1322. // void PotionPacket(int iPotionType);
  1323. void EffectPacket(int enumEffectType);
  1324. void SpecificEffectPacket(const char filename[128]);
  1325.  
  1326. // ADD_MONSTER_REFINE
  1327. bool DoRefine(LPITEM item, bool bMoneyOnly = false);
  1328. // END_OF_ADD_MONSTER_REFINE
  1329.  
  1330. bool DoRefineWithScroll(LPITEM item);
  1331. bool RefineInformation(BYTE bCell, BYTE bType, int iAdditionalCell = -1);
  1332.  
  1333. void SetRefineMode(int iAdditionalCell = -1);
  1334. void ClearRefineMode();
  1335.  
  1336. bool GiveItem(LPCHARACTER victim, TItemPos Cell);
  1337. bool CanReceiveItem(LPCHARACTER from, LPITEM item) const;
  1338. void ReceiveItem(LPCHARACTER from, LPITEM item);
  1339. bool GiveItemFromSpecialItemGroup(DWORD dwGroupNum, std::vector <DWORD> &dwItemVnums,
  1340. std::vector <DWORD> &dwItemCounts, std::vector <LPITEM> &item_gets, int &count);
  1341.  
  1342. bool InformationSpecialItemGroup(DWORD dwGroupNum, std::vector <DWORD> &dwItemVnums,
  1343. std::vector <DWORD> &dwItemCounts, std::vector <LPITEM> &item_gets, int &count);
  1344.  
  1345. bool MoveItem(TItemPos pos, TItemPos change_pos, BYTE num);
  1346. bool PickupItem(DWORD vid);
  1347. bool EquipItem(LPITEM item, int iCandidateCell = -1);
  1348. bool UnequipItem(LPITEM item);
  1349.  
  1350. // ÇöÀç itemÀ» Âø¿ëÇÒ ¼ö ÀÖ´Â Áö È®ÀÎÇϰí, ºÒ°¡´É ÇÏ´Ù¸é ij¸¯ÅÍ¿¡°Ô ÀÌÀ¯¸¦ ¾Ë·ÁÁÖ´Â ÇÔ¼ö
  1351. bool CanEquipNow(const LPITEM item, const TItemPos& srcCell = NPOS, const TItemPos& destCell = NPOS);
  1352.  
  1353. // Âø¿ëÁßÀÎ itemÀ» ¹þÀ» ¼ö ÀÖ´Â Áö È®ÀÎÇϰí, ºÒ°¡´É ÇÏ´Ù¸é ij¸¯ÅÍ¿¡°Ô ÀÌÀ¯¸¦ ¾Ë·ÁÁÖ´Â ÇÔ¼ö
  1354. bool CanUnequipNow(const LPITEM item, const TItemPos& srcCell = NPOS, const TItemPos& destCell = NPOS);
  1355.  
  1356. bool SwapItem(BYTE bCell, BYTE bDestCell);
  1357. LPITEM AutoGiveItem(DWORD dwItemVnum, BYTE bCount=1, int iRarePct = -1, bool bMsg = true);
  1358. void AutoGiveItem(LPITEM item, bool longOwnerShip = false);
  1359.  
  1360. int GetEmptyInventory(BYTE size) const;
  1361. #ifdef __SPECIAL_STORAGE__
  1362. int GetEmptyUpgradeInventory(LPITEM pItem) const;
  1363. int GetEmptyBookInventory(LPITEM pItem) const;
  1364. int GetEmptyStoneInventory(LPITEM pItem) const;
  1365. #endif
  1366. int GetEmptyDragonSoulInventory(LPITEM pItem) const;
  1367. void CopyDragonSoulItemGrid(std::vector<WORD>& vDragonSoulItemGrid) const;
  1368. int CountEmptyInventory() const;
  1369.  
  1370. int CountSpecifyItem(DWORD vnum) const;
  1371. void RemoveSpecifyItem(DWORD vnum, DWORD count = 1);
  1372. LPITEM FindSpecifyItem(DWORD vnum) const;
  1373. LPITEM FindItemByID(DWORD id) const;
  1374.  
  1375. int CountSpecifyTypeItem(BYTE type) const;
  1376. void RemoveSpecifyTypeItem(BYTE type, DWORD count = 1);
  1377.  
  1378. bool IsEquipUniqueItem(DWORD dwItemVnum) const;
  1379.  
  1380. // CHECK_UNIQUE_GROUP
  1381. bool IsEquipUniqueGroup(DWORD dwGroupVnum) const;
  1382. // END_OF_CHECK_UNIQUE_GROUP
  1383.  
  1384. void SendEquipment(LPCHARACTER ch);
  1385. #ifdef __ATTENDANCE_EVENT__
  1386. std::vector<THitCountInfo> m_hitCount;
  1387. #endif
  1388. // End of Item
  1389.  
  1390. protected:
  1391.  
  1392. /// ÇÑ ¾ÆÀÌÅÛ¿¡ ´ëÇÑ °¡°ÝÁ¤º¸¸¦ Àü¼ÛÇÑ´Ù.
  1393. /**
  1394. * @param [in] dwItemVnum ¾ÆÀÌÅÛ vnum
  1395. * @param [in] dwItemPrice ¾ÆÀÌÅÛ °¡°Ý
  1396. */
  1397. void SendMyShopPriceListCmd(DWORD dwItemVnum, long long dwItemPrice);
  1398.  
  1399. bool m_bNoOpenedShop; ///< À̹ø Á¢¼Ó ÈÄ °³ÀλóÁ¡À» ¿¬ ÀûÀÌ ÀÖ´ÂÁöÀÇ ¿©ºÎ(¿­¾ú´ø ÀûÀÌ ¾ø´Ù¸é true)
  1400.  
  1401. bool m_bItemLoaded;
  1402. int m_iRefineAdditionalCell;
  1403. bool m_bUnderRefine;
  1404. DWORD m_dwRefineNPCVID;
  1405.  
  1406. public:
  1407. ////////////////////////////////////////////////////////////////////////////////////////
  1408. // Money related
  1409. long long GetGold() const { return m_points.gold; }
  1410. void SetGold(long long gold) { m_points.gold = gold; }
  1411. bool DropGold(INT gold);
  1412. long long GetAllowedGold() const;
  1413. void GiveGold(long long iAmount);
  1414. #ifdef ENABLE_SORT_INVENTORY
  1415. void SetNextSortInventoryPulse(int pulse) { m_sortInventoryPulse = pulse; }
  1416. int GetSortInventoryPulse() { return m_sortInventoryPulse; }
  1417.  
  1418. void SetNextSortSpecialStoragePulse(int pulse) { m_sortSpecialStoragePulse = pulse; }
  1419. int GetSortSpecialStoragePulse() { return m_sortSpecialStoragePulse; }
  1420. #endif
  1421.  
  1422. #ifdef ENABLE_GEM_SYSTEM
  1423. long GetGem() const { return m_points.gem; }
  1424. void SetGem(long gem) { m_points.gem = gem; }
  1425. #endif
  1426. // End of Money
  1427.  
  1428. ////////////////////////////////////////////////////////////////////////////////////////
  1429. // Shop related
  1430. public:
  1431. void SetShop(LPSHOP pkShop);
  1432. LPSHOP GetShop() const { return m_pkShop; }
  1433. void ShopPacket(BYTE bSubHeader);
  1434.  
  1435. void SetShopOwner(LPCHARACTER ch) { m_pkChrShopOwner = ch; }
  1436. LPCHARACTER GetShopOwner() const { return m_pkChrShopOwner;}
  1437. #ifdef ENABLE_OFFLINE_SHOP_HIDE
  1438. void SetShowOfflineShop(DWORD option) { dwIsShowShops = option; UpdateSectree();}
  1439. DWORD GetShowOfflineShop() const { return dwIsShowShops; }
  1440. #endif
  1441.  
  1442. void OpenMyShop(const char * c_pszSign, TShopItemTable * pTable, BYTE bItemCount);
  1443. LPSHOP GetMyShop() const { return m_pkMyShop; }
  1444. void CloseMyShop();
  1445. #ifdef ENABLE_CHANGE_CHANNEL
  1446. void ChangeChannel(DWORD channelId);
  1447. #endif
  1448.  
  1449.  
  1450. protected:
  1451.  
  1452. LPSHOP m_pkShop;
  1453. LPSHOP m_pkMyShop;
  1454. std::string m_stShopSign;
  1455. LPCHARACTER m_pkChrShopOwner;
  1456. #ifdef ENABLE_SORT_INVENTORY
  1457. int m_sortInventoryPulse;
  1458. int m_sortSpecialStoragePulse;
  1459. #endif
  1460. #ifdef ENABLE_OFFLINE_SHOP_HIDE
  1461. DWORD dwIsShowShops;
  1462. #endif
  1463. // End of shop
  1464.  
  1465. ////////////////////////////////////////////////////////////////////////////////////////
  1466. // Exchange related
  1467. public:
  1468. bool ExchangeStart(LPCHARACTER victim);
  1469. void SetExchange(CExchange * pkExchange);
  1470. CExchange * GetExchange() const { return m_pkExchange; }
  1471.  
  1472. #ifdef ENABLE_FISH_EVENT
  1473. void FishEventGeneralInfo();
  1474. void FishEventUseBox(TItemPos itemPos);
  1475. bool FishEventIsValidPosition(BYTE shapePos, BYTE shapeType);
  1476. void FishEventPlaceShape(BYTE shapePos, BYTE shapeType);
  1477. void FishEventAddShape(BYTE shapePos);
  1478. void FishEventCheckEnd();
  1479. #endif
  1480.  
  1481. #ifdef ENABLE_GEM_SYSTEM
  1482. void OpenGemShop();
  1483. void RefreshGemShop();
  1484. void OpenGemShopFirstTime();
  1485. void RefreshGemShopItems();
  1486. void RefreshGemShopWithItem();
  1487. void GemShopBuy(BYTE bPos);
  1488. void GemShopAdd(BYTE bPos);
  1489. bool CreateGaya(int glimmerstone_count, LPITEM metinstone_item, long long cost, int pct);
  1490. #endif
  1491.  
  1492. protected:
  1493. CExchange * m_pkExchange;
  1494. // End of Exchange
  1495. #if defined(WHEEL_OF_DESTINY)
  1496. public:
  1497. void SetWheelDestiny(std::shared_ptr<CWheelDestiny> pt) { pWheelDestiny = std::move(pt); };
  1498. std::shared_ptr<CWheelDestiny> GetWheelDestiny() const { return pWheelDestiny; }
  1499. void SetWheelFreeCount(const int count) { SetQuestFlag("wheel.free", GetWheelFreeCount() + count); }
  1500. int GetWheelFreeCount() const { return GetQuestFlag("wheel.free"); }
  1501.  
  1502. private:
  1503. std::shared_ptr<CWheelDestiny> pWheelDestiny = nullptr;
  1504. #endif
  1505. ////////////////////////////////////////////////////////////////////////////////////////
  1506. // Battle
  1507.  
  1508. #ifdef __DUNGEON_INFO_SYSTEM__
  1509. public:
  1510. void SetQuestDamage(int iDmg) { iQuestDamage = iDmg; }
  1511. int GetQuestDamage() { return iQuestDamage; }
  1512.  
  1513. private:
  1514. int iQuestDamage;
  1515. #endif
  1516.  
  1517. public:
  1518. struct TBattleInfo
  1519. {
  1520. int iTotalDamage;
  1521. int iAggro;
  1522.  
  1523. TBattleInfo(int iTot, int iAggr)
  1524. : iTotalDamage(iTot), iAggro(iAggr)
  1525. {}
  1526. };
  1527. typedef std::map<VID, TBattleInfo> TDamageMap;
  1528.  
  1529. typedef struct SAttackLog
  1530. {
  1531. DWORD dwVID;
  1532. DWORD dwTime;
  1533. } AttackLog;
  1534.  
  1535. bool Damage(LPCHARACTER pAttacker, int dam, EDamageType type = DAMAGE_TYPE_NORMAL);
  1536. bool __Profile__Damage(LPCHARACTER pAttacker, int dam, EDamageType type = DAMAGE_TYPE_NORMAL);
  1537. void DeathPenalty(BYTE bExpLossPercent);
  1538. void ReviveInvisible(int iDur);
  1539.  
  1540. bool Attack(LPCHARACTER pkVictim, BYTE bType = 0);
  1541. bool IsAlive() const { return m_pointsInstant.position == POS_DEAD ? false : true; }
  1542. bool CanFight() const;
  1543.  
  1544. bool CanBeginFight() const;
  1545. void BeginFight(LPCHARACTER pkVictim); // pkVictimr°ú ½Î¿ì±â ½ÃÀÛÇÑ´Ù. (°­Á¦ÀûÀÓ, ½ÃÀÛÇÒ ¼ö ÀÖ³ª üũÇÏ·Á¸é CanBeginFightÀ» »ç¿ë)
  1546.  
  1547. bool CounterAttack(LPCHARACTER pkChr); // ¹Ý°ÝÇϱâ (¸ó½ºÅ͸¸ »ç¿ë)
  1548.  
  1549. bool IsStun() const;
  1550. void Stun();
  1551. bool IsDead() const;
  1552. void Dead(LPCHARACTER pkKiller = NULL, bool bImmediateDead=false);
  1553. #ifdef NEW_PET_SYSTEM
  1554. void SetImmortal(int st) { m_stImmortalSt = st; };
  1555. bool IsImmortal() { return 1 == m_stImmortalSt; };
  1556. void SetNewPetSkillCD(int s, DWORD time) { m_newpetskillcd[s] = time; };
  1557. DWORD GetNewPetSkillCD(int s) { return m_newpetskillcd[s]; };
  1558. #endif
  1559.  
  1560. void Reward(bool bItemDrop);
  1561. void RewardGold(LPCHARACTER pkAttacker);
  1562. #ifdef __ATTENDANCE_EVENT__
  1563. void RewardAttendance();
  1564. #endif
  1565.  
  1566. bool Shoot(BYTE bType);
  1567. void FlyTarget(DWORD dwTargetVID, long x, long y, BYTE bHeader);
  1568.  
  1569. void ForgetMyAttacker();
  1570. void AggregateMonster();
  1571. void AttractRanger();
  1572. void PullMonster();
  1573.  
  1574. int GetArrowAndBow(LPITEM * ppkBow, LPITEM * ppkArrow, int iArrowCount = 1);
  1575. void UseArrow(LPITEM pkArrow, DWORD dwArrowCount);
  1576.  
  1577. void AttackedByPoison(LPCHARACTER pkAttacker);
  1578. void RemovePoison();
  1579. #ifdef ENABLE_WOLFMAN_CHARACTER
  1580. void AttackedByBleeding(LPCHARACTER pkAttacker);
  1581. void RemoveBleeding();
  1582. #endif
  1583. void AttackedByFire(LPCHARACTER pkAttacker, int amount, int count);
  1584. void RemoveFire();
  1585.  
  1586. void UpdateAlignment(int iAmount);
  1587. int GetAlignment() const;
  1588.  
  1589. //¼±¾ÇÄ¡ ¾ò±â
  1590. int GetRealAlignment() const;
  1591. void ShowAlignment(bool bShow);
  1592.  
  1593. void SetKillerMode(bool bOn);
  1594. bool IsKillerMode() const;
  1595. void UpdateKillerMode();
  1596.  
  1597. BYTE GetPKMode() const;
  1598. void SetPKMode(BYTE bPKMode);
  1599.  
  1600. void ItemDropPenalty(LPCHARACTER pkKiller);
  1601.  
  1602. void UpdateAggrPoint(LPCHARACTER ch, EDamageType type, int dam);
  1603.  
  1604. //
  1605. // HACK
  1606. //
  1607. public:
  1608. void SetComboSequence(BYTE seq);
  1609. BYTE GetComboSequence() const;
  1610.  
  1611. void SetLastComboTime(DWORD time);
  1612. DWORD GetLastComboTime() const;
  1613.  
  1614. int GetValidComboInterval() const;
  1615. void SetValidComboInterval(int interval);
  1616.  
  1617. BYTE GetComboIndex() const;
  1618.  
  1619. void IncreaseComboHackCount(int k = 1);
  1620. void ResetComboHackCount();
  1621. void SkipComboAttackByTime(int interval);
  1622. DWORD GetSkipComboAttackByTime() const;
  1623.  
  1624. protected:
  1625. BYTE m_bComboSequence;
  1626. DWORD m_dwLastComboTime;
  1627. int m_iValidComboInterval;
  1628. BYTE m_bComboIndex;
  1629. int m_iComboHackCount;
  1630. DWORD m_dwSkipComboAttackByTime;
  1631.  
  1632. protected:
  1633. void UpdateAggrPointEx(LPCHARACTER ch, EDamageType type, int dam, TBattleInfo & info);
  1634. void ChangeVictimByAggro(int iNewAggro, LPCHARACTER pNewVictim);
  1635.  
  1636. DWORD m_dwFlyTargetID;
  1637. std::vector<DWORD> m_vec_dwFlyTargets;
  1638. TDamageMap m_map_kDamage; // ¾î¶² ij¸¯ÅͰ¡ ³ª¿¡°Ô ¾ó¸¶¸¸Å­ÀÇ µ¥¹ÌÁö¸¦ ÁÖ¾ú´Â°¡?
  1639. // AttackLog m_kAttackLog;
  1640. DWORD m_dwKillerPID;
  1641.  
  1642. int m_iAlignment; // Lawful/Chaotic value -200000 ~ 200000
  1643. int m_iRealAlignment;
  1644. int m_iKillerModePulse;
  1645. BYTE m_bPKMode;
  1646.  
  1647. // Aggro
  1648. DWORD m_dwLastVictimSetTime;
  1649. int m_iMaxAggro;
  1650. // End of Battle
  1651.  
  1652. // Stone
  1653. public:
  1654. void SetStone(LPCHARACTER pkChrStone);
  1655. void ClearStone();
  1656. void DetermineDropMetinStone();
  1657. DWORD GetDropMetinStoneVnum() const { return m_dwDropMetinStone; }
  1658. BYTE GetDropMetinStonePct() const { return m_bDropMetinStonePct; }
  1659.  
  1660. protected:
  1661. LPCHARACTER m_pkChrStone; // ³ª¸¦ ½ºÆùÇÑ µ¹
  1662. CHARACTER_SET m_set_pkChrSpawnedBy; // ³»°¡ ½ºÆùÇÑ ³ðµé
  1663. DWORD m_dwDropMetinStone;
  1664. BYTE m_bDropMetinStonePct;
  1665. // End of Stone
  1666.  
  1667. public:
  1668. enum
  1669. {
  1670. SKILL_UP_BY_POINT,
  1671. SKILL_UP_BY_BOOK,
  1672. SKILL_UP_BY_TRAIN,
  1673.  
  1674. // ADD_GRANDMASTER_SKILL
  1675. SKILL_UP_BY_QUEST,
  1676. // END_OF_ADD_GRANDMASTER_SKILL
  1677. };
  1678.  
  1679. void SkillLevelPacket();
  1680. #ifdef __7AND8TH_SKILLS__
  1681. bool SkillCanUp(DWORD dwVnum);
  1682. #endif
  1683. void SkillLevelUp(DWORD dwVnum, BYTE bMethod = SKILL_UP_BY_POINT);
  1684. bool SkillLevelDown(DWORD dwVnum);
  1685. // ADD_GRANDMASTER_SKILL
  1686. bool UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaster = true);
  1687. void ResetSkill();
  1688. void SetSkillLevel(DWORD dwVnum, BYTE bLev);
  1689. int GetUsedSkillMasterType(DWORD dwVnum);
  1690.  
  1691. bool IsLearnableSkill(DWORD dwSkillVnum) const;
  1692. // END_OF_ADD_GRANDMASTER_SKILL
  1693.  
  1694. bool CheckSkillHitCount(const BYTE SkillID, const VID dwTargetVID);
  1695. const DWORD* GetUsableSkillList() const;
  1696. bool CanUseSkill(DWORD dwSkillVnum) const;
  1697. bool IsUsableSkillMotion(DWORD dwMotionIndex) const;
  1698. int GetSkillLevel(DWORD dwVnum) const;
  1699. int GetSkillMasterType(DWORD dwVnum) const;
  1700. int GetSkillPower(DWORD dwVnum, BYTE bLevel = 0) const;
  1701.  
  1702. time_t GetSkillNextReadTime(DWORD dwVnum) const;
  1703. void SetSkillNextReadTime(DWORD dwVnum, time_t time);
  1704. void SkillLearnWaitMoreTimeMessage(DWORD dwVnum);
  1705.  
  1706. void ComputePassiveSkill(DWORD dwVnum);
  1707. int ComputeSkill(DWORD dwVnum, LPCHARACTER pkVictim, BYTE bSkillLevel = 0);
  1708. #ifdef ENABLE_WOLFMAN_CHARACTER
  1709. int ComputeSkillParty(DWORD dwVnum, LPCHARACTER pkVictim, BYTE bSkillLevel = 0);
  1710. #endif
  1711. int ComputeSkillAtPosition(DWORD dwVnum, const PIXEL_POSITION& posTarget, BYTE bSkillLevel = 0);
  1712. void ComputeSkillPoints();
  1713.  
  1714. void SetSkillGroup(BYTE bSkillGroup);
  1715. BYTE GetSkillGroup() const { return m_points.skill_group; }
  1716.  
  1717. int ComputeCooltime(int time);
  1718.  
  1719. void GiveRandomSkillBook();
  1720.  
  1721. void DisableCooltime();
  1722. bool LearnSkillByBook(DWORD dwSkillVnum, BYTE bProb = 0);
  1723. bool LearnGrandMasterSkill(DWORD dwSkillVnum);
  1724. #ifdef __SKILLS_LEVEL_OVER_P__
  1725. bool LearnSageMasterSkill(DWORD dwSkillVnum);
  1726. #endif
  1727.  
  1728. private:
  1729. bool m_bDisableCooltime;
  1730. DWORD m_dwLastSkillTime; ///< ¸¶Áö¸·À¸·Î skill À» ¾´ ½Ã°£(millisecond).
  1731. DWORD m_dwLastSkillVnum;
  1732. // End of Skill
  1733.  
  1734. // MOB_SKILL
  1735. public:
  1736. bool HasMobSkill() const;
  1737. size_t CountMobSkill() const;
  1738. const TMobSkillInfo * GetMobSkill(unsigned int idx) const;
  1739. bool CanUseMobSkill(unsigned int idx) const;
  1740. bool UseMobSkill(unsigned int idx);
  1741. void ResetMobSkillCooltime();
  1742. protected:
  1743. DWORD m_adwMobSkillCooltime[MOB_SKILL_MAX_NUM];
  1744. // END_OF_MOB_SKILL
  1745.  
  1746. // for SKILL_MUYEONG
  1747. public:
  1748. void StartMuyeongEvent();
  1749. void StopMuyeongEvent();
  1750.  
  1751. private:
  1752. LPEVENT m_pkMuyeongEvent;
  1753.  
  1754. // for SKILL_CHAIN lighting
  1755. public:
  1756. int GetChainLightningIndex() const { return m_iChainLightingIndex; }
  1757. void IncChainLightningIndex() { ++m_iChainLightingIndex; }
  1758. void AddChainLightningExcept(LPCHARACTER ch) { m_setExceptChainLighting.insert(ch); }
  1759. void ResetChainLightningIndex() { m_iChainLightingIndex = 0; m_setExceptChainLighting.clear(); }
  1760. int GetChainLightningMaxCount() const;
  1761. const CHARACTER_SET& GetChainLightingExcept() const { return m_setExceptChainLighting; }
  1762.  
  1763. private:
  1764. int m_iChainLightingIndex;
  1765. CHARACTER_SET m_setExceptChainLighting;
  1766.  
  1767. // for SKILL_EUNHYUNG
  1768. public:
  1769. void SetAffectedEunhyung();
  1770. void ClearAffectedEunhyung() { m_dwAffectedEunhyungLevel = 0; }
  1771. bool GetAffectedEunhyung() const { return m_dwAffectedEunhyungLevel; }
  1772.  
  1773. private:
  1774. DWORD m_dwAffectedEunhyungLevel;
  1775.  
  1776. //
  1777. // Skill levels
  1778. //
  1779. protected:
  1780. TPlayerSkill* m_pSkillLevels;
  1781. boost::unordered_map<BYTE, int> m_SkillDamageBonus;
  1782. std::map<int, TSkillUseInfo> m_SkillUseInfo;
  1783.  
  1784. ////////////////////////////////////////////////////////////////////////////////////////
  1785. // AI related
  1786. public:
  1787. void AssignTriggers(const TMobTable * table);
  1788. LPCHARACTER GetVictim() const; // °ø°ÝÇÒ ´ë»ó ¸®ÅÏ
  1789. void SetVictim(LPCHARACTER pkVictim);
  1790. LPCHARACTER GetNearestVictim(LPCHARACTER pkChr);
  1791. LPCHARACTER GetProtege() const; // º¸È£ÇØ¾ß ÇÒ ´ë»ó ¸®ÅÏ
  1792.  
  1793. bool Follow(LPCHARACTER pkChr, float fMinimumDistance = 150.0f);
  1794. bool Return();
  1795. bool IsGuardNPC() const;
  1796. bool IsChangeAttackPosition(LPCHARACTER target) const;
  1797. void ResetChangeAttackPositionTime() { m_dwLastChangeAttackPositionTime = get_dword_time() - AI_CHANGE_ATTACK_POISITION_TIME_NEAR;}
  1798. void SetChangeAttackPositionTime() { m_dwLastChangeAttackPositionTime = get_dword_time();}
  1799.  
  1800. bool OnIdle();
  1801.  
  1802. void OnAttack(LPCHARACTER pkChrAttacker);
  1803. void OnClick(LPCHARACTER pkChrCauser);
  1804.  
  1805. VID m_kVIDVictim;
  1806.  
  1807. protected:
  1808. DWORD m_dwLastChangeAttackPositionTime;
  1809. CTrigger m_triggerOnClick;
  1810. // End of AI
  1811.  
  1812. ////////////////////////////////////////////////////////////////////////////////////////
  1813. // Target
  1814. protected:
  1815. LPCHARACTER m_pkChrTarget; // ³» Ÿ°Ù
  1816. CHARACTER_SET m_set_pkChrTargetedBy; // ³ª¸¦ Ÿ°ÙÀ¸·Î °¡Áö°í ÀÖ´Â »ç¶÷µé
  1817.  
  1818. public:
  1819. void SetTarget(LPCHARACTER pkChrTarget);
  1820. void BroadcastTargetPacket();
  1821. void ClearTarget();
  1822. void CheckTarget();
  1823. // VLAD FIX
  1824. void CheckOpenWindow(LPCHARACTER ch);
  1825. // END VLAD FIX
  1826. LPCHARACTER GetTarget() const { return m_pkChrTarget; }
  1827.  
  1828. ////////////////////////////////////////////////////////////////////////////////////////
  1829. // Safebox
  1830. public:
  1831. int GetSafeboxSize() const;
  1832. void QuerySafeboxSize();
  1833. void SetSafeboxSize(int size);
  1834.  
  1835. CSafebox * GetSafebox() const;
  1836. void LoadSafebox(int iSize, DWORD dwGold, int iItemCount, TPlayerItem * pItems);
  1837. void ChangeSafeboxSize(BYTE bSize);
  1838. void CloseSafebox();
  1839.  
  1840. /// â°í ¿­±â ¿äû
  1841. /**
  1842. * @param [in] pszPassword 1ÀÚ ÀÌ»ó 6ÀÚ ÀÌÇÏÀÇ Ã¢°í ºñ¹Ð¹øÈ£
  1843. *
  1844. * DB ¿¡ â°í¿­±â¸¦ ¿äûÇÑ´Ù.
  1845. * â°í´Â Áߺ¹À¸·Î ¿­Áö ¸øÇϸç, Ãֱ٠â°í¸¦ ´ÝÀº ½Ã°£À¸·Î ºÎÅÍ 10ÃÊ À̳»¿¡´Â ¿­ Áö ¸øÇÑ´Ù.
  1846. */
  1847. void ReqSafeboxLoad(const char* pszPassword);
  1848.  
  1849. /// â°í ¿­±â ¿äûÀÇ Ãë¼Ò
  1850. /**
  1851. * ReqSafeboxLoad ¸¦ È£ÃâÇϰí CloseSafebox ÇÏÁö ¾Ê¾ÒÀ» ¶§ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇϸé â°í¸¦ ¿­ ¼ö ÀÖ´Ù.
  1852. * â°í¿­±âÀÇ ¿äûÀÌ DB ¼­¹ö¿¡¼­ ½ÇÆÐÀÀ´äÀ» ¹Þ¾ÒÀ» °æ¿ì ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇØ¼­ ¿äûÀ» ÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù.
  1853. */
  1854. void CancelSafeboxLoad( void ) { m_bOpeningSafebox = false; }
  1855.  
  1856. void SetMallLoadTime(int t) { m_iMallLoadTime = t; }
  1857. int GetMallLoadTime() const { return m_iMallLoadTime; }
  1858.  
  1859. CSafebox * GetMall() const;
  1860. void LoadMall(int iItemCount, TPlayerItem * pItems);
  1861. void CloseMall();
  1862.  
  1863. void SetSafeboxOpenPosition();
  1864. float GetDistanceFromSafeboxOpen() const;
  1865.  
  1866. protected:
  1867. CSafebox * m_pkSafebox;
  1868. int m_iSafeboxSize;
  1869. int m_iSafeboxLoadTime;
  1870. bool m_bOpeningSafebox; ///< â°í°¡ ¿­±â ¿äû ÁßÀ̰ųª ¿­·ÁÀִ°¡ ¿©ºÎ, true ÀÏ °æ¿ì ¿­±â¿äûÀ̰ųª ¿­·ÁÀÖÀ½.
  1871.  
  1872. CSafebox * m_pkMall;
  1873. int m_iMallLoadTime;
  1874.  
  1875. PIXEL_POSITION m_posSafeboxOpen;
  1876.  
  1877. ////////////////////////////////////////////////////////////////////////////////////////
  1878.  
  1879. ////////////////////////////////////////////////////////////////////////////////////////
  1880. // Mounting
  1881. public:
  1882. void MountVnum(DWORD vnum);
  1883. DWORD GetMountVnum() const { return m_dwMountVnum; }
  1884. DWORD GetLastMountTime() const { return m_dwMountTime; }
  1885.  
  1886. bool CanUseHorseSkill();
  1887.  
  1888. // Horse
  1889. virtual void SetHorseLevel(int iLevel);
  1890.  
  1891. virtual bool StartRiding();
  1892. virtual bool StopRiding();
  1893.  
  1894. virtual DWORD GetMyHorseVnum() const;
  1895.  
  1896. virtual void HorseDie();
  1897. virtual bool ReviveHorse();
  1898.  
  1899. virtual void SendHorseInfo();
  1900. virtual void ClearHorseInfo();
  1901.  
  1902. void HorseSummon(bool bSummon, bool bFromFar = false, DWORD dwVnum = 0, const char* name = 0);
  1903.  
  1904. LPCHARACTER GetHorse() const { return m_chHorse; } // ÇöÀç ¼ÒȯÁßÀÎ ¸»
  1905. LPCHARACTER GetRider() const; // rider on horse
  1906. void SetRider(LPCHARACTER ch);
  1907.  
  1908. bool IsRiding() const;
  1909.  
  1910. #ifdef ENABLE_SUPPORT_SYSTEM
  1911. public:
  1912. CSupportSystem* GetSupportSystem() { return m_supportSystem; }
  1913. #ifdef NEW_PET_SUMMON
  1914. void BuffSummon(LPITEM buffItem);
  1915. void BuffUnsummon(LPITEM buffItem);
  1916. void CheckBuff();
  1917. bool IsBuffSummon();
  1918. #endif
  1919. protected:
  1920. CSupportSystem* m_supportSystem;
  1921.  
  1922. public:
  1923. #endif
  1924.  
  1925. #ifdef __PET_SYSTEM__
  1926. public:
  1927. CPetSystem* GetPetSystem() { return m_petSystem; }
  1928. #ifdef NEW_PET_SUMMON
  1929. void PetSummon(LPITEM petItem);
  1930. void PetUnsummon(LPITEM petItem);
  1931. void CheckPet();
  1932. bool IsPetSummon();
  1933. #endif
  1934. protected:
  1935. CPetSystem* m_petSystem;
  1936.  
  1937. public:
  1938. #endif
  1939. #ifdef NEW_PET_SYSTEM
  1940. public:
  1941. CNewPetSystem* GetNewPetSystem() { return m_newpetSystem; }
  1942.  
  1943. protected:
  1944. CNewPetSystem* m_newpetSystem;
  1945.  
  1946. public:
  1947. #endif
  1948. #ifdef ENABLE_MOUNT_COSTUME_SYSTEM
  1949. public:
  1950. CMountSystem* GetMountSystem() { return m_mountSystem; }
  1951.  
  1952. void MountSummon(LPITEM mountItem);
  1953. void MountUnsummon(LPITEM mountItem);
  1954. void CheckMount();
  1955. bool IsRidingMount();
  1956. protected:
  1957. CMountSystem* m_mountSystem;
  1958. #endif
  1959. protected:
  1960. LPCHARACTER m_chHorse;
  1961. LPCHARACTER m_chRider;
  1962.  
  1963. DWORD m_dwMountVnum;
  1964. DWORD m_dwMountTime;
  1965.  
  1966. BYTE m_bSendHorseLevel;
  1967. BYTE m_bSendHorseHealthGrade;
  1968. BYTE m_bSendHorseStaminaGrade;
  1969.  
  1970. ////////////////////////////////////////////////////////////////////////////////////////
  1971. // Detailed Log
  1972. public:
  1973. void DetailLog() { m_bDetailLog = !m_bDetailLog; }
  1974. void ToggleMonsterLog();
  1975. void MonsterLog(const char* format, ...);
  1976. private:
  1977. bool m_bDetailLog;
  1978. bool m_bMonsterLog;
  1979.  
  1980. ////////////////////////////////////////////////////////////////////////////////////////
  1981. // Empire
  1982.  
  1983. public:
  1984. void SetEmpire(BYTE bEmpire);
  1985. BYTE GetEmpire() const { return m_bEmpire; }
  1986.  
  1987. protected:
  1988. BYTE m_bEmpire;
  1989.  
  1990. ////////////////////////////////////////////////////////////////////////////////////////
  1991. // Regen
  1992. public:
  1993. void SetRegen(LPREGEN pkRegen);
  1994.  
  1995. protected:
  1996. PIXEL_POSITION m_posRegen;
  1997. float m_fRegenAngle;
  1998. LPREGEN m_pkRegen;
  1999. size_t regen_id_; // to help dungeon regen identification
  2000. // End of Regen
  2001.  
  2002. ////////////////////////////////////////////////////////////////////////////////////////
  2003. // Resists & Proofs
  2004. public:
  2005. bool CannotMoveByAffect() const; // ƯÁ¤ È¿°ú¿¡ ÀÇÇØ ¿òÁ÷ÀÏ ¼ö ¾ø´Â »óÅÂÀΰ¡?
  2006. bool IsImmune(DWORD dwImmuneFlag);
  2007. void SetImmuneFlag(DWORD dw) { m_pointsInstant.dwImmuneFlag = dw; }
  2008.  
  2009. protected:
  2010. void ApplyMobAttribute(const TMobTable* table);
  2011. // End of Resists & Proofs
  2012.  
  2013. ////////////////////////////////////////////////////////////////////////////////////////
  2014. // QUEST
  2015. //
  2016. public:
  2017. void SetQuestNPCID(DWORD vid);
  2018. DWORD GetQuestNPCID() const { return m_dwQuestNPCVID; }
  2019. LPCHARACTER GetQuestNPC() const;
  2020.  
  2021. void SetQuestItemPtr(LPITEM item);
  2022. void ClearQuestItemPtr();
  2023. #ifdef __BIOLOG_SYSTEM__
  2024. int GetBiologState(const std::string& state) const;
  2025. void SetBiologState(const std::string& state, int szValue);
  2026. #endif
  2027. LPITEM GetQuestItemPtr() const;
  2028.  
  2029. void SetQuestBy(DWORD dwQuestVnum) { m_dwQuestByVnum = dwQuestVnum; }
  2030. DWORD GetQuestBy() const { return m_dwQuestByVnum; }
  2031.  
  2032. int GetQuestFlag(const std::string& flag) const;
  2033. void SetQuestFlag(const std::string& flag, int value);
  2034.  
  2035. void ConfirmWithMsg(const char* szMsg, int iTimeout, DWORD dwRequestPID);
  2036.  
  2037. private:
  2038. DWORD m_dwQuestNPCVID;
  2039. DWORD m_dwQuestByVnum;
  2040. LPITEM m_pQuestItem;
  2041.  
  2042. // Events
  2043. public:
  2044. bool StartStateMachine(int iPulse = 1);
  2045. void StopStateMachine();
  2046. void UpdateStateMachine(DWORD dwPulse);
  2047. void SetNextStatePulse(int iPulseNext);
  2048.  
  2049. // ij¸¯ÅÍ ÀνºÅϽº ¾÷µ¥ÀÌÆ® ÇÔ¼ö. ±âÁ¸¿£ ÀÌ»óÇÑ »ó¼Ó±¸Á¶·Î CFSM::Update ÇÔ¼ö¸¦ È£ÃâÇϰųª UpdateStateMachine ÇÔ¼ö¸¦ »ç¿ëÇߴµ¥, º°°³ÀÇ ¾÷µ¥ÀÌÆ® ÇÔ¼ö Ãß°¡ÇÔ.
  2050. void UpdateCharacter(DWORD dwPulse);
  2051.  
  2052. protected:
  2053. DWORD m_dwNextStatePulse;
  2054.  
  2055. // Marriage
  2056. public:
  2057. LPCHARACTER GetMarryPartner() const;
  2058. void SetMarryPartner(LPCHARACTER ch);
  2059. int GetMarriageBonus(DWORD dwItemVnum, bool bSum = true);
  2060.  
  2061. void SetWeddingMap(marriage::WeddingMap* pMap);
  2062. marriage::WeddingMap* GetWeddingMap() const { return m_pWeddingMap; }
  2063.  
  2064. private:
  2065. marriage::WeddingMap* m_pWeddingMap;
  2066. LPCHARACTER m_pkChrMarried;
  2067.  
  2068. // Warp Character
  2069. public:
  2070. void StartWarpNPCEvent();
  2071. void ChannelSwitch(int new_ch);
  2072.  
  2073. public:
  2074. void StartSaveEvent();
  2075. void StartRecoveryEvent();
  2076. void StartCheckSpeedHackEvent();
  2077. void StartDestroyWhenIdleEvent();
  2078.  
  2079. LPEVENT m_pkDeadEvent;
  2080. LPEVENT m_pkStunEvent;
  2081. LPEVENT m_pkSaveEvent;
  2082. LPEVENT m_pkRecoveryEvent;
  2083. LPEVENT m_pkTimedEvent;
  2084. LPEVENT m_pkFishingEvent;
  2085. LPEVENT m_pkAffectEvent;
  2086. LPEVENT m_pkPoisonEvent;
  2087. #ifdef __ENABLE_BATTLE_FIELD__
  2088. LPEVENT m_pkBattleZoneEvent;
  2089. #endif
  2090. #ifdef ENABLE_CHANGE_CHANNEL
  2091. LPEVENT m_pkChangeChannelEvent;
  2092. #endif
  2093. #ifdef ENABLE_WOLFMAN_CHARACTER
  2094. LPEVENT m_pkBleedingEvent;
  2095. #endif
  2096. LPEVENT m_pkFireEvent;
  2097. LPEVENT m_pkWarpNPCEvent;
  2098. //DELAYED_WARP
  2099. //END_DELAYED_WARP
  2100.  
  2101. // MINING
  2102. LPEVENT m_pkMiningEvent;
  2103. // END_OF_MINING
  2104. LPEVENT m_pkWarpEvent;
  2105. LPEVENT m_pkCheckSpeedHackEvent;
  2106. LPEVENT m_pkDestroyWhenIdleEvent;
  2107. LPEVENT m_pkPetSystemUpdateEvent;
  2108. #ifdef NEW_PET_SYSTEM
  2109. LPEVENT m_pkNewPetSystemUpdateEvent;
  2110. LPEVENT m_pkNewPetSystemExpireEvent;
  2111. #endif
  2112. LPEVENT m_pksupportSystemExpireEvent;
  2113.  
  2114. bool IsWarping() const { return m_pkWarpEvent ? true : false; }
  2115.  
  2116. bool m_bHasPoisoned;
  2117. #ifdef ENABLE_WOLFMAN_CHARACTER
  2118. bool m_bHasBled;
  2119. #endif
  2120.  
  2121. const CMob * m_pkMobData;
  2122. CMobInstance * m_pkMobInst;
  2123.  
  2124. std::map<int, LPEVENT> m_mapMobSkillEvent;
  2125.  
  2126. friend struct FuncSplashDamage;
  2127. friend struct FuncSplashAffect;
  2128. friend class CFuncShoot;
  2129.  
  2130. public:
  2131. int GetPremiumRemainSeconds(BYTE bType) const;
  2132.  
  2133. private:
  2134. int m_aiPremiumTimes[PREMIUM_MAX_NUM];
  2135.  
  2136. // CHANGE_ITEM_ATTRIBUTES
  2137. // static const DWORD msc_dwDefaultChangeItemAttrCycle; ///< µðÆúÆ® ¾ÆÀÌÅÛ ¼Ó¼ºº¯°æ °¡´É ÁÖ±â
  2138. static const char msc_szLastChangeItemAttrFlag[]; ///< ÃÖ±Ù ¾ÆÀÌÅÛ ¼Ó¼ºÀ» º¯°æÇÑ ½Ã°£ÀÇ Quest Flag À̸§
  2139. // static const char msc_szChangeItemAttrCycleFlag[]; ///< ¾ÆÀÌÅÛ ¼Ó¼ºº´°æ °¡´É ÁÖ±âÀÇ Quest Flag À̸§
  2140. // END_OF_CHANGE_ITEM_ATTRIBUTES
  2141.  
  2142. // PC_BANG_ITEM_ADD
  2143. private :
  2144. bool m_isinPCBang;
  2145.  
  2146. public :
  2147. bool SetPCBang(bool flag) { m_isinPCBang = flag; return m_isinPCBang; }
  2148. bool IsPCBang() const { return m_isinPCBang; }
  2149. // END_PC_BANG_ITEM_ADD
  2150.  
  2151. // NEW_HAIR_STYLE_ADD
  2152. public :
  2153. bool ItemProcess_Hair(LPITEM item, int iDestCell);
  2154. // END_NEW_HAIR_STYLE_ADD
  2155.  
  2156. public :
  2157. void ClearSkill();
  2158. void ClearSubSkill();
  2159.  
  2160. // RESET_ONE_SKILL
  2161. bool ResetOneSkill(DWORD dwVnum);
  2162. // END_RESET_ONE_SKILL
  2163.  
  2164. private :
  2165. void SendDamagePacket(LPCHARACTER pAttacker, int Damage, BYTE DamageFlag);
  2166.  
  2167. // ARENA
  2168. private :
  2169. CArena *m_pArena;
  2170. bool m_ArenaObserver;
  2171. int m_nPotionLimit;
  2172.  
  2173. public :
  2174. void SetArena(CArena* pArena) { m_pArena = pArena; }
  2175. void SetArenaObserverMode(bool flag) { m_ArenaObserver = flag; }
  2176.  
  2177. CArena* GetArena() const { return m_pArena; }
  2178. bool GetArenaObserverMode() const { return m_ArenaObserver; }
  2179.  
  2180. void SetPotionLimit(int count) { m_nPotionLimit = count; }
  2181. int GetPotionLimit() const { return m_nPotionLimit; }
  2182. // END_ARENA
  2183.  
  2184. //PREVENT_TRADE_WINDOW
  2185. public:
  2186. bool IsOpenSafebox() const { return m_isOpenSafebox ? true : false; }
  2187. void SetOpenSafebox(bool b) { m_isOpenSafebox = b; }
  2188.  
  2189. int GetSafeboxLoadTime() const { return m_iSafeboxLoadTime; }
  2190. void SetSafeboxLoadTime() { m_iSafeboxLoadTime = thecore_pulse(); }
  2191. //END_PREVENT_TRADE_WINDOW
  2192. private:
  2193. bool m_isOpenSafebox;
  2194.  
  2195. public:
  2196. int GetSkillPowerByLevel(int level, bool bMob = false) const;
  2197. void CheckWrongItems();
  2198.  
  2199.  
  2200. //PREVENT_REFINE_HACK
  2201. int GetRefineTime() const { return m_iRefineTime; }
  2202. void SetRefineTime() { m_iRefineTime = thecore_pulse(); }
  2203. int m_iRefineTime;
  2204. //END_PREVENT_REFINE_HACK
  2205.  
  2206. //RESTRICT_USE_SEED_OR_MOONBOTTLE
  2207. int GetUseSeedOrMoonBottleTime() const { return m_iSeedTime; }
  2208. void SetUseSeedOrMoonBottleTime() { m_iSeedTime = thecore_pulse(); }
  2209. int m_iSeedTime;
  2210. //END_RESTRICT_USE_SEED_OR_MOONBOTTLE
  2211.  
  2212. //PREVENT_PORTAL_AFTER_EXCHANGE
  2213. int GetExchangeTime() const { return m_iExchangeTime; }
  2214. void SetExchangeTime() { m_iExchangeTime = thecore_pulse(); }
  2215. int m_iExchangeTime;
  2216. //END_PREVENT_PORTAL_AFTER_EXCHANGE
  2217.  
  2218. int m_iMyShopTime;
  2219. int GetMyShopTime() const { return m_iMyShopTime; }
  2220. void SetMyShopTime() { m_iMyShopTime = thecore_pulse(); }
  2221.  
  2222. // Hack ¹æÁö¸¦ À§ÇÑ Ã¼Å©.
  2223. bool IsHack(bool bSendMsg = true, bool bCheckShopOwner = true, int limittime = g_nPortalLimitTime);
  2224.  
  2225. // MONARCH
  2226. BOOL IsMonarch() const;
  2227. // END_MONARCH
  2228. void Say(const std::string & s);
  2229.  
  2230. enum MONARCH_COOLTIME
  2231. {
  2232. MC_HEAL = 10,
  2233. MC_WARP = 60,
  2234. MC_TRANSFER = 60,
  2235. MC_TAX = (60 * 60 * 24 * 7),
  2236. MC_SUMMON = (60 * 60),
  2237. };
  2238.  
  2239. enum MONARCH_INDEX
  2240. {
  2241. MI_HEAL = 0,
  2242. MI_WARP,
  2243. MI_TRANSFER,
  2244. MI_TAX,
  2245. MI_SUMMON,
  2246. MI_MAX
  2247. };
  2248.  
  2249. DWORD m_dwMonarchCooltime[MI_MAX];
  2250. DWORD m_dwMonarchCooltimelimit[MI_MAX];
  2251.  
  2252. void InitMC();
  2253. DWORD GetMC(enum MONARCH_INDEX e) const;
  2254. void SetMC(enum MONARCH_INDEX e);
  2255. bool IsMCOK(enum MONARCH_INDEX e) const;
  2256. DWORD GetMCL(enum MONARCH_INDEX e) const;
  2257. DWORD GetMCLTime(enum MONARCH_INDEX e) const;
  2258.  
  2259. public:
  2260. bool ItemProcess_Polymorph(LPITEM item);
  2261.  
  2262. // by mhh
  2263. LPITEM* GetCubeItem() { return m_pointsInstant.pCubeItems; }
  2264. bool IsCubeOpen () const { return (m_pointsInstant.pCubeNpc?true:false); }
  2265. void SetCubeNpc(LPCHARACTER npc) { m_pointsInstant.pCubeNpc = npc; }
  2266. bool CanDoCube() const;
  2267.  
  2268. public:
  2269. bool IsSiegeNPC() const;
  2270.  
  2271. private:
  2272. //Áß±¹ Àü¿ë
  2273. //18¼¼ ¹Ì¸¸ Àü¿ë
  2274. //3½Ã°£ : 50 % 5 ½Ã°£ 0%
  2275. e_overtime m_eOverTime;
  2276.  
  2277. public:
  2278. bool IsOverTime(e_overtime e) const { return (e == m_eOverTime); }
  2279. void SetOverTime(e_overtime e) { m_eOverTime = e; }
  2280.  
  2281. private:
  2282. int m_deposit_pulse;
  2283.  
  2284. public:
  2285. void UpdateDepositPulse();
  2286. bool CanDeposit() const;
  2287.  
  2288. private:
  2289. void __OpenPrivateShop();
  2290.  
  2291. public:
  2292. struct AttackedLog
  2293. {
  2294. DWORD dwPID;
  2295. DWORD dwAttackedTime;
  2296.  
  2297. AttackedLog() : dwPID(0), dwAttackedTime(0)
  2298. {
  2299. }
  2300. };
  2301.  
  2302. AttackLog m_kAttackLog;
  2303. AttackedLog m_AttackedLog;
  2304. int m_speed_hack_count;
  2305.  
  2306. private :
  2307. std::string m_strNewName;
  2308.  
  2309. public :
  2310. const std::string GetNewName() const { return this->m_strNewName; }
  2311. void SetNewName(const std::string name) { this->m_strNewName = name; }
  2312.  
  2313. public :
  2314. void GoHome();
  2315.  
  2316. private :
  2317. std::set<DWORD> m_known_guild;
  2318.  
  2319. public :
  2320. void SendGuildName(CGuild* pGuild);
  2321. void SendGuildName(DWORD dwGuildID);
  2322.  
  2323. private :
  2324. DWORD m_dwLogOffInterval;
  2325.  
  2326. public :
  2327. DWORD GetLogOffInterval() const { return m_dwLogOffInterval; }
  2328.  
  2329. #ifdef ENABLE_FISH_EVENT
  2330. private:
  2331. DWORD m_dwFishUseCount;
  2332. BYTE m_bFishAttachedShape;
  2333. public:
  2334. DWORD GetFishEventUseCount() const { return m_dwFishUseCount; }
  2335. void FishEventIncreaseUseCount() { m_dwFishUseCount++; }
  2336.  
  2337. BYTE GetFishAttachedShape() const { return m_bFishAttachedShape; }
  2338. void SetFishAttachedShape(BYTE bShape) { m_bFishAttachedShape = bShape; }
  2339. #endif
  2340.  
  2341. #ifdef ENABLE_GEM_SYSTEM
  2342. private :
  2343. DWORD m_dwGemNextRefresh;
  2344. public :
  2345. DWORD GetGemNextRefresh() const { return m_dwGemNextRefresh; }
  2346. #endif
  2347.  
  2348. public:
  2349. bool UnEquipSpecialRideUniqueItem ();
  2350.  
  2351. bool CanWarp () const;
  2352.  
  2353. private:
  2354. DWORD m_dwLastGoldDropTime;
  2355. #ifdef ENABLE_NEWSTUFF
  2356. DWORD m_dwLastItemDropTime;
  2357. DWORD m_dwLastBoxUseTime;
  2358. DWORD m_dwLastBuySellTime;
  2359. public:
  2360. DWORD GetLastBuySellTime() const { return m_dwLastBuySellTime; }
  2361. void SetLastBuySellTime(DWORD dwLastBuySellTime) { m_dwLastBuySellTime = dwLastBuySellTime; }
  2362. #endif
  2363. public:
  2364. void StartHackShieldCheckCycle(int seconds);
  2365. void StopHackShieldCheckCycle();
  2366.  
  2367. bool GetHackShieldCheckMode() const { return m_HackShieldCheckMode; }
  2368. void SetHackShieldCheckMode(bool m) { m_HackShieldCheckMode = m; }
  2369.  
  2370. LPEVENT m_HackShieldCheckEvent;
  2371.  
  2372. private:
  2373. bool m_HackShieldCheckMode;
  2374.  
  2375. public:
  2376. void AutoRecoveryItemProcess (const EAffectTypes);
  2377.  
  2378. public:
  2379. void BuffOnAttr_AddBuffsFromItem(LPITEM pItem);
  2380. void BuffOnAttr_RemoveBuffsFromItem(LPITEM pItem);
  2381.  
  2382. private:
  2383. void BuffOnAttr_ValueChange(BYTE bType, BYTE bOldValue, BYTE bNewValue);
  2384. void BuffOnAttr_ClearAll();
  2385.  
  2386. typedef std::map <BYTE, CBuffOnAttributes*> TMapBuffOnAttrs;
  2387. TMapBuffOnAttrs m_map_buff_on_attrs;
  2388. // ¹«Àû : ¿øÈ°ÇÑ Å×½ºÆ®¸¦ À§ÇÏ¿©.
  2389. public:
  2390. void SetArmada() { cannot_dead = true; }
  2391. void ResetArmada() { cannot_dead = false; }
  2392. private:
  2393. bool cannot_dead;
  2394.  
  2395. #ifdef ENABLE_SUPPORT_SYSTEM
  2396. private:
  2397. bool m_bIsSupport;
  2398. LPCHARACTER m_Owner;
  2399. DWORD m_dwSupportCostume;
  2400. DWORD m_dwSupportHair;
  2401. DWORD m_dwSupportWeapon;
  2402. DWORD m_dwSupportInt;
  2403. public:
  2404. void SetSupport() { m_bIsSupport = true; }
  2405. bool IsSupport() { return m_bIsSupport; }
  2406. void SetSupportArmor(int vnum) { m_dwSupportCostume = vnum; }
  2407. void SetSupportHair(int vnum) { m_dwSupportHair = vnum; }
  2408. void SetSupportWeapon(int vnum) { m_dwSupportWeapon = vnum; }
  2409. DWORD GetSupportArmor() { return m_dwSupportCostume; }
  2410. DWORD GetSupportHair() { return m_dwSupportHair; }
  2411. DWORD GetSupportWeapon() { return m_dwSupportWeapon; }
  2412. void SetOwner(LPCHARACTER owner) { m_Owner = owner; }
  2413. LPCHARACTER GetOwner() { return m_Owner; }
  2414. void SetSupportInt(int count) { m_dwSupportInt = count; }
  2415. DWORD GetSupportInt() { return m_dwSupportInt; }
  2416. #endif
  2417. #ifdef ENABLE_AFTERDEATH_SHIELD
  2418. public:
  2419. void StartShieldCountdownEvent(LPCHARACTER ch, int iSec);
  2420. void SetShieldAffect() { m_afAffectFlag.Set(AFF_AFTERDEATH_SHIELD); };
  2421. void RemoveShieldAffect() { return m_afAffectFlag.Reset(AFF_AFTERDEATH_SHIELD); };
  2422. #endif
  2423. #ifdef __PET_SYSTEM__
  2424. private:
  2425. bool m_bIsPet;
  2426. public:
  2427. void SetPet() { m_bIsPet = true; }
  2428. bool IsPet() { return m_bIsPet; }
  2429. #endif
  2430. #ifdef NEW_PET_SYSTEM
  2431. private:
  2432. bool m_bIsNewPet;
  2433. int m_eggvid;
  2434. public:
  2435. void SetNewPet() { m_bIsNewPet = true; }
  2436. bool IsNewPet() const { return m_bIsNewPet ? true : false; }
  2437. void SetEggVid(int vid) { m_eggvid = vid; }
  2438. int GetEggVid() { return m_eggvid; }
  2439.  
  2440. #endif
  2441. #ifdef ENABLE_MOUNT_COSTUME_SYSTEM
  2442. private:
  2443. bool m_bIsMount;
  2444. public:
  2445. void SetMount() { m_bIsMount = true; }
  2446. bool IsMount() { return m_bIsMount; }
  2447. #endif
  2448.  
  2449. #ifdef NEW_ICEDAMAGE_SYSTEM
  2450. private:
  2451. DWORD m_dwNDRFlag;
  2452. std::set<DWORD> m_setNDAFlag;
  2453. public:
  2454. const DWORD GetNoDamageRaceFlag();
  2455. void SetNoDamageRaceFlag(DWORD dwRaceFlag);
  2456. void UnsetNoDamageRaceFlag(DWORD dwRaceFlag);
  2457. void ResetNoDamageRaceFlag();
  2458. const std::set<DWORD> & GetNoDamageAffectFlag();
  2459. void SetNoDamageAffectFlag(DWORD dwAffectFlag);
  2460. void UnsetNoDamageAffectFlag(DWORD dwAffectFlag);
  2461. void ResetNoDamageAffectFlag();
  2462. #endif
  2463.  
  2464. //ÃÖÁ¾ µ¥¹ÌÁö º¸Á¤.
  2465. private:
  2466. float m_fAttMul;
  2467. float m_fDamMul;
  2468. public:
  2469. float GetAttMul() { return this->m_fAttMul; }
  2470. void SetAttMul(float newAttMul) {this->m_fAttMul = newAttMul; }
  2471. float GetDamMul() { return this->m_fDamMul; }
  2472. void SetDamMul(float newDamMul) {this->m_fDamMul = newDamMul; }
  2473.  
  2474. private:
  2475. bool IsValidItemPosition(TItemPos Pos) const;
  2476.  
  2477. public:
  2478. //¿ëÈ¥¼®
  2479.  
  2480. // ij¸¯ÅÍÀÇ affect, quest°¡ load µÇ±â Àü¿¡ DragonSoul_Initialize¸¦ È£ÃâÇÏ¸é ¾ÈµÈ´Ù.
  2481. // affect°¡ °¡Àå ¸¶Áö¸·¿¡ ·ÎµåµÇ¾î LoadAffect¿¡¼­ È£ÃâÇÔ.
  2482. void DragonSoul_Initialize();
  2483.  
  2484. bool DragonSoul_IsQualified() const;
  2485. void DragonSoul_GiveQualification();
  2486.  
  2487. int DragonSoul_GetActiveDeck() const;
  2488. bool DragonSoul_IsDeckActivated() const;
  2489. bool DragonSoul_ActivateDeck(int deck_idx);
  2490.  
  2491. void DragonSoul_DeactivateAll();
  2492. // ¹Ýµå½Ã ClearItem Àü¿¡ ºÒ·¯¾ß ÇÑ´Ù.
  2493. // ¿Ö³ÄÇϸé....
  2494. // ¿ëÈ¥¼® Çϳª Çϳª¸¦ deactivateÇÒ ¶§¸¶´Ù µ¦¿¡ activeÀÎ ¿ëÈ¥¼®ÀÌ ÀÖ´ÂÁö È®ÀÎÇϰí,
  2495. // activeÀÎ ¿ëÈ¥¼®ÀÌ Çϳªµµ ¾ø´Ù¸é, ij¸¯ÅÍÀÇ ¿ëÈ¥¼® affect¿Í, Ȱ¼º »óŸ¦ Á¦°ÅÇÑ´Ù.
  2496. //
  2497. // ÇÏÁö¸¸ ClearItem ½Ã, ij¸¯ÅͰ¡ Âø¿ëÇϰí ÀÖ´Â ¸ðµç ¾ÆÀÌÅÛÀ» unequipÇÏ´Â ¹Ù¶÷¿¡,
  2498. // ¿ëÈ¥¼® Affect°¡ Á¦°ÅµÇ°í, °á±¹ ·Î±×ÀÎ ½Ã, ¿ëÈ¥¼®ÀÌ È°¼ºÈ­µÇÁö ¾Ê´Â´Ù.
  2499. // (UnequipÇÒ ¶§¿¡´Â ·Î±×¾Æ¿ô »óÅÂÀÎÁö, ¾Æ´ÑÁö ¾Ë ¼ö ¾ø´Ù.)
  2500. // ¿ëÈ¥¼®¸¸ deactivate½Ã۰í ij¸¯ÅÍÀÇ ¿ëÈ¥¼® µ¦ Ȱ¼º »óÅ´ °Çµå¸®Áö ¾Ê´Â´Ù.
  2501. void DragonSoul_CleanUp();
  2502. // ¿ëÈ¥¼® °­È­Ã¢
  2503. public:
  2504. bool DragonSoul_RefineWindow_Open(LPENTITY pEntity);
  2505. bool DragonSoul_RefineWindow_Close();
  2506. LPENTITY DragonSoul_RefineWindow_GetOpener() { return m_pointsInstant.m_pDragonSoulRefineWindowOpener; }
  2507. bool DragonSoul_RefineWindow_CanRefine();
  2508.  
  2509. //µ¶ÀÏ ¼±¹° ±â´É ÆÐŶ Àӽà ÀúÀå
  2510. private:
  2511. unsigned int itemAward_vnum;
  2512. char itemAward_cmd[20];
  2513. //bool itemAward_flag;
  2514. public:
  2515. unsigned int GetItemAward_vnum() { return itemAward_vnum; }
  2516. char* GetItemAward_cmd() { return itemAward_cmd; }
  2517. //bool GetItemAward_flag() { return itemAward_flag; }
  2518. void SetItemAward_vnum(unsigned int vnum) { itemAward_vnum = vnum; }
  2519. void SetItemAward_cmd(char* cmd) { strcpy(itemAward_cmd,cmd); }
  2520. //void SetItemAward_flag(bool flag) { itemAward_flag = flag; }
  2521. #ifdef ENABLE_ANTI_CMD_FLOOD
  2522. private:
  2523. int m_dwCmdAntiFloodPulse;
  2524. DWORD m_dwCmdAntiFloodCount;
  2525. public:
  2526. int GetCmdAntiFloodPulse(){return m_dwCmdAntiFloodPulse;}
  2527. DWORD GetCmdAntiFloodCount(){return m_dwCmdAntiFloodCount;}
  2528. DWORD IncreaseCmdAntiFloodCount(){return ++m_dwCmdAntiFloodCount;}
  2529. void SetCmdAntiFloodPulse(int dwPulse){m_dwCmdAntiFloodPulse=dwPulse;}
  2530. void SetCmdAntiFloodCount(DWORD dwCount){m_dwCmdAntiFloodCount=dwCount;}
  2531. #endif
  2532. private:
  2533. // SyncPositionÀ» ¾Ç¿ëÇÏ¿© ŸÀ¯Àú¸¦ ÀÌ»óÇÑ °÷À¸·Î º¸³»´Â ÇÙ ¹æ¾îÇϱâ À§ÇÏ¿©,
  2534. // SyncPositionÀÌ ÀϾ ¶§¸¦ ±â·Ï.
  2535. timeval m_tvLastSyncTime;
  2536. int m_iSyncHackCount;
  2537. public:
  2538. void SetLastSyncTime(const timeval &tv) { memcpy(&m_tvLastSyncTime, &tv, sizeof(timeval)); }
  2539. const timeval& GetLastSyncTime() { return m_tvLastSyncTime; }
  2540. void SetSyncHackCount(int iCount) { m_iSyncHackCount = iCount;}
  2541. int GetSyncHackCount() { return m_iSyncHackCount; }
  2542. #ifdef __ENABLE_BATTLE_FIELD__
  2543. public:
  2544. long GetBattlePoints() const { return m_points.battlePoint; }
  2545. void SetBattlePoints(long battlePoint) { m_points.battlePoint = battlePoint; }
  2546.  
  2547. BYTE GetBattleRank() const { return m_bBattleRank; }
  2548. void SetBattleRank(BYTE bRank) { m_bBattleRank = bRank; }
  2549.  
  2550. BYTE GetBattleDeadCount() const { return m_bBattleDeadCount; }
  2551. void IncreaseBattleDeadCount() { m_bBattleDeadCount++; }
  2552. protected:
  2553. BYTE m_bBattleRank;
  2554. BYTE m_bBattleDeadCount;
  2555. #endif
  2556. #ifdef __UPGRADE_ITEMS_STORAGE__
  2557. private:
  2558. CUpgradeItemsStorage* m_pkStorage;
  2559.  
  2560. public:
  2561. CUpgradeItemsStorage* GetStorage() { return m_pkStorage; };
  2562. void OpenUpgradeItemsStorage(LPCHARACTER pkOpener);
  2563. #endif
  2564. #ifdef OFFLINE_SHOP
  2565. public:
  2566. void OpenMyShop(const char * c_pszSign, TShopItemTable * pTable, BYTE bItemCount, DWORD days);
  2567. void SendShops(bool isGm = false);
  2568. void OpenShop(DWORD id, const char *name, bool onboot = false);
  2569. void SetPrivShop(DWORD shop_id) { bprivShop = shop_id; }
  2570. BOOL IsPrivShop(void) const { return bprivShop>0; }
  2571. DWORD GetPrivShop() const { return bprivShop; }
  2572. void SetPrivShopOwner(DWORD id) { bprivShopOwner = id; }
  2573. DWORD GetPrivShopOwner() const { return bprivShopOwner; }
  2574. void DeleteMyShop();
  2575. DWORD GetShopTime() const { return dw_ShopTime; }
  2576. void SetShopTime(DWORD time) { dw_ShopTime = time; }
  2577. void SetShopSign(const char * name);
  2578. void LoadPrivShops();
  2579. TPrivShop GetPrivShopTable(DWORD id);
  2580. void RemovePrivShopTable(DWORD id);
  2581. void UpdatePrivShopTable(DWORD id, TPrivShop shop);
  2582. void UpdateShopItems();
  2583. void SendShopCost();
  2584. private:
  2585. PSHOP_MAP m_mapshops;
  2586. DWORD bprivShop;
  2587. DWORD bprivShopOwner;
  2588. DWORD dw_ShopTime;
  2589. public:
  2590. void StartRefreshShopEvent();
  2591. protected:
  2592. LPEVENT m_pkRefreshShopEvent;
  2593. #endif
  2594.  
  2595. #ifdef GIFT_SYSTEM
  2596. protected:
  2597. void AddGiftGrid(int page);
  2598. int AddGiftGridItem(int page, int size);
  2599. GIFT_MAP m_mapGiftGrid;
  2600. LPEVENT m_pkGiftRefresh;
  2601. DWORD m_dwLastGiftPage;
  2602. public:
  2603. void StartRefreshGift();
  2604. void LoadGiftPage(int page);
  2605. void RefreshGift();
  2606. int GetGiftPages() { return m_mapGiftGrid.size(); }
  2607. int GetLastGiftPage() { return m_dwLastGiftPage; }
  2608. #endif
  2609. #ifdef __SASH_SYSTEM__
  2610. protected:
  2611. bool m_bSashCombination, m_bSashAbsorption;
  2612.  
  2613. public:
  2614. bool isSashOpened(bool bCombination) {return bCombination ? m_bSashCombination : m_bSashAbsorption;}
  2615. void OpenSash(bool bCombination);
  2616. void CloseSash();
  2617. void ClearSashMaterials();
  2618. bool CleanSashAttr(LPITEM pkItem, LPITEM pkTarget);
  2619. LPITEM* GetSashMaterials() {return m_pointsInstant.pSashMaterials;}
  2620. bool SashIsSameGrade(long lGrade);
  2621. DWORD GetSashCombinePrice(long lGrade);
  2622. void GetSashCombineResult(DWORD & dwItemVnum, DWORD & dwMinAbs, DWORD & dwMaxAbs);
  2623. BYTE CheckEmptyMaterialSlot();
  2624. void AddSashMaterial(TItemPos tPos, BYTE bPos);
  2625. void RemoveSashMaterial(BYTE bPos);
  2626. BYTE CanRefineSashMaterials();
  2627. void RefineSashMaterials();
  2628. #endif
  2629. #ifdef __CHANGELOOK_SYSTEM__
  2630. protected:
  2631. bool m_bChangeLook;
  2632.  
  2633. public:
  2634. bool isChangeLookOpened() {return m_bChangeLook;}
  2635. void ChangeLookWindow(bool bOpen = false, bool bRequest = false);
  2636. void ClearClWindowMaterials();
  2637. LPITEM* GetClWindowMaterials() {return m_pointsInstant.pClMaterials;}
  2638. BYTE CheckClEmptyMaterialSlot();
  2639. #ifdef __CHANGELOOK_EXTEND__
  2640. bool CanBeWearByAntiflag(DWORD dwVnum);
  2641. bool CanBeWearBySex(DWORD dwVnum);
  2642. #endif
  2643. void AddClMaterial(TItemPos tPos, BYTE bPos);
  2644. void RemoveClMaterial(BYTE bPos);
  2645. void RefineClMaterials();
  2646. bool CleanTransmutation(LPITEM pkItem, LPITEM pkTarget);
  2647. #endif
  2648. #ifdef __FAKE_BUFF__
  2649. public:
  2650. // init / destroy
  2651. void FakeBuff_Load(LPCHARACTER pkOwner, LPITEM pkSpawnItem);
  2652. void FakeBuff_Destroy();
  2653.  
  2654. // set / get
  2655. bool FakeBuff_Check() const { return m_pkFakeBuffOwner != NULL; }
  2656. LPCHARACTER FakeBuff_GetOwner() { return m_pkFakeBuffOwner; }
  2657. const LPCHARACTER FakeBuff_GetOwner() const { return m_pkFakeBuffOwner; }
  2658. LPITEM FakeBuff_GetItem() { return m_pkFakeBuffItem; }
  2659. LPCHARACTER FakeBuff_Owner_GetSpawn() { return m_pkFakeBuffSpawn; }
  2660.  
  2661. void FakeBuff_Owner_SetName(const char* szName) { m_stFakeBuffName = szName; }
  2662. const char* FakeBuff_Owner_GetName() const { return m_stFakeBuffName.c_str(); }
  2663.  
  2664. void FakeBuff_SetItem(LPITEM pkItem) { m_pkFakeBuffItem = pkItem; }
  2665. void FakeBuff_Owner_SetSpawn(LPCHARACTER pkChr) { m_pkFakeBuffSpawn = pkChr; }
  2666.  
  2667. DWORD FakeBuff_GetPart(BYTE bPart) const;
  2668.  
  2669. // spawn
  2670. LPCHARACTER FakeBuff_Owner_Spawn(int lX, int lY, LPITEM pkItem);
  2671. bool FakeBuff_Owner_Despawn();
  2672.  
  2673. // skills
  2674. bool FakeBuff_IsSkillNeeded(CSkillProto* pkSkill);
  2675. bool FakeBuff_UseSkill(LPCHARACTER pkTarget = NULL);
  2676. void FakeBuff_SendSkillPacket(CSkillProto* pkSkill);
  2677.  
  2678. private:
  2679. std::string m_stFakeBuffName;
  2680. LPCHARACTER m_pkFakeBuffOwner;
  2681. LPCHARACTER m_pkFakeBuffSpawn;
  2682. LPITEM m_pkFakeBuffItem;
  2683. #endif
  2684.  
  2685. public:
  2686. struct S_CARD
  2687. {
  2688. DWORD type;
  2689. DWORD value;
  2690. };
  2691.  
  2692. struct CARDS_INFO
  2693. {
  2694. S_CARD cards_in_hand[MAX_CARDS_IN_HAND];
  2695. S_CARD cards_in_field[MAX_CARDS_IN_FIELD];
  2696. DWORD cards_left;
  2697. DWORD field_points;
  2698. DWORD points;
  2699. };
  2700.  
  2701. void Cards_open(DWORD safemode);
  2702. void Cards_clean_list();
  2703. DWORD GetEmptySpaceInHand();
  2704. void Cards_pullout();
  2705. void RandomizeCards();
  2706. bool CardWasRandomized(DWORD type, DWORD value);
  2707. void SendUpdatedInformations();
  2708. void SendReward();
  2709. void CardsDestroy(DWORD reject_index);
  2710. void CardsAccept(DWORD accept_index);
  2711. void CardsRestore(DWORD restore_index);
  2712. DWORD GetEmptySpaceInField();
  2713. DWORD GetAllCardsCount();
  2714. bool TypesAreSame();
  2715. bool ValuesAreSame();
  2716. bool CardsMatch();
  2717. DWORD GetLowestCard();
  2718. bool CheckReward();
  2719. void CheckCards();
  2720. void RestoreField();
  2721. void ResetField();
  2722. void CardsEnd();
  2723. void GetGlobalRank(char * buffer, size_t buflen);
  2724. void GetRundRank(char * buffer, size_t buflen);
  2725. protected:
  2726. CARDS_INFO character_cards;
  2727. S_CARD randomized_cards[24];
  2728. #ifdef __BATTLE_PASS__
  2729. public:
  2730. int iMonthBattlePass;
  2731. struct Struct_BattlePass{DWORD count; DWORD status;};
  2732. void Load_BattlePass();
  2733. void ExternBattlePass();
  2734. void DoMission(int index, long long count);
  2735. void SendInfosBattlePass(int index);
  2736. void FinalRewardBattlePass();
  2737. struct Infos_BattlePass{DWORD vnum1; DWORD count1; DWORD vnum2;
  2738. DWORD count2; DWORD vnum3; DWORD count3;
  2739. char name[4096];};
  2740. struct Infos_MissionsBP{DWORD type; DWORD vnum; DWORD count;};
  2741. struct Infos_FinalBP{DWORD f_vnum1; DWORD f_count1; DWORD f_vnum2;
  2742. DWORD f_count2; DWORD f_vnum3; DWORD f_count3;};
  2743. std::vector<Struct_BattlePass> v_counts;
  2744. std::vector<Infos_BattlePass> rewards_bp;
  2745. std::vector<Infos_MissionsBP> missions_bp;
  2746. std::vector<Infos_FinalBP> final_rewards;
  2747. #endif
  2748.  
  2749. };
  2750.  
  2751. ESex GET_SEX(LPCHARACTER ch);
  2752.  
  2753. #endif
  2754.  
Advertisement
Add Comment
Please, Sign In to add comment