Files
mir_server/Gateway/gateway/gameworld/game_world_client.cc

145 lines
2.9 KiB
C++
Raw Permalink Normal View History

2025-01-09 17:45:40 +08:00
#include "StdAfx.h"
#include "game_world_client.h"
GameWorldClient::GameWorldClient(GateServer* serv, GameClientMgr* gcmgr, const char* name) :
NetClient(name),
serv_(serv),
gcmgr_(gcmgr) {
SetClientName(name);
free_.setLock(&lock_);
}
GameWorldClient::~GameWorldClient() {
free_.flush();
for (int i = 0; i < free_.count(); i++)
{
DataPacket* dp = free_[i];
dp->setPosition(0);
Flush(*dp);
}
free_.clear();
}
void GameWorldClient::OnRecv(const uint16_t cmd, char * buf, int size)
{
GATEMSGHDR* hdr = (GATEMSGHDR*)buf;
buf = (char*)(hdr + 1);
switch (cmd) {
case GM_DATA: {
//NetId net_id;
//net_id.socket_ = hdr->nSocket;
//net_id.index_ = hdr->wSessionIdx;
//net_id.gate_id_ = hdr->wServerIdx;
DataPacket *dp = AllocPostPacket();
dp->writeBuf(buf , size);
dp->setPosition(0);
GateInterMsg msg;
msg.msg_id_ = gcGWData;
msg.data_.index_ = hdr->wSessionIdx;
msg.data_.packet_ = dp;
gcmgr_->PostMsg(msg);
break;
}
case GM_CLOSE: {
GateInterMsg msg;
msg.msg_id_ = gcGWClose;
msg.data_.index_ = hdr->wSessionIdx;
gcmgr_->PostMsg(msg);
break;
}
case GM_SERVERUSERINDEX: {
GateInterMsg msg;
msg.msg_id_ = gcServerIdx;
msg.data_.idx_ = hdr->wSessionIdx;
msg.data_.para_ = hdr->wServerIdx;
gcmgr_->PostMsg(msg);
break;
}
case GM_CHECKCLIENT: {
break;
}
default:
MSG_LOG("not handle gameword cmd:%d", cmd);
break;
}
}
void GameWorldClient::OnChannelMsg(char* buf, int size) {
Channel info = *((Channel*)buf);
switch (info.type) {
case ccBroadCast: {
uint8_t nsize = sizeof(Channel);
DataPacket *dp = AllocPostPacket();
dp->writeBuf(buf + nsize, size - nsize);
dp->setPosition(0);
GateInterMsg msg;
msg.msg_id_ = gcChBro;
msg.data_.b_channel_ = info.channelId;
msg.data_.b_para_ = info.para;
msg.data_.dp_ = dp;
gcmgr_->PostMsg(msg);
break;
}
case ccAddUser: {
GateInterMsg msg;
msg.msg_id_ = gcChAdd;
msg.data_.channel_ = info.channelId;
msg.data_.para_ = info.para;
msg.data_.idx_ = info.index_;
gcmgr_->PostMsg(msg);
break;
}
case ccDelUser: {
GateInterMsg msg;
msg.msg_id_ = gcChDel;
msg.data_.channel_ = info.channelId;
msg.data_.para_ = info.para;
msg.data_.idx_ = info.index_;
gcmgr_->PostMsg(msg);
break;
}
default:
MSG_LOG("not handle channel type:%d", info.type);
break;
}
}
int GameWorldClient::GetLocalServerType() {
return SrvDef::GateServer;
}
const char * GameWorldClient::GetLocalServerName() {
return gcmgr_->GetServiceName();
}
void GameWorldClient::OnDisconnected() {
GateInterMsg msg;
msg.msg_id_ = gcGWDisconn;
gcmgr_->PostMsg(msg);
}
void GameWorldClient::FreeBackUserDataPacket(DataPacket* pack) {
free_.append(pack);
}
DataPacket* GameWorldClient::AllocPostPacket()
{
if (free_.count() <= 0)
{
free_.flush();
}
if (free_.count() <= 0)
{
AllocSendPack(&free_, 512);
}
DataPacket* dp = free_.pop();//<2F>õ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>Datapacket
dp->setLength(0);
return dp;
}