//------------------------------------------------------------------------------ /** ¿ùµå »óÀÇ ÀÚ±â À¯Àú ij¸¯ÅÍ Æ¯¼º Á¤ÀÇ ¹× ½½·Ô ó¸® @author @since @remarks -2005.06.07 ¼Ò½º Á¤¸®(Áö¿Ï) - */ #pragma once #include "player.h" #include "HeroDef.h" #include #include "WGPL/WGPLShuffle.h" #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE #include "ToggleSkill.h" #else #include "AuraSkill.h" #endif // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE class SkillAttrCalculator; class QuickContainer; class PlayerAttributes; class SCSlotContainer; class QuickContainer; class SummonSkillContainer; class HeroEquipmentContainer; class StyleContainer; class SummonSKillContainer; class uiHelmetShow; class Hero : public Player #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE , public ToggleSkill #else , public AuraSkill #endif // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE { public: enum ITEM_SLOT_IDX { Inventory = 0, Quick, Skill }; Hero(); virtual ~Hero(); private: virtual void InitContainer(); virtual void ReleaseContainer(); public: virtual void RenderInfo(); virtual void RefreshAppearRender(BOOL refresh_bone = FALSE); virtual void OnDead(); virtual BOOL Process( DWORD dwTick ); virtual void ShowConflictMessage(); virtual BOOL Create( DWORD dwObjectKey, DWORD dwID = 0 ); virtual void Destroy(); virtual int DoAction(PLAYER_ACTION *pAction); virtual BOOL CheckQueueActionCondition(); virtual BOOL ProcessNextAction(); virtual void TransForm(); void HeroTransForm(); virtual void UnTransForm(); virtual SCSlotContainer * GetSlotContainer( SLOTIDX slotIdx ); QuickContainer * GetQuickContainer(); HeroEquipmentContainer * GetHeroEquipContainer(); BOOL CanDoQueueAction(PLAYER_ACTION *pAction); void SetHeroInfo( const HERO_INFO * pHeroInfo ); void SetCannotMoveFlag(BOOL bFlag); BOOL GetCannotMoveFlag(); BOOL IsLockInput(); VOID GetInventoryTotalInfo( BYTE * OUT pItemSteam, WORD & OUT wSize ); VOID GetQuickTotalInfo( QUICK_TOTAL_INFO & OUT rQuickInfo ); VOID ResizeInventoryTotalInfo(BYTE byExtraInventoryTabCount); VOID SetInventoryTotalInfo( const INVENTORY_TOTAL_INFO & rItemInfo ); VOID SetInventoryTotalInfo( const BYTE * IN pItemStream, WORD wSize ); VOID SetSkillTotalInfo( const SKILL_TOTAL_INFO & rSkillInfo ); VOID SetQuickTotalInfo( const QUICK_TOTAL_INFO & rQuickInfo ); VOID SetStyleTotalInfo( const STYLE_TOTAL_INFO & rStyleInfo ); void SetFreeInitState(BYTE count); BYTE GetFreeInitState(); VOID UpdateTotalItemDate(); virtual BOOL Render(); protected: SCSlotContainer * m_pBankContainer; SCSlotContainer * m_pInventoryContainer; QuickContainer * m_pQuickContainer; StyleContainer * m_pStyleContainer; int m_iCanNotMoveTime; SummonSkillContainer * m_pSummonContainer; HeroEquipmentContainer * m_pHeroEquipContainer; int m_iComboCount; DWORD m_dwKeyboardMovePacketSendDuration; // Űº¸µå À̵¿ ÆÐŶ Àü¼Û ÁÖ±â DWORD m_dwKeyboardMovePacketSendTime; // Űº¸µå À̵¿ ÆÐŶ Àü¼Û½Ã°£. BOOL m_bCompleteTransForm; PlayerAttributes* m_pPlayerAttriburtes; public: PlayerAttributes* GetPlayerAttribute() { return m_pPlayerAttriburtes; } // Style 1~3Ÿ Ä«¿îÆ® int GetComboCount(); void SetComboCount(int iCount); // Àӽà virtual BOOL SetPosition( const WzVector& wvPos,int index = -1); BOOL IsCompleteTransForm();//º¯½ÅÀÌ ¿Ï·á µÆ³ª BOOL IsCancelTransForm(DWORD dwSkillClassCode); BYTE GetAttackPropensity(); BOOL SendUseSkillPacket( DWORD SkillCode ); BOOL SendPacket( void *pBuf, int iLength ); BOOL SendStopMovePacket(); bool SendStandUp(); void SetKeyboardMovePacketSendDuration(DWORD dwDuration); DWORD GetKeyboardMovePacketSendDuration(); void SetKeyboardMovePacketSendTime(DWORD dwTime); void AddKeyboardMovePacketSendTime(DWORD dwTime); DWORD GetKeyboardMovePacketSendTime(); virtual DWORD GetWeaponKind(); // ½ºÅ³ »ç¿ë À¯¹« °ü·Ã virtual BOOL CanUseSkill(SLOTCODE skillID, BOOL bShowFailMessage = FALSE); int GetBonusSkillCooltime(); int GetRatioBonusSkillCooltime(); BOOL CanUseSkillWithoutCooltime(SLOTCODE skillID, BOOL bShowFailMessage = FALSE, bool is_check_monster = false); virtual BOOL CanUseSkillLimitMP(SLOTCODE skillID, BOOL bShowFailMessage = FALSE); BOOL CanUseAction(SLOTCODE skillID); BOOL CanUseEmotion(SLOTCODE skillID); BOOL CanUseSkillLimitLevel(SLOTCODE skillID, BOOL bShowFailMessage = FALSE); BOOL CanUseSkillLimitWeapon(SLOTCODE skillID, BOOL bShowFailMessage = FALSE); BOOL CanUseStyleLimitWeapon(SLOTCODE skillID, BOOL bShowFailMessage = FALSE); #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE BOOL CanUseSkillLimitFP(SLOTCODE skillID,BOOL bShowFailMessage = FALSE); #endif // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE BOOL CanUseSkillType(SLOTCODE skillID, BOOL bShowFailMessage = FALSE); BOOL CanUseSkillSlotState(SLOTCODE skillID, BOOL bShowFailMessage = FALSE); BOOL CanUseItem(const BASE_ITEMINFO *pItemInfo,BOOL bShowFailMessage = FALSE); BOOL CanUseChangeGenderItem(); //------------------------------------------------------------------------------ // Qualifier : ÇØ´ç ac ¾ÆÀÌÅÛÀ» »ç¿ëÇÒ¼ö ÀÖ´ÂÁö ¿©ºÎ // Parameter : WORD ac_code // Parameter : BYTE ac_reference_id //------------------------------------------------------------------------------ bool CanUseACItem(const BASE_ITEMINFO *pItemInfo); MONEY GetMoney( void ); void SetMoney(MONEY Money); virtual DWORD GetMaxHP(); virtual DWORD GetMaxMP(); virtual void SetHP(DWORD dwHP); virtual void SetMP(DWORD dwHP); virtual void SetMaxSD(DWORD dwMaxSD); virtual void SetSD(DWORD dwSD); virtual DWORD GetSD(); virtual DWORD GetMaxSD(); #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE virtual void SetMaxFP(const PLAYERFP& max_fp); virtual void SetFP(const PLAYERFP& fp); virtual PLAYERFP GetFP(); virtual PLAYERFP GetMaxFP(); #endif // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE virtual void SetHPInfo(HPINFO *pInfo); virtual int AddSkillEffect(SKILL_EFFECT *pEffect); virtual BOOL DeleteSkillEffect(int iEffectID); void UpdateDominationRewardAttr(SkillAttrCalculator &SkillCalc); #ifdef _NA_007330_20140620_GUILD_SYSTEM_EXTENSION void UpdateGuildFacilityAttr(SkillAttrCalculator& skill_calc); #endif // _NA_007330_20140620_GUILD_SYSTEM_EXTENSION float GetProcessMultiplier(); virtual float GetAttackSpeedModifier(); virtual float GetMoveSpeedModifier(); virtual void SetMaxHP( DWORD iHP ); virtual void SetMaxMP( DWORD iMP ); #ifdef _NA_000000_20131022_RECIEVE_SPEED_FROM_SERVER #else //_NA_000000_20131022_RECIEVE_SPEED_FROM_SERVER virtual void SetAttackSpeedRatio(int iSpeed); virtual void SetMoveSpeedRatio(int iSpeed); #endif //_NA_000000_20131022_RECIEVE_SPEED_FROM_SERVER void SetCustomAttackSpeed(float fSpeed); void SetCustomMoveSpeed(BOOL bUse,float fSpeed = 1.0f); BOOL CanEquipItem(); BOOL SendUnTransFormPacket(); // À̺¥Æ® virtual void OnFootStep(BOOL b2D = FALSE); void OnFootStepPlaySound(); virtual void OnWaterWave(); virtual void OnWaterEllipse(); virtual void OnDamage(const DAMAGE_PRAM &rDamage); virtual void OnLevelUp(); void SetRemainStatPoint( int Point ) { GetCharInfo()->m_iRemainStat = Point; } void SetRemainSkillPoint( int Point ) { GetCharInfo()->m_iRemainSkill = Point; } void OnUseItemWithCoolTime(CODETYPE ItemCode); virtual BOOL OnUseItem(DWORD dwItemCode); void RefreshEquipData(); void UpdateItemAttrCalculator(); void UpdateSkillAttr(); void UpdateActiveSkillEffectAttr(SkillAttrCalculator &calc); void ItemAttrCalculatorByItemslot(SCSlot& item_slot, bool is_equip, POSTYPE position); int GetItemScore(); // override void RefreshStyleQuick(); BOOL IsShowFullMap( void ) { return m_bShowFullMap; } BOOL ToggleFullMapWindow( void ) { m_bShowFullMap ^= TRUE; return m_bShowFullMap; } void ShowFullMapWindow( BOOL bShow ) { m_bShowFullMap = bShow; } int GetEmptyUseSlot(); void SetHeroPetInfo( BASE_PLAYERINFO* pPlayerInfo); virtual void SetPetAttributes( POSTYPE pos,BYTE bIsFullness , BYTE byValue); virtual void DeletePetSummon(); //ÆêÁ¦°Å void UpdatePetInfo( POSTYPE pos ); void UsePetFeed(); //Æê»ç·á»ç¿ë POSTYPE GetPetItemPos(){ return m_PetInfo.HERO_.m_PetItemPos;} void UpdatePetSkillAttr(SkillAttrCalculator &SkillCalc); #ifdef _NA_004035_20120227_COSTUME_ITEM void UpdateCostumeInfo(SkillAttrCalculator& SkillCalc); #endif// _NA_004035_20120227_COSTUME_ITEM #ifdef _NA_008633_20160104_ADD_DECORATECOSTUME void UpdateDecorateCostumeInfo(SkillAttrCalculator& SkillCalc); #endif // _NA_008633_20160104_ADD_DECORATECOSTUME void UpdateBadgeItemInfo(SkillAttrCalculator& SkillCalc); //Æê ÀÚµ¿¼ÒÈ¯ÇØÁ¦ °ü·Ã void PetChangeON( POSTYPE pos ){m_PetInfo.HERO_.m_bChangePet = TRUE; m_PetInfo.HERO_.m_PetChangePos=pos;} void PetChangeOFF(){m_PetInfo.HERO_.m_bChangePet = FALSE;} POSTYPE PetChangePos(){ return m_PetInfo.HERO_.m_PetChangePos;} BOOL IsPetChange(){ return m_PetInfo.HERO_.m_bChangePet;} RIDER_INFO m_RiderInfo; virtual void RefreshRider(); virtual void CreateRider(DWORD dwID,BOOL bEffect=FALSE); virtual void DestroyRider(); void ShowRiderInven(BOOL bOepn); void SendRiderReleasePacket(bool is_battle=true); bool SendWingsControlByAccessory(bool is_spread, bool is_force_send); bool SendWingsControlByRider(bool is_spread, bool is_force_send); bool SendZONE_EX_QUEST_PORTAL_ENTER_SYN(); private: bool SendWingsControl(eSlotContainerIndex container_index, POSTYPE slot_at, bool is_spread); public: void SetEtherItemLock(BOOL bZoneMove, BOOL bLock); void SetEtherChargePos(POSTYPE pos) { m_EtherInfo.byEtherChargePos = pos; } void SetEtherOptionValue(int iValue) { m_EtherInfo.iValue = iValue; } void SetEtherWaitPacket(BOOL bWait) { m_EtherInfo.bWait = bWait; } void ClearEthreInfo(); virtual void SetEtherActive(BYTE byIndex); //¿¡Å׸£ ÀÚµ¿¼ÒÈ¯ÇØÁ¦ °ü·Ã void EtherChangeON(POSTYPE pos) { m_EtherInfo.bChange = TRUE; m_EtherInfo.ChangePos = pos; } void EtherChangeOFF() { m_EtherInfo.bChange = FALSE; } const ETHER_INFO& GetEthreInfo() { return m_EtherInfo; } ETHER_INFO m_EtherInfo; #ifdef _PCBANG_POLICY_CHANGE_POST_EXPIRED void SetPCRoomStatus( CHANGE_PCROOM_STATUS::eStatus ePCBangStatus ) { m_ePCBangStatus = ePCBangStatus; } CHANGE_PCROOM_STATUS::eStatus GetPCRoomStatus() { return m_ePCBangStatus; } #endif eTRIGGER_STATE m_eTriggerState; typedef stdext::hash_map TRIGGERSTATE_MAP; typedef std::pair TRIGGERSTATE_PAIR; typedef stdext::hash_map SHORTCUT_AREA_STATE_MAP; typedef std::pair SHORTCUT_AREA_STATE_PAIR; TRIGGERSTATE_MAP m_MapTriggerState; SHORTCUT_AREA_STATE_MAP m_MapShorcutAreaState; BOOL m_bCustomAttackSpeed; float m_fCustomAttackSpeed; BOOL m_bCannotMove; BOOL m_bCustomMoveSpeed; float m_fCustomMoveSpeed; int m_iHeroTurnState; public: eTRIGGER_STATE GetTriggerState( DWORD iAreaID ) ; void SetTriggerState( DWORD iAreaID,eTRIGGER_STATE TriggerState ); eSHORTCUT_AREA_STATE GetShortcutState( DWORD dwAreaID ) ; void SetShortcutState( DWORD dwAreaID, eSHORTCUT_AREA_STATE ShortcutState ); void InitTriggerState(); void InitShortcutState(); BOOL IsKeboardMoving(); BOOL IsOldKeboardMoving(); public: DWORD m_dwPacketStatus; BOOL m_bShowFullMap; TAB_TARGET_MONSTER_vector m_vectorTargetMonster; TAB_TARGET_MONSTER m_CurTargetInfo; // ÁÖÀΰø IDLE »óÅÂÀÏ ¶§, ȸÀü Á¤º¸( ȸÀü ¾ÈÇÔ, ¿ÞÂÊ È¸Àü, ¿À¸¥ÂÊ È¸Àü ) // À§¿¡ enum °ª ÀÖÀ½ eHERO_TURN_STATE void SetHeroTurnState( int iTurnState ) { m_iHeroTurnState = iTurnState; } int GetHeroTurnState() { return m_iHeroTurnState; } protected: BOOL m_bAccountState; BOOL m_bIsScreenShotMode; BOOL m_bForceAttack; //°­Á¦ °ø°Ý #ifdef _NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER #else void OutputMsg_ForceWithDrawCampSoldier(DWORD dwLevel); #endif //_NA_003923_20120217_GUILD_RENEWAL_UI_GUILD_MANAGER public: virtual bool IsHero() { return true; } BOOL IsForceAttack();//°­Á¦ °ø°Ý °ü·Ã void SetForceAttack(BOOL bForce); BOOL CanUseStyle(); void SetAccountState( BOOL bState ); BOOL GetAccountState( void ); virtual void HideHelmet(BOOL bFlag,BOOL bRefresh = TRUE); #ifdef _NA_000000_20120420_EQUIPMENTS_VISIBLE_WING virtual void HideWing(BOOL bFlag,BOOL bRefresh = TRUE); #endif//_NA_000000_20120420_EQUIPMENTS_VISIBLE_WING #ifdef _NA_006683_20130502_EQUIPMENTS_VISIBLE_COSTUME virtual void HideCostume(BOOL bFlag,BOOL bRefresh = TRUE); #endif virtual void SetChaoState(BYTE bState); void SetScreenShotMode( BOOL bScreenShotMode ) { m_bIsScreenShotMode = bScreenShotMode; } BOOL IsScreenShotMode( void ) { return m_bIsScreenShotMode; } public : BOOL IsParty( void ); BOOL IsReachMaxLevel(); //Àκ¥¿¡ ÀÖÀ»¶§ È¿°ú ¹ßµ¿(¿É¼Ç,ÀÌÆåÆ®)Çϴ·ùÀÇ ¾ÆÀÌÅÛ ÀÌÆåÆ® ó¸® (ÇÔ¼ö¸í º¯°æ ÇÊ¿ä) void ActionCrystalWarp(); protected: BOOL m_bLockSkill; public: void SetLockSkill(BOOL bYes){m_bLockSkill = bYes;} BOOL IsLockSkill(){return m_bLockSkill;} DWORD m_dwCrystalWarpObjKeys[CRYSTAL_WARP_OBJ_MAX_CNT]; private: #ifdef _PCBANG_POLICY_CHANGE_POST_EXPIRED CHANGE_PCROOM_STATUS::eStatus m_ePCBangStatus; #endif public: void SetCrystalWarpKey(DWORD dwKey, bool bAdd = true); bool IsCrystalWarpKey(DWORD dwKey); struct { //CG_ZONE_EX_QUEST_PORTAL_FIXEDPORTAL_STATEINFO_CMD KEYTYPE portal_key; uint8_t open_state; ulong portal_lifetime; bool has_portal_info() { return ((portal_lifetime > 0) && (portal_key > 0) && ((open_state == MSG_CG_ZONE_EX_QUEST_PORTAL_FIXEDPORTAL_STATEINFO_CMD::eOpenState_Created) || (open_state == MSG_CG_ZONE_EX_QUEST_PORTAL_FIXEDPORTAL_STATEINFO_CMD::eOpenState_Countdown))); } }FixedPortalState; struct { //_NA000000_SPEED_HACK_PREVENTION_SUPPORT float ang; WzVector pos; DWORD sent_tick; BYTE last_sent_move_flag; bool is_first_kbmove; //! debug int debug_kbmove_skip_count; float debug_kbmove_gab; float debug_move_speed; }KBMove; struct { //_NA000000_SPEED_HACK_PREVENTION_SUPPORT DWORD delay_tick; bool is_recv_nak; }PacketNak; private: bool is_waiting_invite_group_; public: bool IsWaitingInviateGroup() const { return is_waiting_invite_group_; } void SetWaitingInviateGroup(bool value) { is_waiting_invite_group_ = value; } #ifdef _NA_000000_20120410_SPEEDHACK virtual void SetMoveSpeed(float fMoveSpeed); virtual float GetMoveSpeed(void); WGPL::Shuffle move_speed_; #endif //_NA_000000_20120410_SPEEDHACK #ifdef _NA_20120426_DISPLAY_SKILL_COMBO_ICON_EFFECT private: struct ActivedComboSkillData { int actived_skill_class_code_; DWORD end_time_; }; std::vector actived_combo_skill_array_; public: void AddActivedComboSkill( int skill_class_code, DWORD duration ); void ClearActivedComboSkill(); void UpdateActivedComboSkill(); BOOL IsActivedComboSkill( SLOTCODE SkillClassCode ); #endif #ifdef _NA_004035_20120227_COSTUME_ITEM public: POSTYPE GetActivedCostumeItemSlotIndex(); void SetActivedCostumeItemSlotIndex(POSTYPE inventory_position); #endif//_NA_004035_20120227_COSTUME_ITEM #ifdef _NA_008633_20160104_ADD_DECORATECOSTUME public: POSTYPE GetActivedDecorateCostumeItemSlotIndex(); void SetActivedDecorateCostumeItemSlotIndex(POSTYPE inventory_position); #endif // _NA_008633_20160104_ADD_DECORATECOSTUME void RefreshInvenItemEffect(); void RefreshBadgeItemEffect(); void RefreshPCBangItemEffect(); BYTE GetPCBangMode(); // override Player }; //------------------------------------------------------------------------------ /** */ inline BOOL Hero::IsForceAttack() { return m_bForceAttack; } //------------------------------------------------------------------------------ /** */ inline void Hero::SetForceAttack(BOOL bForce) { m_bForceAttack=bForce; }