场景和网关之间同步消息,再同步到客户端(单播、广播)。
设计上:
网关上有角色id为索引的网关玩家。可以作为单播的依据。
网关上有屏索引的玩家集合,可以作为九屏广播的依据。
场景上的屏索引和网关上的屏索引上的玩家是实时同步的。场景发送消息到网关会附带屏索引和角色id。
1、场景服务器与网关服务器的转发消息
场景服务器发送消息到网关服务器,网关服务器查找对应网关玩家,并发送消息。
(1)单个玩家的消息发送
stSendplayerCmdToMeForwardServerCmd *revMsg = (stSendplayerCmdToMeForwardServerCmd *)ptrMsg;
gateway_player *pplayer = g_user_mgr.get_player_by_id(revMsg->charid);//获取网关玩家
if(pplayer)
{
pplayer->sendmsgToMe(revMsg->data, revMsg->datasize());//转发消息给玩家
}
//网关玩家发送消息
bool gateway_player::sendmsgToMe(const void *ptrmsg, const int msglen)
{
//检查消息长度
if((uint32)msglen >= tcp_socket::MAX_USERDATASIZE || msglen == 0)
{
const MSG::base_msg *ptrMsg = (MSG::base_msg *)ptrmsg;
g_log->error("%s发送消息长度不合法[%u,%u],大小:%u",this->name.c_str(), ptrMsg->first,ptrMsg->second,msglen);
return false;
}
using namespace MSG;
base_msg *pCmd = (base_msg *)ptrmsg;
if(gatewaytask)
{
if(passivetask)//转发给客户端
{
passivetask->sendmsg(ptrmsg,msglen);
}
if(!this->wait_peeper)
{
//场景发来的消息是通过网关连接gatewaytask来发送的&#