⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pvpmanager.h

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 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 + -