📄 mapgroup.cpp
字号:
struct tm time0, time1;
memset(&time0, 0L, sizeof(tm));
memset(&time1, 0L, sizeof(tm));
time0.tm_year =pTime->tm_year;
time0.tm_mon =pTime->tm_mon;
time0.tm_mday =nDay0;
time0.tm_hour =nHour0;
time0.tm_min =nMinute0;
time0.tm_isdst =pTime->tm_isdst;
time1.tm_year =pTime->tm_year;
time1.tm_mon =pTime->tm_mon;
time1.tm_mday =nDay1;
time1.tm_hour =nHour1;
time1.tm_min =nMinute1;
time1.tm_isdst =pTime->tm_isdst;
time_t t0 =mktime(&time0);
time_t t1 =mktime(&time1);
if (ltime >= t0 && ltime<= t1)
return true;
}
}
else if (dwType == 3) //周时间
{
if (6 == sscanf(pszParam, "%d %d:%d %d %d:%d",
&nDay0, &nHour0, &nMinute0,
&nDay1, &nHour1, &nMinute1))
{
DWORD timeNow =nCurWeekDay*24*60+nCurHour*60+nCurMinute;
if (timeNow >= nDay0*24*60+nHour0*60+nMinute0 &&
timeNow <= nDay1*24*60+nHour1*60+nMinute1)
{
return true;
}
}
}
else if (dwType == 4) //日时间
{
if (4 == sscanf(pszParam, "%d:%d %d:%d",
&nHour0, &nMinute0,
&nHour1, &nMinute1))
{
DWORD timeNow =nCurHour*60+nCurMinute;
if (timeNow >= nHour0*60+nMinute0 &&
timeNow <= nHour1*60+nMinute1)
{
return true;
}
}
}
else if (dwType == 5) //小时时间
{
if (2 == sscanf(pszParam, "%d %d",
&nMinute0,
&nMinute1))
{
if (nCurMinute >= nMinute0 && nCurMinute <= nMinute1)
{
return true;
}
}
}
return false;
}
//////////////////////////////////////////////////////////////////////
void CMapGroup::ProcessEvent(void)
{
CONST OBJID ID_EVENT_BEGIN = 2000000;
CONST DWORD MAX_EVENT = 100;
OBJID idBegin = ID_EVENT_BEGIN+m_idProcess*10000;
for (OBJID id=idBegin; id<idBegin+MAX_EVENT; id++)
{
//this->ProcessAction(id);
if (ActionSet()->GetObj(id))
GameAction()->ProcessAction(id);
}
}
//////////////////////////////////////////////////////////////////////
bool CMapGroup::SendClientMsg(SOCKET_ID idSocket, CNetMsg* pMsg)
{
pMsg->AppendInfo(m_idProcess, idSocket, ID_NONE);
return m_pSocket->SendMsg(pMsg);
}
//////////////////////////////////////////////////////////////////////
bool CMapGroup::SendNpcMsg(OBJID idNpc, CNetMsg* pMsg)
{
pMsg->AppendInfo(m_idProcess, SOCKET_NONE, idNpc);
return m_pSocket->SendMsg(pMsg);
}
//////////////////////////////////////////////////////////////////////
bool CMapGroup::SendBroadcastMsg(CNetMsg* pMsg)
{
for(int i = MSGPORT_MAPGROUP_FIRST; i < m_pMsgPort->GetSize(); i++)
{
if(i != m_idProcess) // 不回送
{
MESSAGESTR buf;
CLIENTMSG_PACKET0* pPacket = (CLIENTMSG_PACKET0*)buf;
pPacket->idSocket = pMsg->GetSocketID();
pPacket->idPacket = pMsg->GetType();
memcpy(pPacket->buf, pMsg->GetBuf(), pMsg->GetSize());
pPacket->nSize = pMsg->GetSize();
m_pMsgPort->Send(i, MAPGROUP_BROADCASTMSG, STRUCT_TYPE(buf), pPacket);
}
}
return true;
}
//////////////////////////////////////////////////////////////////////
// 广播给其它地图组核心处理
bool CMapGroup::TransmitMsg(CNetMsg* pMsg, SOCKET_ID idSocket, OBJID idNpc)
{
ASSERT(idSocket != SOCKET_NONE || idNpc != ID_NONE);
MESSAGESTR buf;
TRANSMSG_PACKET0* pPacket = (TRANSMSG_PACKET0*)buf;
pPacket->idSocket = idSocket;
pPacket->idNpc = idNpc;
pPacket->idPacket = pMsg->GetType();
memcpy(pPacket->buf, pMsg->GetBuf(), pMsg->GetSize());
pPacket->nSize = pMsg->GetSize();
pPacket->nTrans = pMsg->GetTransData();
for(int i = MSGPORT_MAPGROUP_FIRST; i < m_pMsgPort->GetSize(); i++)
{
if(i != m_idProcess) // 不回送
m_pMsgPort->Send(i, MAPGROUP_TRANSMITMSG, STRUCT_TYPE(buf), pPacket);
}
return true;
}
//////////////////////////////////////////////////////////////////////
// 广播给其它地图组核心处理
void CMapGroup::RemoteCall(REMOTE_CALL0* pInfo,bool bSendToLocal)
{
for(int i = MSGPORT_MAPGROUP_FIRST; i < m_pMsgPort->GetSize(); i++)
{
if (i != m_idProcess || bSendToLocal)
m_pMsgPort->Send(i, MAPGROUP_REMOTECALL, BUFFER_TYPE(pInfo->nSize), pInfo);
}
}
//////////////////////////////////////////////////////////////////////
// 广播给世界核心处理
bool CMapGroup::TransmitWorldMsg(CNetMsg* pMsg)
{
MESSAGESTR buf;
TRANSMSG_PACKET0* pPacket = (TRANSMSG_PACKET0*)buf;
pPacket->idSocket = pMsg->GetSocketID();
pPacket->idNpc = pMsg->GetNpcID();
pPacket->idPacket = pMsg->GetType();
memcpy(pPacket->buf, pMsg->GetBuf(), pMsg->GetSize());
pPacket->nSize = pMsg->GetSize();
pPacket->nTrans = pMsg->GetTransData();
m_pMsgPort->Send(MSGPORT_WORLD, WORLD_TRANSMITMSG, STRUCT_TYPE(buf), pPacket);
return true;
}
//////////////////////////////////////////////////////////////////////
// 通过世界核心转发给玩家
bool CMapGroup::TransmitWorldMsg(CNetMsg* pMsg, LPCTSTR szName)
{
MESSAGESTR buf;
USERNAMEMSG_PACKET0* pPacket = (USERNAMEMSG_PACKET0*)buf;
pPacket->idSocket = pMsg->GetSocketID();
pPacket->idPacket = pMsg->GetType();
memcpy(pPacket->buf, pMsg->GetBuf(), pMsg->GetSize());
pPacket->nSize = pMsg->GetSize();
SafeCopy(pPacket->szName, szName, _MAX_NAMESIZE);
m_pMsgPort->Send(MSGPORT_WORLD, WORLD_USERNAMEMSG, STRUCT_TYPE(buf), pPacket);
return true;
}
//////////////////////////////////////////////////////////////////////
// 通过世界核心转发给玩家
bool CMapGroup::TransmitWorldMsg(CNetMsg* pMsg, OBJID idUser)
{
MESSAGESTR buf;
USERIDMSG_PACKET0* pPacket = (USERIDMSG_PACKET0*)buf;
pPacket->idSocket = pMsg->GetSocketID();
pPacket->idPacket = pMsg->GetType();
memcpy(pPacket->buf, pMsg->GetBuf(), pMsg->GetSize());
pPacket->nSize = pMsg->GetSize();
pPacket->idUser = idUser;
m_pMsgPort->Send(MSGPORT_WORLD, WORLD_USERIDMSG, STRUCT_TYPE(buf), pPacket);
return true;
}
//////////////////////////////////////////////////////////////////////
bool CMapGroup::SendSocketUserInfo(PROCESS_ID idProcess, SOCKET_ID idSocket, UserInfoStruct* pInfo)
{
// 通知另一地图组
MESSAGESTR buf;
ST_USERCHANGEMAPGORUP* pPacket = (ST_USERCHANGEMAPGORUP*)buf;
pPacket->idSocket = idSocket;
memcpy(&pPacket->info, pInfo, sizeof(UserInfoStruct));
return m_pMsgPort->Send(idProcess, MAPGROUP_SOCKETUSERINFO, STRUCT_TYPE(ST_USERCHANGEMAPGORUP), &buf);
}
//////////////////////////////////////////////////////////////////////
bool CMapGroup::SendObjInfo(PROCESS_ID idProcess, OBJID idUser, INFO_ID nInfoID, void* pInfo, int nSize)
{
CHECKF(nInfoID > INFO_NONE && nInfoID < 20); // 20 最多20种INFO
MESSAGESTR buf;
CHANGEMAPGORUP_INFO0* pPacket = (CHANGEMAPGORUP_INFO0*)buf;
pPacket->idUser = idUser;
pPacket->nInfoType = nInfoID;
memcpy(&pPacket->info, pInfo, nSize);
return m_pMsgPort->Send(idProcess, MAPGROUP_SENDOBJINFO, STRUCT_TYPE(buf), pPacket);
}
//////////////////////////////////////////////////////////////////////
bool CMapGroup::SetNpcProcessID(OBJID idNpc, bool bAddNew)
{
CHANGE_NPCPROCESSID buf;
buf.idNpc = idNpc;
if(bAddNew)
buf.idProcess = m_idProcess;
else
buf.idProcess = PROCESS_NONE;
return m_pMsgPort->Send(MSGPORT_SOCKET, SOCKET_SETNPCPROCESSID, STRUCT_TYPE(CHANGE_NPCPROCESSID), &buf);
}
//////////////////////////////////////////////////////////////////////
bool CMapGroup::ChangeMapGroup(PROCESS_ID idProcess, OBJID idUser, OBJID idMap, int nPosX, int nPosY)
{
ST_CHANGEMAPGROUP st;
st.idUser = idUser;
st.idMap = idMap;
st.nPosX = nPosX;
st.nPosY = nPosY;
return m_pMsgPort->Send(idProcess, MAPGROUP_CHANGEMAPGROUP, STRUCT_TYPE(ST_CHANGEMAPGROUP), &st);
}
//////////////////////////////////////////////////////////////////////
bool CMapGroup::PrintText (LPCTSTR szText)
{
return m_pMsgPort->Send(MSGPORT_SHELL, SHELL_PRINTTEXT, STRING_TYPE(szText), szText);
}
//////////////////////////////////////////////////////////////////////
bool CMapGroup::CloseMapGroup(SOCKET_ID idGmSocket) // 关闭所有socket(除GM),禁止登录
{
// TODO: 请在此添加关闭客户端SOCKET的代码
return m_pMsgPort->Send(MSGPORT_SOCKET, SOCKET_BREAKALLCONNECT, VARTYPE_INT, &idGmSocket);
RoleManager()->SaveAll();
}
//////////////////////////////////////////////////////////////////////
bool CMapGroup::ChangeTeam(int nAction, OBJID idTeam, OBJID idUser, int nData) // 组队相关
{
ST_CHANGETEAM st;
st.nAction = nAction;
st.idTeam = idTeam;
st.idUser = idUser;
st.nData = nData;
for(int i = MSGPORT_MAPGROUP_FIRST; i < m_pMsgPort->GetSize(); i++)
{
if(i != m_idProcess) // 不回送
m_pMsgPort->Send(i, MAPGROUP_CHANGETEAM, STRUCT_TYPE(st), &st);
}
return true;
}
//////////////////////////////////////////////////////////////////////
void CMapGroup::ModifyNpc(OBJID idNpc, LPCTSTR szField, LPCTSTR szData)
{
char buf[1024];
char* ptr = buf;
*(int*)ptr = idNpc;
ptr += sizeof(int);
strcpy(ptr, szField);
ptr = ptr + strlen(szField) + 1;
strcpy(ptr, szData);
ptr = ptr + strlen(szData) + 1;
for(int i = MSGPORT_MAPGROUP_FIRST; i < m_pMsgPort->GetSize(); i++)
{
if(i != m_idProcess) // 不回送
m_pMsgPort->Send(i, MAPGROUP_CHANGENPC, BUFFER_TYPE(ptr - buf), buf);
}
}
//////////////////////////////////////////////////////////////////////
void CMapGroup::DelTransNpc(OBJID idMasterNpc, bool bBroadcast)
{
for(IRoleSet::Iter i = RoleManager()->QuerySet()->Begin(); i != RoleManager()->QuerySet()->End(); i++)
{
IRole* pRole = RoleManager()->QuerySet()->GetObjByIter(i);
if(pRole)
{
CNpc* pNpc;
if(pRole->QueryObj(OBJ_NPC, IPP_OF(pNpc)))
{
if(pNpc->GetType() == _SYNTRANS_NPC && pNpc->GetInt(NPCDATA_LINKID) == idMasterNpc)
ASSERT(pNpc->DelNpc());
}
}
}
if(bBroadcast)
{
for(int i = MSGPORT_MAPGROUP_FIRST; i < m_pMsgPort->GetSize(); i++)
{
if(i != m_idProcess) // 不回送
m_pMsgPort->Send(i, MAPGROUP_DELTRANSNPC, VARTYPE_INT, &idMasterNpc);
}
}
}
//////////////////////////////////////////////////////////////////////
void CMapGroup::ChangeCode (SOCKET_ID idSocket, DWORD dwData)
{
CHANGE_USERDATA st;
st.idSocket = idSocket;
st.nData = dwData;
m_pMsgPort->Send(MSGPORT_SOCKET, SOCKET_CHANGECODE, STRUCT_TYPE(CHANGE_USERDATA), &st);
}
//////////////////////////////////////////////////////////////////////
void CMapGroup::SendRpc(const CEventPack& pack)
{
for(int i = MSGPORT_MAPGROUP_FIRST; i < m_pMsgPort->GetSize(); i++)
{
if(i != m_idProcess) // 不回送
m_pMsgPort->Send(i, MAPGROUP_RPC, BUFFER_TYPE(pack.GetSize()), pack.GetBuf());
}
}
//////////////////////////////////////////////////////////////////////
// syndicate
//////////////////////////////////////////////////////////////////////
bool CMapGroup::CreateSyndicate (const CreateSyndicateInfo* pInfo)
{
return m_pMsgPort->Send(MSGPORT_WORLD, KERNEL_CREATESYNDICATE, STRUCT_TYPE(CreateSyndicateInfo), pInfo);
}
//////////////////////////////////////////////////////////////////////
bool CMapGroup::DestroySyndicate(OBJID idSyn, OBJID idTarget)
{
OBJID setID[2];
setID[0] = idSyn;
setID[1] = idTarget;
return m_pMsgPort->Send(MSGPORT_WORLD, KERNEL_DESTROYSYNDICATE, STRUCT_TYPE(setID), &setID);
}
//////////////////////////////////////////////////////////////////////
bool CMapGroup::CombineSyndicate(OBJID idSyn, OBJID idTarget)
{
OBJID setID[2];
setID[0] = idSyn;
setID[1] = idTarget;
return m_pMsgPort->Send(MSGPORT_WORLD, KERNEL_COMBINESYNDICATE, STRUCT_TYPE(setID), &setID);
}
//////////////////////////////////////////////////////////////////////
bool CMapGroup::ChangeSyndicate (const SynFuncInfo0* pFuncInfo)
{
return m_pMsgPort->Send(MSGPORT_WORLD, KERNEL_CHANGESYNDICATE, BUFFER_TYPE(pFuncInfo->nSize), pFuncInfo);
}
//////////////////////////////////////////////////////////////////////
void CMapGroup::SetMapSynID(OBJID idMap, OBJID idSyn)
{
OBJID setID[2];
setID[0] = idMap;
setID[1] = idSyn;
for(int i = MSGPORT_MAPGROUP_FIRST; i < m_pMsgPort->GetSize(); i++)
{
if(i != m_idProcess) // 不回送
m_pMsgPort->Send(i, MAPGROUP_SETMAPSYNID, STRUCT_TYPE(setID), &setID);
}
}
//////////////////////////////////////////////////////////////////////
int CMapGroup::GetMapGroupAmount()
{
CHECKF(m_pMsgPort);
return m_pMsgPort->GetSize() - MSGPORT_MAPGROUP_FIRST + 1;
}
//////////////////////////////////////////////////////////////////////
void CMapGroup::LevelUp (OBJID idUser, int nLevel)
{
m_pMsgPort->Send(MSGPORT_WORLD, WORLD_LEVELUP, VARTYPE_INT, &idUser);
}
//////////////////////////////////////////////////////////////////////
void CMapGroup::QueryFee (OBJID idAccount)
{
m_pMsgPort->Send(MSGPORT_WORLD, WORLD_QUERYFEE, VARTYPE_INT, &idAccount);
}
bool CMapGroup::TransmitWorldMsg(SOCKET_ID idSocket,CNetMsg *pMsg)
{
MESSAGESTR buf;
TRANSMSG_PACKET0* pPacket = (TRANSMSG_PACKET0*)buf;
pPacket->idSocket = idSocket;
pPacket->idNpc = pMsg->GetNpcID();
pPacket->idPacket = pMsg->GetType();
memcpy(pPacket->buf, pMsg->GetBuf(), pMsg->GetSize());
pPacket->nSize = pMsg->GetSize();
pPacket->nTrans = pMsg->GetTransData();
m_pMsgPort->Send(MSGPORT_WORLD, WORLD_TRANSMITMSG, STRUCT_TYPE(buf), pPacket);
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -