Files
Sun1602/Client/GameClient/Hero.h
T
2022-10-26 12:25:11 +08:00

544 lines
18 KiB
C++

//------------------------------------------------------------------------------
/**
월드 상의 자기 유저 캐릭터 특성 정의 및 슬롯 처리
@author
@since
@remarks
-2005.06.07 소스 정리(지완)
-
*/
#pragma once
#include "player.h"
#include "HeroDef.h"
#include <boost/shared_ptr.hpp>
#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<DWORD, eTRIGGER_STATE> TRIGGERSTATE_MAP;
typedef std::pair<DWORD, eTRIGGER_STATE> TRIGGERSTATE_PAIR;
typedef stdext::hash_map<DWORD, eSHORTCUT_AREA_STATE> SHORTCUT_AREA_STATE_MAP;
typedef std::pair<DWORD, eSHORTCUT_AREA_STATE> 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<float, true, 2> 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<ActivedComboSkillData> 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;
}