📄 pvpmanager.h
字号:
#pragma once
#include <SolarHashTable.h>
#include "PVPCommon.h"
#include "Player.h"
#include "PVPInfo.h"
struct PVP_PLAYER_INFO
{
DWORD m_dwPlayerKey;
BYTE m_Team;
__DECL_PVPPOOL(PVP_PLAYER_INFO)
};
enum ePVP_ZONE_STATE
{
ePVP_ZONE_NONE,
ePVP_ZONE_START_MODE,
ePVP_ZONE_MATCHLESS_MODE,
ePVP_ZONE_MATCH_MODE, //< 贸澜 Match甫 矫累茄 饶狼 葛靛
ePVP_ZONE_END_MODE,
};
typedef util::SolarHashTable<Player *> PVP_PLAYER_HASH;
typedef util::SolarHashTable<Player *>::iterator PVP_PLAYER_HASH_ITR;
typedef util::SolarHashTable<PVP_PLAYER_INFO *> PVP_PLAYER_INFO_HASH;
typedef util::SolarHashTable<PVP_PLAYER_INFO *>::iterator PVP_PLAYER_INFO_HASH_ITR;
class PVPManager
{
public:
PVPManager(void);
~PVPManager(void);
VOID Init( ADDITIONAL_PVPINFO * pInfo );
VOID Release();
VOID AddPVPInfo( DWORD dwPlayerKey, BYTE Team );
// PVPPlayerInfo甫 促 罐篮 促澜 PVP 肺流 矫累
VOID StartPVP();
// Draw, Kill, Die 锭 拌魂贸府
// PlayerEnterSync甫 罐篮 流饶
VOID EnterPlayer( Player * pPlayer );
// 唱啊绰单 惑怕俊 蝶扼 Draw牢瘤, Die牢瘤 魄沥
VOID LeavePlayer( Player * pPlayer );
// 贸澜 甸绢客辑 虐甫 喘范阑 锭
RC::ePVP_RESULT PressKeyPlayer( Player * pKeyPressedPlayer );
VOID Update( DWORD dwDeltaTick );
// 磷芭唱, 磷牢 惑怕, PVP沥焊 拌魂 棺 诀单捞飘
VOID OnPVPResult( DWORD dwKillerKey, Player * pDiedPlayer );
protected:
BOOL IsOpponentDieAll();
BOOL IsDrawCheck( Player * pPlayer );
BOOL IsContinueMatchlessMode();
BOOL IsContinuePVP();
BOOL IsEndPVP();
// 郴何利栏肺 龋免凳
VOID OnStartMatchlessModeAll(); //< 公利葛靛
VOID OnStartMatchModeAll();
VOID OnStartMatchlessMode( Player * pPlayer ); //< 公利葛靛 矫累矫
VOID OnStartMatchMode( Player * pPlayer ); //< PVP葛靛 矫累矫
VOID OnStartMatchModeBRD( Player * pPlayer ); //< 俺牢 PVP葛靛 矫累矫 Brd
VOID OnRevival( Player * pPlayer ); //< 何劝 矫累矫
inline Player * FindMember( DWORD PlayerKey ) { return m_PVPPlayerHash.GetData( PlayerKey ); }
inline VOID AddMember( Player * pPlayer, DWORD PlayerKey ) { m_PVPPlayerHash.Add( pPlayer, PlayerKey ); }
inline VOID RemoveMember( DWORD PlayerKey ) { m_PVPPlayerHash.Remove( PlayerKey ); }
inline VOID SetPVPState( ePVP_ZONE_STATE PVPState ) { m_PVPState = PVPState; }
inline ePVP_ZONE_STATE GetPVPState() { return m_PVPState; }
template<class Operator>
BOOL Foreach( Operator & op );
VOID ClearPVPInfo();
inline PVP_PLAYER_INFO * FindPVPInfo( DWORD PlayerKey ) { return m_PVPPlayerInfoHash.GetData( PlayerKey ); }
inline VOID RemovePVPInfo( DWORD PlayerKey ) { m_PVPPlayerInfoHash.Remove( PlayerKey ); }
inline VOID SendToAll( MSG_BASE_FORWARD * pMsg , WORD wSize, DWORD ExceptObjectKey = 0 );
private:
ADDITIONAL_PVPINFO * m_pAdditionalPVPInfo;
PVP_PLAYER_HASH m_PVPPlayerHash;
util::Timer m_Timer;
ePVP_ZONE_STATE m_PVPState;
PVP_PLAYER_INFO_HASH m_PVPPlayerInfoHash;
// 郴何 努贰胶
class IsContinueMatchlessModeCheck
{
public:
IsContinueMatchlessModeCheck(){}
~IsContinueMatchlessModeCheck(){}
BOOL operator()( Player * pPlayer )
{
if( pPlayer->GetPVPInfo().GetPVPState() != ePVP_USER_KEYPRESSED )
return FALSE;
return TRUE;
}
};
};
VOID PVPManager::SendToAll( MSG_BASE_FORWARD * pMsg , WORD wSize, DWORD ExceptObjectKey )
{
Player * pPlayer = NULL;
for( PVP_PLAYER_HASH_ITR it = m_PVPPlayerHash.begin() ; it != m_PVPPlayerHash.end() ; ++it )
{
pPlayer = (*it);
if( 0 == ExceptObjectKey || ExceptObjectKey != pPlayer->GetObjectKey() )
pPlayer->SendPacket( pMsg, wSize );
}
}
template<class Operator>
BOOL PVPManager::Foreach( Operator & op )
{
for( PVP_PLAYER_HASH_ITR it = m_PVPPlayerHash.begin() ; it != m_PVPPlayerHash.end() ; ++it )
{
if( !op((*it)) ) return FALSE;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -