📄 team.cpp
字号:
// 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 + -