/* ========================================================================== * ÆÄ ÀÏ : DeathMatchObject.h * ¸ñ Àû : * ÀÛ ¼º ÀÚ : ¹Ú°æÈñ * ÀÛ ¼º ÀÏ : 2008-09-04 * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once #include "PVP_Common.h" #include "Player_Common.h" #include "MemoryPool.h" #include "RangeCheck.h" class cPlayer; struct sLevelForceInfo; enum ePVPDM_PROCESS { ePVPDM_PROCESS_WAIT, /// À¯Àú ÀÔÀå ´ë±â ePVPDM_PROCESS_READY, /// ÀüÅõÀü 1ºÐ Ä«¿îÆ® ½ÃÀÛ ePVPDM_PROCESS_READY_OUT, /// Ä«¿îÆ® ½ÃÀÛ Á¶°Ç ºñ¸¸Á· - ÀüÅõºÒ°¡ ePVPDM_PROCESS_FIGHT_MINIMUM, /// ½ÃÀÛÈÄ 5ºÐ°£ Àοø üũ ¾ÈÇÔ ePVPDM_PROCESS_FIGHT, /// ¸ðµç Á¶°ÇÀ» üũÇÏ´Â ÀüÅõ »óÅ ePVPDM_PROCESS_FIGHTEND, /// ÀüÅõ ³¡ °á°ú ó¸® ePVPDM_PROCESS_END, /// °´Ã¼ Á¦°Å }; enum ePVPDM_OBJECTTYPE { ePVPDM_OBJECTTYPE_1 = 101, /// pvpÀüÀå1 ePVPDM_OBJECTTYPE_2, /// pvpÀüÀå2 }; ////////////////////////////////////////////////////////////////////////// /// °³ÀÎ Á¤º¸ class cPvPDMMemberInfo { public: cPvPDMMemberInfo(); ~cPvPDMMemberInfo(); void* operator new( size_t n ); void operator delete( void* p ); void CalcScore(); public: unsigned long mPlayerIdx; /// °íÀ¯¹øÈ£ unsigned char mForceType; unsigned long mLeaderKillCnt; /// ¼öÀå Á×Àμö unsigned long mKillCnt; /// Á×Àμö unsigned long mDeathCnt; /// Á×Àº¼ö /// °á°ú°ª º¯¼ö unsigned long mScore; // ÀÚ½ÅÀ» ½Å°íÇÑ À¯Àú À妽º ¼Â typedef tHashSet cReportSet; cReportSet mReportSet; private: static tPool mMemberInfoPool; }; ////////////////////////////////////////////////////////////////////////// /// ÆÀ Á¤º¸ class cPvPDMTeamInfo { public: cPvPDMTeamInfo(); ~cPvPDMTeamInfo(); bool AddMember( unsigned long idx, unsigned char forceType ); bool DelMember( unsigned long idx ); unsigned long CalcScore( sPvPDMTeamScore* arr ); bool AddReport( unsigned long objectIndex, unsigned long targetIndex ); int GetReportCount( unsigned long targetIndex ); public: unsigned char mMemberCnt; /// ÆÀÀοø unsigned long mPoint; /// ½Àµæ Æ÷ÀÎÆ® unsigned long mTotalKillCnt; /// ¿¬ÇÕ °ü¸® unsigned long mPartyUnionIndex; /// ¼¼·Âº° µ¿¸ÍÆÀ bool mForce[eFORCETYPE_MAX]; //cPvPDMMemberInfo tPointerHashMap mMemberMap; }; ////////////////////////////////////////////////////////////////////////// class cBaseDeathMatch : public PerNode { public: cBaseDeathMatch( ePVPDM_OBJECTTYPE type ); virtual ~cBaseDeathMatch(); virtual bool Init( unsigned short DMIdx, sLevelForceInfo* pLevelForceInfo ); virtual void Process( unsigned long elapsedTime, unsigned long accumTime ) = 0; int GetProcess() { return mProcess; } /// µ¥½º¸ÅÄ¡ ¸É¹ö Ãß°¡ int JoinTeam( cPlayer* pPlayer ); void SendTeamList( cPlayer* pPlayer ); virtual void OutMember( unsigned long playerIdx, ePVPDM_TEAM_TYPE teamType ); unsigned short GetDMIdx() { return mDMIdx; } void SendReadyLeftTime( cPlayer* pPlayer ); bool IsFight(); unsigned char TeamCnt( ePVPDM_TEAM_TYPE teamType ) { return mTeamInfo[teamType].mMemberCnt; } unsigned long TeamKillTotal( ePVPDM_TEAM_TYPE teamType ); void SetPartyUnionIndex( ePVPDM_TEAM_TYPE teamType, unsigned long partyUnionIndex ); unsigned long GetPartyUnionIndex( ePVPDM_TEAM_TYPE teamType ); /// Ä«¿îÆ® ½ÃÀÛ void Ready(); /// pvp ½ÃÀÛ ¸Þ¼¼Áö ¹ß¼Û virtual void SendFight( unsigned long fightTime ); bool SendFight( cPlayer* pPlayer ); void EndNpcTalk(); void AddTeleportPortal(); /// Á¡¼ö º¯°æ virtual void ScoreUpdate( unsigned long killIdx, ePVPDM_TEAM_TYPE killerTeam, unsigned long deadIdx, ePVPDM_TEAM_TYPE deadTeam ) = 0; /// °á°ú ó¸® virtual void Result(); void SendResult( ePVPDM_TEAM_TYPE winTeam, ePVPDM_END_TYPE endType ); virtual void SendTeamResult( cPvPDMTeamInfo* pTeam, ePVPDM_END_TYPE endType, char protocol ); /// pvp ³¡³² ó¸® void EndDM(); bool OrderEndDM(); void EndDMReq( unsigned long playerIdx, unsigned long teamType ); /// msg¹ß¼Û void DMQuickSend( char* msg, unsigned long length ); void TeamQuickSend( ePVPDM_TEAM_TYPE teamType, char* msg, unsigned long length ); void TeamQuickSendExcept( ePVPDM_TEAM_TYPE teamType, unsigned long exceptIdx, char* msg, unsigned long length ); void TeamChatQuickSend( cPlayer* pPlayer, ePVPDM_TEAM_TYPE teamType, char* msg, unsigned long length ); ePVPDM_OBJECTTYPE GetType() { return mObjectType; } bool IsMovePossible( NiPoint2 startPos, NiPoint2 goalPos ); void SendObstruction( cPlayer* pPlayer ); unsigned long GetProcessEndTime() { return mProcessEndTime; } int UseTeleportPortal( cPlayer* pPlayer, unsigned long mapChangeIdx ); // ÀüÀå ½Å°í Ãß°¡ int AddReport( cPlayer* hero, unsigned long targetIndex ); protected: typedef tArray cArray; typedef tPointerArray cPArray; typedef tPointerHashMap cPHashMap; typedef tHashSet cHashSet; unsigned short mDMIdx; /// °íÀ¯ ¹øÈ£ ePVPDM_OBJECTTYPE mObjectType; ePVPDM_PROCESS mProcess; unsigned long mFightStartTime; /// ÀüÅõ ½ÃÀ۽ð£ unsigned long mProcessEndTime; /// ÇöÀç ÇÁ·Î¼¼½º Á¾·á ½Ã°£ sDMBlockInfo* mpDMBlockInfo; /// ·¹º§ ±¸°£ Á¤º¸ /// ÆÀ Á¤º¸ cPvPDMTeamInfo mTeamInfo[ePVPDM_TEAMTYPE_MAX]; ePVPDM_TEAM_TYPE mFirstKillTeam; bool mScoreEnd; /// ÅäÅÛ °ü¸®ÀÚ cArray mDMTotemArr; /// npc°ü¸®ÀÚ cArray mNpcAry; cArray mTempChatAry; cRangeCheck mRangeCheck; unsigned long mWaitEndTime; unsigned long mAutoOutCheckTime; ////////////////////////////////////////////////////////////////////////// /// Àå¾Ö¹° /// cPHashMap mObstructionMap; ////////////////////////////////////////////////////////////////////////// /// ÅÚ·¹Æ÷Æ® À§Ä¡À̵¿ Æ÷Å» cHashSet mPvPTeleportSet; };