Files
mir_server/server/LogicServer/base/ScriptNetmsgDispatcher.cpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

60 lines
1.6 KiB
C++

#include "StdAfx.h"
#include "ScriptNetmsgDispatcher.h"
static NetMsgHandle s_net_msg_handles[256][256] = { 0 };
void ScriptNetMsgHandle(CActor* pActor, INT_PTR nSystemID, INT_PTR nCmd, CDataPacketReader& pack)
{
static CNpc* gp = GetGlobalLogicEngine()->GetGlobalNpc();
CScriptValueList paramList, retList;
paramList << nSystemID;
paramList << nCmd;
paramList << pActor;
paramList << &pack;
bool ret = gp->GetScript().Call("OnNetMsg", paramList, retList);
if (!ret)
{
//脚本错误,将以模态对话框的形式呈现给客户端
const RefString& s = gp->GetScript().getLastErrorDesc();
if (pActor) pActor->SendTipmsg((const char*)s, ttDialog);
}
return;
}
void NetMsgDispatcher::Init()
{
memset(s_net_msg_handles,0,sizeof(s_net_msg_handles));
OutputMsg(rmTip,_T("[NetmsgDispatcher] Initialization!"));
}
bool NetMsgDispatcher::ProcessNetMsg(CActor* pActor, INT_PTR nSystemID, INT_PTR nCmd, CDataPacket& pack)
{
if (nSystemID > 255 || nCmd > 255) return false;
if (s_net_msg_handles[nSystemID][nCmd])
{
CDataPacketReader dp(pack.getOffsetPtr(), pack.getAvaliableLength());
s_net_msg_handles[nSystemID][nCmd](pActor, nSystemID, nCmd, dp);
return true;
}
return false;
}
bool NetMsgDispatcher::RegistNetMsgHandle(INT_PTR nSystemID, INT_PTR nCmd, NetMsgHandle func)
{
if (nSystemID < 0 || nSystemID > 255 || nCmd < 0 || nCmd > 255)
{
OutputMsg(rmError, "RegisterNetMsgHandle error. (%d,%d)", nSystemID, nCmd);
return false;
}
s_net_msg_handles[nSystemID][nCmd] = func;
return true;
}
bool NetMsgDispatcher::RegisterScriptMsg(INT_PTR nSystemID, INT_PTR nCmd)
{
return RegistNetMsgHandle(nSystemID, nCmd, ScriptNetMsgHandle);
}