/* ========================================================================== * ÆÄ ÀÏ : Monster.h * ¸ñ Àû : ¸ó½ºÅÍ Å¬·¡½º * ÀÛ ¼º ÀÚ : ¹Ú°æÈñ * ÀÛ ¼º ÀÏ : 2006-09-20 * ÁÖÀÇ»çÇ× : ¸ó½ºÅÍ´Â Ç®¿¡¼­ ¸Þ¸ð¸®¸¦ ÇÒ´ç ¹Þ±â¶§¹®¿¡ °´Ã¼ »ý¼º¼Ò¸ê overrideÇÔ *===========================================================================*/ #pragma once #include "BaseObject.h" #include "actionmove.h" #include "ActionDie.h" #include "ActionAttack.h" #include "ActionEscape.h" #include "ActionFollow.h" #include "ActionIdle.h" #include "ActionPushPull.h" #include "Monster_Common.h" #include "RangeCheck.h" #include "Skill_Common.h" #include "TakeDamagePool.h" #include "SummonPatternPool.h" class cPathFinder; enum eOBJECTTYPE; class cModeAgent; class cMode; const unsigned long TARGET_CHECK_RANGE = 5000; /// Ÿ°Ù ¼±Á¤½Ã À¯È¿¹üÀ§ const unsigned long ESCAPE_HP50 = 50; /// µµ¸Á½Ã Á¶°Ç const unsigned long ESCAPE_HP30 = 30; const unsigned long SKILL_USE_HP40 = 40; /// ½ºÅ³ »ç¿ë Á¶°Ç const unsigned long SKILL_USE_HP80 = 80; const unsigned long TALK_DELAY = 1000; /// ´ë»ç°£ ÃÖ¼Ò °£°Ý const unsigned long SKILL_WAIT_TIME = 500; /// ½ºÅ³ Àç»ç¿ë ´ë±â ½Ã°£ const unsigned long MAX_DUMMY_DAMAGE = 5; /// ´õ¹Ì °ø°Ý ÃÖ´ë Çã¿ë Ƚ¼ö struct sMonsterTakeDamageInfo { unsigned long takeDamage; unsigned long distressPoint; }; class cMonster : public cBaseObject { public: /// »ý¼º¼Ò¸ê cMonster( void ); ~cMonster( void ); /// objectmanagerÀÇ ¸Þ¸ð¸®Ç®¿¡¼­ ¸ó½ºÅÍ °ø°£À» ÇÒ´ç¹ÞÀ½ void* operator new ( size_t n ); /// ¸Þ¸ð¸®Ç®¿¡¼­ ÇÒ´ç ¹ÞÀº ¸ó½ºÅ͸¦ Á¦°ÅÇØÁÜ void operator delete ( void* ptr, size_t n ); /// ÀϹÝÀûÀÎ »ý¼º bool Init( unsigned long uniqueidx, unsigned long classIdx, unsigned long regenIdx, unsigned short mapNumber, unsigned char modeNum ); void Release( bool parentLinkRelase = true ); /// ¸®Á¨ ½ºÅ©¸³Æ®·Î »ý¼ºµÈ ¸ó½ºÅͰ¡ ¾Æ´Ñ ¿ÜºÎ ¼ÒȯÀ¸·Î »ý¼ºµÈ ¸ó½ºÅÍ void SetSummonInfo( cMonster* pParent, unsigned short mapNumber, float regenX, float regenY, unsigned long regenMin, unsigned long regenMax, unsigned long destroyTime, bool isRand = true, bool isAutuDummy = false ); void SetDMTeamType( unsigned long teamType ) { mDMTeamType = teamType; } unsigned long GetDMTeamType() { return mDMTeamType; } void SendTeamRegen(); unsigned long GetfirstAttack() { return mFirstAttackCharacter; } void SetFirstAttack( unsigned long playerIdx ) { mFirstAttackCharacter = playerIdx; } void SetLastAttack( unsigned long playerIdx ) { mLastAttacker = playerIdx; } cBaseObject* GetTarget(); bool SetTarget ( unsigned char kind, unsigned long idx ); void OutsideDestroyTrue() { mOutsideDestroy = true; } bool IsCheatTempMonster() { return mOutsideAddMonster; } void Die(); void SendRegen(); NiPoint2 CalcMinMaxRandPos( float centerX, float centerY, unsigned long rangeMin, unsigned long rangeMax ); ///*--------------- ½ºÅ©¸³Æ® °ü·Ã ÂüÁ¶ µ¥ÀÌŸ ---------------*/ const sMonsterScript* GetMonsterInfo() { return mpMonsterInfo; } const sRegenScript* GetRegenMonsterInfo() { return mpRegenMonsterInfo; } const sMonsterPattern* GetMovePattern() { return mpMovePattern; } /*--------------- ±âº» Á¤º¸ ---------------*/ unsigned int GetRaceGender() { return mpMonsterInfo->mMonsterClassIdx; } unsigned long GetRegenGroupNum() { return mpRegenMonsterInfo->mGroupNumber; } float GetDirection() { return mDirection; } unsigned char GetLevel( ) { return mpMonsterInfo->mLevel; } /*--------------- ½ºÅ³ °ü·Ã ---------------*/ /// È¿°ú ¸ñ·Ï Ãß°¡ //bool AddInfluence( unsigned long /*uniqueIdx*/, unsigned long /*influenceClassIdx*/ ); bool AddInfluence( cInfluenceObject* pInf ); tHashSet* GetInfluenceSet() { return &mInfluenceSet; } void ReleaseInfluenceSet( bool logOut ); void DeleteInfluence( unsigned long influenceIdx ); bool IsParentEqual( unsigned long parentUniqueIdx ); // ¿ÀÅä´õ¹Ì¿ë ¸ó½ºÅÍ bool IsAutoDummy() { return (mAutoDummy==1); } /// ¹ÞÀº µ¥¹ÌÁö Á¤º¸ ±â·Ï /// ¸ó½ºÅÍ¿¡ ÇÇÇØ¸¦ ÁÖ´Â °´Ã¼¿¡ ´ëÇÑ Á¤º¸¸¦ µî·Ï void AddTakeDamage( sObject attacker, unsigned long damage, long distressPoint, eTAKEDAMAGE_TYPE type ); void DelTakeDamagePlayer( unsigned long playerIdx ); void ClearDistressPointPlayer( unsigned long playerIdx ); void ClearDistressPoint(); void ClearTakeDamage(); /// ¿ÀÅä´õ¹Ì °ø°Ý Á¤º¸ ÀúÀå void AttackDummy( sObject attacker ); /// ÇØ´ç Ç÷¹À̾ °¡Áö°í ÀÖ´Â ¾î±×·Î ¼öÄ¡¸¦ % ¸¸Å­ Áõ°¡½ÃŲ´Ù. void AddDistressPer( sObject attacker, long distressPointPer, eTAKEDAMAGE_TYPE type ); /// ÇØ´ç attaker¿Í targetÀÇ ¾î±×·Î Æ÷ÀÎÆ®¸¦ ±³Ã¼ÇÑ´Ù. void SwapDistressPoint( unsigned long attackerIdx, unsigned long targetIdx ); //void AddTakeDamage( unsigned long playerIdx, unsigned long takeDamage ); unsigned long GetTakeDamage( unsigned long playerIdx ); TakeDamageRoot* GetTakeDamageRoot() { return &mTakeDamageRoot; } /// ½ºÅ³ ¼±Á¤ eMONSTERATTACK_TYPE SelectSkill(); eMONSTERATTACK_TYPE SelectApplyTargetSkill( unsigned long monsClassIdx, eMONSTERATTACK_TYPE attackType ); /// ½ºÅ³ ÄðŸÀÓ °»½Å void UpdateSkillCoolTime( eMONSTERATTACK_TYPE attackType ); /// ½ºÅ³ ¹ßµ¿ÈÄ ´ë±â ½Ã°£ void CalcSkillWaitTime( unsigned long skillEndTime ); bool IsSkillWaitEnd(); /// AI¿¡ ÀÇÇØ °ø°Ý´ë»óÀÌ º¯°æµÇ¾î¾ß Çϴ°æ¿ì È£Ãâ void ChangeActionTarget(); /// Ÿ°Ù Á¦°Å ½ºÅ³¿¡ ÀÎÇÑ Å¸°Ù º¯°æ void ChangeTargetDeleteSkill(); /// ¸é¿ª È¿°ú ó¸® void ClearImmune() { mImmuneBuffSet.Clear(); mImmuneDebuffSet.Clear(); mImmuneKindSet.Clear(); } void AddImmuneApplyType( unsigned char InfluenceType, unsigned short applyType ); void AddImmuneKind( unsigned long infKind ); bool IsImmuneApplyType( unsigned char InfluenceType, unsigned long applyType ); bool IsImmuneApplyAll( unsigned long applyType ); bool IsImmuneKind( unsigned long infKind ); void SetSkillLastAttack( sObject attacker, unsigned char kind ) { mSkillLastAttack = attacker; mSkillLastKind = kind; } sObject GetSkillLastAttack() { return mSkillLastAttack; } unsigned char GetSkillLastKind() { return (unsigned char)mSkillLastKind; } unsigned long CalcChangeMPDamage( unsigned char attributeType, unsigned long damage, bool applyHP ); unsigned long CalcGuard( unsigned char attributeType, unsigned long damage ); /*--------------- ½ºÅ×ÀÌÅͽº °ü·Ã ---------------*/ sMonsterStatus* GetStatusPlus() { return &mStatusPlus; } sMonsterStatus* GetStatusPer() { return &mStatusPer; } unsigned long CalcPhysicAttack( unsigned long skillAttack ); unsigned long CalcPhysicRangeAttack( unsigned long skillAttack ); unsigned long CalcMagicAttack( unsigned long skillAttack ); unsigned long GetPhysicDefense(); unsigned long GetMagicDefense(); unsigned long GetPhysicAvoid(); unsigned long GetMagicAvoid(); unsigned long GetPhysicAttackRate(); unsigned long GetMagicAttackRate(); //unsigned long CalcPhysicCritical( unsigned long physicCritical ); //unsigned long CalcMagicCritical( unsigned long magicCritical ); float GetAttackSpeed(); float CalcStatusSkillRange( float skillRange, eRANGETYPE rangeType ); /// ÇöÀç ¸ó½ºÅÍÀÇ À̵¿¼Óµµ unsigned short GetMoveSpeed(); unsigned short SetMoveSpeed( unsigned long moveSpeed, eMOVE_SPEED_TYPE mMoveSpeedType ); void SendMoveSpeed(); /// ÃÖ´ë hp/mp unsigned long GetMaxHP(); unsigned long GetMaxMP() { return (unsigned long)( mpMonsterInfo->mMaxMp + ( mpMonsterInfo->mMaxMp * mStatusPer.mMaxMP ) + mStatusPlus.mMaxMP ); } /*--------------- ½ºÅ×ÀÌÅͽº °ü·Ã ±âŸ---------------*/ /// HP/MP Á¤º¸ unsigned long GetHP() { return mHP; } unsigned long GetMP() { return mMP; } /// HP/MP Áõ°¨ unsigned long HPDamage( sObject attacker, unsigned long damage, bool *die, bool msgSend, bool cri = false ); void HPUse( unsigned long useValue, bool msgSend ); void HPHeal( unsigned long hp, bool msgSend, sObject healer, long distressPoint, eTAKEDAMAGE_TYPE type ); void MPDamage( unsigned long damage, bool msgSend ); void MPUse( unsigned long useValue, bool msgSend ); void MPHeal( unsigned long heal, bool msgSend ); unsigned long GetOriHPMax() { return mpMonsterInfo->mMaxHp; } unsigned long GetOriMPMax() { return mpMonsterInfo->mMaxMp; } /// µ¥¹ÌÁö ó¸® bool AttackSuccess( sObject target, unsigned long attributeType, short accuracyValue, unsigned long instantSuccess, unsigned long instantSuccessPer ); bool CriticalSuccess( sObject target, unsigned long attributeType, unsigned short criticalValue, unsigned long instantCri, unsigned long instantCriPer ); unsigned long DamageCalc( sObject target, unsigned long skillIdx, unsigned long attributeType, unsigned long rangeType, unsigned long skillDamage, unsigned long skillDamagePer,bool isIgnoreDefence, float addTotalDamage, float addPerTotalDamage ); /// ´Ù¸¥ °è»ê°ú ´Ù¸£°Ô µµÆ®µ¥¹ÌÁö´Â °ø°ÝÀÚ°¡¾ø¾îµµ °è»êÀ» ÇØ¾ßµÇ±â¶§¹®¿¡ ±âÁذ´Ã¼°¡ Ÿ°Ù°´Ã¼´Ù!! unsigned long DotDamageCalc( unsigned char attackerType, unsigned char attackerLv, unsigned long attackMin, unsigned long attackMax, unsigned char dotType, unsigned long skillDamage, unsigned long skillDamagePer, unsigned long totalTime, unsigned long dotTime ); unsigned long HealCalc( sObject /*target*/, long /*skillHealPlus*/, long /*skillHealPer*/, bool /*applyHP*/ ) { assert(NULL); return 0; } unsigned long DotHealCalc( sObject /*target*/, long /*infHealPlus*/, long /*infHealPer*/, unsigned long /*heal*/, unsigned long /*dotTotalTime*/, unsigned long /*dotTime*/ ) { assert(NULL); return 0; } unsigned long ConditionOdd( sObject target, long influenceRate, unsigned long skillClassIdx ); void StatusCalc(); /*--------------- »óÅ °ü·Ã ---------------*/ /// ¾×¼Ç ¼öÇà - ¾×¼Ç ÁøÇà/ÁßÁö »óŰª ¸®ÅÏ eACTION_CHANGE Update( unsigned long elapsedTime, unsigned long accumTime ); void UpdateMode( unsigned long elapsedTime, unsigned long accumTime ); bool DeathUpdate(); void ActionChange( eACTION_ID state ); eACTION_ID GetActionID() { return mpAction->GetActionID(); } void SetGroupRegen( bool groupRegen ) { mGroupRegen = groupRegen; } bool IsGroupRegen() { return mGroupRegen; }; /// ÃßÀû½Ã °ø°Ý¹üÀ§¿¡ µé¾î¿Â°æ¿ì °ø°ÝÇüÅ void SetAttackType( eMONSTERATTACK_TYPE attackType ) { mAttackType = attackType; } eMONSTERATTACK_TYPE GetAttackType() { return mAttackType; } void SetLastUsedSkillIdx( unsigned long lastUsedSkillIdx ) { mLastUsedSkillIdx = (eMONSTERATTACK_TYPE)lastUsedSkillIdx; } void SkillEscape( unsigned long type ); void SetEscape(); void Comeback(); void ReservationComeback(); void CheckComback(); /// ¸ó½ºÅÍ »ýÁ¸ À¯¹« bool GetStateDie(); /// ¿ÜºÎ ¸ó½ºÅÍ »èÁ¦ ¼³Á¤ void OutsideDestroy(); /// ´ë±â »óÅ Á¾·á½Ã°£ unsigned long GetIdleEndTime() { return mIdleEndTime; } void SetIdleEndTime( unsigned long endTime ) { mIdleEndTime = endTime; } bool GetDeathMonster() { return mDeathMonster; } /*--------------- »óÅ ÀÌ»ó ---------------*/ void SetStateOddity( long* pOddity ); unsigned long GetStateOddity( eODDITYTYPE oddityType ) { return mODDITY[oddityType]; } bool IsCantSkill( unsigned long attributeType ); bool IsCantSkill( unsigned long attributeType, eMONSTERATTACK_TYPE attackType ); bool IsCantMove() { return mODDITY[eODDITYTYPE_CANTMOVE] != 0 || mODDITY[eODDITYTYPE_SLEEP] != 0 || mODDITY[eODDITYTYPE_STUN] != 0; } void TargetChange( sObject attacker, long distressPoint ); void SetSkillPushPull( unsigned short type, cBaseObject* pAttacker, unsigned long range ); bool IsSkillPushPull() { return GetActionID() == eACT_PUSHPULL; } bool IsPushPullPossible( NiPoint2 startPos, NiPoint2 goalPos ); /*--------------- À̵¿ °ü·Ã ---------------*/ /// À̵¿ ÇÁ·Î¼¼½º bool MoveUpdate( unsigned long deltaTime ); bool PushPullUpdate( unsigned long deltaTime ); /// ´ÙÀ½ À̵¿ °æ·Î ÃÖÁ¾À§Ä¡ ¼±Á¤ bool SelectNextPath( float* pPosX, float* pPosY ); void GetNextPattern( long* pPatternPos, char* pPatternDir ); /// À̵¿ °æ·Î ¼ÂÆÃ unsigned int SetPath( float targetX, float targetY ); unsigned int SetPath( float targetX, float targetY, float range , sObject target ); /// À̵¿ÁÂÇ¥ ÃÖÁ¾ ¸ñÀûÁö±î±â °¡±âÀü Á¤ÁöÀÇ ¹üÀ§ float GetMoveStopRange() { return mMoveStopRange; } void SetMoveStopRange( float moveStopRange ) { mMoveStopRange = moveStopRange; } /// ¸ó½ºÅͰ¡ ½ÇÁ¦ ¸®Á¨µÈ ÁÂÇ¥ const NiPoint2& GetRegenPos() const { return mRegenPos; } /// ÃßÀû ½ÃÀ۽à ±âÁØ Á¤º¸ NiPoint2 GetFollowStartPos() { return mFollowStartPos; } void SetFollowEndTime( unsigned long followEndTime ) { mFollowEndTime = followEndTime; } unsigned long GetFollowEndTime() { return mFollowEndTime; } /// ÃßÀûÇÏ´Ù°¡ ¿ø·¡ À̵¿ ±¸¿ªÀ¸·Î À̵¿Áß bool GetFollowEndMove() { return mFollowEndMove; } void SetFollowEndMove( bool followEndMove ) { mFollowEndMove = followEndMove; } /// À̵¿ Á¤Áö void MoveStop( bool sendMsg ); /// ¹æÇâ ¼³Á¤ void CalcDirection( NiPoint2 targetPos ); /// óÀ½ À̵¿ bool IsFirstMove() { return mIsFirstMove; } bool FirstMoveEnd() { return mIsFirstMove = false; } unsigned char GetPlayerFollowPos() { return mPlayerFollowPos; } void SetPlayerFollowPos( unsigned char playerFollowPos ) { mPlayerFollowPos = playerFollowPos; } /// ±æÃ£±â bool FindPath( const NiPoint2& goal ); void SetPathFinder( cPathFinder* pathFinder ); cPathFinder* GetPathFinder() { return mPathFinder; } unsigned int GetPathCount() const; const NiPoint2* GetPathArray() const; /// ¿ÀºêÁ§Æ®ÀÇ °Å¸® üũ ¼öÁ¤ °Å¸® - Àû¿ë ¹üÀ§ float GetFixedObjectSize() { return mFixedObjectSize; } void SetFixedObjectSizePer( short sizePer ); unsigned short GetFixedObjectSizePer() { return mFixedObjectSizePer; } void SendMonsterSize(); unsigned char GetFollowImportance() { return mFollowImportance; } /// ÆÐÅÏ À̵¿ ÈÄ ´ë±â½Ã°£ unsigned long GetPatternWait() { return mPatternWait; } void ClearPatternWait() { mPatternWait = 0; } void SetGroupMoveReady( unsigned char moveReady ) { mGroupMoveReady = moveReady; } unsigned char GetGroupMoveReady() { return mGroupMoveReady; } /*--------------- ´ë»ç °ü·Ã ---------------*/ /// ´ë»ç ¼±Åà ¹ß¼Û void SendSpeech( unsigned long talkState ); void SpeechProcess(); bool IsCriDie() { return mCriDie; } /*--------------- º¸½º(¿¤¸®Æ®) °ü·Ã ---------------*/ /// ¼ÒȯµÈ ¸ó½ºÅÍ Ãß°¡ void AddSummonMonster( unsigned long monsterIdx ); void DieSummonMonster( unsigned long monsterIdx, NiPoint2 diePos ); void ModeSkillEnd(); eMONSTERATTACK_TYPE GetModeSkill(); void TargetFixed( unsigned long playerIdx, unsigned long influenceIdx ); void TargetFixedEnd(); void LinkObstruction(); void DeathGenMonster(); void LinkTeleportPortal(); public: bool SendSightIn ( char category, char protocol, unsigned long connectionIdx ); bool SendSightOut ( char category, char protocol, unsigned long connectionIdx ); bool SendMonsterMove ( unsigned long connectionIdx ); /// ¸ó½ºÅÍ ÁÖº¯ ±×¸®µå¿¡ ÇØ´ç Ç÷¹À̾ Á¸ÀçÇÏ´ÂÁö °Ë»ç cPlayer* NearGridFindPlayer( unsigned long playerIdx, bool diePass ); /// º¯¼ö ¼ÂÆÃ void SetCombatFlag( bool set ); inline bool IsCombat() { return mIsCombat; } long CalcSkillRate( cBaseObject* pTarget, eMONSTERATTACK_TYPE attackType, long scriptRate ); bool IsModeState() { return (mCurrentMode != 0); } tPointerArray* GetBuffImmune(); bool IsFollowContinue(); // ij¸¯ÅͰ¡ °¡Áö°í ÀÖ´Â buff/debuff ¸ñ·Ï üũ bool IsHaveApplyBuffType( unsigned short applyValueType ); bool IsHaveApplyDeBuffType( unsigned short applyValueType ); private: /// ¾×¼Ç »óÅ º¯°æ void SetAction( cAction& pNewAtion ); /// ÃʱâÈ­ bool MonsterInit( unsigned long monsterClassIdx ); /// ÀüÅõ ½ÃÀÛ/Á¾·á½ÃÁ¡ void CombatStart(); void CombatEnd(); /// ¸ðµå º¯È¯ void ChangeCurrentMode( long modeIdx ); bool ConditionValueCheck( unsigned char type, unsigned long value ); void ProcessTakeDamage( unsigned long elapsedTime, unsigned long accumTime ); private: typedef tPointerArray cPArray; typedef tArray cArray; typedef tArray cLongAry; typedef tHashSet cHashSet; typedef tHashMap cHashMap; typedef tPointerHashMap cPHashMap; /// ¹üÀ§ °Ë»ç cRangeCheck mRangeCheck; /// ¼±°ø Ç÷¹À̾î unsigned long mFirstAttackCharacter; unsigned long mFirstAttackParty; /// ¸¶Áö¸· °ø°Ý Ç÷¹À̾î unsigned long mLastAttacker; /// ¿ÀºêÁ§Æ®ÀÇ °Å¸® üũ ¼öÁ¤ °Å¸® - Àû¿ë ¹üÀ§ float mFixedObjectSize; unsigned short mFixedObjectSizePer; /// Á¤»ó Á×À½ÀÌ ¾Æ´Ñ ¿ÜºÎ»èÁ¦ ¸í·ÉÀ¸·Î ÀÎÇÑÁ¦°Å(°æÇèÄ¡ °ü·Ã µå·Ó¾ÈÇÔ) bool mOutsideDestroy; /// ¸®Á¨ ½ºÅ©¸³Æ®°¡ ¾Æ´Ñ ¿ÜºÎ È£Ãâ·Î »ý¼ºµÈ ¸ó½ºÅÍ bool mOutsideAddMonster; /// ÀüÀå ÆÀŸÀÔ unsigned long mDMTeamType; ///*--------------- ½ºÅ©¸³Æ® °ü·Ã ÂüÁ¶ µ¥ÀÌŸ ---------------*/ sMonsterScript* mpMonsterInfo; /// ½ºÅ©¸³Æ®¿¡¼­ ÂüÁ¶ÇÑ ¸ó½ºÅÍ ±âº»Á¤º¸ sRegenScript* mpRegenMonsterInfo; /// ¸ó½ºÅÍ ¸®Á¨Á¤º¸ sMonsterPattern* mpMovePattern; unsigned char mFollowImportance; /*--------------- ½ºÅ³ °ü·Ã ---------------*/ /// º¸À¯ È¿°ú ¼Â typedef tHashSet cSkillInfluenceSet; cSkillInfluenceSet mInfluenceSet; /// ¹ÞÀº µ¥¹ÌÁö TakeDamageRoot mTakeDamageRoot; /// ´ÙÀ½ Ÿ°Ù º¯°æ ½Ã°£ unsigned long mNextTargetChangeTime; /// ÄðŸÀÓ typedef tHashMap cCoolTime; cCoolTime mSkillCoolTimeMap; cCoolTime mEliteCoolTimeMap; /// ½ºÅ³ °ø°Ý ŸÀÔ eMONSTERATTACK_TYPE mAttackType; /// ½ºÅ³ Àç»ç¿ë °¡´É ½Ã°£ unsigned long mSkillWaitEndTime; /// ¸¶Áö¸·À¸·Î »ç¿ëÇÑ ½ºÅ³Á¾·ù eMONSTERATTACK_TYPE mLastUsedSkillIdx; /// ½ºÅ³ ¼±Á¤½Ã °¡´ÉÇÑ ½ºÅ³µé ¸ñ·ÏÀ» ´ã¾ÆµÑ Àӽà °ø°£ cHashMap mTempSelectSkill; typedef tHashSet cHashSet; cHashSet mImmuneKindSet; /// ¸é¿ª È¿°úÁ¾·ù ¸ñ·Ï cHashSet mImmuneBuffSet; /// ¸é¿ª Àû¿ëÈ¿°ú°ª ¸ñ·Ï cHashSet mImmuneDebuffSet; /// ¸é¿ª Àû¿ëÈ¿°ú°ª ¸ñ·Ï sObject mSkillLastAttack; unsigned char mSkillLastKind; /// eDAMAGE_KIND /// cLongAry mGuardAry; /// cLongAry mChangeMPDamageAry; /// cLongAry mDeleteTypeDamagedAry; /*--------------- ½ºÅ×ÀÌÅͽº °ü·Ã ---------------*/ unsigned long mHP; unsigned long mMP; /// ¸ó½ºÅÍ ½ºÅÝ ±âº»°ª sMonsterStatus mStatusBase; /// ¸ó½ºÅÍ ½ºÅÝ È®Àå°ª sMonsterStatus mStatusPlus; sMonsterStatus mStatusPer; float mMoveSpeed; /*--------------- »óÅ °ü·Ã ---------------*/ cAction* mpAction; /// ¼öÇàÁßÀÎ ¾×¼ÇÀÇ Æ÷ÀÎÅÍ bool mGroupRegen; /// ±×·ì ´ÜÀ§ ¸®Á¨ ¼³Á¤ /// ÃßÀû½Ã °ø°Ý¹üÀ§¿¡ µé¾î¿Â°æ¿ì °ø°ÝÇüÅ eMONSTERATTACK_TYPE attackType; /// ¸ó½ºÅÍ¿¡¼­ »ç¿ëÇÒ Çൿ cActionMove mActionMove; cActionDie mActionDie; cActionAttack mActionAttack; cActionEscape mActionEscape; cActionFollow mActionFollow; cActionIdle mActionIdle; cActionPushPull mActionPushPull; unsigned long mDestroyTime; unsigned long mIdleEndTime; bool mReservationComeback; /*--------------- »óÅ ÀÌ»ó ---------------*/ long mODDITY[eODDITYTYPE_MAX]; unsigned long mTFixedPlayerIdx; /// Ÿ°Ù °íÁ¤ playeridx unsigned long mTFixedInfIdx; /// Ÿ°Ù °íÁ¤ È¿°ú ¹øÈ£ /*--------------- À̵¿ °ü·Ã ---------------*/ NiPoint2 mLastPos; /// À̵¿ ÆÐ½º ÃÖÁ¾ ¸ñÀûÁö NiPoint2 mNextPos; /// À̵¿ ÆÐ½º ´ÙÀ½ ³ëµå À§Ä¡ float mMoveStopRange; /// ¸ñÀûÁö Àü Á¤Áö ¹üÀ§ NiPoint2 mRegenPos; /// ¸ó½ºÅͰ¡ ½ÇÁ¦ ¸®Á¨µÈ ÁÂÇ¥ NiPoint2 mFollowStartPos; /// ÃßÀû ½ÃÀÛ À§Ä¡ unsigned long mFollowEndTime; /// ÃßÀû Á¾·á ½Ã°£ bool mFollowEndMove; /// ÃßÀûÇÏ´Ù°¡ ¿ø·¡ À̵¿ ±¸¿ªÀ¸·Î À̵¿Áß float mMoveOverTime; /// °æ·Î ¸ñÀûÁö±îÁö À̵¿Áß ÇÁ·Î¼¼½º °£°Ý¿¡ÀÇÇØ ³Ñ¾î°£ ½Ã°£ eMOVE_SPEED_TYPE mMoveSpeedType; /// À̵¿ ¹æ¹ý bool mIsFirstMove; /// óÀ½ À̵¿ ÀÎÁö ¼³Á¤ unsigned char mPlayerFollowPos; float mDirection; /// ¹æÇâ°ª long mPatternPos; /// ÆÐÅÏ ¸ñÀûÁö char mPatternDir; /// ÆÐÅÏ À̵¿ ¹æÇâ( 1:Á¤¹æÇâ, -1:¿ª¹æÇâ) unsigned long mPatternWait; /// ÆÐÅÏ À̵¿ÈÄ ´ë±â½Ã°£ char mGroupMoveReady; /// 0:À̵¿Áß, 1:À̵¿³¡³ª°í´ë±â½Ã°£, 2:´ë±â½Ã°£³¡À̵¿°¡´É /// Ŭ¶óÀÌ¾ðÆ®¿¡ ¼­¹öÀ§Ä¡¸¦ Ç¥½ÃÇØÁÖ´Â Å×½ºÆ®ÄÚµåÀÇ ¸Þ¼¼Áö¹ß¼Û ´ÙÀ½½Ã°£ unsigned long mServerPosTime; /// ±æÃ£±â cPathFinder* mPathFinder; NiPoint2 mPathArray[MAX_PATH_COUNT]; unsigned int mPathCount; unsigned int mPathIndex; /*--------------- ´ë»ç °ü·Ã ---------------*/ unsigned long mTalkDealyEndTime; unsigned char mTalkState; unsigned long mTalkProcessCheckTime; bool mCriDie; // ¿ÀÅä´õ¹Ì ¿©ºÎ (0:¾Æ´Ô,1:¿ÀÅä´õ¹Ì) char mAutoDummy; /*--------------- ¸ó½ºÅÍ ¸ðµå °ü·Ã ---------------*/ bool mIsCombat; eMONSTERATTACK_TYPE mModeSkillIdx; eMONSTERATTACK_TYPE mModeInitSkillIdx; unsigned long mTotalTime; unsigned long mModeTime; cModeAgent* mModeAgent; cMode* mCurrentMode; /// ºÎ¸ð ¸ó½ºÅͰ¡ ÀÖ´Â °æ¿ì ó¸® bool mIsParentLink; unsigned long mParentMonsterIdx; /// ¸ðµåº° ¼ÒȯµÈ ¸ó½ºÅÍ ¸ñ·Ï /// tHashMap*> cPHashMap mSummonListMap; bool mDeathMonster; /// ¼ÒȯÇÑ Ã¤Áý¹° ¸ñ·Ï cLongAry mSummonGatherAry; /// GenMonster cooltime /// typedef tHashMap cGenMonCoolTimeMap; cHashMap mGenMonCoolTimeMap; /// GenTotem CoolTime /// typedef tHashMap cGenTotemCoolTimeMap; cHashMap mGenTotemCoolTimeMap; /// GenGathering CoolTime /// typedef tHashMap cGenGatheringCoolTimeMap; cHashMap mGenGatheringCoolTimeMap; // ¿ÀÅä´õ¹Ì °ø°ÝÇÑ À¯ÀúÁ¤º¸ cHashMap mAutoAttackerMap; /// PatternGen /// //cPArray mSummonPatternInfoAry; sSummonPatternRoot mSummonPatternRoot; /// ½ºÅ³ »ç¿ëÁ¶°Ç üũ¸¦ À§ÇÑ º¸À¯ÁßÀÎ ¹öÇÁ/µð¹öÇÁ ¸Ê. Ű °ªÀº ApplyValueType(È¿°ú Àû¿ë ŸÀÔ) ÀÌ´Ù. //typedef tHashSet cHashSet; typedef tHashMap cApplyValueTypeMap; cApplyValueTypeMap mBuffmap; cApplyValueTypeMap mDeBuffmap; }; inline void cMonster::SetPathFinder( cPathFinder* pathFinder ) { mPathFinder = pathFinder; } inline unsigned int cMonster::GetPathCount() const { int c = mPathCount - mPathIndex; if( c >= 0 ) { return c; } else { assert( 0 ); return 0; } } inline const NiPoint2* cMonster::GetPathArray() const { if( mPathIndex < mPathCount ) { return &mPathArray[mPathIndex]; } else { assert( 0 ); return &mPathArray[0]; } }