// NPC.h: interface for the NPC class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_NPC_H__6A6486A6_D04B_4978_88CE_BD1C88F269F0__INCLUDED_) #define AFX_NPC_H__6A6486A6_D04B_4978_88CE_BD1C88F269F0__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include #include #include #include #include #include #include #include "Character.h" //#include "BattleRecord.h" #include "NPCAttrForUpdate.h" #include "VarMsg.h" #include "UnitRegenInfo.h" #include "UnitGroupInfo.h" #include "AppliedNpcDependencyChain.h" struct AI_MSG; class State; class AIMessageQueue; class Character; class NPCStateManager; class TargetManager; class UnitListOfGroup; //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // class NPC : public Character, public SCNPC { enum { NPC_SKILL_COOLTIME_INIT_NUM = 10 }; public : typedef RatioSelector SkillSelector; public: NPC(); virtual ~NPC(); virtual BOOL Init(); virtual BOOL Update( DWORD dwDeltaTick ); virtual VOID Reuse(); protected: virtual VOID Release(); virtual VOID SetInitialState( DWORD dwStateID, BYTE byMoveType=0, DWORD dwMoveAreaID=0, LPARAM param1=0 ); public: virtual VOID OnEnterField( GameField& IN rField, const WzVector& IN rwzVec, INT iAngle=-1 ); virtual VOID OnLeaveField(); virtual VOID OnEnterObject( const Sector& IN rSector ); virtual VOID OnLeaveObject( const Sector& IN rSector ); virtual void SendMoveInfo(Player* pEnterPlayer, const Sector& IN rSector); //_NA_0_20100817_HELLON_LAST_TRIGGER BASE_NPCINFO* GetBaseInfo() const; public: VOID SetBaseInfo( WORD NPCCode, BYTE byMoveType, DWORD dwMoveAreaID, DWORD dwStateID=2, LPARAM param1=0 ); ////////////////////////////////////////////////////////////////////////// // public: VOID GetNPCRenderInfo( MONSTER_RENDER_INFO* OUT pRenderInfo ); virtual VOID GetSummonedRenderInfo( SUMMONED_RENDER_INFO* OUT pRenderInfo ); virtual VOID GetTotemNPCRenderInfo( TOTEMNPC_RENDER_INFO* OUT pRenderInfo ); ////////////////////////////////////////////////////////////////////////// // public: virtual Attributes& GetAttr(); virtual const Attributes& GetAttr() const; virtual LEVELTYPE GetLevel() const; virtual LEVELTYPE GetDisplayLevel() const; BYTE GetGrade() const; FLOAT GetGradeExpRatio(); virtual FLOAT GetAttackRange() const; virtual FLOAT GetNormalRangeBonus() const; virtual FLOAT GetSkillRangeBonus() const; virtual FLOAT GetSightRange() const; virtual eARMOR_TYPE GetArmorType() const; virtual eMELEE_TYPE GetMeleeType() const; virtual eATTACK_TYPE GetWeaponBaseAttType() const; virtual eATTACK_TYPE GetWeaponMagicalAttType() const; virtual DWORD GetHP() const; virtual DWORD GetMP() const; virtual FLOAT GetHPRatio() const; virtual FLOAT GetMPRatio() const; virtual DWORD GetMaxHP() const; virtual DWORD GetMaxMP() const; virtual const TCHAR * GetCharName() const; virtual INT GetRegenHP() const; virtual INT GetRegenMP() const; virtual DWORD GetPhysicalAvoidValue() const; virtual FLOAT GetPhysicalAttackSpeed() const; virtual INT GetMoveSpeedRatio() const; virtual INT GetAttSpeedRatio() const; virtual FLOAT GetBodyRadius() const; virtual DWORD GetMaxSD() const; virtual INT GetRegenSD() const; virtual FLOAT GetSDRatio() const; virtual VOID SetSD( DWORD dwSD ); virtual DWORD GetSD() const; virtual VOID SetAttr( eATTR_TYPE eAttrType, eATTR_KIND eAttrKind, INT iValue ); virtual VOID SetHP( DWORD dwHP ); virtual VOID SetMP( DWORD dwMP ); virtual VOID SetHPAttackPowerAsParty( DWORD dwCurMemberNum ); // ÀÏ´ÜÀº ¹«½Ã. ·¾¾÷ÇÏ´Â NPCµµ ÀÖ°ÚÁö?; virtual EXPTYPE GetExp() const; inline eTARGET_SEARCH_TYPE GetSearchType() const; //_NA001385_20090924_DOMINATION_MAPNPC_AI_BUG BOOL IsHPMPRegenNPC(); // ÀÚµ¿ HP ¸®Á¨µÇ´Â NPCÀΰ¡? BOOL IsSDRegenNPC(); ////////////////////////////////////////////////////////////////////////// // public: inline NPCStateManager* GetStateManager() const; inline TargetManager* GetTargetManager() const; inline SkillSelector& GetSkillSelector(); inline VOID ChangeNpcDependencyChain( const INpcLinkActionD& rNewAction ); virtual VOID SetTargetChar( Character* pChar ); virtual Character* GetTargetChar(); public: Character* SelectSkillTarget( SLOTCODE SkillCode, BOOL bHeal=FALSE ); eUSER_RELATION_TYPE IsFriend( Character* pTarget ); public: virtual VOID StatusResist(); // »óÅÂÀúÇ× virtual BOOL IsDelegate() { return TRUE; } //_NA_0_20091118_GAMEROOM_BATTLE_RESULT virtual VOID OnRecover( INT recoverHP, INT recoverMP, INT recoverSD = 0, eRECOVER_TYPE Type = eRECOVER_TYPE_NORMAL, Character* pAttacker = NULL ); void SendHPChange(); void SendAreaDamage(const DAMAGETYPE damage); public: virtual VOID SpecialAction(); // Ư¼öÇൿ //_NA_0_20100514_NPC_DEAD_STATE_TIME(»èÁ¦) VOID SpecialAction(const SPECIAL_CONDITION& special_condition); SPECIAL_CONDITION* GetDrawLotsSpecialAction(); public: BOOL IsSpecialAction( eNPC_SPECIAL_ACTION_TYPE eType ); ENUM_STATD_ID GetCurStateID(); /*FLOAT GetDistToTarget() const;*/ FLOAT GetDistToNewTarget( Character* pNewTargetChar ) const; ////////////////////////////////////////////////////////////////////////// // // ½ºÅ³ °ü·Ã #ifdef _NA_007123_20140324_SHADOW_SKILL_RENEWAL protected: #else private: #endif //_NA_007123_2014_0324_SHADOW_SKILL_RENEWAL virtual VOID AddDefaultSkill(); // NPC°¡ »ç¿ë°¡´ÉÇÑ ½ºÅ³µéÀ» µî·ÏÇÑ´Ù. public: BOOL UseSkill( SLOTCODE SkillCode ); virtual RC::eSKILL_RESULT CanUseSkill( SLOTCODE SkillCode, BOOL bCoolTimerReset = TRUE ); VOID SelectSkill( Character* pTarget, SLOTCODE SkillCode #ifdef _NA_006669_20130426_SUMMON_SKILL_SYNC_BUG_MODIFY , WORD SelectedSkillDelay = 0 #endif // _NA_006669_20130426_SUMMON_SKILL_SYNC_BUG_MODIFY ); VOID SelectSkill(); SLOTCODE GetSelectedSkill() const; VOID ResetSelectedSkill(); WORD GetSelectedSkillDelay() const; BOOL UseResurrectionSkill(); virtual BOOL CheckSkillRange( Character* pTarget, const WzVector& vTargetPos, FLOAT fSkillRange ); ////////////////////////////////////////////////////////////////////////// // public: BOOL IsSamePositionWithTarget(); BOOL IsTooCloseToTarget(); // ³Ê¹« °¡±î¿ì¸é ¸Ö¾îÁö±â BOOL NeedToRetreatFromTarget(); // targetÀ¸·ÎºÎÅÍ ¸Ö¾îÁú Çʿ䰡 ÀÖ´Â °æ¿ì public: virtual BOOL IsOutOfWanderRadius(); virtual BOOL IsOutOfRegenLocationLimit( WzVector &vTargetPos ); virtual VOID SetRegenPos( const WzVector& regenPos ); public: VOID GetTrackPos( WzVector& wvDestPos, FLOAT fAttackRangeRatio = 0.9f ); virtual BOOL ExecuteThrust( BOOL bForcedMove, WzVector* pwvMoveDistance, WzVector& wvPosAfterThrust, FLOAT fMoveDistance, BOOL bDownAfterThrust ); BOOL MoveAndBroadcast( WzVector* pwvDestPos, eCHAR_MOVE_STATE moveState ); BOOL ThrustMoveAndBroadcast( WzVector* pwvDestPos, eCHAR_MOVE_STATE moveState, BOOL& bTouchedSomething, WzVector& wvRotatedVector ); ////////////////////////////////////////////////////////////////////////// // public: BOOL IsOnGoodPositionToJump(); BOOL CanJumpDist( Character *pTarget ); BOOL SetJumpPos( Character *pTarget ); WzVector& GetJumpPos(); ////////////////////////////////////////////////////////////////////////// // virtual VOID ChangeState( DWORD dwStateID, LPARAM param1 = 0, LPARAM param2 = 0, LPARAM param3 = 0 ); public: VOID SendAIMessage( AI_MSG* pMsg, WORD wSize, DWORD dwDelay = 0 ); VOID SendAIMessageToGroupExceptMe( AI_MSG* pMsg, WORD wSize, DWORD dwDelay = 0 ); VOID SendAIMessageAroundExceptMe( AI_MSG* pMsg, WORD wSize, DWORD dwDelay = 0 ); VOID GroupCmdAttackToGroup( Character* pTargetChar ); VOID GroupCmdStopAttackToGroup(); protected: VOID AIMsgProgress(); public: virtual VOID OnAttack( Character *pTarget, SLOTCODE skillcode, DAMAGETYPE damage ); protected: virtual void _Damaged(DamageArgs* damage_arg); public: virtual VOID AddBattlePoint( Character* pAttacker, eBATTLE_POINT_TYPE ePointType, INT iBattlePoint ); Character* SearchTarget(); virtual BOOL OnResurrection( FLOAT fRecoverExp, FLOAT fRecoverHP, FLOAT fRecoverMP, Player *pHealer=NULL ); virtual VOID OnDead(); public: ////////////////////////////////////////////////////////////////////////// // REGENID GetRegenID(); CODETYPE GetTriggerAnimationCode(); void SetTriggerAnimationCode(CODETYPE code); bool IsLeader(); //{ return m_pUnitRegenInfo->GetID() == m_pUnitGroupInfo->GetLeaderRegenID(); } // (WAVERIX) (090617) (BUG-FIX) ±×·ì ¸â¹öµéÀº ÀÚ¹ßÀûÀ¸·Î ÈÄÅð ¸øÇÏ´Â »óȲ °¨¼Ò½Ã۱â ÀÛ¾÷ NPC* GetLeaderInField(); bool IsFollower(); public: bool IsLeaderAlive();// { return m_pUnitListOfGroup->IsAlive(m_pUnitGroupInfo->GetLeaderRegenID()); } public: bool IsGroupMember(); void SetUnitGroupInfo( UnitGroupInfo* p ); void SetUnitRegenInfo( UnitRegenInfo* p ); UnitRegenInfo* GetUnitRegenInfo(); ////////////////////////////////////////////////////////////////////////// // VOID SetGMIdleOn( BOOL bIdleOn ); BOOL ISGMIdleOn() const; ns_trigger::TriggerNpcLinkInGameSlots* GetTriggerLinks(); // _NA_0_20100222_UNIT_TRIGGERS_FRIEND_MONSTER eTARGET_SEARCH_TYPE FindSearchTypeByAttitude(const BYTE attitude); void SetSearchType(const eTARGET_SEARCH_TYPE search_type, const DWORD object_key); Character* SearchTargetFriend(); //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // protected: enum { eAIMESSAGE_TEMP_SIZE = 120, eAIMESSAGE_DEFAULT_SIZE = 250 }; // AI °ü·Ã protected: static VarMsg2 m_VarMsg2; protected: BASE_NPCINFO* m_pBaseInfo; // NPCInfoParser¿¡ ÀÖ´Â Á¤º¸¸¦ °øÀ¯ÇÏ´Â Æ÷ÀÎÅÍÀ̹ǷΠ»èÁ¦ÇÏÁö ¸»°Í protected: NPCStateManager* m_pNPCStatusManager; TargetManager* m_pTargetManager; protected: INpcLinkActionD m_LinkedAction; protected: AIMessageQueue* m_pAIMessageQueue; AIMessageQueue* m_pTempMessageQueue; protected:struct { // SKILL CONTROL FIELDs SkillSelector m_SkillSelector; util::ITimerBase m_pSkillSelectTimer[1]; SLOTCODE m_SelectedSkillCode; WORD m_wSelectedSkillDelay; }; protected: NPCAttrForUpdate m_Attr; // ÆÄ¶ó¹ÌÅÍ DWORD m_dwHP; DWORD m_dwMP; DWORD m_dwSD; // INT m_iAngle; BOOL m_bDestroy; WzVector m_vJumpPos; BOOL m_bGMIdleOn; protected:struct { // UNIT CONTROL FIELDs UnitListOfGroup* m_pUnitListOfGroup; UnitRegenInfo* m_pUnitRegenInfo; UnitGroupInfo* m_pUnitGroupInfo; }; //---------------------------------------------------------------------------------------- // NOTE: trigger informantion, need code arrangement //_NA_002098_20110307_ADD_NPC_CONTROL_TRIGGER_BASE ns_trigger::TriggerNpcLinkInGameSlots trigger_links_; //_NA_0_20100222_UNIT_TRIGGERS_FRIEND_MONSTER // Æ®¸®°Å¸¦ ÅëÇÑ Å¸ÄÏ °Ë»ö º¯°æÀ» À§ÇØ °¢NPC°¡ Á¤º¸¸¦ °¡Áø´Ù. eTARGET_SEARCH_TYPE search_type_; REGENID search_taget_unitID_; DWORD search_taget_mapobjectID_; MONSTERCODE search_taget_monstercode_; //_NA_0_20100817_HELLON_LAST_TRIGGER CODETYPE trigger_animation_code_; //---------------------------------------------------------------------------------------- }; #define __GAMESERVER_NPC_INL #include "./NPC.inl" #undef __GAMESERVER_NPC_INL #endif