Advertisement
Guest User

Untitled

a guest
Jan 12th, 2019
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 70.02 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 "../../common/CommonDefines.h"
  17. #define ENABLE_ANTI_CMD_FLOOD
  18. enum eMountType {MOUNT_TYPE_NONE=0, MOUNT_TYPE_NORMAL=1, MOUNT_TYPE_COMBAT=2, MOUNT_TYPE_MILITARY=3};
  19. int __MountAtkSkill(DWORD dwMountVnum, bool IsNew);
  20.  
  21. class CBuffOnAttributes;
  22. class CPetSystem;
  23.  
  24. #define INSTANT_FLAG_DEATH_PENALTY (1 << 0)
  25. #define INSTANT_FLAG_SHOP (1 << 1)
  26. #define INSTANT_FLAG_EXCHANGE (1 << 2)
  27. #define INSTANT_FLAG_STUN (1 << 3)
  28. #define INSTANT_FLAG_NO_REWARD (1 << 4)
  29.  
  30. #define AI_FLAG_NPC (1 << 0)
  31. #define AI_FLAG_AGGRESSIVE (1 << 1)
  32. #define AI_FLAG_HELPER (1 << 2)
  33. #define AI_FLAG_STAYZONE (1 << 3)
  34.  
  35.  
  36. #define SET_OVER_TIME(ch, time) (ch)->SetOverTime(time)
  37.  
  38. extern int g_nPortalLimitTime;
  39.  
  40. enum
  41. {
  42. MAIN_RACE_WARRIOR_M,
  43. MAIN_RACE_ASSASSIN_W,
  44. MAIN_RACE_SURA_M,
  45. MAIN_RACE_SHAMAN_W,
  46. MAIN_RACE_WARRIOR_W,
  47. MAIN_RACE_ASSASSIN_M,
  48. MAIN_RACE_SURA_W,
  49. MAIN_RACE_SHAMAN_M,
  50. #ifdef ENABLE_WOLFMAN_CHARACTER
  51. MAIN_RACE_WOLFMAN_M,
  52. #endif
  53. MAIN_RACE_MAX_NUM,
  54. };
  55.  
  56. enum
  57. {
  58. POISON_LENGTH = 30,
  59. #ifdef ENABLE_WOLFMAN_CHARACTER
  60. BLEEDING_LENGTH = 30,
  61. #endif
  62. STAMINA_PER_STEP = 1,
  63. SAFEBOX_PAGE_SIZE = 9,
  64. AI_CHANGE_ATTACK_POISITION_TIME_NEAR = 10000,
  65. AI_CHANGE_ATTACK_POISITION_TIME_FAR = 1000,
  66. AI_CHANGE_ATTACK_POISITION_DISTANCE = 100,
  67. SUMMON_MONSTER_COUNT = 3,
  68. };
  69.  
  70. enum
  71. {
  72. FLY_NONE,
  73. FLY_EXP,
  74. FLY_HP_MEDIUM,
  75. FLY_HP_BIG,
  76. FLY_SP_SMALL,
  77. FLY_SP_MEDIUM,
  78. FLY_SP_BIG,
  79. FLY_FIREWORK1,
  80. FLY_FIREWORK2,
  81. FLY_FIREWORK3,
  82. FLY_FIREWORK4,
  83. FLY_FIREWORK5,
  84. FLY_FIREWORK6,
  85. FLY_FIREWORK_CHRISTMAS,
  86. FLY_CHAIN_LIGHTNING,
  87. FLY_HP_SMALL,
  88. FLY_SKILL_MUYEONG,
  89. };
  90.  
  91. enum EDamageType
  92. {
  93. DAMAGE_TYPE_NONE,
  94. DAMAGE_TYPE_NORMAL,
  95. DAMAGE_TYPE_NORMAL_RANGE,
  96. //½ºÅ³
  97. DAMAGE_TYPE_MELEE,
  98. DAMAGE_TYPE_RANGE,
  99. DAMAGE_TYPE_FIRE,
  100. DAMAGE_TYPE_ICE,
  101. DAMAGE_TYPE_ELEC,
  102. DAMAGE_TYPE_MAGIC,
  103. DAMAGE_TYPE_POISON,
  104. DAMAGE_TYPE_SPECIAL,
  105. #ifdef ENABLE_WOLFMAN_CHARACTER
  106. DAMAGE_TYPE_BLEEDING,
  107. #endif
  108. };
  109.  
  110. enum DamageFlag
  111. {
  112. DAMAGE_NORMAL = (1 << 0),
  113. DAMAGE_POISON = (1 << 1),
  114. DAMAGE_DODGE = (1 << 2),
  115. DAMAGE_BLOCK = (1 << 3),
  116. DAMAGE_PENETRATE= (1 << 4),
  117. DAMAGE_CRITICAL = (1 << 5),
  118. #if defined(ENABLE_WOLFMAN_CHARACTER) && !defined(USE_MOB_BLEEDING_AS_POISON)
  119. DAMAGE_BLEEDING = (1 << 6),
  120. #endif
  121. };
  122.  
  123. enum EPointTypes
  124. {
  125. POINT_NONE, // 0
  126. POINT_LEVEL, // 1
  127. POINT_VOICE, // 2
  128. POINT_EXP, // 3
  129. POINT_NEXT_EXP, // 4
  130. POINT_HP, // 5
  131. POINT_MAX_HP, // 6
  132. POINT_SP, // 7
  133. POINT_MAX_SP, // 8
  134. POINT_STAMINA, // 9 ½ºÅ׹̳Ê
  135. POINT_MAX_STAMINA, // 10 ÃÖ´ë ½ºÅ׹̳Ê
  136.  
  137. POINT_GOLD, // 11
  138. POINT_ST, // 12 ±Ù·Â
  139. POINT_HT, // 13 ü·Â
  140. POINT_DX, // 14 ¹Îø¼º
  141. POINT_IQ, // 15 Á¤½Å·Â
  142. POINT_DEF_GRADE, // 16 ...
  143. POINT_ATT_SPEED, // 17 °ø°Ý¼Óµµ
  144. POINT_ATT_GRADE, // 18 °ø°Ý·Â MAX
  145. POINT_MOV_SPEED, // 19 À̵¿¼Óµµ
  146. POINT_CLIENT_DEF_GRADE, // 20 ¹æ¾îµî±Þ
  147. POINT_CASTING_SPEED, // 21 ÁÖ¹®¼Óµµ (Äð´Ù¿îŸÀÓ*100) / (100 + ÀÌ°ª) = ÃÖÁ¾ Äð´Ù¿î ŸÀÓ
  148. POINT_MAGIC_ATT_GRADE, // 22 ¸¶¹ý°ø°Ý·Â
  149. POINT_MAGIC_DEF_GRADE, // 23 ¸¶¹ý¹æ¾î·Â
  150. POINT_EMPIRE_POINT, // 24 Á¦±¹Á¡¼ö
  151. POINT_LEVEL_STEP, // 25 ÇÑ ·¹º§¿¡¼­ÀÇ ´Ü°è.. (1 2 3 µÉ ¶§ º¸»ó, 4 µÇ¸é ·¹º§ ¾÷)
  152. POINT_STAT, // 26 ´É·ÂÄ¡ ¿Ã¸± ¼ö ÀÖ´Â °³¼ö
  153. POINT_SUB_SKILL, // 27 º¸Á¶ ½ºÅ³ Æ÷ÀÎÆ®
  154. POINT_SKILL, // 28 ¾×Ƽºê ½ºÅ³ Æ÷ÀÎÆ®
  155. POINT_WEAPON_MIN, // 29 ¹«±â ÃÖ¼Ò µ¥¹ÌÁö
  156. POINT_WEAPON_MAX, // 30 ¹«±â ÃÖ´ë µ¥¹ÌÁö
  157. POINT_PLAYTIME, // 31 Ç÷¹À̽ð£
  158. POINT_HP_REGEN, // 32 HP ȸº¹·ü
  159. POINT_SP_REGEN, // 33 SP ȸº¹·ü
  160.  
  161. POINT_BOW_DISTANCE, // 34 È° »çÁ¤°Å¸® Áõ°¡Ä¡ (meter)
  162.  
  163. POINT_HP_RECOVERY, // 35 ü·Â ȸº¹ Áõ°¡·®
  164. POINT_SP_RECOVERY, // 36 Á¤½Å·Â ȸº¹ Áõ°¡·®
  165.  
  166. POINT_POISON_PCT, // 37 µ¶ È®·ü
  167. POINT_STUN_PCT, // 38 ±âÀý È®·ü
  168. POINT_SLOW_PCT, // 39 ½½·Î¿ì È®·ü
  169. POINT_CRITICAL_PCT, // 40 Å©¸®Æ¼Äà Ȯ·ü
  170. POINT_PENETRATE_PCT, // 41 °üÅëŸ°Ý È®·ü
  171. POINT_CURSE_PCT, // 42 ÀúÁÖ È®·ü
  172.  
  173. POINT_ATTBONUS_HUMAN, // 43 Àΰ£¿¡°Ô °­ÇÔ
  174. POINT_ATTBONUS_ANIMAL, // 44 µ¿¹°¿¡°Ô µ¥¹ÌÁö % Áõ°¡
  175. POINT_ATTBONUS_ORC, // 45 ¿õ±Í¿¡°Ô µ¥¹ÌÁö % Áõ°¡
  176. POINT_ATTBONUS_MILGYO, // 46 ¹Ð±³¿¡°Ô µ¥¹ÌÁö % Áõ°¡
  177. POINT_ATTBONUS_UNDEAD, // 47 ½Ãü¿¡°Ô µ¥¹ÌÁö % Áõ°¡
  178. POINT_ATTBONUS_DEVIL, // 48 ¸¶±Í(¾Ç¸¶)¿¡°Ô µ¥¹ÌÁö % Áõ°¡
  179. POINT_ATTBONUS_INSECT, // 49 ¹ú·¹Á·
  180. POINT_ATTBONUS_FIRE, // 50 È­¿°Á·
  181. POINT_ATTBONUS_ICE, // 51 ºù¼³Á·
  182. POINT_ATTBONUS_DESERT, // 52 »ç¸·Á·
  183. POINT_ATTBONUS_MONSTER, // 53 ¸ðµç ¸ó½ºÅÍ¿¡°Ô °­ÇÔ
  184. POINT_ATTBONUS_WARRIOR, // 54 ¹«»ç¿¡°Ô °­ÇÔ
  185. POINT_ATTBONUS_ASSASSIN, // 55 ÀÚ°´¿¡°Ô °­ÇÔ
  186. POINT_ATTBONUS_SURA, // 56 ¼ö¶ó¿¡°Ô °­ÇÔ
  187. POINT_ATTBONUS_SHAMAN, // 57 ¹«´ç¿¡°Ô °­ÇÔ
  188. POINT_ATTBONUS_TREE, // 58 ³ª¹«¿¡°Ô °­ÇÔ 20050729.myevan UNUSED5
  189.  
  190. POINT_RESIST_WARRIOR, // 59 ¹«»ç¿¡°Ô ÀúÇ×
  191. POINT_RESIST_ASSASSIN, // 60 ÀÚ°´¿¡°Ô ÀúÇ×
  192. POINT_RESIST_SURA, // 61 ¼ö¶ó¿¡°Ô ÀúÇ×
  193. POINT_RESIST_SHAMAN, // 62 ¹«´ç¿¡°Ô ÀúÇ×
  194.  
  195. POINT_STEAL_HP, // 63 »ý¸í·Â Èí¼ö
  196. POINT_STEAL_SP, // 64 Á¤½Å·Â Èí¼ö
  197.  
  198. POINT_MANA_BURN_PCT, // 65 ¸¶³ª ¹ø
  199.  
  200. /// ÇÇÇؽà º¸³Ê½º ///
  201.  
  202. POINT_DAMAGE_SP_RECOVER, // 66 °ø°Ý´çÇÒ ½Ã Á¤½Å·Â ȸº¹ È®·ü
  203.  
  204. POINT_BLOCK, // 67 ºí·°À²
  205. POINT_DODGE, // 68 ȸÇÇÀ²
  206.  
  207. POINT_RESIST_SWORD, // 69
  208. POINT_RESIST_TWOHAND, // 70
  209. POINT_RESIST_DAGGER, // 71
  210. POINT_RESIST_BELL, // 72
  211. POINT_RESIST_FAN, // 73
  212. POINT_RESIST_BOW, // 74 È­»ì ÀúÇ× : ´ë¹ÌÁö °¨¼Ò
  213. POINT_RESIST_FIRE, // 75 È­¿° ÀúÇ× : È­¿°°ø°Ý¿¡ ´ëÇÑ ´ë¹ÌÁö °¨¼Ò
  214. POINT_RESIST_ELEC, // 76 Àü±â ÀúÇ× : Àü±â°ø°Ý¿¡ ´ëÇÑ ´ë¹ÌÁö °¨¼Ò
  215. POINT_RESIST_MAGIC, // 77 ¼ú¹ý ÀúÇ× : ¸ðµç¼ú¹ý¿¡ ´ëÇÑ ´ë¹ÌÁö °¨¼Ò
  216. POINT_RESIST_WIND, // 78 ¹Ù¶÷ ÀúÇ× : ¹Ù¶÷°ø°Ý¿¡ ´ëÇÑ ´ë¹ÌÁö °¨¼Ò
  217.  
  218. POINT_REFLECT_MELEE, // 79 °ø°Ý ¹Ý»ç
  219.  
  220. /// Ư¼ö ÇÇÇؽà ///
  221. POINT_REFLECT_CURSE, // 80 ÀúÁÖ ¹Ý»ç
  222. POINT_POISON_REDUCE, // 81 µ¶µ¥¹ÌÁö °¨¼Ò
  223.  
  224. /// Àû ¼Ò¸ê½Ã ///
  225. POINT_KILL_SP_RECOVER, // 82 Àû ¼Ò¸ê½Ã MP ȸº¹
  226. POINT_EXP_DOUBLE_BONUS, // 83
  227. POINT_GOLD_DOUBLE_BONUS, // 84
  228. POINT_ITEM_DROP_BONUS, // 85
  229.  
  230. /// ȸº¹ °ü·Ã ///
  231. POINT_POTION_BONUS, // 86
  232. POINT_KILL_HP_RECOVERY, // 87
  233.  
  234. POINT_IMMUNE_STUN, // 88
  235. POINT_IMMUNE_SLOW, // 89
  236. POINT_IMMUNE_FALL, // 90
  237. //////////////////
  238.  
  239. POINT_PARTY_ATTACKER_BONUS, // 91
  240. POINT_PARTY_TANKER_BONUS, // 92
  241.  
  242. POINT_ATT_BONUS, // 93
  243. POINT_DEF_BONUS, // 94
  244.  
  245. POINT_ATT_GRADE_BONUS, // 95
  246. POINT_DEF_GRADE_BONUS, // 96
  247. POINT_MAGIC_ATT_GRADE_BONUS, // 97
  248. POINT_MAGIC_DEF_GRADE_BONUS, // 98
  249.  
  250. POINT_RESIST_NORMAL_DAMAGE, // 99
  251.  
  252. POINT_HIT_HP_RECOVERY, // 100
  253. POINT_HIT_SP_RECOVERY, // 101
  254. POINT_MANASHIELD, // 102 Èæ½Å¼öÈ£ ½ºÅ³¿¡ ÀÇÇÑ ¸¶³ª½¯µå È¿°ú Á¤µµ
  255.  
  256. POINT_PARTY_BUFFER_BONUS, // 103
  257. POINT_PARTY_SKILL_MASTER_BONUS, // 104
  258.  
  259. POINT_HP_RECOVER_CONTINUE, // 105
  260. POINT_SP_RECOVER_CONTINUE, // 106
  261.  
  262. POINT_STEAL_GOLD, // 107
  263. POINT_POLYMORPH, // 108 º¯½ÅÇÑ ¸ó½ºÅÍ ¹øÈ£
  264. POINT_MOUNT, // 109 Ÿ°íÀÖ´Â ¸ó½ºÅÍ ¹øÈ£
  265.  
  266. POINT_PARTY_HASTE_BONUS, // 110
  267. POINT_PARTY_DEFENDER_BONUS, // 111
  268. POINT_STAT_RESET_COUNT, // 112 ÇÇÀÇ ´Ü¾à »ç¿ëÀ» ÅëÇÑ ½ºÅÝ ¸®¼Â Æ÷ÀÎÆ® (1´ç 1Æ÷ÀÎÆ® ¸®¼Â°¡´É)
  269.  
  270. POINT_HORSE_SKILL, // 113
  271.  
  272. POINT_MALL_ATTBONUS, // 114 °ø°Ý·Â +x%
  273. POINT_MALL_DEFBONUS, // 115 ¹æ¾î·Â +x%
  274. POINT_MALL_EXPBONUS, // 116 °æÇèÄ¡ +x%
  275. POINT_MALL_ITEMBONUS, // 117 ¾ÆÀÌÅÛ µå·ÓÀ² x/10¹è
  276. POINT_MALL_GOLDBONUS, // 118 µ· µå·ÓÀ² x/10¹è
  277.  
  278. POINT_MAX_HP_PCT, // 119 ÃÖ´ë»ý¸í·Â +x%
  279. POINT_MAX_SP_PCT, // 120 ÃÖ´ëÁ¤½Å·Â +x%
  280.  
  281. POINT_SKILL_DAMAGE_BONUS, // 121 ½ºÅ³ µ¥¹ÌÁö *(100+x)%
  282. POINT_NORMAL_HIT_DAMAGE_BONUS, // 122 ÆòŸ µ¥¹ÌÁö *(100+x)%
  283.  
  284. // DEFEND_BONUS_ATTRIBUTES
  285. POINT_SKILL_DEFEND_BONUS, // 123 ½ºÅ³ ¹æ¾î µ¥¹ÌÁö
  286. POINT_NORMAL_HIT_DEFEND_BONUS, // 124 ÆòŸ ¹æ¾î µ¥¹ÌÁö
  287. // END_OF_DEFEND_BONUS_ATTRIBUTES
  288.  
  289. // PC_BANG_ITEM_ADD
  290. POINT_PC_BANG_EXP_BONUS, // 125 PC¹æ Àü¿ë °æÇèÄ¡ º¸³Ê½º
  291. POINT_PC_BANG_DROP_BONUS, // 126 PC¹æ Àü¿ë µå·Ó·ü º¸³Ê½º
  292. // END_PC_BANG_ITEM_ADD
  293. POINT_RAMADAN_CANDY_BONUS_EXP, // ¶ó¸¶´Ü »çÅÁ °æÇèÄ¡ Áõ°¡¿ë
  294.  
  295. POINT_ENERGY = 128, // 128 ±â·Â
  296.  
  297. // ±â·Â ui ¿ë.
  298. // ¼­¹ö¿¡¼­ ¾²Áö ¾Ê±â¸¸, Ŭ¶óÀ̾ðÆ®¿¡¼­ ±â·ÂÀÇ ³¡ ½Ã°£À» POINT·Î °ü¸®Çϱ⠶§¹®¿¡ ÀÌ·¸°Ô ÇÑ´Ù.
  299. // ¾Æ ºÎ²ô·´´Ù
  300. POINT_ENERGY_END_TIME = 129, // 129 ±â·Â Á¾·á ½Ã°£
  301.  
  302. POINT_COSTUME_ATTR_BONUS = 130,
  303. POINT_MAGIC_ATT_BONUS_PER = 131,
  304. POINT_MELEE_MAGIC_ATT_BONUS_PER = 132,
  305.  
  306. // Ãß°¡ ¼Ó¼º ÀúÇ×
  307. POINT_RESIST_ICE = 133, // ³Ã±â ÀúÇ× : ¾óÀ½°ø°Ý¿¡ ´ëÇÑ ´ë¹ÌÁö °¨¼Ò
  308. POINT_RESIST_EARTH = 134, // ´ëÁö ÀúÇ× : ¾óÀ½°ø°Ý¿¡ ´ëÇÑ ´ë¹ÌÁö °¨¼Ò
  309. POINT_RESIST_DARK = 135, // ¾îµÒ ÀúÇ× : ¾óÀ½°ø°Ý¿¡ ´ëÇÑ ´ë¹ÌÁö °¨¼Ò
  310.  
  311. POINT_RESIST_CRITICAL = 136, // Å©¸®Æ¼Äà ÀúÇ× : »ó´ëÀÇ Å©¸®Æ¼Äà Ȯ·üÀ» °¨¼Ò
  312. POINT_RESIST_PENETRATE = 137, // °üÅëŸ°Ý ÀúÇ× : »ó´ëÀÇ °üÅëŸ°Ý È®·üÀ» °¨¼Ò
  313.  
  314. #ifdef ENABLE_WOLFMAN_CHARACTER
  315. POINT_BLEEDING_REDUCE = 138,
  316. POINT_BLEEDING_PCT = 139,
  317.  
  318. POINT_ATTBONUS_WOLFMAN = 140, // 140 ¼öÀÎÁ·¿¡°Ô °­ÇÔ
  319. POINT_RESIST_WOLFMAN = 141, // 141 ¼öÀÎÁ·¿¡°Ô ÀúÇ×
  320. POINT_RESIST_CLAW = 142, // 142 CLAW¿¡ ÀúÇ×
  321. #endif
  322.  
  323. #ifdef ENABLE_ACCE_COSTUME_SYSTEM
  324. POINT_ACCEDRAIN_RATE = 143,
  325. #endif
  326. #ifdef ENABLE_MAGIC_REDUCTION_SYSTEM
  327. POINT_RESIST_MAGIC_REDUCTION = 144,
  328. #endif
  329.  
  330. //POINT_MAX_NUM = 129 common/length.h
  331. };
  332.  
  333. enum EPKModes
  334. {
  335. PK_MODE_PEACE,
  336. PK_MODE_REVENGE,
  337. PK_MODE_FREE,
  338. PK_MODE_PROTECT,
  339. PK_MODE_GUILD,
  340. PK_MODE_MAX_NUM
  341. };
  342.  
  343. enum EPositions
  344. {
  345. POS_DEAD,
  346. POS_SLEEPING,
  347. POS_RESTING,
  348. POS_SITTING,
  349. POS_FISHING,
  350. POS_FIGHTING,
  351. POS_MOUNTING,
  352. POS_STANDING
  353. };
  354.  
  355. enum EBlockAction
  356. {
  357. BLOCK_EXCHANGE = (1 << 0),
  358. BLOCK_PARTY_INVITE = (1 << 1),
  359. BLOCK_GUILD_INVITE = (1 << 2),
  360. BLOCK_WHISPER = (1 << 3),
  361. BLOCK_MESSENGER_INVITE = (1 << 4),
  362. BLOCK_PARTY_REQUEST = (1 << 5),
  363. };
  364.  
  365. // <Factor> Dynamically evaluated CHARACTER* equivalent.
  366. // Referring to SCharDeadEventInfo.
  367. struct DynamicCharacterPtr {
  368. DynamicCharacterPtr() : is_pc(false), id(0) {}
  369. DynamicCharacterPtr(const DynamicCharacterPtr& o)
  370. : is_pc(o.is_pc), id(o.id) {}
  371.  
  372. // Returns the LPCHARACTER found in CHARACTER_MANAGER.
  373. LPCHARACTER Get() const;
  374. // Clears the current settings.
  375. void Reset() {
  376. is_pc = false;
  377. id = 0;
  378. }
  379.  
  380. // Basic assignment operator.
  381. DynamicCharacterPtr& operator=(const DynamicCharacterPtr& rhs) {
  382. is_pc = rhs.is_pc;
  383. id = rhs.id;
  384. return *this;
  385. }
  386. // Supports assignment with LPCHARACTER type.
  387. DynamicCharacterPtr& operator=(LPCHARACTER character);
  388. // Supports type casting to LPCHARACTER.
  389. operator LPCHARACTER() const {
  390. return Get();
  391. }
  392.  
  393. bool is_pc;
  394. uint32_t id;
  395. };
  396.  
  397. /* ÀúÀåÇÏ´Â µ¥ÀÌÅÍ */
  398. typedef struct character_point
  399. {
  400. long points[POINT_MAX_NUM];
  401.  
  402. BYTE job;
  403. BYTE voice;
  404.  
  405. BYTE level;
  406. DWORD exp;
  407. long gold;
  408.  
  409. int hp;
  410. int sp;
  411.  
  412. int iRandomHP;
  413. int iRandomSP;
  414.  
  415. int stamina;
  416.  
  417. BYTE skill_group;
  418. } CHARACTER_POINT;
  419.  
  420. /* ÀúÀåµÇÁö ¾Ê´Â ij¸¯ÅÍ µ¥ÀÌÅÍ */
  421. typedef struct character_point_instant
  422. {
  423. long points[POINT_MAX_NUM];
  424.  
  425. float fRot;
  426.  
  427. int iMaxHP;
  428. int iMaxSP;
  429.  
  430. long position;
  431.  
  432. long instant_flag;
  433. DWORD dwAIFlag;
  434. DWORD dwImmuneFlag;
  435. DWORD dwLastShoutPulse;
  436.  
  437. WORD parts[PART_MAX_NUM];
  438.  
  439. // ¾Æ... ÁøÂ¥ ¿åÀ» ¾È ÇÒ·¡¾ß ¾È ÇÒ ¼ö°¡ ¾ø´Ù.
  440. // char´Â Àκ¥À» BYTE array·Î grid¸¦ °ü¸®ÇÏ°í, exchange³ª cube´Â CGrid·Î grid¸¦ °ü¸®ÇÏ°í ¹¹³Ä ÀÌ°Å...
  441. // grid¸¦ ¸¸µé¾î ³ùÀ¸¸é grid¸¦ ¾²¶õ ¸»À̾ß!!!
  442. // ¤µ¤² ¿ëÈ¥¼® Àκ¥À» ¶È°°ÀÌ µû¶ó¼­ ¸¸µç ³ªµµ À߸øÇß´Ù ¤Ð¤Ð
  443. LPITEM pItems[INVENTORY_AND_EQUIP_SLOT_MAX];
  444. BYTE bItemGrid[INVENTORY_AND_EQUIP_SLOT_MAX];
  445.  
  446. // ¿ëÈ¥¼® Àκ¥Å丮.
  447. LPITEM pDSItems[DRAGON_SOUL_INVENTORY_MAX_NUM];
  448. WORD wDSItemGrid[DRAGON_SOUL_INVENTORY_MAX_NUM];
  449.  
  450. // by mhh
  451. LPITEM pCubeItems[CUBE_MAX_NUM];
  452. LPCHARACTER pCubeNpc;
  453.  
  454. LPCHARACTER battle_victim;
  455.  
  456. BYTE gm_level;
  457.  
  458. BYTE bBasePart; // Æò»óº¹ ¹øÈ£
  459.  
  460. int iMaxStamina;
  461.  
  462. BYTE bBlockMode;
  463.  
  464. int iDragonSoulActiveDeck;
  465. LPENTITY m_pDragonSoulRefineWindowOpener;
  466. } CHARACTER_POINT_INSTANT;
  467.  
  468. #define TRIGGERPARAM LPCHARACTER ch, LPCHARACTER causer
  469.  
  470. typedef struct trigger
  471. {
  472. BYTE type;
  473. int (*func) (TRIGGERPARAM);
  474. long value;
  475. } TRIGGER;
  476.  
  477. class CTrigger
  478. {
  479. public:
  480. CTrigger() : bType(0), pFunc(NULL)
  481. {
  482. }
  483.  
  484. BYTE bType;
  485. int (*pFunc) (TRIGGERPARAM);
  486. };
  487.  
  488. EVENTINFO(char_event_info)
  489. {
  490. DynamicCharacterPtr ch;
  491. };
  492.  
  493. struct TSkillUseInfo
  494. {
  495. int iHitCount;
  496. int iMaxHitCount;
  497. int iSplashCount;
  498. DWORD dwNextSkillUsableTime;
  499. int iRange;
  500. bool bUsed;
  501. DWORD dwVID;
  502. bool isGrandMaster;
  503.  
  504. boost::unordered_map<VID, size_t> TargetVIDMap;
  505.  
  506. TSkillUseInfo()
  507. : iHitCount(0), iMaxHitCount(0), iSplashCount(0), dwNextSkillUsableTime(0), iRange(0), bUsed(false),
  508. dwVID(0), isGrandMaster(false)
  509. {}
  510.  
  511. bool HitOnce(DWORD dwVnum = 0);
  512.  
  513. bool UseSkill(bool isGrandMaster, DWORD vid, DWORD dwCooltime, int splashcount = 1, int hitcount = -1, int range = -1);
  514. DWORD GetMainTargetVID() const { return dwVID; }
  515. void SetMainTargetVID(DWORD vid) { dwVID=vid; }
  516. void ResetHitCount() { if (iSplashCount) { iHitCount = iMaxHitCount; iSplashCount--; } }
  517. };
  518.  
  519. typedef struct packet_party_update TPacketGCPartyUpdate;
  520. class CExchange;
  521. class CSkillProto;
  522. class CParty;
  523. class CDungeon;
  524. class CWarMap;
  525. class CAffect;
  526. class CGuild;
  527. class CSafebox;
  528. class CArena;
  529.  
  530. class CShop;
  531. typedef class CShop * LPSHOP;
  532.  
  533. class CMob;
  534. class CMobInstance;
  535. typedef struct SMobSkillInfo TMobSkillInfo;
  536.  
  537. //SKILL_POWER_BY_LEVEL
  538. extern int GetSkillPowerByLevelFromType(int job, int skillgroup, int skilllevel);
  539. //END_SKILL_POWER_BY_LEVEL
  540.  
  541. namespace marriage
  542. {
  543. class WeddingMap;
  544. }
  545. enum e_overtime
  546. {
  547. OT_NONE,
  548. OT_3HOUR,
  549. OT_5HOUR,
  550. };
  551.  
  552. #define NEW_ICEDAMAGE_SYSTEM
  553. class CHARACTER : public CEntity, public CFSM, public CHorseRider
  554. {
  555. protected:
  556. //////////////////////////////////////////////////////////////////////////////////
  557. // Entity °ü·Ã
  558. virtual void EncodeInsertPacket(LPENTITY entity);
  559. virtual void EncodeRemovePacket(LPENTITY entity);
  560. //////////////////////////////////////////////////////////////////////////////////
  561.  
  562. public:
  563. LPCHARACTER FindCharacterInView(const char * name, bool bFindPCOnly);
  564. void UpdatePacket();
  565.  
  566. //////////////////////////////////////////////////////////////////////////////////
  567. // FSM (Finite State Machine) °ü·Ã
  568. protected:
  569. CStateTemplate<CHARACTER> m_stateMove;
  570. CStateTemplate<CHARACTER> m_stateBattle;
  571. CStateTemplate<CHARACTER> m_stateIdle;
  572.  
  573. public:
  574. virtual void StateMove();
  575. virtual void StateBattle();
  576. virtual void StateIdle();
  577. virtual void StateFlag();
  578. virtual void StateFlagBase();
  579. void StateHorse();
  580.  
  581. protected:
  582. // STATE_IDLE_REFACTORING
  583. void __StateIdle_Monster();
  584. void __StateIdle_Stone();
  585. void __StateIdle_NPC();
  586. // END_OF_STATE_IDLE_REFACTORING
  587.  
  588. public:
  589. DWORD GetAIFlag() const { return m_pointsInstant.dwAIFlag; }
  590.  
  591. void SetAggressive();
  592. bool IsAggressive() const;
  593.  
  594. void SetCoward();
  595. bool IsCoward() const;
  596. void CowardEscape();
  597.  
  598. void SetNoAttackShinsu();
  599. bool IsNoAttackShinsu() const;
  600.  
  601. void SetNoAttackChunjo();
  602. bool IsNoAttackChunjo() const;
  603.  
  604. void SetNoAttackJinno();
  605. bool IsNoAttackJinno() const;
  606.  
  607. void SetAttackMob();
  608. bool IsAttackMob() const;
  609.  
  610. virtual void BeginStateEmpty();
  611. virtual void EndStateEmpty() {}
  612.  
  613. void RestartAtSamePos();
  614.  
  615. protected:
  616. DWORD m_dwStateDuration;
  617. //////////////////////////////////////////////////////////////////////////////////
  618.  
  619. public:
  620. CHARACTER();
  621. virtual ~CHARACTER();
  622.  
  623. void Create(const char * c_pszName, DWORD vid, bool isPC);
  624. void Destroy();
  625.  
  626. void Disconnect(const char * c_pszReason);
  627.  
  628. protected:
  629. void Initialize();
  630.  
  631. //////////////////////////////////////////////////////////////////////////////////
  632. // Basic Points
  633. public:
  634. DWORD GetPlayerID() const { return m_dwPlayerID; }
  635.  
  636. void SetPlayerProto(const TPlayerTable * table);
  637. void CreatePlayerProto(TPlayerTable & tab); // ÀúÀå ½Ã »ç¿ë
  638.  
  639. void SetProto(const CMob * c_pkMob);
  640. WORD GetRaceNum() const;
  641.  
  642. void Save(); // DelayedSave
  643. void SaveReal(); // ½ÇÁ¦ ÀúÀå
  644. void FlushDelayedSaveItem();
  645.  
  646. const char * GetName() const;
  647. const VID & GetVID() const { return m_vid; }
  648.  
  649. void SetName(const std::string& name) { m_stName = name; }
  650.  
  651. void SetRace(BYTE race);
  652. bool ChangeSex();
  653.  
  654. DWORD GetAID() const;
  655. int GetChangeEmpireCount() const;
  656. void SetChangeEmpireCount();
  657. int ChangeEmpire(BYTE empire);
  658.  
  659. BYTE GetJob() const;
  660. BYTE GetCharType() const;
  661.  
  662. bool IsPC() const { return GetDesc() ? true : false; }
  663. bool IsNPC() const { return m_bCharType != CHAR_TYPE_PC; }
  664. bool IsMonster() const { return m_bCharType == CHAR_TYPE_MONSTER; }
  665. bool IsStone() const { return m_bCharType == CHAR_TYPE_STONE; }
  666. bool IsDoor() const { return m_bCharType == CHAR_TYPE_DOOR; }
  667. bool IsBuilding() const { return m_bCharType == CHAR_TYPE_BUILDING; }
  668. bool IsWarp() const { return m_bCharType == CHAR_TYPE_WARP; }
  669. bool IsGoto() const { return m_bCharType == CHAR_TYPE_GOTO; }
  670. // bool IsPet() const { return m_bCharType == CHAR_TYPE_PET; }
  671.  
  672. DWORD GetLastShoutPulse() const { return m_pointsInstant.dwLastShoutPulse; }
  673. void SetLastShoutPulse(DWORD pulse) { m_pointsInstant.dwLastShoutPulse = pulse; }
  674. int GetLevel() const { return m_points.level; }
  675. void SetLevel(BYTE level);
  676.  
  677. BYTE GetGMLevel() const;
  678. BOOL IsGM() const;
  679. void SetGMLevel();
  680.  
  681. DWORD GetExp() const { return m_points.exp; }
  682. void SetExp(DWORD exp) { m_points.exp = exp; }
  683. DWORD GetNextExp() const;
  684. LPCHARACTER DistributeExp(); // Á¦ÀÏ ¸¹ÀÌ ¶§¸° »ç¶÷À» ¸®ÅÏÇÑ´Ù.
  685. void DistributeHP(LPCHARACTER pkKiller);
  686. void DistributeSP(LPCHARACTER pkKiller, int iMethod=0);
  687.  
  688. void SetPosition(int pos);
  689. bool IsPosition(int pos) const { return m_pointsInstant.position == pos ? true : false; }
  690. int GetPosition() const { return m_pointsInstant.position; }
  691.  
  692. void SetPart(BYTE bPartPos, WORD wVal);
  693. WORD GetPart(BYTE bPartPos) const;
  694. WORD GetOriginalPart(BYTE bPartPos) const;
  695.  
  696. void SetHP(int hp) { m_points.hp = hp; }
  697. int GetHP() const { return m_points.hp; }
  698.  
  699. void SetSP(int sp) { m_points.sp = sp; }
  700. int GetSP() const { return m_points.sp; }
  701.  
  702. void SetStamina(int stamina) { m_points.stamina = stamina; }
  703. int GetStamina() const { return m_points.stamina; }
  704.  
  705. void SetMaxHP(int iVal) { m_pointsInstant.iMaxHP = iVal; }
  706. int GetMaxHP() const { return m_pointsInstant.iMaxHP; }
  707.  
  708. void SetMaxSP(int iVal) { m_pointsInstant.iMaxSP = iVal; }
  709. int GetMaxSP() const { return m_pointsInstant.iMaxSP; }
  710.  
  711. void SetMaxStamina(int iVal) { m_pointsInstant.iMaxStamina = iVal; }
  712. int GetMaxStamina() const { return m_pointsInstant.iMaxStamina; }
  713.  
  714. void SetRandomHP(int v) { m_points.iRandomHP = v; }
  715. void SetRandomSP(int v) { m_points.iRandomSP = v; }
  716.  
  717. int GetRandomHP() const { return m_points.iRandomHP; }
  718. int GetRandomSP() const { return m_points.iRandomSP; }
  719.  
  720. int GetHPPct() const;
  721.  
  722. void SetRealPoint(BYTE idx, int val);
  723. int GetRealPoint(BYTE idx) const;
  724.  
  725. void SetPoint(BYTE idx, int val);
  726. int GetPoint(BYTE idx) const;
  727. int GetLimitPoint(BYTE idx) const;
  728. int GetPolymorphPoint(BYTE idx) const;
  729.  
  730. const TMobTable & GetMobTable() const;
  731. BYTE GetMobRank() const;
  732. BYTE GetMobBattleType() const;
  733. BYTE GetMobSize() const;
  734. DWORD GetMobDamageMin() const;
  735. DWORD GetMobDamageMax() const;
  736. WORD GetMobAttackRange() const;
  737. DWORD GetMobDropItemVnum() const;
  738. float GetMobDamageMultiply() const;
  739.  
  740. // NEWAI
  741. bool IsBerserker() const;
  742. bool IsBerserk() const;
  743. void SetBerserk(bool mode);
  744.  
  745. bool IsStoneSkinner() const;
  746.  
  747. bool IsGodSpeeder() const;
  748. bool IsGodSpeed() const;
  749. void SetGodSpeed(bool mode);
  750.  
  751. bool IsDeathBlower() const;
  752. bool IsDeathBlow() const;
  753.  
  754. bool IsReviver() const;
  755. bool HasReviverInParty() const;
  756. bool IsRevive() const;
  757. void SetRevive(bool mode);
  758. // NEWAI END
  759.  
  760. bool IsRaceFlag(DWORD dwBit) const;
  761. bool IsSummonMonster() const;
  762. DWORD GetSummonVnum() const;
  763.  
  764. DWORD GetPolymorphItemVnum() const;
  765. DWORD GetMonsterDrainSPPoint() const;
  766.  
  767. void MainCharacterPacket(); // ³»°¡ ¸ÞÀÎij¸¯ÅͶó°í º¸³»ÁØ´Ù.
  768.  
  769. void ComputePoints();
  770. void ComputeBattlePoints();
  771. void PointChange(BYTE type, int amount, bool bAmount = false, bool bBroadcast = false);
  772. void PointsPacket();
  773. void ApplyPoint(BYTE bApplyType, int iVal);
  774. void CheckMaximumPoints(); // HP, SP µîÀÇ ÇöÀç °ªÀÌ ÃÖ´ë°ª º¸´Ù ³ôÀºÁö °Ë»çÇÏ°í ³ô´Ù¸é ³·Ãá´Ù.
  775.  
  776. bool Show(long lMapIndex, long x, long y, long z = LONG_MAX, bool bShowSpawnMotion = false);
  777.  
  778. void Sitdown(int is_ground);
  779. void Standup();
  780.  
  781. void SetRotation(float fRot);
  782. void SetRotationToXY(long x, long y);
  783. float GetRotation() const { return m_pointsInstant.fRot; }
  784.  
  785. void MotionPacketEncode(BYTE motion, LPCHARACTER victim, struct packet_motion * packet);
  786. void Motion(BYTE motion, LPCHARACTER victim = NULL);
  787.  
  788. void ChatPacket(BYTE type, const char *format, ...);
  789. void MonsterChat(BYTE bMonsterChatType);
  790. void SendGreetMessage();
  791.  
  792. void ResetPoint(int iLv);
  793.  
  794. void SetBlockMode(BYTE bFlag);
  795. void SetBlockModeForce(BYTE bFlag);
  796. bool IsBlockMode(BYTE bFlag) const { return (m_pointsInstant.bBlockMode & bFlag)?true:false; }
  797.  
  798. bool IsPolymorphed() const { return m_dwPolymorphRace>0; }
  799. bool IsPolyMaintainStat() const { return m_bPolyMaintainStat; } // ÀÌÀü ½ºÅÝÀ» À¯ÁöÇÏ´Â Æú¸®¸ðÇÁ.
  800. void SetPolymorph(DWORD dwRaceNum, bool bMaintainStat = false);
  801. DWORD GetPolymorphVnum() const { return m_dwPolymorphRace; }
  802. int GetPolymorphPower() const;
  803.  
  804. // FISING
  805. void fishing();
  806. void fishing_take();
  807. // END_OF_FISHING
  808.  
  809. // MINING
  810. void mining(LPCHARACTER chLoad);
  811. void mining_cancel();
  812. void mining_take();
  813. // END_OF_MINING
  814.  
  815. void ResetPlayTime(DWORD dwTimeRemain = 0);
  816.  
  817. void CreateFly(BYTE bType, LPCHARACTER pkVictim);
  818.  
  819. void ResetChatCounter();
  820. BYTE IncreaseChatCounter();
  821. BYTE GetChatCounter() const;
  822.  
  823. protected:
  824. DWORD m_dwPolymorphRace;
  825. bool m_bPolyMaintainStat;
  826. DWORD m_dwLoginPlayTime;
  827. DWORD m_dwPlayerID;
  828. VID m_vid;
  829. std::string m_stName;
  830. BYTE m_bCharType;
  831.  
  832. CHARACTER_POINT m_points;
  833. CHARACTER_POINT_INSTANT m_pointsInstant;
  834.  
  835. int m_iMoveCount;
  836. DWORD m_dwPlayStartTime;
  837. BYTE m_bAddChrState;
  838. bool m_bSkipSave;
  839. std::string m_stMobile;
  840. char m_szMobileAuth[5];
  841. BYTE m_bChatCounter;
  842.  
  843. // End of Basic Points
  844.  
  845. //////////////////////////////////////////////////////////////////////////////////
  846. // Move & Synchronize Positions
  847. //////////////////////////////////////////////////////////////////////////////////
  848. public:
  849. bool IsStateMove() const { return IsState((CState&)m_stateMove); }
  850. bool IsStateIdle() const { return IsState((CState&)m_stateIdle); }
  851. bool IsWalking() const { return m_bNowWalking || GetStamina()<=0; }
  852. void SetWalking(bool bWalkFlag) { m_bWalking=bWalkFlag; }
  853. void SetNowWalking(bool bWalkFlag);
  854. void ResetWalking() { SetNowWalking(m_bWalking); }
  855.  
  856. bool Goto(long x, long y); // ¹Ù·Î À̵¿ ½ÃÅ°Áö ¾Ê°í ¸ñÇ¥ À§Ä¡·Î BLENDING ½ÃŲ´Ù.
  857. void Stop();
  858.  
  859. bool CanMove() const; // À̵¿ÇÒ ¼ö Àִ°¡?
  860.  
  861. void SyncPacket();
  862. bool Sync(long x, long y); // ½ÇÁ¦ ÀÌ ¸Þ¼Òµå·Î À̵¿ ÇÑ´Ù (°¢ Á¾ Á¶°Ç¿¡ ÀÇÇÑ À̵¿ ºÒ°¡°¡ ¾øÀ½)
  863. bool Move(long x, long y); // Á¶°ÇÀ» °Ë»çÇÏ°í Sync ¸Þ¼Òµå¸¦ ÅëÇØ À̵¿ ÇÑ´Ù.
  864. void OnMove(bool bIsAttack = false); // ¿òÁ÷À϶§ ºÒ¸°´Ù. Move() ¸Þ¼Òµå ÀÌ¿Ü¿¡¼­µµ ºÒ¸± ¼ö ÀÖ´Ù.
  865. DWORD GetMotionMode() const;
  866. float GetMoveMotionSpeed() const;
  867. float GetMoveSpeed() const;
  868. void CalculateMoveDuration();
  869. void SendMovePacket(BYTE bFunc, BYTE bArg, DWORD x, DWORD y, DWORD dwDuration, DWORD dwTime=0, int iRot=-1);
  870. #ifdef ENABLE_SUPPORT_SYSTEM
  871. void SendSupportSkillPacket(DWORD skill_vnum);
  872. DWORD SupportGetNextExp() const;
  873. #endif
  874. DWORD GetCurrentMoveDuration() const { return m_dwMoveDuration; }
  875. DWORD GetWalkStartTime() const { return m_dwWalkStartTime; }
  876. DWORD GetLastMoveTime() const { return m_dwLastMoveTime; }
  877. DWORD GetLastAttackTime() const { return m_dwLastAttackTime; }
  878.  
  879. void SetLastAttacked(DWORD time); // ¸¶Áö¸·À¸·Î °ø°Ý¹ÞÀº ½Ã°£ ¹× À§Ä¡¸¦ ÀúÀåÇÔ
  880.  
  881. bool SetSyncOwner(LPCHARACTER ch, bool bRemoveFromList = true);
  882. bool IsSyncOwner(LPCHARACTER ch) const;
  883.  
  884. bool WarpSet(long x, long y, long lRealMapIndex = 0);
  885. void SetWarpLocation(long lMapIndex, long x, long y);
  886. void WarpEnd();
  887. const PIXEL_POSITION & GetWarpPosition() const { return m_posWarp; }
  888. bool WarpToPID(DWORD dwPID);
  889.  
  890. void SaveExitLocation();
  891. void ExitToSavedLocation();
  892.  
  893. void StartStaminaConsume();
  894. void StopStaminaConsume();
  895. bool IsStaminaConsume() const;
  896. bool IsStaminaHalfConsume() const;
  897.  
  898. void ResetStopTime();
  899. DWORD GetStopTime() const;
  900.  
  901. protected:
  902. void ClearSync();
  903.  
  904. float m_fSyncTime;
  905. LPCHARACTER m_pkChrSyncOwner;
  906. CHARACTER_LIST m_kLst_pkChrSyncOwned; // ³»°¡ SyncOwnerÀÎ ÀÚµé
  907.  
  908. PIXEL_POSITION m_posDest;
  909. PIXEL_POSITION m_posStart;
  910. PIXEL_POSITION m_posWarp;
  911. long m_lWarpMapIndex;
  912.  
  913. PIXEL_POSITION m_posExit;
  914. long m_lExitMapIndex;
  915.  
  916. DWORD m_dwMoveStartTime;
  917. DWORD m_dwMoveDuration;
  918.  
  919. DWORD m_dwLastMoveTime;
  920. DWORD m_dwLastAttackTime;
  921. DWORD m_dwWalkStartTime;
  922. DWORD m_dwStopTime;
  923.  
  924. bool m_bWalking;
  925. bool m_bNowWalking;
  926. bool m_bStaminaConsume;
  927. // End
  928.  
  929. // Quickslot °ü·Ã
  930. public:
  931. void SyncQuickslot(BYTE bType, BYTE bOldPos, BYTE bNewPos);
  932. bool GetQuickslot(BYTE pos, TQuickslot ** ppSlot);
  933. bool SetQuickslot(BYTE pos, TQuickslot & rSlot);
  934. bool DelQuickslot(BYTE pos);
  935. bool SwapQuickslot(BYTE a, BYTE b);
  936. void ChainQuickslotItem(LPITEM pItem, BYTE bType, BYTE bOldPos);
  937.  
  938. protected:
  939. TQuickslot m_quickslot[QUICKSLOT_MAX_NUM];
  940.  
  941. ////////////////////////////////////////////////////////////////////////////////////////
  942. // Affect
  943. public:
  944. void StartAffectEvent();
  945. void ClearAffect(bool bSave=false);
  946. void ComputeAffect(CAffect * pkAff, bool bAdd);
  947. bool AddAffect(DWORD dwType, BYTE bApplyOn, long lApplyValue, DWORD dwFlag, long lDuration, long lSPCost, bool bOverride, bool IsCube = false);
  948. void RefreshAffect();
  949. bool RemoveAffect(DWORD dwType);
  950. bool IsAffectFlag(DWORD dwAff) const;
  951.  
  952. bool UpdateAffect(); // called from EVENT
  953. int ProcessAffect();
  954.  
  955. void LoadAffect(DWORD dwCount, TPacketAffectElement * pElements);
  956. void SaveAffect();
  957.  
  958. // Affect loadingÀÌ ³¡³­ »óÅÂÀΰ¡?
  959. bool IsLoadedAffect() const { return m_bIsLoadedAffect; }
  960.  
  961. bool IsGoodAffect(BYTE bAffectType) const;
  962.  
  963. void RemoveGoodAffect();
  964. void RemoveBadAffect();
  965.  
  966. CAffect * FindAffect(DWORD dwType, BYTE bApply=APPLY_NONE) const;
  967. const std::list<CAffect *> & GetAffectContainer() const { return m_list_pkAffect; }
  968. bool RemoveAffect(CAffect * pkAff);
  969.  
  970. protected:
  971. bool m_bIsLoadedAffect;
  972. TAffectFlag m_afAffectFlag;
  973. std::list<CAffect *> m_list_pkAffect;
  974.  
  975. public:
  976. // PARTY_JOIN_BUG_FIX
  977. void SetParty(LPPARTY pkParty);
  978. LPPARTY GetParty() const { return m_pkParty; }
  979.  
  980. bool RequestToParty(LPCHARACTER leader);
  981. void DenyToParty(LPCHARACTER member);
  982. void AcceptToParty(LPCHARACTER member);
  983.  
  984. /// ÀÚ½ÅÀÇ ÆÄƼ¿¡ ´Ù¸¥ character ¸¦ ÃÊ´ëÇÑ´Ù.
  985. /**
  986. * @param pchInvitee ÃÊ´ëÇÒ ´ë»ó character. ÆÄƼ¿¡ Âü¿© °¡´ÉÇÑ »óÅÂÀ̾î¾ß ÇÑ´Ù.
  987. *
  988. * ¾çÃø character ÀÇ »óÅ°¡ ÆÄƼ¿¡ ÃÊ´ëÇÏ°í ÃÊ´ë¹ÞÀ» ¼ö ÀÖ´Â »óÅ°¡ ¾Æ´Ï¶ó¸é ÃÊ´ëÇϴ ij¸¯ÅÍ¿¡°Ô ÇØ´çÇϴ äÆà ¸Þ¼¼Áö¸¦ Àü¼ÛÇÑ´Ù.
  989. */
  990. void PartyInvite(LPCHARACTER pchInvitee);
  991.  
  992. /// ÃÊ´ëÇß´ø character ÀÇ ¼ö¶ôÀ» ó¸®ÇÑ´Ù.
  993. /**
  994. * @param pchInvitee ÆÄƼ¿¡ Âü¿©ÇÒ character. ÆÄƼ¿¡ Âü¿©°¡´ÉÇÑ »óÅÂÀ̾î¾ß ÇÑ´Ù.
  995. *
  996. * pchInvitee °¡ ÆÄƼ¿¡ °¡ÀÔÇÒ ¼ö ÀÖ´Â »óȲÀÌ ¾Æ´Ï¶ó¸é ÇØ´çÇϴ äÆà ¸Þ¼¼Áö¸¦ Àü¼ÛÇÑ´Ù.
  997. */
  998. void PartyInviteAccept(LPCHARACTER pchInvitee);
  999.  
  1000. /// ÃÊ´ëÇß´ø character ÀÇ ÃÊ´ë °ÅºÎ¸¦ ó¸®ÇÑ´Ù.
  1001. /**
  1002. * @param [in] dwPID ÃÊ´ë Çß´ø character ÀÇ PID
  1003. */
  1004. void PartyInviteDeny(DWORD dwPID);
  1005.  
  1006. bool BuildUpdatePartyPacket(TPacketGCPartyUpdate & out);
  1007. int GetLeadershipSkillLevel() const;
  1008.  
  1009. bool CanSummon(int iLeaderShip);
  1010.  
  1011. void SetPartyRequestEvent(LPEVENT pkEvent) { m_pkPartyRequestEvent = pkEvent; }
  1012.  
  1013. protected:
  1014.  
  1015. /// ÆÄƼ¿¡ °¡ÀÔÇÑ´Ù.
  1016. /**
  1017. * @param pkLeader °¡ÀÔÇÒ ÆÄƼÀÇ ¸®´õ
  1018. */
  1019. void PartyJoin(LPCHARACTER pkLeader);
  1020.  
  1021. /**
  1022. * ÆÄƼ °¡ÀÔÀ» ÇÒ ¼ö ¾øÀ» °æ¿ìÀÇ ¿¡·¯ÄÚµå.
  1023. * Error code ´Â ½Ã°£¿¡ ÀÇÁ¸ÀûÀΰ¡¿¡ µû¶ó º¯°æ°¡´ÉÇÑ(mutable) type °ú Á¤Àû(static) type À¸·Î ³ª´¶´Ù.
  1024. * Error code ÀÇ °ªÀÌ PERR_SEPARATOR º¸´Ù ³·À¸¸é º¯°æ°¡´ÉÇÑ type ÀÌ°í ³ôÀ¸¸é Á¤Àû type ÀÌ´Ù.
  1025. */
  1026. enum PartyJoinErrCode {
  1027. PERR_NONE = 0, ///< 󸮼º°ø
  1028. PERR_SERVER, ///< ¼­¹ö¹®Á¦·Î ÆÄƼ°ü·Ã ó¸® ºÒ°¡
  1029. PERR_DUNGEON, ///< ij¸¯ÅÍ°¡ ´øÀü¿¡ ÀÖÀ½
  1030. PERR_OBSERVER, ///< °üÀü¸ðµåÀÓ
  1031. PERR_LVBOUNDARY, ///< »ó´ë ij¸¯ÅÍ¿Í ·¹º§Â÷ÀÌ°¡ ³²
  1032. PERR_LOWLEVEL, ///< »ó´ëÆÄƼÀÇ ÃÖ°í·¹º§º¸´Ù 30·¹º§ ³·À½
  1033. PERR_HILEVEL, ///< »ó´ëÆÄƼÀÇ ÃÖÀú·¹º§º¸´Ù 30·¹º§ ³ôÀ½
  1034. PERR_ALREADYJOIN, ///< ÆÄƼ°¡ÀÔ ´ë»ó ij¸¯ÅÍ°¡ ÀÌ¹Ì ÆÄƼÁß
  1035. PERR_PARTYISFULL, ///< ÆÄƼÀοø Á¦ÇÑ ÃÊ°ú
  1036. PERR_SEPARATOR, ///< Error type separator.
  1037. PERR_DIFFEMPIRE, ///< »ó´ë ij¸¯ÅÍ¿Í ´Ù¸¥ Á¦±¹ÀÓ
  1038. PERR_MAX ///< Error code ÃÖ°íÄ¡. ÀÌ ¾Õ¿¡ Error code ¸¦ Ãß°¡ÇÑ´Ù.
  1039. };
  1040.  
  1041. /// ÆÄƼ °¡ÀÔÀ̳ª °á¼º °¡´ÉÇÑ Á¶°ÇÀ» °Ë»çÇÑ´Ù.
  1042. /**
  1043. * @param pchLeader ÆÄƼÀÇ leader À̰ųª ÃÊ´ëÇÑ character
  1044. * @param pchGuest ÃÊ´ë¹Þ´Â character
  1045. * @return ¸ðµç PartyJoinErrCode °¡ ¹ÝȯµÉ ¼ö ÀÖ´Ù.
  1046. */
  1047. static PartyJoinErrCode IsPartyJoinableCondition(const LPCHARACTER pchLeader, const LPCHARACTER pchGuest);
  1048.  
  1049. /// ÆÄƼ °¡ÀÔÀ̳ª °á¼º °¡´ÉÇÑ µ¿ÀûÀÎ Á¶°ÇÀ» °Ë»çÇÑ´Ù.
  1050. /**
  1051. * @param pchLeader ÆÄƼÀÇ leader À̰ųª ÃÊ´ëÇÑ character
  1052. * @param pchGuest ÃÊ´ë¹Þ´Â character
  1053. * @return mutable type ÀÇ code ¸¸ ¹ÝȯÇÑ´Ù.
  1054. */
  1055. static PartyJoinErrCode IsPartyJoinableMutableCondition(const LPCHARACTER pchLeader, const LPCHARACTER pchGuest);
  1056.  
  1057. LPPARTY m_pkParty;
  1058. DWORD m_dwLastDeadTime;
  1059. LPEVENT m_pkPartyRequestEvent;
  1060.  
  1061. /**
  1062. * ÆÄƼÃÊû Event map.
  1063. * key: ÃÊ´ë¹ÞÀº ij¸¯ÅÍÀÇ PID
  1064. * value: eventÀÇ pointer
  1065. *
  1066. * ÃÊ´ëÇÑ Ä³¸¯Å͵鿡 ´ëÇÑ event map.
  1067. */
  1068. typedef std::map< DWORD, LPEVENT > EventMap;
  1069. EventMap m_PartyInviteEventMap;
  1070.  
  1071. // END_OF_PARTY_JOIN_BUG_FIX
  1072.  
  1073. ////////////////////////////////////////////////////////////////////////////////////////
  1074. // Dungeon
  1075. public:
  1076. void SetDungeon(LPDUNGEON pkDungeon);
  1077. LPDUNGEON GetDungeon() const { return m_pkDungeon; }
  1078. LPDUNGEON GetDungeonForce() const;
  1079. protected:
  1080. LPDUNGEON m_pkDungeon;
  1081. int m_iEventAttr;
  1082.  
  1083. ////////////////////////////////////////////////////////////////////////////////////////
  1084. // Guild
  1085. public:
  1086. void SetGuild(CGuild * pGuild);
  1087. CGuild* GetGuild() const { return m_pGuild; }
  1088.  
  1089. void SetWarMap(CWarMap* pWarMap);
  1090. CWarMap* GetWarMap() const { return m_pWarMap; }
  1091.  
  1092. protected:
  1093. CGuild * m_pGuild;
  1094. DWORD m_dwUnderGuildWarInfoMessageTime;
  1095. CWarMap * m_pWarMap;
  1096.  
  1097. ////////////////////////////////////////////////////////////////////////////////////////
  1098. // Item related
  1099. public:
  1100. bool CanHandleItem(bool bSkipRefineCheck = false, bool bSkipObserver = false); // ¾ÆÀÌÅÛ °ü·Ã ÇàÀ§¸¦ ÇÒ ¼ö Àִ°¡?
  1101.  
  1102. bool IsItemLoaded() const { return m_bItemLoaded; }
  1103. void SetItemLoaded() { m_bItemLoaded = true; }
  1104.  
  1105. void ClearItem();
  1106. void SetItem(TItemPos Cell, LPITEM item);
  1107. LPITEM GetItem(TItemPos Cell) const;
  1108. LPITEM GetInventoryItem(WORD wCell) const;
  1109. bool IsEmptyItemGrid(TItemPos Cell, BYTE size, int iExceptionCell = -1) const;
  1110.  
  1111. void SetWear(BYTE bCell, LPITEM item);
  1112. LPITEM GetWear(BYTE bCell) const;
  1113.  
  1114. // MYSHOP_PRICE_LIST
  1115. void UseSilkBotary(void); /// ºñ´Ü º¸µû¸® ¾ÆÀÌÅÛÀÇ »ç¿ë
  1116.  
  1117. /// DB ij½Ã·Î ºÎÅÍ ¹Þ¾Æ¿Â °¡°ÝÁ¤º¸ ¸®½ºÆ®¸¦ À¯Àú¿¡°Ô Àü¼ÛÇÏ°í º¸µû¸® ¾ÆÀÌÅÛ »ç¿ëÀ» ó¸®ÇÑ´Ù.
  1118. /**
  1119. * @param [in] p °¡°ÝÁ¤º¸ ¸®½ºÆ® ÆÐŶ
  1120. *
  1121. * Á¢¼ÓÇÑ ÈÄ Ã³À½ ºñ´Ü º¸µû¸® ¾ÆÀÌÅÛ »ç¿ë ½Ã UseSilkBotary ¿¡¼­ DB ij½Ã·Î °¡°ÝÁ¤º¸ ¸®½ºÆ®¸¦ ¿äûÇÏ°í
  1122. * ÀÀ´ä¹ÞÀº ½ÃÁ¡¿¡ ÀÌ ÇÔ¼ö¿¡¼­ ½ÇÁ¦ ºñ´Üº¸µû¸® »ç¿ëÀ» ó¸®ÇÑ´Ù.
  1123. */
  1124. void UseSilkBotaryReal(const TPacketMyshopPricelistHeader* p);
  1125. // END_OF_MYSHOP_PRICE_LIST
  1126.  
  1127. bool UseItemEx(LPITEM item, TItemPos DestCell);
  1128. bool UseItem(TItemPos Cell, TItemPos DestCell = NPOS);
  1129.  
  1130. // ADD_REFINE_BUILDING
  1131. bool IsRefineThroughGuild() const;
  1132. CGuild * GetRefineGuild() const;
  1133. int ComputeRefineFee(int iCost, int iMultiply = 5) const;
  1134. void PayRefineFee(int iTotalMoney);
  1135. void SetRefineNPC(LPCHARACTER ch);
  1136. // END_OF_ADD_REFINE_BUILDING
  1137.  
  1138. bool RefineItem(LPITEM pkItem, LPITEM pkTarget);
  1139. bool DropItem(TItemPos Cell, BYTE bCount=0);
  1140. bool GiveRecallItem(LPITEM item);
  1141. void ProcessRecallItem(LPITEM item);
  1142.  
  1143. // void PotionPacket(int iPotionType);
  1144. void EffectPacket(int enumEffectType);
  1145. void SpecificEffectPacket(const char filename[128]);
  1146.  
  1147. // ADD_MONSTER_REFINE
  1148. bool DoRefine(LPITEM item, bool bMoneyOnly = false);
  1149. // END_OF_ADD_MONSTER_REFINE
  1150.  
  1151. bool DoRefineWithScroll(LPITEM item);
  1152. bool RefineInformation(BYTE bCell, BYTE bType, int iAdditionalCell = -1);
  1153.  
  1154. void SetRefineMode(int iAdditionalCell = -1);
  1155. void ClearRefineMode();
  1156.  
  1157. bool GiveItem(LPCHARACTER victim, TItemPos Cell);
  1158. bool CanReceiveItem(LPCHARACTER from, LPITEM item) const;
  1159. void ReceiveItem(LPCHARACTER from, LPITEM item);
  1160. bool GiveItemFromSpecialItemGroup(DWORD dwGroupNum, std::vector <DWORD> &dwItemVnums,
  1161. std::vector <DWORD> &dwItemCounts, std::vector <LPITEM> &item_gets, int &count);
  1162.  
  1163. bool MoveItem(TItemPos pos, TItemPos change_pos, BYTE num);
  1164. bool PickupItem(DWORD vid);
  1165. bool EquipItem(LPITEM item, int iCandidateCell = -1);
  1166. bool UnequipItem(LPITEM item);
  1167.  
  1168. // ÇöÀç itemÀ» Âø¿ëÇÒ ¼ö ÀÖ´Â Áö È®ÀÎÇÏ°í, ºÒ°¡´É ÇÏ´Ù¸é ij¸¯ÅÍ¿¡°Ô ÀÌÀ¯¸¦ ¾Ë·ÁÁÖ´Â ÇÔ¼ö
  1169. bool CanEquipNow(const LPITEM item, const TItemPos& srcCell = NPOS, const TItemPos& destCell = NPOS);
  1170.  
  1171. // Âø¿ëÁßÀÎ itemÀ» ¹þÀ» ¼ö ÀÖ´Â Áö È®ÀÎÇÏ°í, ºÒ°¡´É ÇÏ´Ù¸é ij¸¯ÅÍ¿¡°Ô ÀÌÀ¯¸¦ ¾Ë·ÁÁÖ´Â ÇÔ¼ö
  1172. bool CanUnequipNow(const LPITEM item, const TItemPos& srcCell = NPOS, const TItemPos& destCell = NPOS);
  1173.  
  1174. bool SwapItem(BYTE bCell, BYTE bDestCell);
  1175. LPITEM AutoGiveItem(DWORD dwItemVnum, BYTE bCount=1, int iRarePct = -1, bool bMsg = true);
  1176. void AutoGiveItem(LPITEM item, bool longOwnerShip = false);
  1177.  
  1178. int GetEmptyInventory(BYTE size) const;
  1179. int GetEmptyDragonSoulInventory(LPITEM pItem) const;
  1180. void CopyDragonSoulItemGrid(std::vector<WORD>& vDragonSoulItemGrid) const;
  1181.  
  1182. int CountEmptyInventory() const;
  1183.  
  1184. int CountSpecifyItem(DWORD vnum) const;
  1185. void RemoveSpecifyItem(DWORD vnum, DWORD count = 1);
  1186. LPITEM FindSpecifyItem(DWORD vnum) const;
  1187. LPITEM FindItemByID(DWORD id) const;
  1188.  
  1189. int CountSpecifyTypeItem(BYTE type) const;
  1190. void RemoveSpecifyTypeItem(BYTE type, DWORD count = 1);
  1191.  
  1192. bool IsEquipUniqueItem(DWORD dwItemVnum) const;
  1193.  
  1194. // CHECK_UNIQUE_GROUP
  1195. bool IsEquipUniqueGroup(DWORD dwGroupVnum) const;
  1196. // END_OF_CHECK_UNIQUE_GROUP
  1197.  
  1198. void SendEquipment(LPCHARACTER ch);
  1199. // End of Item
  1200.  
  1201. protected:
  1202.  
  1203. /// ÇÑ ¾ÆÀÌÅÛ¿¡ ´ëÇÑ °¡°ÝÁ¤º¸¸¦ Àü¼ÛÇÑ´Ù.
  1204. /**
  1205. * @param [in] dwItemVnum ¾ÆÀÌÅÛ vnum
  1206. * @param [in] dwItemPrice ¾ÆÀÌÅÛ °¡°Ý
  1207. */
  1208. void SendMyShopPriceListCmd(DWORD dwItemVnum, DWORD dwItemPrice);
  1209.  
  1210. bool m_bNoOpenedShop; ///< À̹ø Á¢¼Ó ÈÄ °³ÀλóÁ¡À» ¿¬ ÀûÀÌ ÀÖ´ÂÁöÀÇ ¿©ºÎ(¿­¾ú´ø ÀûÀÌ ¾ø´Ù¸é true)
  1211.  
  1212. bool m_bItemLoaded;
  1213. int m_iRefineAdditionalCell;
  1214. bool m_bUnderRefine;
  1215. DWORD m_dwRefineNPCVID;
  1216.  
  1217. public:
  1218. ////////////////////////////////////////////////////////////////////////////////////////
  1219. // Money related
  1220. INT GetGold() const { return m_points.gold; }
  1221. void SetGold(INT gold) { m_points.gold = gold; }
  1222. bool DropGold(INT gold);
  1223. INT GetAllowedGold() const;
  1224. void GiveGold(INT iAmount); // ÆÄƼ°¡ ÀÖÀ¸¸é ÆÄƼ ºÐ¹è, ·Î±× µîÀÇ Ã³¸®
  1225. // End of Money
  1226.  
  1227. ////////////////////////////////////////////////////////////////////////////////////////
  1228. // Shop related
  1229. public:
  1230. void SetShop(LPSHOP pkShop);
  1231. LPSHOP GetShop() const { return m_pkShop; }
  1232. void ShopPacket(BYTE bSubHeader);
  1233.  
  1234. void SetShopOwner(LPCHARACTER ch) { m_pkChrShopOwner = ch; }
  1235. LPCHARACTER GetShopOwner() const { return m_pkChrShopOwner;}
  1236.  
  1237. void OpenMyShop(const char * c_pszSign, TShopItemTable * pTable, BYTE bItemCount);
  1238. LPSHOP GetMyShop() const { return m_pkMyShop; }
  1239. void CloseMyShop();
  1240.  
  1241. protected:
  1242.  
  1243. LPSHOP m_pkShop;
  1244. LPSHOP m_pkMyShop;
  1245. std::string m_stShopSign;
  1246. LPCHARACTER m_pkChrShopOwner;
  1247. // End of shop
  1248.  
  1249. ////////////////////////////////////////////////////////////////////////////////////////
  1250. // Exchange related
  1251. public:
  1252. bool ExchangeStart(LPCHARACTER victim);
  1253. void SetExchange(CExchange * pkExchange);
  1254. CExchange * GetExchange() const { return m_pkExchange; }
  1255.  
  1256. protected:
  1257. CExchange * m_pkExchange;
  1258. // End of Exchange
  1259.  
  1260. ////////////////////////////////////////////////////////////////////////////////////////
  1261. // Battle
  1262. public:
  1263. struct TBattleInfo
  1264. {
  1265. int iTotalDamage;
  1266. int iAggro;
  1267.  
  1268. TBattleInfo(int iTot, int iAggr)
  1269. : iTotalDamage(iTot), iAggro(iAggr)
  1270. {}
  1271. };
  1272. typedef std::map<VID, TBattleInfo> TDamageMap;
  1273.  
  1274. typedef struct SAttackLog
  1275. {
  1276. DWORD dwVID;
  1277. DWORD dwTime;
  1278. } AttackLog;
  1279.  
  1280. bool Damage(LPCHARACTER pAttacker, int dam, EDamageType type = DAMAGE_TYPE_NORMAL);
  1281. bool __Profile__Damage(LPCHARACTER pAttacker, int dam, EDamageType type = DAMAGE_TYPE_NORMAL);
  1282. void DeathPenalty(BYTE bExpLossPercent);
  1283. void ReviveInvisible(int iDur);
  1284.  
  1285. bool Attack(LPCHARACTER pkVictim, BYTE bType = 0);
  1286. bool IsAlive() const { return m_pointsInstant.position == POS_DEAD ? false : true; }
  1287. bool CanFight() const;
  1288.  
  1289. bool CanBeginFight() const;
  1290. void BeginFight(LPCHARACTER pkVictim); // pkVictimr°ú ½Î¿ì±â ½ÃÀÛÇÑ´Ù. (°­Á¦ÀûÀÓ, ½ÃÀÛÇÒ ¼ö ÀÖ³ª üũÇÏ·Á¸é CanBeginFightÀ» »ç¿ë)
  1291.  
  1292. bool CounterAttack(LPCHARACTER pkChr); // ¹Ý°ÝÇϱâ (¸ó½ºÅ͸¸ »ç¿ë)
  1293.  
  1294. bool IsStun() const;
  1295. void Stun();
  1296. bool IsDead() const;
  1297. void Dead(LPCHARACTER pkKiller = NULL, bool bImmediateDead=false);
  1298.  
  1299. void Reward(bool bItemDrop);
  1300. void RewardGold(LPCHARACTER pkAttacker);
  1301.  
  1302. bool Shoot(BYTE bType);
  1303. void FlyTarget(DWORD dwTargetVID, long x, long y, BYTE bHeader);
  1304.  
  1305. void ForgetMyAttacker();
  1306. void AggregateMonster();
  1307. void AttractRanger();
  1308. void PullMonster();
  1309.  
  1310. int GetArrowAndBow(LPITEM * ppkBow, LPITEM * ppkArrow, int iArrowCount = 1);
  1311. void UseArrow(LPITEM pkArrow, DWORD dwArrowCount);
  1312.  
  1313. void AttackedByPoison(LPCHARACTER pkAttacker);
  1314. void RemovePoison();
  1315. #ifdef ENABLE_WOLFMAN_CHARACTER
  1316. void AttackedByBleeding(LPCHARACTER pkAttacker);
  1317. void RemoveBleeding();
  1318. #endif
  1319. void AttackedByFire(LPCHARACTER pkAttacker, int amount, int count);
  1320. void RemoveFire();
  1321.  
  1322. void UpdateAlignment(int iAmount);
  1323. int GetAlignment() const;
  1324.  
  1325. //¼±¾ÇÄ¡ ¾ò±â
  1326. int GetRealAlignment() const;
  1327. void ShowAlignment(bool bShow);
  1328.  
  1329. void SetKillerMode(bool bOn);
  1330. bool IsKillerMode() const;
  1331. void UpdateKillerMode();
  1332.  
  1333. BYTE GetPKMode() const;
  1334. void SetPKMode(BYTE bPKMode);
  1335.  
  1336. void ItemDropPenalty(LPCHARACTER pkKiller);
  1337.  
  1338. void UpdateAggrPoint(LPCHARACTER ch, EDamageType type, int dam);
  1339.  
  1340. //
  1341. // HACK
  1342. //
  1343. public:
  1344. void SetComboSequence(BYTE seq);
  1345. BYTE GetComboSequence() const;
  1346.  
  1347. void SetLastComboTime(DWORD time);
  1348. DWORD GetLastComboTime() const;
  1349.  
  1350. int GetValidComboInterval() const;
  1351. void SetValidComboInterval(int interval);
  1352.  
  1353. BYTE GetComboIndex() const;
  1354.  
  1355. void IncreaseComboHackCount(int k = 1);
  1356. void ResetComboHackCount();
  1357. void SkipComboAttackByTime(int interval);
  1358. DWORD GetSkipComboAttackByTime() const;
  1359.  
  1360. protected:
  1361. BYTE m_bComboSequence;
  1362. DWORD m_dwLastComboTime;
  1363. int m_iValidComboInterval;
  1364. BYTE m_bComboIndex;
  1365. int m_iComboHackCount;
  1366. DWORD m_dwSkipComboAttackByTime;
  1367.  
  1368. protected:
  1369. void UpdateAggrPointEx(LPCHARACTER ch, EDamageType type, int dam, TBattleInfo & info);
  1370. void ChangeVictimByAggro(int iNewAggro, LPCHARACTER pNewVictim);
  1371.  
  1372. DWORD m_dwFlyTargetID;
  1373. std::vector<DWORD> m_vec_dwFlyTargets;
  1374. TDamageMap m_map_kDamage; // ¾î¶² ij¸¯ÅÍ°¡ ³ª¿¡°Ô ¾ó¸¶¸¸Å­ÀÇ µ¥¹ÌÁö¸¦ ÁÖ¾ú´Â°¡?
  1375. // AttackLog m_kAttackLog;
  1376. DWORD m_dwKillerPID;
  1377.  
  1378. int m_iAlignment; // Lawful/Chaotic value -200000 ~ 200000
  1379. int m_iRealAlignment;
  1380. int m_iKillerModePulse;
  1381. BYTE m_bPKMode;
  1382.  
  1383. // Aggro
  1384. DWORD m_dwLastVictimSetTime;
  1385. int m_iMaxAggro;
  1386. // End of Battle
  1387.  
  1388. // Stone
  1389. public:
  1390. void SetStone(LPCHARACTER pkChrStone);
  1391. void ClearStone();
  1392. void DetermineDropMetinStone();
  1393. DWORD GetDropMetinStoneVnum() const { return m_dwDropMetinStone; }
  1394. BYTE GetDropMetinStonePct() const { return m_bDropMetinStonePct; }
  1395.  
  1396. protected:
  1397. LPCHARACTER m_pkChrStone; // ³ª¸¦ ½ºÆùÇÑ µ¹
  1398. CHARACTER_SET m_set_pkChrSpawnedBy; // ³»°¡ ½ºÆùÇÑ ³ðµé
  1399. DWORD m_dwDropMetinStone;
  1400. BYTE m_bDropMetinStonePct;
  1401. // End of Stone
  1402.  
  1403. public:
  1404. enum
  1405. {
  1406. SKILL_UP_BY_POINT,
  1407. SKILL_UP_BY_BOOK,
  1408. SKILL_UP_BY_TRAIN,
  1409.  
  1410. // ADD_GRANDMASTER_SKILL
  1411. SKILL_UP_BY_QUEST,
  1412. // END_OF_ADD_GRANDMASTER_SKILL
  1413. };
  1414.  
  1415. void SkillLevelPacket();
  1416. void SkillLevelUp(DWORD dwVnum, BYTE bMethod = SKILL_UP_BY_POINT);
  1417. bool SkillLevelDown(DWORD dwVnum);
  1418. // ADD_GRANDMASTER_SKILL
  1419. bool UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaster = true);
  1420. void ResetSkill();
  1421. void SetSkillLevel(DWORD dwVnum, BYTE bLev);
  1422. int GetUsedSkillMasterType(DWORD dwVnum);
  1423.  
  1424. bool IsLearnableSkill(DWORD dwSkillVnum) const;
  1425. // END_OF_ADD_GRANDMASTER_SKILL
  1426.  
  1427. bool CheckSkillHitCount(const BYTE SkillID, const VID dwTargetVID);
  1428. bool CanUseSkill(DWORD dwSkillVnum) const;
  1429. bool IsUsableSkillMotion(DWORD dwMotionIndex) const;
  1430. int GetSkillLevel(DWORD dwVnum) const;
  1431. int GetSkillMasterType(DWORD dwVnum) const;
  1432. int GetSkillPower(DWORD dwVnum, BYTE bLevel = 0) const;
  1433.  
  1434. time_t GetSkillNextReadTime(DWORD dwVnum) const;
  1435. void SetSkillNextReadTime(DWORD dwVnum, time_t time);
  1436. void SkillLearnWaitMoreTimeMessage(DWORD dwVnum);
  1437.  
  1438. void ComputePassiveSkill(DWORD dwVnum);
  1439. int ComputeSkill(DWORD dwVnum, LPCHARACTER pkVictim, BYTE bSkillLevel = 0);
  1440. #ifdef ENABLE_WOLFMAN_CHARACTER
  1441. int ComputeSkillParty(DWORD dwVnum, LPCHARACTER pkVictim, BYTE bSkillLevel = 0);
  1442. #endif
  1443. int ComputeSkillAtPosition(DWORD dwVnum, const PIXEL_POSITION& posTarget, BYTE bSkillLevel = 0);
  1444. void ComputeSkillPoints();
  1445.  
  1446. void SetSkillGroup(BYTE bSkillGroup);
  1447. BYTE GetSkillGroup() const { return m_points.skill_group; }
  1448.  
  1449. int ComputeCooltime(int time);
  1450.  
  1451. void GiveRandomSkillBook();
  1452.  
  1453. void DisableCooltime();
  1454. bool LearnSkillByBook(DWORD dwSkillVnum, BYTE bProb = 0);
  1455. bool LearnGrandMasterSkill(DWORD dwSkillVnum);
  1456.  
  1457. private:
  1458. bool m_bDisableCooltime;
  1459. DWORD m_dwLastSkillTime; ///< ¸¶Áö¸·À¸·Î skill À» ¾´ ½Ã°£(millisecond).
  1460. // End of Skill
  1461.  
  1462. // MOB_SKILL
  1463. public:
  1464. bool HasMobSkill() const;
  1465. size_t CountMobSkill() const;
  1466. const TMobSkillInfo * GetMobSkill(unsigned int idx) const;
  1467. bool CanUseMobSkill(unsigned int idx) const;
  1468. bool UseMobSkill(unsigned int idx);
  1469. void ResetMobSkillCooltime();
  1470. protected:
  1471. DWORD m_adwMobSkillCooltime[MOB_SKILL_MAX_NUM];
  1472. // END_OF_MOB_SKILL
  1473.  
  1474. // for SKILL_MUYEONG
  1475. public:
  1476. void StartMuyeongEvent();
  1477. void StopMuyeongEvent();
  1478.  
  1479. private:
  1480. LPEVENT m_pkMuyeongEvent;
  1481.  
  1482. // for SKILL_CHAIN lighting
  1483. public:
  1484. int GetChainLightningIndex() const { return m_iChainLightingIndex; }
  1485. void IncChainLightningIndex() { ++m_iChainLightingIndex; }
  1486. void AddChainLightningExcept(LPCHARACTER ch) { m_setExceptChainLighting.insert(ch); }
  1487. void ResetChainLightningIndex() { m_iChainLightingIndex = 0; m_setExceptChainLighting.clear(); }
  1488. int GetChainLightningMaxCount() const;
  1489. const CHARACTER_SET& GetChainLightingExcept() const { return m_setExceptChainLighting; }
  1490.  
  1491. private:
  1492. int m_iChainLightingIndex;
  1493. CHARACTER_SET m_setExceptChainLighting;
  1494.  
  1495. // for SKILL_EUNHYUNG
  1496. public:
  1497. void SetAffectedEunhyung();
  1498. void ClearAffectedEunhyung() { m_dwAffectedEunhyungLevel = 0; }
  1499. bool GetAffectedEunhyung() const { return m_dwAffectedEunhyungLevel; }
  1500.  
  1501. private:
  1502. DWORD m_dwAffectedEunhyungLevel;
  1503.  
  1504. //
  1505. // Skill levels
  1506. //
  1507. protected:
  1508. TPlayerSkill* m_pSkillLevels;
  1509. boost::unordered_map<BYTE, int> m_SkillDamageBonus;
  1510. std::map<int, TSkillUseInfo> m_SkillUseInfo;
  1511.  
  1512. ////////////////////////////////////////////////////////////////////////////////////////
  1513. // AI related
  1514. public:
  1515. void AssignTriggers(const TMobTable * table);
  1516. LPCHARACTER GetVictim() const; // °ø°ÝÇÒ ´ë»ó ¸®ÅÏ
  1517. void SetVictim(LPCHARACTER pkVictim);
  1518. LPCHARACTER GetNearestVictim(LPCHARACTER pkChr);
  1519. LPCHARACTER GetProtege() const; // º¸È£ÇØ¾ß ÇÒ ´ë»ó ¸®ÅÏ
  1520.  
  1521. bool Follow(LPCHARACTER pkChr, float fMinimumDistance = 150.0f);
  1522. bool Return();
  1523. bool IsGuardNPC() const;
  1524. bool IsChangeAttackPosition(LPCHARACTER target) const;
  1525. void ResetChangeAttackPositionTime() { m_dwLastChangeAttackPositionTime = get_dword_time() - AI_CHANGE_ATTACK_POISITION_TIME_NEAR;}
  1526. void SetChangeAttackPositionTime() { m_dwLastChangeAttackPositionTime = get_dword_time();}
  1527.  
  1528. bool OnIdle();
  1529.  
  1530. void OnAttack(LPCHARACTER pkChrAttacker);
  1531. void OnClick(LPCHARACTER pkChrCauser);
  1532.  
  1533. VID m_kVIDVictim;
  1534.  
  1535. protected:
  1536. DWORD m_dwLastChangeAttackPositionTime;
  1537. CTrigger m_triggerOnClick;
  1538. // End of AI
  1539.  
  1540. ////////////////////////////////////////////////////////////////////////////////////////
  1541. // Target
  1542. protected:
  1543. LPCHARACTER m_pkChrTarget; // ³» Ÿ°Ù
  1544. CHARACTER_SET m_set_pkChrTargetedBy; // ³ª¸¦ Ÿ°ÙÀ¸·Î °¡Áö°í ÀÖ´Â »ç¶÷µé
  1545.  
  1546. public:
  1547. void SetTarget(LPCHARACTER pkChrTarget);
  1548. void BroadcastTargetPacket();
  1549. void ClearTarget();
  1550. void CheckTarget();
  1551. LPCHARACTER GetTarget() const { return m_pkChrTarget; }
  1552.  
  1553. ////////////////////////////////////////////////////////////////////////////////////////
  1554. // Safebox
  1555. public:
  1556. int GetSafeboxSize() const;
  1557. void QuerySafeboxSize();
  1558. void SetSafeboxSize(int size);
  1559.  
  1560. CSafebox * GetSafebox() const;
  1561. void LoadSafebox(int iSize, DWORD dwGold, int iItemCount, TPlayerItem * pItems);
  1562. void ChangeSafeboxSize(BYTE bSize);
  1563. void CloseSafebox();
  1564.  
  1565. /// â°í ¿­±â ¿äû
  1566. /**
  1567. * @param [in] pszPassword 1ÀÚ ÀÌ»ó 6ÀÚ ÀÌÇÏÀÇ Ã¢°í ºñ¹Ð¹øÈ£
  1568. *
  1569. * DB ¿¡ â°í¿­±â¸¦ ¿äûÇÑ´Ù.
  1570. * â°í´Â Áߺ¹À¸·Î ¿­Áö ¸øÇϸç, Ãֱ٠â°í¸¦ ´ÝÀº ½Ã°£À¸·Î ºÎÅÍ 10ÃÊ À̳»¿¡´Â ¿­ Áö ¸øÇÑ´Ù.
  1571. */
  1572. void ReqSafeboxLoad(const char* pszPassword);
  1573.  
  1574. /// â°í ¿­±â ¿äûÀÇ Ãë¼Ò
  1575. /**
  1576. * ReqSafeboxLoad ¸¦ È£ÃâÇÏ°í CloseSafebox ÇÏÁö ¾Ê¾ÒÀ» ¶§ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇϸé â°í¸¦ ¿­ ¼ö ÀÖ´Ù.
  1577. * â°í¿­±âÀÇ ¿äûÀÌ DB ¼­¹ö¿¡¼­ ½ÇÆÐÀÀ´äÀ» ¹Þ¾ÒÀ» °æ¿ì ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇؼ­ ¿äûÀ» ÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù.
  1578. */
  1579. void CancelSafeboxLoad( void ) { m_bOpeningSafebox = false; }
  1580.  
  1581. void SetMallLoadTime(int t) { m_iMallLoadTime = t; }
  1582. int GetMallLoadTime() const { return m_iMallLoadTime; }
  1583.  
  1584. CSafebox * GetMall() const;
  1585. void LoadMall(int iItemCount, TPlayerItem * pItems);
  1586. void CloseMall();
  1587.  
  1588. void SetSafeboxOpenPosition();
  1589. float GetDistanceFromSafeboxOpen() const;
  1590.  
  1591. protected:
  1592. CSafebox * m_pkSafebox;
  1593. int m_iSafeboxSize;
  1594. int m_iSafeboxLoadTime;
  1595. bool m_bOpeningSafebox; ///< â°í°¡ ¿­±â ¿äû ÁßÀ̰ųª ¿­·ÁÀִ°¡ ¿©ºÎ, true ÀÏ °æ¿ì ¿­±â¿äûÀ̰ųª ¿­·ÁÀÖÀ½.
  1596.  
  1597. CSafebox * m_pkMall;
  1598. int m_iMallLoadTime;
  1599.  
  1600. PIXEL_POSITION m_posSafeboxOpen;
  1601.  
  1602. ////////////////////////////////////////////////////////////////////////////////////////
  1603.  
  1604. ////////////////////////////////////////////////////////////////////////////////////////
  1605. // Mounting
  1606. public:
  1607. void MountVnum(DWORD vnum);
  1608. DWORD GetMountVnum() const { return m_dwMountVnum; }
  1609. DWORD GetLastMountTime() const { return m_dwMountTime; }
  1610.  
  1611. bool CanUseHorseSkill();
  1612.  
  1613. // Horse
  1614. virtual void SetHorseLevel(int iLevel);
  1615.  
  1616. virtual bool StartRiding();
  1617. virtual bool StopRiding();
  1618.  
  1619. virtual DWORD GetMyHorseVnum() const;
  1620.  
  1621. virtual void HorseDie();
  1622. virtual bool ReviveHorse();
  1623.  
  1624. virtual void SendHorseInfo();
  1625. virtual void ClearHorseInfo();
  1626.  
  1627. void HorseSummon(bool bSummon, bool bFromFar = false, DWORD dwVnum = 0, const char* name = 0);
  1628.  
  1629. LPCHARACTER GetHorse() const { return m_chHorse; } // ÇöÀç ¼ÒȯÁßÀÎ ¸»
  1630. LPCHARACTER GetRider() const; // rider on horse
  1631. void SetRider(LPCHARACTER ch);
  1632.  
  1633. bool IsRiding() const;
  1634.  
  1635. #ifdef ENABLE_SUPPORT_SYSTEM
  1636. public:
  1637. CSupportSystem* GetSupportSystem() { return m_supportSystem; }
  1638.  
  1639. protected:
  1640. CSupportSystem* m_supportSystem;
  1641.  
  1642. public:
  1643. #endif
  1644.  
  1645. #ifdef __PET_SYSTEM__
  1646. public:
  1647. CPetSystem* GetPetSystem() { return m_petSystem; }
  1648.  
  1649. protected:
  1650. CPetSystem* m_petSystem;
  1651.  
  1652. public:
  1653. #endif
  1654.  
  1655. protected:
  1656. LPCHARACTER m_chHorse;
  1657. LPCHARACTER m_chRider;
  1658.  
  1659. DWORD m_dwMountVnum;
  1660. DWORD m_dwMountTime;
  1661.  
  1662. BYTE m_bSendHorseLevel;
  1663. BYTE m_bSendHorseHealthGrade;
  1664. BYTE m_bSendHorseStaminaGrade;
  1665.  
  1666. ////////////////////////////////////////////////////////////////////////////////////////
  1667. // Detailed Log
  1668. public:
  1669. void DetailLog() { m_bDetailLog = !m_bDetailLog; }
  1670. void ToggleMonsterLog();
  1671. void MonsterLog(const char* format, ...);
  1672. private:
  1673. bool m_bDetailLog;
  1674. bool m_bMonsterLog;
  1675.  
  1676. ////////////////////////////////////////////////////////////////////////////////////////
  1677. // Empire
  1678.  
  1679. public:
  1680. void SetEmpire(BYTE bEmpire);
  1681. BYTE GetEmpire() const { return m_bEmpire; }
  1682.  
  1683. protected:
  1684. BYTE m_bEmpire;
  1685.  
  1686. ////////////////////////////////////////////////////////////////////////////////////////
  1687. // Regen
  1688. public:
  1689. void SetRegen(LPREGEN pkRegen);
  1690.  
  1691. protected:
  1692. PIXEL_POSITION m_posRegen;
  1693. float m_fRegenAngle;
  1694. LPREGEN m_pkRegen;
  1695. size_t regen_id_; // to help dungeon regen identification
  1696. // End of Regen
  1697.  
  1698. ////////////////////////////////////////////////////////////////////////////////////////
  1699. // Resists & Proofs
  1700. public:
  1701. bool CannotMoveByAffect() const; // ƯÁ¤ È¿°ú¿¡ ÀÇÇØ ¿òÁ÷ÀÏ ¼ö ¾ø´Â »óÅÂÀΰ¡?
  1702. bool IsImmune(DWORD dwImmuneFlag);
  1703. void SetImmuneFlag(DWORD dw) { m_pointsInstant.dwImmuneFlag = dw; }
  1704.  
  1705. protected:
  1706. void ApplyMobAttribute(const TMobTable* table);
  1707. // End of Resists & Proofs
  1708.  
  1709. ////////////////////////////////////////////////////////////////////////////////////////
  1710. // QUEST
  1711. //
  1712. public:
  1713. void SetQuestNPCID(DWORD vid);
  1714. DWORD GetQuestNPCID() const { return m_dwQuestNPCVID; }
  1715. LPCHARACTER GetQuestNPC() const;
  1716.  
  1717. void SetQuestItemPtr(LPITEM item);
  1718. void ClearQuestItemPtr();
  1719. LPITEM GetQuestItemPtr() const;
  1720.  
  1721. void SetQuestBy(DWORD dwQuestVnum) { m_dwQuestByVnum = dwQuestVnum; }
  1722. DWORD GetQuestBy() const { return m_dwQuestByVnum; }
  1723.  
  1724. int GetQuestFlag(const std::string& flag) const;
  1725. void SetQuestFlag(const std::string& flag, int value);
  1726.  
  1727. void ConfirmWithMsg(const char* szMsg, int iTimeout, DWORD dwRequestPID);
  1728.  
  1729. private:
  1730. DWORD m_dwQuestNPCVID;
  1731. DWORD m_dwQuestByVnum;
  1732. LPITEM m_pQuestItem;
  1733.  
  1734. // Events
  1735. public:
  1736. bool StartStateMachine(int iPulse = 1);
  1737. void StopStateMachine();
  1738. void UpdateStateMachine(DWORD dwPulse);
  1739. void SetNextStatePulse(int iPulseNext);
  1740.  
  1741. // ij¸¯ÅÍ ÀνºÅϽº ¾÷µ¥ÀÌÆ® ÇÔ¼ö. ±âÁ¸¿£ ÀÌ»óÇÑ »ó¼Ó±¸Á¶·Î CFSM::Update ÇÔ¼ö¸¦ È£ÃâÇϰųª UpdateStateMachine ÇÔ¼ö¸¦ »ç¿ëÇߴµ¥, º°°³ÀÇ ¾÷µ¥ÀÌÆ® ÇÔ¼ö Ãß°¡ÇÔ.
  1742. void UpdateCharacter(DWORD dwPulse);
  1743.  
  1744. protected:
  1745. DWORD m_dwNextStatePulse;
  1746.  
  1747. // Marriage
  1748. public:
  1749. LPCHARACTER GetMarryPartner() const;
  1750. void SetMarryPartner(LPCHARACTER ch);
  1751. int GetMarriageBonus(DWORD dwItemVnum, bool bSum = true);
  1752.  
  1753. void SetWeddingMap(marriage::WeddingMap* pMap);
  1754. marriage::WeddingMap* GetWeddingMap() const { return m_pWeddingMap; }
  1755.  
  1756. private:
  1757. marriage::WeddingMap* m_pWeddingMap;
  1758. LPCHARACTER m_pkChrMarried;
  1759.  
  1760. // Warp Character
  1761. public:
  1762. void StartWarpNPCEvent();
  1763.  
  1764. public:
  1765. void StartSaveEvent();
  1766. void StartRecoveryEvent();
  1767. void StartCheckSpeedHackEvent();
  1768. void StartDestroyWhenIdleEvent();
  1769.  
  1770. LPEVENT m_pkDeadEvent;
  1771. LPEVENT m_pkStunEvent;
  1772. LPEVENT m_pkSaveEvent;
  1773. LPEVENT m_pkRecoveryEvent;
  1774. LPEVENT m_pkTimedEvent;
  1775. LPEVENT m_pkFishingEvent;
  1776. LPEVENT m_pkAffectEvent;
  1777. LPEVENT m_pkPoisonEvent;
  1778. #ifdef ENABLE_WOLFMAN_CHARACTER
  1779. LPEVENT m_pkBleedingEvent;
  1780. #endif
  1781. LPEVENT m_pkFireEvent;
  1782. LPEVENT m_pkWarpNPCEvent;
  1783. //DELAYED_WARP
  1784. //END_DELAYED_WARP
  1785.  
  1786. // MINING
  1787. LPEVENT m_pkMiningEvent;
  1788. // END_OF_MINING
  1789. LPEVENT m_pkWarpEvent;
  1790. LPEVENT m_pkCheckSpeedHackEvent;
  1791. LPEVENT m_pkDestroyWhenIdleEvent;
  1792. LPEVENT m_pkPetSystemUpdateEvent;
  1793.  
  1794. bool IsWarping() const { return m_pkWarpEvent ? true : false; }
  1795.  
  1796. bool m_bHasPoisoned;
  1797. #ifdef ENABLE_WOLFMAN_CHARACTER
  1798. bool m_bHasBled;
  1799. #endif
  1800.  
  1801. const CMob * m_pkMobData;
  1802. CMobInstance * m_pkMobInst;
  1803.  
  1804. std::map<int, LPEVENT> m_mapMobSkillEvent;
  1805.  
  1806. friend struct FuncSplashDamage;
  1807. friend struct FuncSplashAffect;
  1808. friend class CFuncShoot;
  1809.  
  1810. public:
  1811. int GetPremiumRemainSeconds(BYTE bType) const;
  1812.  
  1813. private:
  1814. int m_aiPremiumTimes[PREMIUM_MAX_NUM];
  1815.  
  1816. // CHANGE_ITEM_ATTRIBUTES
  1817. // static const DWORD msc_dwDefaultChangeItemAttrCycle; ///< µðÆúÆ® ¾ÆÀÌÅÛ ¼Ó¼ºº¯°æ °¡´É ÁÖ±â
  1818. static const char msc_szLastChangeItemAttrFlag[]; ///< ÃÖ±Ù ¾ÆÀÌÅÛ ¼Ó¼ºÀ» º¯°æÇÑ ½Ã°£ÀÇ Quest Flag À̸§
  1819. // static const char msc_szChangeItemAttrCycleFlag[]; ///< ¾ÆÀÌÅÛ ¼Ó¼ºº´°æ °¡´É ÁÖ±âÀÇ Quest Flag À̸§
  1820. // END_OF_CHANGE_ITEM_ATTRIBUTES
  1821.  
  1822. // PC_BANG_ITEM_ADD
  1823. private :
  1824. bool m_isinPCBang;
  1825.  
  1826. public :
  1827. bool SetPCBang(bool flag) { m_isinPCBang = flag; return m_isinPCBang; }
  1828. bool IsPCBang() const { return m_isinPCBang; }
  1829. // END_PC_BANG_ITEM_ADD
  1830.  
  1831. // NEW_HAIR_STYLE_ADD
  1832. public :
  1833. bool ItemProcess_Hair(LPITEM item, int iDestCell);
  1834. // END_NEW_HAIR_STYLE_ADD
  1835.  
  1836. public :
  1837. void ClearSkill();
  1838. void ClearSubSkill();
  1839.  
  1840. // RESET_ONE_SKILL
  1841. bool ResetOneSkill(DWORD dwVnum);
  1842. // END_RESET_ONE_SKILL
  1843.  
  1844. private :
  1845. void SendDamagePacket(LPCHARACTER pAttacker, int Damage, BYTE DamageFlag);
  1846.  
  1847. // ARENA
  1848. private :
  1849. CArena *m_pArena;
  1850. bool m_ArenaObserver;
  1851. int m_nPotionLimit;
  1852.  
  1853. public :
  1854. void SetArena(CArena* pArena) { m_pArena = pArena; }
  1855. void SetArenaObserverMode(bool flag) { m_ArenaObserver = flag; }
  1856.  
  1857. CArena* GetArena() const { return m_pArena; }
  1858. bool GetArenaObserverMode() const { return m_ArenaObserver; }
  1859.  
  1860. void SetPotionLimit(int count) { m_nPotionLimit = count; }
  1861. int GetPotionLimit() const { return m_nPotionLimit; }
  1862. // END_ARENA
  1863.  
  1864. //PREVENT_TRADE_WINDOW
  1865. public:
  1866. bool IsOpenSafebox() const { return m_isOpenSafebox ? true : false; }
  1867. void SetOpenSafebox(bool b) { m_isOpenSafebox = b; }
  1868.  
  1869. int GetSafeboxLoadTime() const { return m_iSafeboxLoadTime; }
  1870. void SetSafeboxLoadTime() { m_iSafeboxLoadTime = thecore_pulse(); }
  1871. //END_PREVENT_TRADE_WINDOW
  1872. private:
  1873. bool m_isOpenSafebox;
  1874.  
  1875. public:
  1876. int GetSkillPowerByLevel(int level, bool bMob = false) const;
  1877.  
  1878. //PREVENT_REFINE_HACK
  1879. int GetRefineTime() const { return m_iRefineTime; }
  1880. void SetRefineTime() { m_iRefineTime = thecore_pulse(); }
  1881. int m_iRefineTime;
  1882. //END_PREVENT_REFINE_HACK
  1883.  
  1884. //RESTRICT_USE_SEED_OR_MOONBOTTLE
  1885. int GetUseSeedOrMoonBottleTime() const { return m_iSeedTime; }
  1886. void SetUseSeedOrMoonBottleTime() { m_iSeedTime = thecore_pulse(); }
  1887. int m_iSeedTime;
  1888. //END_RESTRICT_USE_SEED_OR_MOONBOTTLE
  1889.  
  1890. //PREVENT_PORTAL_AFTER_EXCHANGE
  1891. int GetExchangeTime() const { return m_iExchangeTime; }
  1892. void SetExchangeTime() { m_iExchangeTime = thecore_pulse(); }
  1893. int m_iExchangeTime;
  1894. //END_PREVENT_PORTAL_AFTER_EXCHANGE
  1895.  
  1896. int m_iMyShopTime;
  1897. int GetMyShopTime() const { return m_iMyShopTime; }
  1898. void SetMyShopTime() { m_iMyShopTime = thecore_pulse(); }
  1899.  
  1900. // Hack ¹æÁö¸¦ À§ÇÑ Ã¼Å©.
  1901. bool IsHack(bool bSendMsg = true, bool bCheckShopOwner = true, int limittime = g_nPortalLimitTime);
  1902.  
  1903. // MONARCH
  1904. BOOL IsMonarch() const;
  1905. // END_MONARCH
  1906. void Say(const std::string & s);
  1907.  
  1908. enum MONARCH_COOLTIME
  1909. {
  1910. MC_HEAL = 10,
  1911. MC_WARP = 60,
  1912. MC_TRANSFER = 60,
  1913. MC_TAX = (60 * 60 * 24 * 7),
  1914. MC_SUMMON = (60 * 60),
  1915. };
  1916.  
  1917. enum MONARCH_INDEX
  1918. {
  1919. MI_HEAL = 0,
  1920. MI_WARP,
  1921. MI_TRANSFER,
  1922. MI_TAX,
  1923. MI_SUMMON,
  1924. MI_MAX
  1925. };
  1926.  
  1927. DWORD m_dwMonarchCooltime[MI_MAX];
  1928. DWORD m_dwMonarchCooltimelimit[MI_MAX];
  1929.  
  1930. void InitMC();
  1931. DWORD GetMC(enum MONARCH_INDEX e) const;
  1932. void SetMC(enum MONARCH_INDEX e);
  1933. bool IsMCOK(enum MONARCH_INDEX e) const;
  1934. DWORD GetMCL(enum MONARCH_INDEX e) const;
  1935. DWORD GetMCLTime(enum MONARCH_INDEX e) const;
  1936.  
  1937. public:
  1938. bool ItemProcess_Polymorph(LPITEM item);
  1939.  
  1940. // by mhh
  1941. LPITEM* GetCubeItem() { return m_pointsInstant.pCubeItems; }
  1942. bool IsCubeOpen () const { return (m_pointsInstant.pCubeNpc?true:false); }
  1943. void SetCubeNpc(LPCHARACTER npc) { m_pointsInstant.pCubeNpc = npc; }
  1944. bool CanDoCube() const;
  1945.  
  1946. public:
  1947. bool IsSiegeNPC() const;
  1948.  
  1949. private:
  1950. //Áß±¹ Àü¿ë
  1951. //18¼¼ ¹Ì¸¸ Àü¿ë
  1952. //3½Ã°£ : 50 % 5 ½Ã°£ 0%
  1953. e_overtime m_eOverTime;
  1954.  
  1955. public:
  1956. bool IsOverTime(e_overtime e) const { return (e == m_eOverTime); }
  1957. void SetOverTime(e_overtime e) { m_eOverTime = e; }
  1958.  
  1959. private:
  1960. int m_deposit_pulse;
  1961.  
  1962. public:
  1963. void UpdateDepositPulse();
  1964. bool CanDeposit() const;
  1965.  
  1966. private:
  1967. void __OpenPrivateShop();
  1968.  
  1969. public:
  1970. struct AttackedLog
  1971. {
  1972. DWORD dwPID;
  1973. DWORD dwAttackedTime;
  1974.  
  1975. AttackedLog() : dwPID(0), dwAttackedTime(0)
  1976. {
  1977. }
  1978. };
  1979.  
  1980. AttackLog m_kAttackLog;
  1981. AttackedLog m_AttackedLog;
  1982. int m_speed_hack_count;
  1983.  
  1984. private :
  1985. std::string m_strNewName;
  1986.  
  1987. public :
  1988. const std::string GetNewName() const { return this->m_strNewName; }
  1989. void SetNewName(const std::string name) { this->m_strNewName = name; }
  1990.  
  1991. public :
  1992. void GoHome();
  1993.  
  1994. private :
  1995. std::set<DWORD> m_known_guild;
  1996.  
  1997. public :
  1998. void SendGuildName(CGuild* pGuild);
  1999. void SendGuildName(DWORD dwGuildID);
  2000.  
  2001. private :
  2002. DWORD m_dwLogOffInterval;
  2003.  
  2004. public :
  2005. DWORD GetLogOffInterval() const { return m_dwLogOffInterval; }
  2006.  
  2007. public:
  2008. bool UnEquipSpecialRideUniqueItem ();
  2009.  
  2010. bool CanWarp () const;
  2011.  
  2012. private:
  2013. DWORD m_dwLastGoldDropTime;
  2014. #ifdef ENABLE_NEWSTUFF
  2015. DWORD m_dwLastItemDropTime;
  2016. DWORD m_dwLastBoxUseTime;
  2017. DWORD m_dwLastBuySellTime;
  2018. public:
  2019. DWORD GetLastBuySellTime() const { return m_dwLastBuySellTime; }
  2020. void SetLastBuySellTime(DWORD dwLastBuySellTime) { m_dwLastBuySellTime = dwLastBuySellTime; }
  2021. #endif
  2022. public:
  2023. void StartHackShieldCheckCycle(int seconds);
  2024. void StopHackShieldCheckCycle();
  2025.  
  2026. bool GetHackShieldCheckMode() const { return m_HackShieldCheckMode; }
  2027. void SetHackShieldCheckMode(bool m) { m_HackShieldCheckMode = m; }
  2028.  
  2029. LPEVENT m_HackShieldCheckEvent;
  2030.  
  2031. private:
  2032. bool m_HackShieldCheckMode;
  2033.  
  2034. public:
  2035. void AutoRecoveryItemProcess (const EAffectTypes);
  2036.  
  2037. public:
  2038. void BuffOnAttr_AddBuffsFromItem(LPITEM pItem);
  2039. void BuffOnAttr_RemoveBuffsFromItem(LPITEM pItem);
  2040.  
  2041. private:
  2042. void BuffOnAttr_ValueChange(BYTE bType, BYTE bOldValue, BYTE bNewValue);
  2043. void BuffOnAttr_ClearAll();
  2044.  
  2045. typedef std::map <BYTE, CBuffOnAttributes*> TMapBuffOnAttrs;
  2046. TMapBuffOnAttrs m_map_buff_on_attrs;
  2047. // ¹«Àû : ¿øÈ°ÇÑ Å×½ºÆ®¸¦ À§ÇÏ¿©.
  2048. public:
  2049. void SetArmada() { cannot_dead = true; }
  2050. void ResetArmada() { cannot_dead = false; }
  2051. private:
  2052. bool cannot_dead;
  2053. #ifdef ENABLE_SUPPORT_SYSTEM
  2054. private:
  2055. bool m_bIsSupport;
  2056. LPCHARACTER m_Owner;
  2057. DWORD m_dwSupportCostume;
  2058. DWORD m_dwSupportHair;
  2059. DWORD m_dwSupportWeapon;
  2060. DWORD m_dwSupportInt;
  2061. public:
  2062. void SetSupport() { m_bIsSupport = true; }
  2063. bool IsSupport() { return m_bIsSupport; }
  2064. void SetSupportArmor(int vnum) { m_dwSupportCostume = vnum; }
  2065. void SetSupportHair(int vnum) { m_dwSupportHair = vnum; }
  2066. void SetSupportWeapon(int vnum) { m_dwSupportWeapon = vnum; }
  2067. DWORD GetSupportArmor() { return m_dwSupportCostume; }
  2068. DWORD GetSupportHair() { return m_dwSupportHair; }
  2069. DWORD GetSupportWeapon() { return m_dwSupportWeapon; }
  2070. void SetOwner(LPCHARACTER owner) { m_Owner = owner; }
  2071. LPCHARACTER GetOwner() { return m_Owner; }
  2072. void SetSupportInt(int count) { m_dwSupportInt = count; }
  2073. DWORD GetSupportInt() { return m_dwSupportInt; }
  2074. #endif
  2075.  
  2076. #ifdef __PET_SYSTEM__
  2077. private:
  2078. bool m_bIsPet;
  2079. public:
  2080. void SetPet() { m_bIsPet = true; }
  2081. bool IsPet() { return m_bIsPet; }
  2082. #endif
  2083. #ifdef NEW_ICEDAMAGE_SYSTEM
  2084. private:
  2085. DWORD m_dwNDRFlag;
  2086. std::set<DWORD> m_setNDAFlag;
  2087. public:
  2088. const DWORD GetNoDamageRaceFlag();
  2089. void SetNoDamageRaceFlag(DWORD dwRaceFlag);
  2090. void UnsetNoDamageRaceFlag(DWORD dwRaceFlag);
  2091. void ResetNoDamageRaceFlag();
  2092. const std::set<DWORD> & GetNoDamageAffectFlag();
  2093. void SetNoDamageAffectFlag(DWORD dwAffectFlag);
  2094. void UnsetNoDamageAffectFlag(DWORD dwAffectFlag);
  2095. void ResetNoDamageAffectFlag();
  2096. #endif
  2097.  
  2098. //ÃÖÁ¾ µ¥¹ÌÁö º¸Á¤.
  2099. private:
  2100. float m_fAttMul;
  2101. float m_fDamMul;
  2102. public:
  2103. float GetAttMul() { return this->m_fAttMul; }
  2104. void SetAttMul(float newAttMul) {this->m_fAttMul = newAttMul; }
  2105. float GetDamMul() { return this->m_fDamMul; }
  2106. void SetDamMul(float newDamMul) {this->m_fDamMul = newDamMul; }
  2107.  
  2108. private:
  2109. bool IsValidItemPosition(TItemPos Pos) const;
  2110.  
  2111. public:
  2112. //¿ëÈ¥¼®
  2113.  
  2114. // ij¸¯ÅÍÀÇ affect, quest°¡ load µÇ±â Àü¿¡ DragonSoul_Initialize¸¦ È£ÃâÇÏ¸é ¾ÈµÈ´Ù.
  2115. // affect°¡ °¡Àå ¸¶Áö¸·¿¡ ·ÎµåµÇ¾î LoadAffect¿¡¼­ È£ÃâÇÔ.
  2116. void DragonSoul_Initialize();
  2117.  
  2118. bool DragonSoul_IsQualified() const;
  2119. void DragonSoul_GiveQualification();
  2120.  
  2121. int DragonSoul_GetActiveDeck() const;
  2122. bool DragonSoul_IsDeckActivated() const;
  2123. bool DragonSoul_ActivateDeck(int deck_idx);
  2124.  
  2125. void DragonSoul_DeactivateAll();
  2126. // ¹Ýµå½Ã ClearItem Àü¿¡ ºÒ·¯¾ß ÇÑ´Ù.
  2127. // ¿Ö³ÄÇϸé....
  2128. // ¿ëÈ¥¼® Çϳª Çϳª¸¦ deactivateÇÒ ¶§¸¶´Ù µ¦¿¡ activeÀÎ ¿ëÈ¥¼®ÀÌ ÀÖ´ÂÁö È®ÀÎÇÏ°í,
  2129. // activeÀÎ ¿ëÈ¥¼®ÀÌ Çϳªµµ ¾ø´Ù¸é, ij¸¯ÅÍÀÇ ¿ëÈ¥¼® affect¿Í, È°¼º »óŸ¦ Á¦°ÅÇÑ´Ù.
  2130. //
  2131. // ÇÏÁö¸¸ ClearItem ½Ã, ij¸¯ÅÍ°¡ Âø¿ëÇÏ°í ÀÖ´Â ¸ðµç ¾ÆÀÌÅÛÀ» unequipÇÏ´Â ¹Ù¶÷¿¡,
  2132. // ¿ëÈ¥¼® Affect°¡ Á¦°ÅµÇ°í, °á±¹ ·Î±×ÀÎ ½Ã, ¿ëÈ¥¼®ÀÌ È°¼ºÈ­µÇÁö ¾Ê´Â´Ù.
  2133. // (UnequipÇÒ ¶§¿¡´Â ·Î±×¾Æ¿ô »óÅÂÀÎÁö, ¾Æ´ÑÁö ¾Ë ¼ö ¾ø´Ù.)
  2134. // ¿ëÈ¥¼®¸¸ deactivate½ÃÅ°°í ij¸¯ÅÍÀÇ ¿ëÈ¥¼® µ¦ È°¼º »óÅ´ °Çµå¸®Áö ¾Ê´Â´Ù.
  2135. void DragonSoul_CleanUp();
  2136. // ¿ëÈ¥¼® °­È­Ã¢
  2137. public:
  2138. bool DragonSoul_RefineWindow_Open(LPENTITY pEntity);
  2139. bool DragonSoul_RefineWindow_Close();
  2140. LPENTITY DragonSoul_RefineWindow_GetOpener() { return m_pointsInstant.m_pDragonSoulRefineWindowOpener; }
  2141. bool DragonSoul_RefineWindow_CanRefine();
  2142.  
  2143. //µ¶ÀÏ ¼±¹° ±â´É ÆÐŶ Àӽà ÀúÀå
  2144. private:
  2145. unsigned int itemAward_vnum;
  2146. char itemAward_cmd[20];
  2147. //bool itemAward_flag;
  2148. public:
  2149. unsigned int GetItemAward_vnum() { return itemAward_vnum; }
  2150. char* GetItemAward_cmd() { return itemAward_cmd; }
  2151. //bool GetItemAward_flag() { return itemAward_flag; }
  2152. void SetItemAward_vnum(unsigned int vnum) { itemAward_vnum = vnum; }
  2153. void SetItemAward_cmd(char* cmd) { strcpy(itemAward_cmd,cmd); }
  2154. //void SetItemAward_flag(bool flag) { itemAward_flag = flag; }
  2155. #ifdef ENABLE_ANTI_CMD_FLOOD
  2156. private:
  2157. int m_dwCmdAntiFloodPulse;
  2158. DWORD m_dwCmdAntiFloodCount;
  2159. public:
  2160. int GetCmdAntiFloodPulse(){return m_dwCmdAntiFloodPulse;}
  2161. DWORD GetCmdAntiFloodCount(){return m_dwCmdAntiFloodCount;}
  2162. DWORD IncreaseCmdAntiFloodCount(){return ++m_dwCmdAntiFloodCount;}
  2163. void SetCmdAntiFloodPulse(int dwPulse){m_dwCmdAntiFloodPulse=dwPulse;}
  2164. void SetCmdAntiFloodCount(DWORD dwCount){m_dwCmdAntiFloodCount=dwCount;}
  2165. #endif
  2166. private:
  2167. // SyncPositionÀ» ¾Ç¿ëÇÏ¿© ŸÀ¯Àú¸¦ ÀÌ»óÇÑ °÷À¸·Î º¸³»´Â ÇÙ ¹æ¾îÇϱâ À§ÇÏ¿©,
  2168. // SyncPositionÀÌ ÀϾ ¶§¸¦ ±â·Ï.
  2169. timeval m_tvLastSyncTime;
  2170. int m_iSyncHackCount;
  2171. public:
  2172. void SetLastSyncTime(const timeval &tv) { memcpy(&m_tvLastSyncTime, &tv, sizeof(timeval)); }
  2173. const timeval& GetLastSyncTime() { return m_tvLastSyncTime; }
  2174. void SetSyncHackCount(int iCount) { m_iSyncHackCount = iCount;}
  2175. int GetSyncHackCount() { return m_iSyncHackCount; }
  2176. };
  2177.  
  2178. ESex GET_SEX(LPCHARACTER ch);
  2179.  
  2180. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement