Files
2022-10-26 12:25:11 +08:00

147 lines
4.3 KiB
C++

#pragma once
#include <set>
enum eTEAM_STATE
{
eTEAM_STATE_NONE,
eTEAM_STATE_MATCH, // 경쟁 상태
eTEAM_STATE_END, // 종료 상태
};
enum eEXPIRE_STATE
{
eEXPIRE_STATE_NONE,
eEXPIRE_STATE_ALL_DEAD, // 멤버 모두 죽은 상태
eEXPIRE_STATE_ALL_LEAVE, // 멤버 모두 떠난 상태
};
class CHuntingManager;
// 킬포인트 sort를 위한 벡터
typedef STLX_VECTOR<Player*> PLAYER_SORT_VECTOR;
typedef PLAYER_SORT_VECTOR::iterator PLAYER_SORT_VECTOR_ITR;
class CompetitionTeam
{
enum { END_WAIT_TIME = 20*1000 };
enum { MAX_WIN_POINT = 3000 };
enum { MAX_VICTORY_NUM = 30 };
public:
CompetitionTeam();
~CompetitionTeam();
VOID Init( CHuntingManager *pMgr, WORD wTeamKey, eCOMPETITION_RULE_TYPE eRule, eCOMPETITION_MODE_TYPE eMode );
VOID Update();
VOID Start();
VOID ResultTie();
VOID ResultWin( CompetitionTeam *pLoseTeam, WORD wProcessTime );
VOID ResultLose( CompetitionTeam *pWinnerTeam );
BOOL IsExpired() { return m_State == eTEAM_STATE_END; }
eEXPIRE_STATE GetExpireState() { return m_eExpireState; }
BOOL IsAllDied();
VOID AddMember( Player *pPlayer );
VOID RemoveMember( DWORD dwObjKey );
Player * FindMember( DWORD dwObjKey );
BYTE GetMemberNum();
BYTE GetAliveMemberNum();
BYTE GetAllPointInfo( CompetitionPoint * OUT pPointInfo );
WORD GetTeamKey() { return m_wTeamKey; }
WORD GetKillPoint() { return m_wKillPoint; }
WORD GetWinPoint() { return m_wWinPoint; }
VOID SetPartyKey( WORD wPartyKey ) { m_wPartyKey = wPartyKey; }
WORD GetPartyKey() { return m_wPartyKey; }
LEVELTYPE GetAvgLevel();
LEVELTYPE GetTotLevel();
VOID IncNPCKillPoint( Player *pKiller, NPC *pNPC );
VOID IncPlayerKillPoint( Player *pKiller, Player *pDeadPlayer );
VOID UsePotion();
VOID LevelUp() { m_TotLevel++; }
VOID IncWinCount( Player * pPlayer, int iIncVCount );
VOID SetChampion( BOOL bChampion ) { m_bChampion = bChampion; }
BOOL IsChampion() { return m_bChampion; }
RC::eSTATUS_RESULT ResurrectionAtSafezone( Player *pPlayer, BOOL bModeCheck );
VOID AllResurrectionAtSafezone();
VOID SendPacketToAll( MSG_BASE_FORWARD * pMsg, WORD wSize, DWORD dwMyObjKey = 0 );
VOID SetReadyPlayer( BYTE byReadyPlayerNum, DWORD * IN pUserKeyList );
BOOL IsAllPlayerEntered();
BOOL IsReadyPlayer( DWORD UserKey );
#ifdef __NA_000000_20070528_TAIWAN_GUILD_PVP
GUILDGUID GetGuildGuid() { return m_GuildGuid; }
VOID SetGuildGuid( GUILDGUID GuildGuid ) { m_GuildGuid = GuildGuid; }
#endif
// _NA_0_20091118_GAMEROOM_BATTLE_RESULT
BYTE GetWinCount() { return m_byTeamWinCount; }
private:
VOID OnEnd();
VOID OnRewards( Player * pPlayer, LEVELTYPE EnemyPartyAvgLV, WORD wProcessTime, BOOL bGetItem );
BOOL OnIsExpired();
VOID OnCalcRanking();
WORD OnGetMaxPlayTimes();
RC::eSTATUS_RESULT OnMoveToSafezone( Player *pPlayer );
#ifdef __NA_000000_20070528_TAIWAN_GUILD_PVP
VOID OnExpel( Player *pPlayer );
VOID OnExpels();
#else
VOID OnExpel();
#endif
BOOL IsCompetition() { return m_State == eTEAM_STATE_MATCH; }
BOOL IsFreeForAllRule() { return m_Rule == eCOMPETITION_RULE_FREE_FOR_ALL; }
BOOL IsDualPartyRule() { return m_Rule == eCOMPETITION_RULE_DUAL_PARTY; }
BOOL IsSurvivalMode() { return m_Mode == eCOMPETITION_MODE_SURVIVAL; }
BOOL IsTimeAttackMode() { return m_Mode == eCOMPETITION_MODE_TIME_ATTACK; }
BOOL IsDeathMatchMode() { return m_Mode == eCOMPETITION_MODE_DEATH_MATCH; }
private:
CHuntingManager * m_pCHuntngMgr;
WORD m_wTeamKey;
WORD m_wPartyKey;
#ifdef __NA_000000_20070528_TAIWAN_GUILD_PVP
GUILDGUID m_GuildGuid;
#endif
eCOMPETITION_RULE_TYPE m_Rule;
eCOMPETITION_MODE_TYPE m_Mode;
eTEAM_STATE m_State;
BOOL m_bChampion; // 챔피언인가 도전자인가
PLAYER_HASH m_PlayerHash;
util::Timer m_EndWaitTimer;
LEVELTYPE m_TotLevel; // 초기멤버 전체레벨
BYTE m_byInitMemberNum; // 초기멤버 수
WORD m_wKillPoint; // 킬 포인트
WORD m_wWinPoint; // 승리 포인트
// _NA_0_20091118_GAMEROOM_BATTLE_RESULT
BYTE m_byTeamWinCount; // 연승 횟수
eEXPIRE_STATE m_eExpireState; // 종료상태
BYTE m_byReadyPlayerNum; // 입장하려는 플레이어 수
STLX_SET<DWORD> m_setReadyUserKeys;
BOOL m_bResultTie; // 이전판이 무승부 판이었는가
};