/* ========================================================================== * ÆÄ ÀÏ : SkillManager.h * ¸ñ Àû : * ÀÛ ¼º ÀÚ : ¹Ú°æÈñ * ÀÛ ¼º ÀÏ : 2007-07-06 * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once #include "HashMap.h" #include "PointerHashMap.h" #include "Pool.h" #include "../Common/BaseObject_Common.h" #include "PlayerSkillObject.h" #include "MonsterSkillObject.h" #include "PlayerMonSkillObject.h" #include "InfluenceObject.h" #include "HaveSkillObject.h" #include "DramaturgyManager.h" #include "IndexGenerator.h" #include "SQLGameStmt.h" #include "RangeCheck.h" class cBaseObject; class cSkillScript; class cCommunityScript; class cMakeSkillScript; class cPlayer; class cInfluenceObject; enum eObject; enum eAURATYPE; const long DB_SAVE_COOLTIME = 5000; struct sDelSkillInfo { sObject skillUser; unsigned long mSkillIdx; }; class cSkillManager { public: static cSkillManager* mpSkillManager; public: cSkillManager(); ~cSkillManager(); bool Init(); void Release(); void Process( unsigned long elapsedTime, unsigned long accumTime ); /*------------------ Ç®¿¡¼­ °¡Á®¿À°í ¹Ý³³Çϱâ ------------------ */ /// »ç¿ëÁßÀÎ ½ºÅ³ cPlayerSkillObject* AllocPlayerSkillObject() { return mPlayerSkillObjectPool.Alloc(); } void FreePlayerSkillObject(cPlayerSkillObject* ptr) { mPlayerSkillObjectPool.Free(ptr); } cMonsterSkillObject* AllocMonsterSkillObject() { return mMonsterSkillObjectPool.Alloc(); } void FreeMonsterSkillObject(cMonsterSkillObject* ptr) { mMonsterSkillObjectPool.Free(ptr); } cPlayerMonSkillObject* AllocPlayerMonSkillObject() { return mPlayerMonSkillObjectPool.Alloc(); } void FreePlayerMonSkillObject(cPlayerMonSkillObject* ptr) { mPlayerMonSkillObjectPool.Free(ptr); } /// º¸À¯ È¿°ú cInfluenceObject* AllocInfluenceObject() { return mInfluenceObjectPool.Alloc(); } void FreeInfluenceObject(cInfluenceObject* ptr) { mInfluenceObjectPool.Free(ptr); } /// º¸À¯ ½ºÅ³ cHaveSkillObject* AllocHaveSkillObject() { return mPlayerHaveSkillPool.Alloc(); } void FreeHaveSkillObject(cHaveSkillObject* ptr) { mPlayerHaveSkillPool.Free(ptr); } /*--------------- º¸À¯ ½ºÅ³ ó¸® ---------------*/ /// DB ÀÔÃâ·Â bool SaveSkillCoolTime( unsigned long playerIdx, SKILL_COOLTIME* skillCoolTime ); bool RestorePlayerSkill( SKILL_SELECT* skillSelect ); bool AddTutorialHaveSkill( cPlayer* pPlayer ); /// º¸À¯½ºÅ³ µî·ÏÀü °Ë»ç Ç׸ñ ¸®ÅÏ bool NeedAddPlayerHaveSkill( unsigned long skillIdx, unsigned char skillStep, /*unsigned long *money,*/ unsigned short *sp ); /// dbÀÔÃâ·Â ½ÇÆÐ½Ã ½ºÅ³ ´Ü°è°¨¼Ò void RollBackPlayerHaveSkill( unsigned long playerIdx, unsigned long skillIdx ); /// º¸À¯ ½ºÅ³ Ãß°¡ unsigned char AddPlayerHaveSkill( unsigned long playerIdx, unsigned long skillIdx, unsigned char skillStep, unsigned long cooltime ); cHaveSkillObject* GetPlayerHaveSkill( unsigned long playerIdx, unsigned long skillIdx ); void* GetPlayerHaveSkill( unsigned long playerIdx ); /// º¸À¯ ½ºÅ³ Á¦°Å void ReleasePlayerHaveSkill( unsigned long playerIdx ); /// º¸À¯ ½ºÅ³ ġƮ·Î Ãß°¡ unsigned char AddPlayerHaveSkillByCheat( unsigned long playerIdx, unsigned long skillIdx, unsigned char skillStep, unsigned long cooltime ); /// ½ºÅ³ »ç¿ë½Ã °ü·Ã ½ºÅ³µé ÄðŸÀÓ ¾÷µ¥ÀÌÆ® void UpdateSkillCoolTime( sObject attacker, unsigned long skillIdx, unsigned char skillStep, unsigned long accumTime, float speedFactor ); void AddSkillReset( unsigned long playerIdx, unsigned long skillIdx, unsigned char skillStep ); void ClearPlayerHaveSkillCoolTime( unsigned long playerIdx, unsigned long exceptSkillIdx ); /*--------------- ½ºÅ³(+ÀϹÝ) °ø°Ý ó¸® ---------------*/ /// ÀÏ¹Ý °ø°Ý void PlayerNormalAttackRequest( unsigned long characterIdx, MSG_REQ_SKILL_USED* pMsg ); /// ¿ÀºêÁ§Æ®°¡ Ÿ°ÙÀÎ ½ºÅ³ void PlayerObjectSkillRequest( unsigned long characterIdx, MSG_REQ_SKILL_USED* pMsg, bool casting ); /// ÁÂÇ¥°¡ Ÿ°ÙÀÎ ½ºÅ³ void PlayerPositionSkillRequest( unsigned long characterIdx, MSG_REQ_POS_USED* pMsg, bool casting ); /// ¸ó½ºÅÍ º¯½Å ½ºÅ³ void PlayerMonSkillRequest( unsigned long characterIdx, MSG_REQ_SKILL_USED* pMsg, bool casting ); /// ¸ó½ºÅÍ º¯½Å ÁÂÇ¥ ½ºÅ³ void PlayerMonPosSkillRequest( unsigned long characterIdx, MSG_REQ_POS_USED* pMsg, bool casting ); /// ¸ÊÀ̵¿ ½ºÅ³ void MapChangeSkillRequest( unsigned long characterIdx, MSG_REQ_SKILL_ITEMMAPCHANGE* pMsg ); /// Å»°Í ½ºÅ³ void VehiCleSkillRequest( unsigned long characterIdx, MSG_REQ_SKILL_VEHICLE* pMsg ); /// ij½Ã ¸ÊÀ̵¿ ½ºÅ³ void CashMapChangeSkillRequest( unsigned long characterIdx, MSG_REQ_SKILL_CASHMAPCHANGE* pMsg ); /// ¼ø°£À̵¿ ½ºÅ³ void BlinkSkillRequest( unsigned long characterIdx, MSG_REQ_SKILL_BLINK* pMsg ); /// Á¤Áö ÇÏÁö ¾Ê´Â ½ºÅ³ void PlayerNonStopSkillRequest( unsigned long characterIdx, MSG_REQ_SKILL_USED* pMsg ); void PlayerMonNonStopSkillRequest( unsigned long characterIdx, MSG_REQ_SKILL_USED* pMsg ); /// µ¹Áø void PlayerRushSkillRequest( unsigned long characterIdx, MSG_REQ_SKILL_USED* pMsg, bool blink ); /// µ¹Áø ÈÄ ½ºÅ³ void PlayerRushAfterSkillRequest( unsigned long characterIdx, MSG_REQ_SKILL_USED* pMsg ); /// ¸ó½ºÅÍ °ø°Ý bool MonsterAttack( unsigned long monsterIdx, eMONSTERATTACK_TYPE attackType, sObject target ); /// ½ºÅ³ »ç¿ë °¡´É ¿©ºÎ üũ bool IsUsingSkill( unsigned char type, unsigned long objectIdx ); unsigned long SkillLeftEndTime( unsigned char type, unsigned long objectIdx ); /// ij½ºÆÃ ÁßÀÎ ½ºÅ³ »ç¿ë Á¾·á / ij½ºÆÃ ¹æÇØ void CastSkillCancel( sObject attacker, bool isObstacle, unsigned long attributeType ); /// ä³Î¸µ ÁßÀÎ ½ºÅ³ »ç¿ë Á¾·á / ij½ºÆÃ ¹æÇØ void ChannelingSkillCancel( sObject attacker, bool isObstacle, unsigned long attributeType, bool isDuelEndCancel = false ); /// °ø°Ý ½ºÅ³Á¦°Å bool DeleteSkillObject( unsigned char type, unsigned long objectIdx, unsigned long skillUniqueIdx ); void InsertDeleteSkillObject( sObject skillUser, unsigned long skillUniqueIdx ); /// ½ºÅ³°´Ã¼ ¼Ò¸ê½Ã °íÀ¯Å°»ý¼º±â·Î ¸¸µé¾îÁø Ű ¹Ýȯ void DelSkillUniqueIdx( unsigned long uniqueIdx ) { mSkillGen.DelIdx( uniqueIdx ); } /*--------------- È¿°ú ó¸® ---------------*/ /// DB ÀÔÃâ·Â bool SaveAllPlayerInfluence( unsigned long playerIdx, SKILL_INFLUENCE_UPDATE* pInfluenceUpdate ); void SavePlayerInfluence( unsigned long playerIdx, unsigned long infObjectIdx, bool del ); void CycleSaveCashInfluence( cPlayer* pPlayer ); void RestorePlayerInfluence( unsigned long playerIdx, SKILL_INFLUENCE_SELECT* pInfluenceSelect, unsigned long rowCnt ); /// ½ºÅ³ ¿Ü È¿°ú »ý¼º bool AddInfluence( sObject attacker, sObject target, unsigned long infClassIdx, unsigned long skillClassIdx, bool msgSend, sInfluenceCreate* pInf = NULL ); unsigned long AddInfSwitch( sObject attacker, sObject target, unsigned long infClassIdx, unsigned long skillClassIdx, bool msgSend ); bool AddInfChildAura( sObject attacker, sObject target, unsigned long infClassIdx, unsigned long skillClassIdx, unsigned long parentIdx, bool msgSend ); bool AddInfluenceTotem( sObject attacker, sObject target, unsigned long infClassIdx, unsigned long skillClassIdx, unsigned long parentIdx, bool msgSend, unsigned long continuanceTime, sInfluenceCreate* pInf = NULL ); unsigned long AddInfMode( sObject attacker, sObject target, unsigned long infClassIdx, bool enemyApply, unsigned short range, bool msgSend ); int ItemCheckAddInf( cBaseObject* pAttacker, cBaseObject* pTarget, unsigned long infClassIdx ); bool ApplyInfluence( cBaseObject* pAttacker, cBaseObject* pTarget, unsigned long infObjectIdx, unsigned long infClassIdx, unsigned long type, long value, bool noProcessApply = false ); cInfluenceObject* GetInfluence( unsigned long uniqueIdx ) { return (cInfluenceObject*)mInfluenceMap.GetAt( uniqueIdx ); } /// °³º° È¿°ú Á¦°Å void DeleteInfluence( sObject target, unsigned long uniqueIdx ); void DeleteInfluenceClassIdx( sObject target, unsigned long classIdx ); void VehicleDeleteInfluence( sObject target, unsigned long uniqueIdx, bool sendSync = true ); /// ¸®½ºÆ®¿¡¼­ Á¦°Å(»èÁ¦ ¿¹¾à) void DeleteInfluenceList( unsigned long uniqueIdx ); /// ¿À¶ó È¿°ú Á¾·á bool ClientAuraInfluenceOff( unsigned long playerIdx, unsigned long uniqueIdx, unsigned long skillClassIdx ); void AuraInfluenceOff( unsigned long playerIdx, unsigned long skillClassIdx ); void SwitchParentAllOff( unsigned long playerIdx ); /// ÀÚ½ÅÀÌ »ç¿ëÇÑ ¿À¶óÈ¿°ú ¸ðµÎÁ¦°Å void InfluenceOff( unsigned long playerIdx, unsigned long influenceClassIdx ); /// Ŭ¶óÀÌ¾ðÆ®¿¡¼­ È¿°ú »èÁ¦¸Þ¼¼Áö°¡ ³¯¶ó¿È void ClientDeleteInfluenceObject( unsigned long playerIdx, unsigned long uniqueIdx ); /// È¿°ú µð½ºÆç void DispelInfluence( sObject target, unsigned long influenceTypeDetail, unsigned long groupOrder ); void DispelInfluenceAll( sObject target, unsigned long groupOrder ); /// ¸é¿ª¿¡ ÇØ´çÇÏ´Â È¿°ú Á¦°Å void ClearImmuneKind( sObject target, unsigned long typeDetail ); void ClearImmuneApplyType( sObject target, unsigned char InfluenceType, unsigned short applyType ); /// È¿°ú°´Ã¼ ¼Ò¸ê½Ã °íÀ¯Å°»ý¼º±â·Î ¸¸µé¾îÁø Ű ¹Ýȯ void DelInfluenceUniqueIdx( unsigned long uniqueIdx ) { mInfluenceGen.DelIdx( uniqueIdx ); } void SendHPMPInf( cBaseObject* pTarget, sObject attacker, char* targetMsg, unsigned short targetLen, char* aroundMsg, unsigned short aroundLen ); /*--------------- ¹ßµ¿ È¿°ú ó¸® ---------------*/ void CheckActInfluence( eACTSTATUS status, cBaseObject* pObject, cBaseObject* pTarget ); void CheckSkillActInfluence( unsigned long actIdx, cBaseObject* pObject, cBaseObject* pTarget ); /*--------------- hp/mp º¯È­·® Àû¿ë ¹ß¼Û ---------------*/ void InsertChangeSet( cBaseObject* pTarget, sObject attacker, unsigned char damageKind ); /*--------------- Ç÷¹À̾î Á¢¼Ó ó¸® ---------------*/ /// µ¥ÀÌÅÍ ·Îµå½ÃÁ¡ Á¤º¸ ¹ß¼Û void SendMsgSkillHaveToPlayer( unsigned long connectionIdx, unsigned long characterIdx ); void SendMsgInfluenceToPlayer( unsigned long connectionIdx, unsigned long characterIdx ); /// ±×¸®µå in/out ½ÌÅ© ¸Þ¼¼Áö ¹ß¼Û void SendAddSynMsgInfluenceToPlayer( unsigned long connectionIdx, unsigned long characterIdx ); /*-----------------------------------------*/ private: void InsertPlayerSkillMap( unsigned long characterIdx, cBaseSkillObject* pSkillObject ); void InsertMonsterSkillMap( unsigned long monsterIdx, cMonsterSkillObject* pSkillObject ); /// ½ºÅ³ º¸À¯¸®½ºÆ® ó¸® bool DelPlayerHaveSkill( unsigned long playerIdx, unsigned long skillIdx ); void ReleasePlayerHaveSkill(); /// È¿°ú ¸®½ºÆ® ó¸® void ReleaseInfluence(); private: /// Ç÷¹ÀÌ¾î ½ºÅ³ °´Ã¼¸¦ ´ãÀ» pool typedef tPool cPlayerSkillObjectPool; cPlayerSkillObjectPool mPlayerSkillObjectPool; typedef tPool cMonsterSkillObjectPool; cMonsterSkillObjectPool mMonsterSkillObjectPool; typedef tPool cPlayerMonSkillObjectPool; cPlayerMonSkillObjectPool mPlayerMonSkillObjectPool; /// È¿°ú °´Ã¼¸¦ ´ãÀ» pool typedef tPool cInfluenceObjectPool; cInfluenceObjectPool mInfluenceObjectPool; /// º¸À¯ ½ºÅ³À» ´ãÀ» pool typedef tPool cHaveSkillObjectPool; cHaveSkillObjectPool mPlayerHaveSkillPool; typedef tArray cArray; typedef tPointerHashMap cPointerHashMap; typedef tPointerHashMap cPlayerMap; typedef tHashSet cHashSet; typedef tHashMap cHashMap; typedef tPointerArray cPArray; typedef tArray cLongAry; /// »ç¿ë ÁßÀÎ ½ºÅ³°´Ã¼ °ü¸® ÇØ½¬¸Ê //typedef tPointerHashMap*> cSkillObjectHashMap; cPointerHashMap mPlayerSkillMap; cPointerHashMap mMonsterSkillMap; /// Ç÷¹À̾ º¸À¯ÇÑ ½ºÅ³ ¸®½ºÆ® /// ¡Ø playeridx¿Í skillidx·Î ¿©·¯°¡Áö °Ë»öÀÌ À־ mapÀÌ mapÀ» ÂüÁ¶ÇÏ´Â ÇüÅ·Π¸¸µé¾îÁü //typedef tPointerHashMap cPlayerHaveSkillMap; //typedef tPointerHashMap cPlayerSkillPointerHashMap; cPointerHashMap mPlayerHaveSkillMap; /// È¿°ú Àüü ¸Ê - ¿ÀºêÁ§Æ®°¡ Àڽſ¡ ¸Â´Â È¿°ú Æ÷ÀÎÅ͸¦ °¡Áö°í ÀÖ´Ù. //typedef tPointerHashMap cInfluenceMap; cPointerHashMap mInfluenceMap; /// Á¦°ÅÇ׸ñÀúÀå¹è¿­ tArray mDeleteSkillAry; tArray mDeleteInfluenceAry; /// ½ºÅ³ ½ºÅ©¸³Æ® ÆÄÀÏ ·Î´õ cSkillScript* mpSkillScript; /// Ä¿¹Â´ÏƼ ½ºÅ©¸³Æ® ÆÄÀÏ ·Îµå cCommunityScript* mpCommuScript; /// ½ºÅ³ ¿¬Ãâ ÆÄÀÏ ·Î´õ cDramaturgyManager mDramaturgyManager; /// Àü¹® ±â¼ú cMakeSkillScript* mpMakeSkillScript; /// À妽º »ý¼º±â cIndexGenerator mSkillGen; cIndexGenerator mInfluenceGen; /// °Å¸® üũ cRangeCheck mRangeCheck; /// hp/mp º¯µ¿ ¸ñ·Ï /// cHashSet mPlayerChangeSet; /// cHashSet mMonsterChangeSet; /// cHashSet mSendMsgSet; cLongAry mTempActTargetAry; }; #define SKILLMANAGER cSkillManager::mpSkillManager