Advertisement
Guest User

Untitled

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