Files
mir_server/server/LogicServer/entitysystem/MsgSystem.cpp

477 lines
11 KiB
C++
Raw Normal View History

2025-01-09 17:45:40 +08:00
#include "StdAfx.h"
#include "../base/Container.hpp"
using namespace jxInterSrvComm::DbServerProto;
CMsgSystem::CMsgSystem()
{
}
CMsgSystem::~CMsgSystem()
{
}
bool CMsgSystem::Initialize(void *data,SIZE_T size)
{
return true;
}
void CMsgSystem::OnEnterGame()
{
SendDbLoadMsg(0);
}
void CMsgSystem::ProcessNetData(INT_PTR nCmd,CDataPacketReader &packet )
{
switch (nCmd)
{
case cReadMsg:
{
INT64 nMsgId = 0;
packet >> nMsgId;
ProcessMsg(nMsgId);
break;
}
default:
break;
}
}
/*
bool CMsgSystem::SendFireMsgInfo(INT64 nMsgId, byte nType, WORD nCount, char * sName, char * sBuff)
{
CActorPacket ap;
CDataPacket& netPack = m_pEntity->AllocPacket(ap);
netPack << (BYTE)enMiscSystemID << (BYTE)sOpenRedGift;
netPack << (INT64)nMsgId << (BYTE)nType;
netPack.writeString(sName);
netPack << nCount;
netPack.writeString(sBuff);
ap.flush();
return true;
}
*/
void CMsgSystem::SendMsgToClient(MsgData& msg)
{
if (!m_pEntity)
{
return;
}
if (msg.Msgtype <= mtNoType || msg.Msgtype >= mtMessageCount)
{
return;
}
LPCSTR sTitle = NULL;
LPCSTR sBtnTxt = NULL;
msg.GetTxt(sTitle,sBtnTxt);
/*if (msg.Msgtype == mtSendFire || msg.Msgtype == mtSendRedPacket)
{
LPCSTR sTitle = NULL;
LPCSTR sBtnTxt = NULL;
CDataPacketReader packet(msg.Msg,MAX_MSG_COUNT);
packet >> sTitle;
packet >> sBtnTxt;
byte nType;
WORD nCount;
ACTORNAME sName;
char sBuff[1024];
packet >> nType >> nCount;
packet.readString(sName, ArrayCount(sName));
packet.readString(sBuff, ArrayCount(sBuff));
SendFireMsgInfo(msg.Msgid, nType, nCount, sName, sBuff);
}
else*/
{
CActorPacket AP;
CDataPacket& packet = m_pEntity->AllocPacket(AP);
AP << (BYTE)enMsgSystemID << (BYTE)sAddMsg;
AP << (WORD)1;
AP << (INT64)msg.Msgid;
AP << (BYTE)msg.Msgtype;
//发送文字
sTitle?packet.writeString(sTitle):packet.writeString("");
sBtnTxt?packet.writeString(sBtnTxt):packet.writeString(""); // 按钮格式: 按钮1名称;按钮2名称/操作类型,参数1 默认“确定”则使用""
AP.flush();
}
}
void CMsgSystem::OnAddOfflineMsgDbReturn(INT_PTR nCmd,char * data,SIZE_T size)
{
if ( nCmd != dcAddMsg)
{
return;
}
LPCSTR sErrStr = NULL;
int nMsgType = ttTipmsgWindow;
CDataPacketReader reader(data,size);
int nActorid = 0,nSrcActorId = 0;
BYTE nErrorCode = 0;
int nRawServerId, nLoginServerId;
reader >> nRawServerId >> nLoginServerId;
reader >> nActorid;//
reader >> nSrcActorId;
reader >> nErrorCode;
if (nErrorCode != reSucc)
{
sErrStr = _T("Error!!the msg send to %d fail!");
nMsgType = ttDialog;
OutputMsg(rmError,sErrStr,nActorid);
}
else
{
sErrStr = _T("the msg send to%d ok!");
//如果用户在线,通知其从数据库中读出
CActor* pActor = GetGlobalLogicEngine()->GetEntityMgr()->GetEntityPtrByActorID(nActorid);
if (pActor)
{
INT64 nMsgId = 0;
reader >> nMsgId;
pActor->GetMsgSystem().ReloadFromDb(nMsgId);
}
}
//通知发送的原角色(一般是GM错误消息
/*CActor* pSrcActor = GetGlobalLogicEngine()->GetEntityMgr()->GetEntityPtrByActorID(nSrcActorId);
if (pSrcActor)
{
pSrcActor->SendTipmsgFormat(sErrStr,nMsgType,nActorid);
}*/
}
void CMsgSystem::OnAddOfflineMsgByNameDbReturn(INT_PTR nCmd,char * data,SIZE_T size)
{
if ( nCmd != dcAddMsgByActorName)
{
return;
}
LPCSTR sErrStr = NULL;
int nMsgType = ttTipmsgWindow;
CDataPacketReader reader(data,size);
int nActorid = 0,nSrcActorId = 0;
LPCSTR sName = NULL;
BYTE nErrorCode = 0;
int nRawServerId, nLoginServerId;
reader >> nRawServerId >> nLoginServerId;
reader >> sName;
reader >> nSrcActorId;
reader >> nErrorCode;
if (nErrorCode != reSucc)
{
sErrStr = _T("Error!!the msg send to %s fail!");
nMsgType = ttDialog;
OutputMsg(rmError,sErrStr,sName);
}
else
{
//如果用户在线,通知其从数据库中读出
CActor* pActor = GetGlobalLogicEngine()->GetEntityMgr()->GetActorPtrByName((char*)sName);
if (pActor)
{
INT64 nMsgId = 0;
reader >> nMsgId;
pActor->GetMsgSystem().ReloadFromDb(nMsgId);
}
sErrStr = _T("the msg send to %s ok!");
}
//通知发送的原角色(一般是GM错误消息
/*CActor* pSrcActor = GetGlobalLogicEngine()->GetEntityMgr()->GetEntityPtrByActorID(nSrcActorId);
if (pSrcActor)
{
pSrcActor->SendTipmsgFormat(sErrStr,nMsgType,sName);
}*/
}
VOID CMsgSystem::OnDbRetData( INT_PTR nCmd,INT_PTR nErrorCode, CDataPacketReader &reader )
{
switch(nCmd)
{
case dcLoadMsg://接收自己的消息
{
//不可以加重复Msgid的消息
if (nErrorCode != reSucc)
{
OutputMsg(rmError,_T("load actor msg error!"));
}else
{
WORD nCount = 0;
reader >> nCount;
for(int i = 0; i < nCount; i++)
{
MsgData msg;
reader >> msg.Msgid;
reader >> msg.Msgtype;
reader >> msg.nBufSize;
reader.readBuf(msg.Msg,msg.nBufSize);
if (AddToList(msg))
{
SendMsgToClient(msg);
}
}
}
break;
}
case dcDeleteMsg: //删除自己的消息
{
if (nErrorCode != reSucc)
{
OutputMsg(rmError,_T("delete actor msg error!"));
}
break;
}
}
}
bool CMsgSystem::ProcessMsg( INT64 msgId )
{
bool ret = false;
for (INT_PTR i = m_msgList.count()-1; i >= 0; i--)
{
MsgData& msgInList = m_msgList[i];
if (msgInList.Msgid == msgId)
{
ret = ProcessMsg(msgInList);
if (ret)
{
CActorPacket AP;
m_pEntity->AllocPacket(AP);
AP << (BYTE)enMsgSystemID << (BYTE)sDeleteMsg << (INT64)msgId;
AP.flush();
m_msgList.remove(i);
SendDbDeleteMsg(msgId);//通知数据库删除
}
break;
}
}
return ret;
}
bool CMsgSystem::ProcessMsg( MsgData& msg )
{
if (!m_pEntity) return false;
bool ret = false;
//前两个字段固定是字符串
LPCSTR sTitle = NULL;
LPCSTR sBtnTxt = NULL;
CDataPacketReader packet(msg.Msg,MAX_MSG_COUNT);
packet >> sTitle;
packet >> sBtnTxt;
//分发给各个子系统处理
switch(msg.Msgtype)
{
case mtTxtMsg:
case mtGmTxtMsg:
case mtChangeMoney:
case mtAddIndexItem:
case mtSeverMaster:
case mtExpelPupil:
case mtDeleteGuild:
case mtReturnSuggestMsg:
case mtGuildDepotMsg:
case mtAuctionItem:
case mtGiveStoreItem:
case mtPaTaMasterAward:
case mtCorpsBattleAward:
case mtCombatRankAward:
case mtWholeActivityAward:
case mtGiveFirstSbkGuildAward:
case mtDefendSbkThreeTimes:
case mtDefendSbkSecAwards:
case mtGiveFirstCombineSbkAward:
case mtGiveFirstCombineSecSbkAward:
case mtGiveCombineDefendSbkAward:
case mtGiveCombineDefendSbkSecAward:
case mtGiveCombineActivityAward:
case mtHundredYestodayConsumeRank:
case mtSurpriseRet:
case mtFestivalWithDraw:
case mtLuckAward:
case mtFireTop1:
case mtOldPlayerBack:
case mtSpecialConsumeYb:
case mtCombatLog:
{
ret = m_pEntity->ProcessOfflineMsg(msg.Msgtype,packet.getOffsetPtr(),MAX_MSG_COUNT-packet.getPosition(),msg.Msgid);
if (msg.Msgtype == mtAuctionItem)
{
CActorPacket AP;
m_pEntity->AllocPacket(AP);
AP << (BYTE)enMsgSystemID << (BYTE)sResultMsg << (INT64)msg.Msgid << (BYTE)ret;
AP.flush();
}
break;
}
case mtUnMarry:
{
//ret = m_pEntity->GetInterActionSystem().ProcessOfflineMsg(msg.Msgtype,packet.getOffsetPtr(),MAX_MSG_COUNT-packet.getPosition());
break;
}
}
return ret;
}
bool CMsgSystem::AddOfflineMsg( unsigned int nActorId,INT_PTR nMsgType,char* pMsgBuf,SIZE_T size ,unsigned int nSrcActorId)
{
if (size > MAX_MSG_COUNT)
{
OutputMsg(rmError,_T("Add OfflineMsg error!!!!"));
return false;
}
CDataPacket& DataPacket =
GetLogicServer()->GetDbClient()->allocProtoPacket(dcAddMsg);
int nServerId = GetLogicServer()->GetServerIndex();
DataPacket << nServerId << nServerId;
DataPacket << (unsigned int)nActorId;//
DataPacket << (unsigned int)nSrcActorId;//发出消息的角色id
DataPacket << (int)nMsgType;
DataPacket << (int)size;
if (size > 0 && pMsgBuf)
{
DataPacket.writeBuf(pMsgBuf,size);
}
GetLogicServer()->GetDbClient()->flushProtoPacket(DataPacket);
return true;
}
bool CMsgSystem::AddOfflineMsgByName(LPCSTR pActorName, INT_PTR nMsgType,char* pMsgBuf,SIZE_T size ,unsigned int nSrcActorId)
{
if (size > MAX_MSG_COUNT || !pActorName || !pMsgBuf)
{
OutputMsg(rmError,_T("Add OfflineMsg error!!!!"));
return false;
}
CDataPacket& DataPacket =
GetLogicServer()->GetDbClient()->allocProtoPacket(dcAddMsgByActorName);
int nServerId = GetLogicServer()->GetServerIndex();
DataPacket << nServerId << nServerId;
DataPacket << (unsigned int)nSrcActorId;//发出消息的角色id
DataPacket << (int)(GetLogicServer()->GetServerIndex());
DataPacket.writeString(pActorName);
DataPacket << (int)nMsgType;
DataPacket << (int)size;
if (size > 0 && pMsgBuf)
{
DataPacket.writeBuf(pMsgBuf,size);
}
GetLogicServer()->GetDbClient()->flushProtoPacket(DataPacket);
return true;
}
void CMsgSystem::SendDbLoadMsg(INT64 nMsgId)
{
if (!m_pEntity)
{
return;
}
if (((CActor*)m_pEntity)->OnGetIsTestSimulator() )
{
return;
}
CDataPacket& DataPacket =
GetLogicServer()->GetDbClient()->allocProtoPacket(jxInterSrvComm::DbServerProto::dcLoadMsg);
int nServerId = GetLogicServer()->GetServerIndex();
DataPacket << nServerId << nServerId;
DataPacket << (unsigned int)m_pEntity->GetProperty<unsigned int>(PROP_ENTITY_ID);////如果nMsgid==0读入所有消息否则读入固定id的消息
DataPacket << (INT64)nMsgId ;
GetLogicServer()->GetDbClient()->flushProtoPacket(DataPacket);
}
void CMsgSystem::SendDbDeleteMsg( INT64 nMsgId )
{
if (!m_pEntity) return;
CDataPacket& DataPacket =
GetLogicServer()->GetDbClient()->allocProtoPacket(jxInterSrvComm::DbServerProto::dcDeleteMsg);
int nServerId = GetLogicServer()->GetServerIndex();
DataPacket << nServerId << nServerId;
DataPacket << (unsigned int)m_pEntity->GetProperty<unsigned int>(PROP_ENTITY_ID);
DataPacket << (INT64)nMsgId;
GetLogicServer()->GetDbClient()->flushProtoPacket(DataPacket);
}
void CMsgSystem::ReloadFromDb(INT64 msgId)
{
//检查内存的列表中是否有这条消息,避免重复读入数据
INT_PTR nCount = m_msgList.count();
for (INT_PTR i = 0; i < nCount; i++)
{
MsgData& msg = m_msgList[i];
if (msg.Msgid == msgId)
{
return;
}
}
//向数据库发送读入新消息
SendDbLoadMsg(msgId);
}
bool CMsgSystem::AddToList( MsgData& msg )
{
INT_PTR nCount = m_msgList.count();
for (INT_PTR i = 0; i < nCount; i++)
{
MsgData& msgInList = m_msgList[i];
if (msgInList.Msgid == msg.Msgid)
{
return false;
}
}
if(msg.Msgtype == mtPaTaMasterAward )
{
int nNowDt = GetGlobalLogicEngine()->getMiniDateTime();
char sTitle[512];
char sBtnTxt[512];
byte bType = 0;
int nFubenId = 0;
int nDeadLine = 0;
CDataPacketReader tempPacket(msg.Msg, MAX_MSG_COUNT);
tempPacket.readString(sTitle, ArrayCount(sTitle));
tempPacket.readString(sBtnTxt, ArrayCount(sBtnTxt));
tempPacket >> bType >> nFubenId >> nDeadLine;
if (nDeadLine <= nNowDt)
{
SendDbDeleteMsg(msg.Msgid);//通知数据库删除
}
}
else if(msg.Msgtype == mtSendFire)
{
SendDbDeleteMsg(msg.Msgid);
}
m_msgList.add(msg);
return true;
}
void CMsgSystem::SendMoveToMsg(LPCSTR sSceneName, INT_PTR nX, INT_PTR nY, LPCSTR sTitle, LPCSTR sTips)
{
CActorPacket AP;
CDataPacket& packet = m_pEntity->AllocPacket(AP);
AP << (BYTE)enMsgSystemID << (BYTE)sMoveToMsg;
//发送文字
sTips?packet.writeString(sTips):packet.writeString(""); //
sTitle?packet.writeString(sTitle):packet.writeString(""); // 寻路径坐标格式
sSceneName?packet.writeString(sSceneName):packet.writeString(""); //
packet << (WORD)nX << (WORD)nY;
AP.flush();
}