Files
Sun1602/Server/GameServer/CHuntingManager.h
T
2022-10-26 12:25:11 +08:00

135 lines
4.5 KiB
C++

#pragma once
#include <MemoryPoolFactory.h>
#include <ObjKeyGenerator.h>
#include "CompetitionTeam.h"
class GameCHuntingRoom;
enum eCOMPETITION_STATE
{
eCOMPETITION_NONE,
eCOMPETITION_ALL_ENTER_WAIT, // 플레이어가 다 들어오길 기다리는 상태
eCOMPETITION_START_WAIT, // 시작 대기 상태
eCOMPETITION_MATCH, // 경쟁 상태
eCOMPETITION_END_WAIT, // 종료 대기 상태
};
typedef util::SolarHashTable<CompetitionTeam*> COMPETITION_INFO_HASH;
typedef COMPETITION_INFO_HASH::iterator COMPETITION_INFO_HASH_ITR;
class CHuntingManager
{
enum { MAX_COMPETITION_INFO_NUM = 10 };
enum { ALL_ENTER_WAIT_TIME = 90*1000 };
enum { START_WAIT_TIME = 20*1000 };
enum { RESURRECTION_WAIT_TIME = 5*1000 };
enum { DISCONNECT_PENALTY_PVPPOINT = 50 };
public:
CHuntingManager();
~CHuntingManager();
VOID Release();
VOID Init( GameCHuntingRoom *pCHuntingZone, ADDITIONAL_CHUNTINGINFO * pInfo );
VOID Update();
VOID EnterPlayer( Player * pPlayer );
VOID LeavePlayer( Player * pPlayer );
BOOL CanUsePotion( Player *pPlayer );
VOID UsePotion( Player *pPlayer );
VOID DeadCharacter( Character *pDeadChar, Character *pKillChar );
VOID LevelUp( Player * pPlayer );
VOID IncWinCount( Player * pPlayer, int iIncVCount );
RC::eSTATUS_RESULT ResurrectionAtSafezone( Player *pPlayer, BOOL bModeCheck );
CompetitionTeam * CreateTeam();
VOID DestroyTeam( WORD wTeamKey );
VOID EnterTeam( BYTE byReadyPlayerNum, DWORD * IN pUserKeyList, GUILDGUID GuildGuid );
VOID SetReadyPlayerNum( BYTE byReadyPlayerNum ) { m_byReadyPlayerNum = byReadyPlayerNum; }
BYTE GetMaxTeamMemberNum();
VOID SendPacketToAll( MSG_BASE_FORWARD * pMsg, WORD wSize, DWORD dwMyObjKey = 0 );
BYTE GetAllPointInfo( WORD TeamKey, CompetitionPoint * OUT pPointInfo );
BOOL IsApplyPenalty() { return IsTimeAttackMode(); }
GameCHuntingRoom * GetCHunting() { return m_pCHuntingZone; }
BOOL IsCompetition() { return m_eCompetitionState == eCOMPETITION_MATCH; }
eCOMPETITION_STATE GetCompetitionState() { return m_eCompetitionState; }
#ifdef __NA_000000_20070528_TAIWAN_GUILD_PVP
BOOL IsGuildPVPMode();
WORD OnGetMaxPlayTimes() { return (WORD)(m_ExpireTimer.GetIntervalTime()/1000); }
#endif
// _NA_0_20091118_GAMEROOM_BATTLE_RESULT
VOID GetTeamWinCount(BYTE* OUT HomeTeamWinCount,
BYTE* OUT AwayTeamWinCount,
WORD HomeTeamKey);
private:
VOID OnStartWait(); // 경쟁헌팅 시작 Wait
VOID OnStart(); // 경쟁헌팅 시작
VOID OnResult(); // 결과 처리
CompetitionTeam * DecideTie(); // 무승부인가
CompetitionTeam * DecideWinner(); // 최종 승자 결정
VOID DecideMemberNumWinner(); // 멤버수가 많은 팀
CompetitionTeam * DecideKillPointWinner( COMPETITION_INFO_HASH *pTeamHash ); // 킬포인트가 높은 팀
BOOL IsExpired();
BOOL IsReMatchCondition();
CompetitionTeam * FindTeam( WORD wTeamKey ) { return m_CompetionTeamHash.GetData(wTeamKey); }
Player * FindPlayer( DWORD dwObjKey );
BOOL IsAllPlayerEntered(); // 플레이어가 모두 들어왔나
BOOL IsAllLoseTeamLeft(); // 패배한 팀이 모두 나갔나
CompetitionTeam * FindReadyTeam( Player *pPlayer );
BOOL IsFreeForAllRule() { return m_pAdditionalInfo->m_Rule == eCOMPETITION_RULE_FREE_FOR_ALL; }
BOOL IsDualPartyRule() { return m_pAdditionalInfo->m_Rule == eCOMPETITION_RULE_DUAL_PARTY; }
BOOL IsSurvivalMode() { return m_pAdditionalInfo->m_Mode == eCOMPETITION_MODE_SURVIVAL; }
BOOL IsTimeAttackMode() { return m_pAdditionalInfo->m_Mode == eCOMPETITION_MODE_TIME_ATTACK; }
BOOL IsDeathMatchMode() { return m_pAdditionalInfo->m_Mode == eCOMPETITION_MODE_DEATH_MATCH; }
public:
eUSER_RELATION_TYPE IsFriendPVP( Player *pAttacker,Player *pTarget );
eUSER_RELATION_TYPE IsFriendFreeForAll( Player *pAttacker, Player *pTarget );
eUSER_RELATION_TYPE IsFriendDualParty( Player *pAttacker, Player *pTarget );
private:
GameCHuntingRoom* m_pCHuntingZone;
struct { // CHunting Info
ADDITIONAL_CHUNTINGINFO* m_pAdditionalInfo;
eCOMPETITION_STATE m_eCompetitionState;
BYTE m_byReadyPlayerNum; // 입장하려는 플레이어 수
WORD m_WinnerKey;
};
struct { // Time Info
util::Timer m_StartWaitTimer;
util::Timer m_ExpireTimer;
BOOL m_TimeExpired; // 시간종료로 게임이 종료되었는가?
};
util::CObjKeyGenerator<> m_CompetionKeyGenerater;
util::CMemoryPoolFactory<CompetitionTeam> m_CompetionTeamPool;
COMPETITION_INFO_HASH m_CompetionTeamHash;
COMPETITION_INFO_HASH m_TempTeamHash;
};