Files
mir_server/Gateway/gateway/gameworld/game_world_client.cc
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

145 lines
2.9 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}