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

📄 team.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Team.cpp: implementation of the CTeam class.
//
//////////////////////////////////////////////////////////////////////

#include "allmsg.h"
#include "Team.h"
#include "mapgroup.h"

#define GUIDING_TIME  60*60		//一个小时


MYHEAP_IMPLEMENTATION(CTeam,s_heap)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CTeam::CTeam(PROCESS_ID idProcess)
{
	m_idProcess	= idProcess;
	this->m_tGuidingTime.Startup(GUIDING_TIME);
}

CTeam::~CTeam()
{

}

//////////////////////////////////////////////////////////////////////
CTeam* CTeam::CreateNew(PROCESS_ID idProcess, OBJID m_idTeam, OBJID idLeader)
{
	CTeam* pTeam	= new CTeam(idProcess);
	if (!pTeam)
		return NULL;

	if (!pTeam->Create(idLeader))
	{
		delete pTeam;
		return NULL;
	}

	pTeam->m_id = m_idTeam;
	return pTeam;
}

//////////////////////////////////////////////////////////////////////
CTeam* CTeam::CreateNew(PROCESS_ID idProcess, TeamInfoStruct* pInfo)
{
	CTeam* pTeam	= new CTeam(idProcess);
	IF_NOT(pTeam)
		return NULL;

	IF_NOT(pTeam->Create(pInfo->idLeader))
	{
		delete pTeam;
		return NULL;
	}

	pTeam->m_id = pInfo->id;

	for(int i = 0; i < _MAX_TEAMAMOUNT; i++)
	{
		if(pInfo->setMember[i] != ID_NONE && pInfo->setMember[i] != pInfo->idLeader)
			pTeam->AddMemberOnly(pInfo->setMember[i]);
	}

	pTeam->m_bCloseMoney	= pInfo->bCloseMoney;
	pTeam->m_bCloseItem		= pInfo->bCloseItem;

	return pTeam;
}

//////////////////////////////////////////////////////////////////////
BOOL CTeam::Create(OBJID idLeader)
{
	this->Init();
	m_idLeader	= idLeader;
	this->AddMemberOnly(idLeader);

	CUser* pPlayer	= UserManager()->GetUser(idLeader);
	if (pPlayer)			// may be not current mapgroup
		pPlayer->SetStatus(STATUS_TEAMLEADER);
	
	return true;
}

//////////////////////////////////////////////////////////////////////
BOOL CTeam::AddMember(OBJID idMember)
{
	if (m_fClosed)
		return false;

	int nOldAmount = this->GetMemberAmount();
	if (nOldAmount >= _MAX_TEAMAMOUNT)
		return false;

	if (this->IsTeamMember(idMember))
		return false;

	CUser* pMember = UserManager()->GetUser(idMember);
	if (!pMember)
		return false;

	int nSize = m_setIdUser.size();
	for(int i = 0; i < nSize; i++)
	{
		CUser* pPlayer = UserManager()->GetUser(m_setIdUser[i]);
		if(pPlayer)
		{
			IF_OK(pPlayer->GetTeam())
				pPlayer->GetTeam()->AddMemberOnly(idMember);
		}
		else
		{
			MapGroup(PID)->QueryIntraMsg()->ChangeTeam(CHANGETEAM_ADD, GetID(), idMember);
		}
	}
	int nNewAmount = this->GetMemberAmount();
	if (nOldAmount != nNewAmount 
		&& (nOldAmount >= TEAM_STATUS_REQ_ROLES || nNewAmount >= TEAM_STATUS_REQ_ROLES))
	{
		AdjustMemberStatus(nOldAmount, nNewAmount);
	}
	pMember->SetTeam(this->CloneNew());				//? 只会在本地
	return true;
}

//////////////////////////////////////////////////////////////////////
BOOL CTeam::DelMember(OBJID idMember)
{// 从队伍里删除队员ID,不需要检验ID的有效性。
	int nOldAmount = this->GetMemberAmount();
	int nSize = nOldAmount;	//this->GetMemberAmount();
	for (int i=nSize-1; i>=0; i--)
	{// 倒序,删除
		CUser* pPlayer	= UserManager()->GetUser(m_setIdUser[i]);
		if (pPlayer)
		{
			IF_OK(pPlayer->GetTeam())
			{
				pPlayer->GetTeam()->DelMemberOnly(idMember);
			}
		}
		else
		{
			MapGroup(PID)->QueryIntraMsg()->ChangeTeam(CHANGETEAM_DEL, GetID(), idMember);
		}
	}
	int nNewAmount = this->GetMemberAmount();
	if (nOldAmount != nNewAmount 
		&& (nOldAmount >= TEAM_STATUS_REQ_ROLES || nNewAmount >= TEAM_STATUS_REQ_ROLES))
	{
		AdjustMemberStatus(nOldAmount, nNewAmount);
	}
	return true;
}

//////////////////////////////////////////////////////////////////////
void CTeam::Dismiss(OBJID idLeader)
{
	CUser* pLeader = UserManager()->GetUser(idLeader);
	if (pLeader)
	{
		for (int i=STATUS_TEAM_BEGIN; i<=STATUS_TEAM_END; i++)
		{
			if (pLeader->QueryStatus(i))
			{
				CMsgTalk msg;
				if (msg.Create(SYSTEM_NAME, ALLUSERS_NAME, STR_TEAM_STATUS_DISAPPEAR, NULL, 0xff0000, _TXTATR_SYSTEM))
					this->BroadcastTeamMsg(&msg);
				break;
			}
		}
	}
				
	int nSize = this->GetMemberAmount();
	for (int i=nSize-1; i>=0; i--)
	{// 倒序,删除
		CUser* pPlayer	= UserManager()->GetUser(m_setIdUser[i]);
		if (pPlayer)
		{
			IF_OK(pPlayer->GetTeam())
			{
				if(pPlayer->GetID() != idLeader)	// owner在外面删除
					pPlayer->ClrTeam();					//? 可能在远程,CUser::DelTeamMember()中会删除
			}
		}
		else
		{
			MapGroup(PID)->QueryIntraMsg()->ChangeTeam(CHANGETEAM_DISMISS, GetID(), idLeader);
		}
	}
}

//////////////////////////////////////////////////////////////////////
OBJID CTeam::GetMemberByIndex(int nIndex)
{
	if (nIndex >= m_setIdUser.size() || nIndex < 0)
		return ID_NONE;

	return m_setIdUser[nIndex];
}

//////////////////////////////////////////////////////////////////////
void CTeam::Destroy()
{
	this->Init();
}

//////////////////////////////////////////////////////////////////////
void CTeam::Init()
{
	m_setIdUser.clear();
	m_fClosed			= false;
	m_bCloseMoney		= false;
	m_bCloseItem		= true;
	m_bCloseGemAccess	= true;
	m_idLeader			= ID_NONE;
}

//////////////////////////////////////////////////////////////////////
void CTeam::SetLeader(OBJID idLeader)
{
	if (m_idLeader != ID_NONE)	// 已经设置过队长了。
		return;

	CUser* pPlayer	= UserManager()->GetUser(idLeader);
	if (!pPlayer)
		return;

	m_idLeader	= idLeader;
}

//////////////////////////////////////////////////////////////////////
OBJID CTeam::GetLeader()
{
	return m_idLeader;
}

//////////////////////////////////////////////////////////////////////
int CTeam::GetMemberAmount()
{
	return __min(_MAX_TEAMAMOUNT, m_setIdUser.size());
}

//////////////////////////////////////////////////////////////////////
void CTeam::BroadcastTeamMsg(CNetMsg* pMsg, CUser* pSender/*=NULL*/)
{
	if (!pMsg)
		return;

	for (int i=0; i<this->GetMemberAmount(); i++)
	{
		CUser* pUser	= NULL;
		OBJID idUser	= this->GetMemberByIndex(i);
		pUser			= UserManager()->GetUser(idUser);
		if (pUser)
		{
			if (pUser != pSender)
				pUser->SendMsg(pMsg);
		}
		else // 跨进程组
		{
			MapGroup(PID)->QueryIntraMsg()->TransmitWorldMsg(pMsg, idUser);
		}
	}
}

//////////////////////////////////////////////////////////////////////
void CTeam::Open()
{
	m_fClosed	= false;
}

//////////////////////////////////////////////////////////////////////
void CTeam::Close()
{
	m_fClosed	= true;
}

//////////////////////////////////////////////////////////////////////
BOOL CTeam::IsClosed()
{
	return m_fClosed;
}

//////////////////////////////////////////////////////////////////////
void CTeam::OpenMoney()
{
	m_bCloseMoney	= false;
	char szBuf[1024];
	sprintf(szBuf, STR_TEAM_MONEY_s, STR_OPEN);

	for (int i=0; i<this->GetMemberAmount(); i++)
	{
		OBJID idTarget = this->GetMemberByIndex(i);
		CUser* pTarget = UserManager()->GetUser(idTarget);		
		if (pTarget)			//? may be another mapgroup
		{
			CTeam* pTeam = pTarget->GetTeam();
			IF_OK(pTeam)
			{
				pTeam->SetCloseMoney(false);
				pTarget->SendSysMsg(_TXTATR_TEAM, szBuf);
			}
		}
		else
		{
			// remote call
			char	buf[1024];
			REMOTE_CALL0* pInfo = (REMOTE_CALL0*)&buf;
			pInfo->idUser		= idTarget;
			pInfo->ucFuncType	= REMOTE_CALL_TEAM_CLOSE_MONEY;
			pInfo->IntParam[0]	= false;
			pInfo->nSize		= sizeof(REMOTE_CALL0) + sizeof(int);
			MapGroup(PID)->QueryIntraMsg()->RemoteCall(pInfo);
		}
	}
}

//////////////////////////////////////////////////////////////////////
void CTeam::CloseMoney()
{
	m_bCloseMoney	= true;
	char szBuf[1024];
	sprintf(szBuf, STR_TEAM_MONEY_s, STR_CLOSE);

	for (int i=0; i<this->GetMemberAmount(); i++)
	{
		OBJID idTarget = this->GetMemberByIndex(i);
		CUser* pTarget = UserManager()->GetUser(idTarget);		
		if (pTarget)			//? may be another mapgroup
		{
			CTeam* pTeam = pTarget->GetTeam();
			IF_OK(pTeam)
			{
				pTeam->SetCloseMoney(true);
				pTarget->SendSysMsg(_TXTATR_TEAM, szBuf);
			}
		}
		else
		{
			// remote call
			char	buf[1024];
			REMOTE_CALL0* pInfo = (REMOTE_CALL0*)&buf;
			pInfo->idUser		= idTarget;
			pInfo->ucFuncType	= REMOTE_CALL_TEAM_CLOSE_MONEY;
			pInfo->IntParam[0]	= true;
			pInfo->nSize		= sizeof(REMOTE_CALL0) + sizeof(int);
			MapGroup(PID)->QueryIntraMsg()->RemoteCall(pInfo);
		}
	}
}

//////////////////////////////////////////////////////////////////////
void CTeam::OpenItem()
{
	m_bCloseItem	= false;
	char szBuf[1024];
	sprintf(szBuf, STR_TEAM_ITEM_s, STR_OPEN);

	for (int i=0; i<this->GetMemberAmount(); i++)
	{
		OBJID idTarget = this->GetMemberByIndex(i);
		CUser* pTarget = UserManager()->GetUser(idTarget);		
		if (pTarget)			//? may be another mapgroup
		{
			CTeam* pTeam = pTarget->GetTeam();
			IF_OK(pTeam)
			{
				pTeam->SetCloseItem(false);
				pTarget->SendSysMsg(_TXTATR_TEAM, szBuf);
			}
		}
		else
		{
			// remote call
			char	buf[1024];
			REMOTE_CALL0* pInfo = (REMOTE_CALL0*)&buf;
			pInfo->idUser		= idTarget;
			pInfo->ucFuncType	= REMOTE_CALL_TEAM_CLOSE_ITEM;
			pInfo->IntParam[0]	= false;
			pInfo->nSize		= sizeof(REMOTE_CALL0) + sizeof(int);
			MapGroup(PID)->QueryIntraMsg()->RemoteCall(pInfo);
		}
	}
}

//////////////////////////////////////////////////////////////////////
void CTeam::CloseItem()
{
	m_bCloseItem	= true;
	char szBuf[1024];
	sprintf(szBuf, STR_TEAM_ITEM_s, STR_CLOSE);

	for (int i=0; i<this->GetMemberAmount(); i++)
	{
		OBJID idTarget = this->GetMemberByIndex(i);
		CUser* pTarget = UserManager()->GetUser(idTarget);		
		if (pTarget)			//? may be another mapgroup
		{
			CTeam* pTeam = pTarget->GetTeam();
			IF_OK(pTeam)
			{
				pTeam->SetCloseItem(true);
				pTarget->SendSysMsg(_TXTATR_TEAM, szBuf);
			}
		}
		else
		{
			// remote call
			char	buf[1024];
			REMOTE_CALL0* pInfo = (REMOTE_CALL0*)&buf;
			pInfo->idUser		= idTarget;
			pInfo->ucFuncType	= REMOTE_CALL_TEAM_CLOSE_ITEM;
			pInfo->IntParam[0]	= true;
			pInfo->nSize		= sizeof(REMOTE_CALL0) + sizeof(int);
			MapGroup(PID)->QueryIntraMsg()->RemoteCall(pInfo);
		}
	}
}

//////////////////////////////////////////////////////////////////////
void CTeam::OpenGemAccess()
{
	m_bCloseGemAccess	= false;
	char szBuf[1024];
	sprintf(szBuf, STR_TEAM_GEM_s, STR_OPEN);

	for (int i=0; i<this->GetMemberAmount(); i++)
	{
		OBJID idTarget = this->GetMemberByIndex(i);
		CUser* pTarget = UserManager()->GetUser(idTarget);		
		if (pTarget)			//? may be another mapgroup
		{
			CTeam* pTeam = pTarget->GetTeam();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -