/* ========================================================================== * ÆÄ ÀÏ : SkillObject.h * ¸ñ Àû : * ÀÛ ¼º ÀÚ : ¹Ú°æÈñ * ÀÛ ¼º ÀÏ : 2007-06-07 * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once #include "Skill_Common.h" #include "RangeCheck.h" #include "SkillTargetPool.h" enum eSkillCode { NONUSESKILL, ACTIVESKILL, PASSIVESKILL, }; enum eSKILLPROCESS { eSKILLPROCESS_CASTING, /// ij½ºÆÃ eSKILLPROCESS_ACTIVITY, /// ¹ßµ¿ eSKILLPROCESS_PROJECTILE, /// ¹ß»çü eSKILLPROCESS_DAMAGE, /// µ¥¹ÌÁö eSKILLPROCESS_HP, /// HP eSKILLPROCESS_DESTRUCTION, /// ¼Ò¸ê }; enum eSKILLCREATE_TYPE { eSKILLCREATETYPE_NORMAL, /// ÀÏ¹Ý ½ºÅ³ eSKILLCREATETYPE_MAPCHANGE, /// ¸ÊÀ̵¿ ½ºÅ³ eSKILLCREATETYPE_VEHICLE, /// Å»°Í »ý¼º ½ºÅ³ eSKILLCREATETYPE_BLINK, /// ¼ø°£À̵¿ eSKILLCREATETYPE_DELTARGET, /// Ÿ°Ù ÇØÁ¦ ½ºÅ³ eSKILLCREATETYPE_CASHMAPCHANGE, /// ij½Ã ¸ÊÀ̵¿ ½ºÅ³ eSKILLCREATETYPE_CLEAR_COOLTIME, /// ÄðŸÀÓ Å¬¸®¾î }; class cBaseObject; struct sDramaAction; class sDramaState; enum eOBJECTTYPE; class cBaseSkillObject { public: cBaseSkillObject(); virtual ~cBaseSkillObject(); unsigned long GetAttackerIdx() { return mAttacker.index; } unsigned char GetAttackerType() { return mAttacker.type; } eSKILLPROCESS GetSkillState() { return mSkillState; } unsigned long GetUniqueIdx() { return mUniqueIdx; } bool IsProjectile() { return mIsProjectile; } bool IsDetailEnd() { return mDetailCnt <= mDetailPos + 1; } unsigned long SkillEndTime(); bool IsChgMonsSkill() { return mIsChgMonsSkill; } eATTRIBUTETYPE GetAttributeType() { return mAttributeType; } unsigned long GetSkillIdx() { return mSkillIdx; } void AddSendTarget( unsigned long playerIdx ); sSkillTargetRoot* GetTargetRoot() { return &mTargetRoot; } void Process( unsigned long elapsedTime, unsigned long accumTime ); bool IsChanneling() { return mIsChanneling; } protected: /// ij½ºÆÃ½Ã °ø°ÝÀÚ / Ÿ°Ù °´Ã¼ üũ virtual bool CastingObjectCheck( cBaseObject* pAttacker ) = 0; /// ½ºÅ³ ¹ßµ¿½Ã ¼Ò¸ðÇ׸ñ ¼Ò¸ð virtual bool RequireValue( cBaseObject* pAttacker ) = 0; /// ¹ß»çü ¸ñÀûÁö ¼³Á¤ virtual bool SetCenterPos() = 0; /// ¹ß»çü À̵¿ bool IsProjectileEndProcess( unsigned long elapsedTime ); /// Ÿ°Ù ¼±Åà virtual void TargetSelect( cBaseObject* pAttacker ) = 0; /// µ¥¹ÌÁö Àû¿ë virtual void ApplyDamage( cBaseObject* pAttacker ) = 0; /// ½ºÅ³Å¸ÀÔº° ó¸® void SendDamage( cBaseObject* pAttacker, unsigned long shotType, eATTRIBUTETYPE attribType, eRANGETYPE rangeType, unsigned short applyType1, unsigned short applyType2, unsigned long applyValue1, unsigned long applyValue2, unsigned long influenceClassIdx, short accuracyValue, unsigned short criticalValue, bool applyHP ); void SendHeal( cBaseObject* pAttacker, unsigned long shotType, unsigned short applyType1, unsigned short applyType2, unsigned long applyValue1, unsigned long applyValue2, unsigned long influenceClassIdx ); void SendApply( cBaseObject* pAttacker, unsigned long shotType, eATTRIBUTETYPE attribType, short accuracyValue, unsigned short applyType1, unsigned short applyType2, unsigned long applyValue1, unsigned long applyValue2, unsigned long influenceClassIdx ); void SendDelTarget( cBaseObject* pAttacker, short accuracyValue ); void ApplyBlink( cBaseObject* pAttacker ); void AddTotem( cBaseObject* pAttacker, unsigned long partyIdx, unsigned long partyUnionIdx, eAPPLYTYPE applyType, eATTRIBUTETYPE attributeType, unsigned long influenceClassIdx, unsigned char applyCnt ); void AddPortal( cBaseObject* pAttacker, unsigned long mapChangePosIdx ); void AttackerNullDamage(); /// HP Àû¿ë ( true : Àû¿ëÇ׸ñ ³²À½, false : Àû¿ëÇ׸ñ ¾øÀ½ ) virtual bool ApplyHP( cBaseObject* pAttacker ); void SelectPlayerTarget( cBaseObject* pAttacker, NiPoint3 centerPos, float rangeX, float rangeY, unsigned char* pTargetCnt, unsigned long maxCnt, bool applyHP, bool enemy, eBOUNDTYPE boundType ); void SelectMonsterTarget( cBaseObject* pAttacker, NiPoint3 centerPos, float rangeX, float rangeY, unsigned char* pTargetCnt, unsigned long maxCnt, bool applyHP, eBOUNDTYPE boundType ); protected: typedef tHashSet cHashSet; typedef tArray cObjectAry; typedef tArray cLongAry; /// °íÀ¯ À妽º unsigned long mUniqueIdx; /// ½ºÅ³ »óÅ eSKILLPROCESS mSkillState; /// °ø°ÝÀÚ(»ç¿ëÀÚ)ÀÇ Á¤º¸ sObject mAttacker; /// Ÿ°Ù ±âÁØ ½ºÅ³ ±âÁØ ¿ÀºêÁ§Æ® sObject mCenterTarget; /// Àû¿ë½ÃÁ¡(=µ¥¹ÌÁö) ±âÁØÀ§Ä¡ NiPoint3 mCenterPos; /// ¸Ê³Ñ¹ö unsigned long mMapNumber; /// ½ºÅ³ »ý¼º ½ÃÁ¡(Àý´ë ½Ã°£) unsigned long mCreationTime; /// ¹ßµ¿ ½Ã°£ unsigned long mActivityTime; /// ij½ºÆÃ ½Ã°£ unsigned long mCastingTime; /// ¹ß»çü À¯¹« bool mIsProjectile; /// ¹ß»çü ¼Óµµ float mProjectileSpeed; /// ¹ß»çü È¿°úÀ§Ä¡ NiPoint2 mProjectilePos; /// ºÐÇÒ Àû¿ë µ¥¹ÌÁö Á¤º¸¸¦ Àоî¿Ã ¿¬ÃâÁ¤º¸ Æ÷ÀÎÆ® unsigned long mDetailCnt; sDramaAction* mpDetailBegin; sDramaAction* mpDetailEnd; unsigned long mDetailPos; unsigned long mDetailStartTime; unsigned long mDetailEndTime; /// ÀϹݰø°Ý ¼Óµµ º¯°æ(±âÁØ:1.0) float mSpeedFactor; unsigned long mDramaKey; ///½ºÅ©¸³Æ® »óÀÇ ½ºÅ³À妽º unsigned int mSkillIdx; cHashSet mSendAttackerSet; cHashSet mSendTargetSet; cHashSet mSendAroundSet; unsigned char mAttackerDie; /// 0 : Á×Áö¾ÊÀ½, 1 : Á×À½(°´Ã¼¸¸Áö¿ò), 2 : Á×À½(µ¥¹ÌÁömiss) /// ¹ß»çü°¡ ÃßÀûÇÏ´ø Ÿ°ÙÀÌ »ç¶óÁ® µ¥¹ÌÁö ¹Ì½ºÃ³¸® bool mNoTargetNoDamage; /// Ç÷¹À̾ ¸ó½ºÅÍ·Î º¯½ÅÈÄ »ç¿ëÇÑ ½ºÅ³ÀÎÁö ±â·Ï bool mIsChgMonsSkill; /// ¹üÀ§ ¹æ½Ä eBOUNDTYPE boundType; /// Àû¿ë Ÿ°Ù eAPPLYTYPE applyType; /// Àû¿ë °Å¸® float range; /// ¹°¸®/¸¶¹ý ¼Ó¼º eATTRIBUTETYPE mAttributeType; eSKILLCREATE_TYPE mCreateType; unsigned long mUseItemIdx; long mDistressPoint; /// Ÿ°ÙÀ» ÇØÁ¦ÇÏ´Â ½ºÅ³ bool mDelTarget; /// Ÿ°Ù ¸ñ·Ï sSkillTargetRoot mTargetRoot; /// Ÿ°Ù ¼±Á¤½Ã ±×¸®µå¿¡¼­ ¹Þ¾Æ¿Ã °´Ã¼ °íÀ¯¹øÈ£ cLongAry mObjectIdxAry; unsigned short mPushPull; unsigned long mPushRange; unsigned short mCashMapNum; float mCashX; float mCashY; cRangeCheck mRangeCheck; bool mIsChanneling; sDramaState* mpChannelDramaState; unsigned long mChannelingTime; };