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

📄 mapgroupkernel.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
📖 第 1 页 / 共 2 页
字号:
							pUser->QueryChangeTeam()->SendInfo(idSocket, idAgent);
					}
				}
				break;
			case	CHANGETEAM_FLY:
				{
					DEADLOOP_CHECK(PID, "MAPGROUP_CHANGETEAM: CHANGETEAM_FLY")
					OBJID	idMap = pPacket->idTeam;
					CUser* pUser = UserManager()->GetUser(pPacket->idUser);
					if(pUser && pUser->IsAlive())
						pUser->FlyMap(idMap, LOWORD(pPacket->nData), HIWORD(pPacket->nData));
				}
				break;
			}
		}
		break;
	// syndicate -------------------------------------------------------------------------------
	case	KERNEL_CREATESYNDICATE:
		{
			DEADLOOP_CHECK(PID, "KERNEL_CREATESYNDICATE")
			CreateSyndicateInfo* pPacket = (CreateSyndicateInfo*)buf;
			SynManager()->QuerySynchro()->CreateSyndicate(pPacket);
		}
		break;
	case	KERNEL_DESTROYSYNDICATE:
		{
			DEADLOOP_CHECK(PID, "KERNEL_DESTROYSYNDICATE")
			OBJID*	pId		= (OBJID*)buf;
			OBJID	idSyn	= pId[0];
			OBJID	idTarget= pId[1];
			SynManager()->QuerySynchro()->DestroySyndicate(idSyn, idTarget);
		}
		break;
	case	KERNEL_COMBINESYNDICATE:
		{
			DEADLOOP_CHECK(PID, "KERNEL_COMBINESYNDICATE")
			OBJID*	pId		= (OBJID*)buf;
			OBJID idSyn		= pId[0];
			OBJID idTarget	= pId[1];
			SynManager()->QuerySynchro()->CombineSyndicate(idSyn, idTarget);
		}
		break;
	case	KERNEL_CHANGESYNDICATE:
		{
			DEADLOOP_CHECK(PID, "KERNEL_CHANGESYNDICATE")
			SynFuncInfo0* pPacket = (SynFuncInfo0*)buf;
			CSynPtr pSyn = SynManager()->QuerySyndicate(pPacket->idSyn);
			if(pSyn)
				pSyn->ChangeSyndicate(pPacket);
		}
		break;
	case	MAPGROUP_SETMAPSYNID:
		{
			DEADLOOP_CHECK(PID, "MAPGROUP_SETMAPSYNID")
			OBJID*	pId		= (OBJID*)buf;
			OBJID idMap		= pId[0];
			OBJID idSyn		= pId[1];
			SynManager()->QuerySynchro()->SetMapSynID(idMap, idSyn);
		}
		break;
	case	MAPGROUP_CHANGENPC:
		{
			DEADLOOP_CHECK(PID, "MAPGROUP_CHANGENPC")
			char* ptr = (char*)buf;
			OBJID idNpc = *(int*)ptr;
			char* pszField = ptr + sizeof(int);
			char* pszData = pszField + strlen(pszField) + 1;
			int	  nData = atol(pszData);
			bool	bUpdate = UPDATE_FALSE;

			IRole*	pRole = RoleManager()->QueryRole(idNpc);
			if(!pRole)
				return false;

			CNpc*	pTarget;
			IF_NOT(pRole->QueryObj(OBJ_NPC, IPP_OF(pTarget)))
				return false;

			if(stricmp(pszField, "lookface") == 0)
			{
				//if(strcmp(szOpt, "=") == 0)
				{
					pTarget->SetInt(NPCDATA_LOOKFACE, nData, bUpdate);
					return true;
				}
			}
			else if(stricmp(pszField, "datastr") == 0)
			{
				//if(strcmp(szOpt, "=") == 0)
				{
					pTarget->SetStr(NPCDATA_DATASTR, pszData, _MAX_NAMESIZE, bUpdate);
					return true;
				}
			}
			else if(strnicmp(pszField, "data", 4) == 0)
			{
				int idx = (*(pszField+4) - '0');
				if(idx < 0 || idx >= MAX_NPCDATA)
					return false;
				//if(strcmp(szOpt, "=") == 0)
				{
					pTarget->SetData(idx, nData, bUpdate);
					return true;
				}
			}
		}
		break;
	case	MAPGROUP_DELTRANSNPC:
		{
			DEADLOOP_CHECK(PID, "MAPGROUP_DELTRANSNPC")
			OBJID idMastNpc = *(OBJID*)buf;
			MapGroup(PID)->QueryIntraMsg()->DelTransNpc(idMastNpc, false);		// false: no brocast to other mapgroup
		}
		break;
	case	KERNEL_SUPERMANLIST:
		{
			DEADLOOP_CHECK(PID, "KERNEL_SUPERMANLIST")
			VARIANT_SET0* pInfo = (VARIANT_SET0*)buf;
			CUser* pUser = UserManager()->GetUser(pInfo->IntParam(0));
			if(pUser)
				pUser->SynchroSupermanOrder(pInfo->IntParam(1));
		}
		break;

	default:
		ASSERT(!"CWorldKernel::ProcessMsg()");
	}

	return true;		// return false : 消息处理异常,程序关闭。
}

//////////////////////////////////////////////////////////////////////
bool CMapGroupKernel::OnTimer(time_t tCurr)
{
	// TODO: 请在此添加时钟处理代码
	MapGroup(PID)->OnTimer(tCurr);

	return true;		// return false : 消息处理异常,程序关闭。
}

//////////////////////////////////////////////////////////////////////
bool CMapGroupKernel::ProcessClientMsg(SOCKET_ID idSocket, OBJID idMsg, const char *pbufMsg, int nSize, int nTrans)
{
	// TODO: 请在此添加客户端上传消息的处理代码
	if(!pbufMsg || nSize <= 0 || nSize >_MAX_MSGSIZE)
        return false;
	DEADLOOP_CHECK(PID, "ProcessClientMsg: ")

	CNetMsg* pMsg	=CNetMsg::CreateClientMsg(m_idProcess, idSocket, idMsg, pbufMsg, nSize, nTrans);
	if(pMsg)
	{
		try {
			clock_t tStart = clock();

			// msg count
			CUserPtr pUser = UserManager()->GetUser(pMsg);
			if (pUser)
				pUser->m_dwMsgCount++;

			// msg process
			pMsg->Process(this);

			clock_t tUsed = clock()-tStart;
			extern struct STAT_STRUCT	g_stat;
			if(tUsed > g_stat.setDebug[0])
			{
				InterlockedExchange(&g_stat.setDebug[0], tUsed);		// debug
//				InterlockedExchange(&g_stat.setDebug[3], idMsg);		// debug
			}
		}
		catch(...)
		{
//			CNetMsg::DumpMsg(pMsg);
			ASSERT(!"catch");
			::LogSave("exception catch at CGameSocket::ProcessClientMsg()! MsgType:%d, SocketID:%u", idMsg, idSocket);
		}
		SAFE_DELETE(pMsg);
	}

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CMapGroupKernel::BroadcastMapGroupMsg(SOCKET_ID idSocket, OBJID idMsg, const char *pbufMsg, int nSize)
{
	if(!pbufMsg || nSize <= 0 || nSize >_MAX_MSGSIZE)
        return false;
	DEADLOOP_CHECK(PID, "BroadcastMapGroupMsg: ")

	int nTransmit = 0;
	CNetMsg* pMsg	=CNetMsg::CreateClientMsg(m_idProcess, idSocket, idMsg, pbufMsg, nSize, nTransmit);
	if(pMsg)
	{
		try {
			RoleManager()->BroadcastMapGroupMsg(pMsg);
		}
		catch(...)
		{
//			CNetMsg::DumpMsg(pMsg);
			ASSERT(!"catch");
			::LogSave("exception catch at CGameSocket::ProcessMsg()! MsgType:%d, SocketID:%u", idMsg, idSocket);
		}
		SAFE_DELETE(pMsg);
	}

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CMapGroupKernel::SendMsg(CNetMsg* pNetMsg)
{
	ASSERT(pNetMsg);
	if(!pNetMsg)
		return false;

	if(!pNetMsg->IsNpcMsg())
		return SendMsg(pNetMsg->GetSocketID(), pNetMsg->GetType(), pNetMsg->GetBuf(), pNetMsg->GetSize());
	else
		return SendNpcMsg(pNetMsg->GetNpcID(), pNetMsg->GetType(), pNetMsg->GetBuf(), pNetMsg->GetSize());
}

//////////////////////////////////////////////////////////////////////
bool CMapGroupKernel::SendMsg(SOCKET_ID idSocket, OBJID idMsg, const char *pBuf, int nMsgLen)
{
	// TODO: 请在此添加客户端下传消息的代码
	if (!pBuf)
	{
		::LogSave("Error: null msg point found in CGameSocket::SendMsg.");
		return false;
	}

	if (_MSG_NONE == idMsg)
	{
		::LogSave("Error: invalid msg type in CGameSocket::SendMsg().");
		return false;
	}

	try {
		char	bufPacket[MAX_MESSAGESIZE];
		SENDCLIENTMSG_PACKET0* pPacket = (SENDCLIENTMSG_PACKET0*)bufPacket;
		pPacket->idSocket	= idSocket;
		pPacket->idPacket	= idMsg;
		pPacket->nSize		= nMsgLen;
		memcpy(pPacket->buf, pBuf, nMsgLen);
		m_pMsgPort->Send(MSGPORT_SOCKET, SOCKET_SENDCLIENTMSG, STRUCT_TYPE(bufPacket), &bufPacket);
		return true;
	}
	catch(...)
	{
		ASSERT(!"catch");
		::LogSave("Error: exception catched in CGameSocket::SendMsg(%d).", idMsg);
		return false;
	}			

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CMapGroupKernel::ProcessNpcMsg(OBJID idNpc, OBJID idMsg, const char *pbufMsg, int nSize, int nTrans)
{
	// TODO: 请在此添加NPC服务器上传消息的处理代码
	if(!pbufMsg || nSize <= 0 || nSize >_MAX_MSGSIZE)
        return false;
	DEADLOOP_CHECK(PID, "ProcessNpcMsg: ")

	CNetMsg* pMsg	=CNetMsg::CreateNpcMsg(m_idProcess, idNpc, idMsg, pbufMsg, nSize, nTrans);
	if(pMsg)
	{
		try {
			pMsg->Process(this);
		}
		catch(...)
		{
//			CNetMsg::DumpMsg(pMsg);
			ASSERT(!"catch");
			::LogSave("exception catch at CGameSocket::ProcessNpcMsg()! MsgType:%d, NpcID:%u", idMsg, idNpc);
		}
		SAFE_DELETE(pMsg);
	}

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CMapGroupKernel::SendNpcMsg(OBJID idNpc, OBJID idMsg, const char *pBuf, int nMsgLen)
{
	// TODO: 请在此添加NPC服务器下传消息的代码
	if (!pBuf)
	{
		::LogSave("Error: null msg point found in CGameSocket::SendNpcMsg.");
		return false;
	}

	if (_MSG_NONE == idMsg)
	{
		::LogSave("Error: invalid msg type in CGameSocket::SendNpcMsg().");
		return false;
	}

	try {
		char	bufPacket[MAX_MESSAGESIZE];
		SENDNPCMSG_PACKET0* pPacket = (SENDNPCMSG_PACKET0*)bufPacket;
		pPacket->idNpc		= idNpc;
		pPacket->idPacket	= idMsg;
		pPacket->nSize		= nMsgLen;
		memcpy(pPacket->buf, pBuf, nMsgLen);
		m_pMsgPort->Send(MSGPORT_SOCKET, SOCKET_SENDNPCMSG, STRUCT_TYPE(bufPacket), &bufPacket);
		return true;
	}
	catch(...)
	{
		ASSERT(!"catch");
		::LogSave("Error: exception catched in CGameSocket::SendNpcMsg().");
		return false;
	}			

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CMapGroupKernel::CloseSocket(SOCKET_ID idSocket)		// 直接关闭socket
{
	// TODO: 请在此添加关闭客户端SOCKET的代码
	m_pMsgPort->Send(MSGPORT_SOCKET, SOCKET_BREAKCONNECT, VARTYPE_INT, &idSocket);

	return true;
}

///////////////////////////////////////////////////////////////////////////////////////
void CMapGroupKernel::SynchroData()
{
	CGameMap* pMap = MapManager()->QueryMap(SET_WHITE_SYN);
	if(pMap)
		_SynManager(PID)->QueryModify()->SetMapSynID(pMap->GetID(), pMap->GetOwnerID());
	 pMap = MapManager()->QueryMap(SET_BLACK_SYN);
	if(pMap)
		_SynManager(PID)->QueryModify()->SetMapSynID(pMap->GetID(), pMap->GetOwnerID());
}

///////////////////////////////////////////////////////////////////////////////////////
// global entry
///////////////////////////////////////////////////////////////////////////////////////
IMapGroup* IMapGroup::CreateNew()
{
	return new CMapGroupKernel;
}

⌨️ 快捷键说明

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