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