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

📄 msgteam.cpp

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

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMsgTeam::CMsgTeam()
{
	this->Init();
	m_pInfo	=(MSG_Info *)m_bufMsg;
}

CMsgTeam::~CMsgTeam()
{

}

//////////////////////////////////////////////////////////////////////
BOOL CMsgTeam::Create(OBJID idPlayer, int nAction)
{
	// init
	this->Init();

	// fill info now
	m_unMsgSize	=sizeof(MSG_Info);
	m_unMsgType	=_MSG_TEAM;

	m_pInfo->idPlayer	= idPlayer;
	m_pInfo->unAction	= nAction;
	return true;
}

//////////////////////////////////////////////////////////////////////
BOOL CMsgTeam::Create(char* pbufMsg, DWORD dwMsgSize)
{
	if(!pbufMsg)
		return false;

	memcpy(this->m_bufMsg, pbufMsg, dwMsgSize);
	return true;
}

//////////////////////////////////////////////////////////////////////
void CMsgTeam::Process(void* pInfo)
{
	CUserPtr pUser	= UserManager()->GetUser(this);
	if (!pUser)
		return;

	if (pUser->IsGM() && !pUser->IsPM())
	{
		pUser->SendSysMsg("【GM】不能进行队伍操作。");
		return;
	}

	CGameMap* pMap = pUser->GetMap();
	if (pMap && pMap->IsTeamDisable())
		return;

	switch(m_pInfo->unAction)
	{
	case _MSGTEAM_CREATE:
		{
			DEBUG_TRY
			if (pUser->CreateTeam())
			{
				pUser->SendMsg(this);
			}
			DEBUG_CATCH("MsgTeam proc create team crash.")
		}
		break;
	case _MSGTEAM_APPLYJOIN:
		{
			if (m_pInfo->idPlayer == ID_NONE)
				return;

			if (pUser->GetTeam())
			{
				pUser->SendSysMsg(STR_INTEAM_NOJOIN);
				return;
			}

			OBJID	idTarget = m_pInfo->idPlayer;
			CUser* pTarget = NULL;

			DEBUG_TRY
			if(!pUser->GetMap()->QueryObj(pUser->GetPosX(), pUser->GetPosY(), OBJ_USER, idTarget, IPP_OF(pTarget)))
			{
				pUser->SendSysMsg(STR_NO_APPLICANT);
				return;
			}
			DEBUG_CATCH("MsgTeam apply join Queryobj by ID crash.");

			CTeam* pTeam	= pTarget->GetTeam();
			if (!pTeam)
			{
				pUser->SendSysMsg(STR_NO_TEAM);
				return;
			}

			if (pTeam->IsClosed())
			{
				pUser->SendSysMsg(STR_FORBIDDEN_JOIN);
				return;
			}

			if (pTeam->GetMemberAmount() >= _MAX_TEAMAMOUNT)
			{
				pUser->SendSysMsg(STR_TEAM_FULL);
				return;
			}
			if (!pTarget->IsAlive())
			{
				pUser->SendSysMsg(STR_APPLIED_LEADER_DEAD);
				return;
			}

			DEBUG_TRY
			if (pTeam->GetLeader() != pTarget->GetID())
			{
				pUser->SendSysMsg(STR_NO_CAPTAIN_CLOSE);
				return;
			}
			DEBUG_CATCH("CMsgTeam apply join Queryobj by leader id crash.");

			//if (!pUser->FetchApply(CUser::APPLY_TEAMAPPLY, pTarget->GetID()))
			//{
			pUser->SetApply(CUser::APPLY_TEAMAPPLY, idTarget);
			IF_NOT(this->Create(pUser->GetID(), _MSGTEAM_APPLYJOIN))
				return;
			
			pTarget->SendMsg(this);
			pUser->SendSysMsg(STR_JOIN_REQUEST_SENT);
			/*}
			else
			{
			pUser->SendSysMsg(STR_INVI_SENT);
		}*/
		}
		break;
	case _MSGTEAM_AGREEJOIN:
		{
			if (m_pInfo->idPlayer == ID_NONE)
				return;

			CTeam* pTeam	= pUser->GetTeam();
			if (!pTeam)
			{
				pUser->SendSysMsg(STR_NO_TEAM_TO_INVITE);
				return;
			}
			if (pTeam->GetLeader() != pUser->GetID())
			{
				pUser->SendSysMsg(STR_NOT_CAPTAIN_INVITE);
				return;
			}
			if (pTeam->GetMemberAmount() >= _MAX_TEAMAMOUNT)
			{
				pUser->SendSysMsg(STR_YOUR_TEAM_FULL);
				return;
			}

			OBJID	idTarget = m_pInfo->idPlayer;
			CUser* pTarget = NULL;

			DEBUG_TRY
			if(!pUser->GetMap()->QueryObj(pUser->GetPosX(), pUser->GetPosY(), OBJ_USER, idTarget, IPP_OF(pTarget)))
			{
				pUser->SendSysMsg(STR_APPLICANT_NOT_FOUND);
				return;
			}
			DEBUG_CATCH("CMsgTeam proc accept join Queryobj by idtarget crash.")

			if (pTarget->GetTeam())
			{
				pTarget->SendSysMsg(STR_HAVE_JOIN_TEAM);
				return;
			}

			if (pTarget->FetchApply(CUser::APPLY_TEAMAPPLY, pUser->GetID()))
			{
				pTarget->SetApply(CUser::APPLY_NONE, ID_NONE);
				if (pUser->AcceptTeamMember(pTarget))
				{// MsgTeamMember,全队的信息全队内更新广播
				}
			}
			else
			{
				pUser->SendSysMsg(STR_NOT_TO_JOIN);
			}
		}
		break;
	case _MSGTEAM_INVITE:
		{
			if (m_pInfo->idPlayer == ID_NONE)
				return;

			CTeam* pTeam	= pUser->GetTeam();
			if (!pTeam)
			{
				pUser->SendSysMsg(STR_NOTEAM_TO_INVITE);
				return;
			}

			if (pTeam->IsClosed())
			{
				pUser->SendSysMsg(STR_TEAM_CLOSED);
				return;
			}

			if (pTeam->GetLeader() != pUser->GetID())
			{
				pUser->SendSysMsg(STR_NOT_CAPTAIN_ACCEPT);
				return;
			}

			if (pTeam->GetMemberAmount() >= _MAX_TEAMAMOUNT)
			{
				pUser->SendSysMsg(STR_YOUR_TEAM_FULL);
				return;
			}

			OBJID	idTarget = m_pInfo->idPlayer;
			CUser* pTarget = NULL;

			DEBUG_TRY
			if(!pUser->GetMap()->QueryObj(pUser->GetPosX(), pUser->GetPosY(), OBJ_USER, idTarget, IPP_OF(pTarget)))
			{
				pUser->SendSysMsg(STR_INVITED_NOT_FOUND);
				return;
			}
			DEBUG_CATCH("CMsgTeam proc invite queryobj by id crash.");

			if (pTarget->GetTeam())
			{
				pUser->SendSysMsg(STR_HAS_IN_TEAM);
				return;
			}
			if (!pTarget->IsAlive())
			{
				pUser->SendSysMsg(STR_INVITED_IS_DEAD);
				return;
			}

			//if (!pUser->FetchApply(CUser::APPLY_TEAMINVIT, pTarget->GetID()))
			//
			pUser->SetApply(CUser::APPLY_TEAMINVIT, pTarget->GetID());
			IF_NOT(this->Create(pUser->GetID(), _MSGTEAM_INVITE))
				return;
			
			pTarget->SendMsg(this);
			pUser->SendSysMsg(STR_INVITE_SENT);
		}
		break;
	case _MSGTEAM_ACCEPTINVITE:
		{
			if (m_pInfo->idPlayer == ID_NONE)
				return;

			if (pUser->GetTeam())
			{
				//pUser->SendSysMsg("[队伍]您已经是队员了,不能接受邀请加入新队伍。");
				return;
			}

			OBJID	idTarget = m_pInfo->idPlayer;
			CUser* pTarget = NULL;

			DEBUG_TRY
			if(!pUser->GetMap()->QueryObj(pUser->GetPosX(), pUser->GetPosY(), OBJ_USER, idTarget, IPP_OF(pTarget)))
			{
				//pUser->SendSysMsg("[队伍]没有找到邀请者。");
				return;
			}
			DEBUG_CATCH("CMsgTeam proc accept invite queryobj by id crash.")

			CTeam* pTeam	= pTarget->GetTeam();
			if (!pTeam)
			{
				pUser->SendSysMsg(STR_NOT_CREATE_TEAM);
				return;
			}
			if (pTeam->GetMemberAmount() >= _MAX_TEAMAMOUNT)
			{
				pUser->SendSysMsg(STR_HIS_TEAM_FULL);
				return;
			}

			if (pTeam->GetLeader() != pTarget->GetID())
			{
				pUser->SendSysMsg(STR_NO_CAPTAIN_CLOSE);
				return;
			}

			if (pTarget->FetchApply(CUser::APPLY_TEAMINVIT, pUser->GetID()))
			{
				pTarget->SetApply(CUser::APPLY_NONE, ID_NONE);
				if (pUser->AcceptTeamInvit(pTarget))
				{// MsgTeamMember,全队的信息全队内更新广播
				}
			}
			else
			{
				pUser->SendSysMsg(STR_NOT_BE_INVIITED);
			}
		}
		break;
	case _MSGTEAM_LEAVE:
		{
			DEBUG_TRY
			CTeam* pTeam	= pUser->GetTeam();
			if (!pTeam)
			{
			//	pUser->SendSysMsg("[队伍]您还不是队员,不能退出队伍。");
				return;
			}

			m_pInfo->idPlayer	= pUser->GetID();
			pUser->QuitTeam();
			DEBUG_CATCH("CMsgTeam proc quitteam crash.")
		}
		break;
	case _MSGTEAM_DISMISS:
		{
			DEBUG_TRY
			CTeam* pTeam	= pUser->GetTeam();
			if (!pTeam)
			{
			//	pUser->SendSysMsg("[队伍]您还没有队伍,不能解散队伍。");
				return;
			}
			if (pTeam->GetLeader() != pUser->GetID())
			{
			//	pUser->SendSysMsg("[队伍]您不是队长,不能解散队伍。");
				return;
			}

			pUser->DismissTeam();
			DEBUG_CATCH("CMsgTeam proc dismiss crash.")
		}
		break;
	case _MSGTEAM_OPENTEAM:
		{
			CTeam* pTeam	= pUser->GetTeam();
			if (!pTeam)
			{
			//	pUser->SendSysMsg("[队伍]您没有队伍。");
				return;
			}
			
			pTeam->Open();
		}
		break;
	case _MSGTEAM_CLOSETEAM:
		{
			CTeam* pTeam	= pUser->GetTeam();
			if (!pTeam)
			{
			//	pUser->SendSysMsg("[队伍]您没有队伍。");
				return;
			}
			
			pTeam->Close();
		}
		break;
	case _MSGTEAM_KICKOUT:
		{
			CTeam* pTeam	= pUser->GetTeam();
			if (!pTeam)
			{
			//	pUser->SendSysMsg("[队伍]您没有队伍。");
				return;
			}

			if(pUser->GetID() != m_pInfo->idPlayer)		// 不能开除自己
				pUser->KickOut(m_pInfo->idPlayer);
		}
		break;
	case _MSGTEAM_CLOSEMONEYACCESS:
		{
			CTeam* pTeam	= pUser->GetTeam();
			if (!pTeam)
				return;

			pTeam->CloseMoney();
		}
		break;
	case _MSGTEAM_OPENMONEYACCESS:
		{
			CTeam* pTeam	= pUser->GetTeam();
			if (!pTeam)
				return;

			pTeam->OpenMoney();
		}
		break;
	case _MSGTEAM_CLOSEITEMACCESS:
		{
			CTeam* pTeam	= pUser->GetTeam();
			if (!pTeam)
				return;

			pTeam->CloseItem();
		}
		break;
	case _MSGTEAM_OPENITEMACCESS:
		{
			CTeam* pTeam	= pUser->GetTeam();
			if (!pTeam)
				return;

			pTeam->OpenItem();
		}
		break;
	case _MSGTEAM_CLOSEGEMACCESS:
		{
			CTeam* pTeam	= pUser->GetTeam();
			if (!pTeam)
				return;

			pTeam->CloseGemAccess();
		}
		break;
	case _MSGTEAM_OPENGEMACCESS:
		{
			CTeam* pTeam	= pUser->GetTeam();
			if (!pTeam)
				return;

			pTeam->OpenGemAccess();
		}
		break;
	}
}

⌨️ 快捷键说明

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