/* ========================================================================== * ÆÄ ÀÏ : PVPManager.h * ¸ñ Àû : * ÀÛ ¼º ÀÚ : ¹Ú°æÈñ * ÀÛ ¼º ÀÏ : 2008-09-04 * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once #include "DeathMatchObject.h" #include "RangeCheck.h" #include "PvPObjectPool.h" #include "IndexGenerator.h" #include "PvPPlayerListPool.h" #include "GameSrv.h" #include "PvPScript.h" enum ePVPMANAGER_PROCESS { ePVPPROCESS_WAIT, /// pvp ´ë±â»óÅ ePVPPROCESS_RUN, /// ÀüÀå °³º° ¼öÇà }; enum ePVPSECTION_PROCESS { ePVPSECTION_WAIT, ePVPPROCESS_NOTICE, /// °øÁö ¹ß¼Û»óÅ ePVPPROCESS_READY, /// ÀÔÀå ½Åû ¹Þ´Â »óÅ ePVPPROCESS_RUNOBJECT, /// ¹æº° ÇÁ·Î¼¼½º·Î ³Ñ±è }; struct sLevelForceInfo { /// sDMBlockInfo* mpBlockInfo; /// Àδø À妽º ¸ñ·Ï tArray mPvPObjectIdxAry; /// unsigned long mForceCnt[eFORCETYPE_MAX]; /// ¼¼·Âº° Àοø Ä«¿îÆ® bool mATeam[eFORCETYPE_MAX]; /// AÆÀ true / bÆÀ false unsigned long mCreateMaxRoom; /// »ý¼ºµÉ Àδø °¹¼ö unsigned long mTeamCnt[ePVPDM_TEAMTYPE_MAX]; /// ÀÔÀå/ºÒ°¡ Àοø üũ½Ã ÀÔÀå°¡´É ó¸®µÈ Àοø Ä«¿îÆ® sLevelForceInfo() { memset( this, 0, sizeof(sLevelForceInfo) ); mPvPObjectIdxAry.Reserve( 10 ); } void Init() { memset( mForceCnt, 0, sizeof(mForceCnt) ); memset( mATeam, 0, sizeof(mATeam) ); memset( mTeamCnt, 0, sizeof(mTeamCnt) ); mCreateMaxRoom = 0; mPvPObjectIdxAry.Clear(); } }; struct sSecionInfo { ePVPSECTION_PROCESS mSecProcess; unsigned long mNextEventTime; unsigned char mMinLevel; unsigned char mMaxLevel; unsigned char mNoticeCount; unsigned long mNoticeSendTime; /// ä³Î¼­¹ö ·¹µð »óÅÂÀÎ Ç÷¹À̾î¸í´Ü /// tHashSet mReadyPlayerSet; }; class cPVPManager { public: static cPVPManager* mpPVPManager; public: cPVPManager(); ~cPVPManager(); bool Init( SERVER_TYPE type, unsigned short mapNumber ); void Release(); void Process( unsigned long elapsedTime, unsigned long accumTime ); void ObjectProcess( unsigned long elapsedTime, unsigned long accumTime ); /// °ø¿ë ±âº» º¯¼ö Á¶È¸ sDMInfo* GetDMInfo() { return mpDMInfo; } unsigned long GetMapIndex() { return mMapNumber; } /// Àδø °ü¸®ºÎ void TeamDivision( PVP_USER_SELECT* select ); unsigned short JoinDeathMatch( cPlayer* pPlayer, float* x, float*y ); void MemberOut( unsigned long pvpIdx, unsigned long playerIdx, ePVPDM_TEAM_TYPE teamType ); void DelAryInsertPVP( unsigned long pvpDMIdx ); /// ÀüÀå Àδø °´Ã¼°ü·Ã ÂüÁ¶ sPvPObjectRoot* GetPvPObjectRoot() { return &mPvPObjectRoot; } cBaseDeathMatch* GetPvPDMObject( unsigned long dmIdx ); /// °´Ã¼ À妽º »ý¼º / Á¦°Å unsigned long GenNpcIndex() { return mNpcIdxGen.GeneratIdx(); } void DelNpcIndex( unsigned long npcIdx ) { mNpcIdxGen.DelIdx( npcIdx); } unsigned long GetTeamPlayerMax(); unsigned long GetTeamPlayerMin(); unsigned long GetTeamGenPosIdx( ePVPDM_TEAM_TYPE teamType ); //void SendReadyLeftTime( cPlayer* pPlayer ); /// °ÔÀÓ¼­¹ö ÀÔÀå´ë±â °ü¸®¸ñ·Ï void AddReadyPlayer( cPlayer* pPlayer ); void DelReadyPlayer( cPlayer* pPlayer ); void SendNotPvPIn( unsigned long aryPos ); void AddGmPlayer( unsigned long playerIdx ) { mGmPlayer.Insert( playerIdx ); } bool IsGmPlayer( unsigned long playerIdx ); unsigned long GetSectionAryPos( unsigned char level ); sSecionInfo* GetSectionInfo( unsigned long aryPos ); void SendMsgSynPvPReadyClose( unsigned long aryPos ); private: typedef tPointerHashMap cPHashMap; typedef tHashSet cHashSet; typedef tArray cAry; typedef tPointerArray cPAry; ePVPMANAGER_PROCESS mProcess; /// ÇÁ·Î¼¼½º »óÅ unsigned long mNextEventTime; /// ´ÙÀ½ À̺¥Æ® ½ÃÀÛ ½Ã°£ sSecionInfo mSectionInfo[PVP_DM_LEVEL_SECTION_MAX]; /// pvp °´Ã¼ ¸®½ºÆ® sPvPObjectRoot mPvPObjectRoot; /// °´Ã¼ »èÁ¦ ¹è¿­ cAry mDelDMAry; unsigned char mDMMaxCnt; cRangeCheck mRangeCheck; sDMInfo* mpDMInfo; unsigned short mMapNumber; unsigned long mTeamGenPos[ePVPDM_TEAMTYPE_MAX]; cIndexGenerator mNpcIdxGen; /// ±¸°£º° ¼¼·ÂÁ¤º¸ °´Ã¼ cPAry mLevelForceAry; /// ·¹º§º° ÂüÁ¶Á¤º¸ /// cPHashMap mLevelForceMap; ///// ·¹µð »óÅÂÀÎ Ç÷¹À̾î¸í´Ü ///// //cHashSet mReadyPlayerSet; /// ´ÙÀ½ ½ÃÀÛ ½Ã°£ ¼³Á¤ TIMESTAMP_STRUCT mNextStartTime; unsigned long mStartTimeScriptPos; /// 081114 PKH PvP½ºÅ©¸³Æ® cPvPScript* mpPvPScript; cHashSet mGmPlayer; }; #define PVPMANAGER cPVPManager::mpPVPManager