This commit is contained in:
aozhiwei 2019-09-17 16:52:19 +08:00
parent 23481dd384
commit 45c356bbfa
4 changed files with 21 additions and 12 deletions

View File

@ -232,10 +232,14 @@ void GCListener::SetKey(int sockhandle, const std::string& key)
tcp_listener_->UnLockClients();
}
void GCListener::InternalSendMsg(int socket_handle, int msgid, google::protobuf::Message& msg)
void GCListener::InternalSendMsg(int socket_handle, int msgid, google::protobuf::Message& msg, int guess_size)
{
unsigned short packlen = 2 + CustomPbSerializeSize(&msg);
if (guess_size > 0 && packlen - 2 < guess_size) {
packlen = guess_size + 2;
}
char* buff = (char*)malloc(sizeof(ServerPktHeader) + packlen);
memset(buff, 0, sizeof(ServerPktHeader) + packlen);
ServerPktHeader* head = (ServerPktHeader*)buff;
head->cmd = msgid;
head->size = (packlen << 8) + (packlen >> 8);

View File

@ -33,11 +33,11 @@ class GCListener : public a8::Singleton<GCListener>
void UnInit();
template <typename T>
void SendMsg(int socket_handle, T& msg)
void SendMsg(int socket_handle, T& msg, int guess_size = 0)
{
static int msgid = f8::Net_GetMessageId(msg);
InternalSendMsg(socket_handle, msgid, msg);
InternalSendMsg(socket_handle, msgid, msg, guess_size);
}
void SendText(int sockhandle, const std::string& text);
@ -47,7 +47,7 @@ class GCListener : public a8::Singleton<GCListener>
void SetKey(int sockhandle, const std::string& key);
private:
void InternalSendMsg(int socket_handle, int msgid, google::protobuf::Message& msg);
void InternalSendMsg(int socket_handle, int msgid, google::protobuf::Message& msg, int guess_size);
private:
a8::TcpListener *tcp_listener_ = nullptr;

View File

@ -177,7 +177,7 @@ bool CustomPbSerialize(char* buf, int& offset, int buflen, const google::protobu
if (offset + sizeof(long long) > (size_t)buflen) {
abort();
}
long long val = reflection->GetUInt64(*msg, field_desc);
long long val = reflection->GetInt64(*msg, field_desc);
memmove(buf + offset, &val, sizeof(val));
offset += sizeof(val);
}
@ -216,7 +216,7 @@ bool CustomPbSerialize(char* buf, int& offset, int buflen, const google::protobu
{
if (field_desc->is_repeated()) {
int field_size = reflection->FieldSize(*msg, field_desc);
assert(fixed_len > 0 && field_size == field_size);
assert(fixed_len <= 0 || field_size == field_size);
for (int i = 0; i < field_size; ++i) {
const google::protobuf::Message* val = &reflection->GetRepeatedMessage(*msg, field_desc, i);
CustomPbSerialize(buf, offset, buflen, val);
@ -283,7 +283,7 @@ int CustomPbSerializeSize(const google::protobuf::Message* msg)
{
if (field_desc->is_repeated()) {
int field_size = reflection->FieldSize(*msg, field_desc);
assert(fixed_len > 0 && field_size == field_size);
assert(fixed_len <= 0 || field_size == field_size);
for (int i = 0; i < field_size; ++i) {
const google::protobuf::Message* val = &reflection->GetRepeatedMessage(*msg, field_desc, i);
byte_size += CustomPbSerializeSize(val);

View File

@ -30,6 +30,11 @@ void PlayerMgr::_CMAuthSession(f8::MsgHdr& hdr, const cs::CMAuthSession& msg)
cs::SMAuthResponse respmsg;
respmsg.set_errcode(AUTH_OK);
GCListener::Instance()->SendMsg(hdr.socket_handle, respmsg);
if (!GetTempSessionBySocket(hdr.socket_handle)) {
TempSession* tmp_session = new TempSession();
tmp_session->account_id = DBEngine::Instance()->GetValue(0);
tmp_session_hash_[hdr.socket_handle] = tmp_session;
}
}
void PlayerMgr::_CMCharEnum(f8::MsgHdr& hdr, const cs::CMCharEnum& msg)
@ -40,9 +45,9 @@ void PlayerMgr::_CMCharEnum(f8::MsgHdr& hdr, const cs::CMCharEnum& msg)
"SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.playerBytes, characters.playerBytes2, characters.level, "
"characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z, guild_member.guildid, characters.playerFlags, "
"characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache "
"FROM characters LEFT JOIN character_pet ON characters.guid=character_pet.owner AND character_pet.slot='%u' "
"LEFT JOIN guild_member ON characters.guid = guild_member.guid "
"WHERE characters.account = '%u' ORDER BY characters.guid";
"FROM zero_characters.characters LEFT JOIN zero_characters.character_pet ON characters.guid=character_pet.owner AND character_pet.slot='%d' "
"LEFT JOIN zero_characters.guild_member ON characters.guid = guild_member.guid "
"WHERE zero_characters.characters.account = '%d' ORDER BY characters.guid";
int ret = DBEngine::Instance()->ExecQuery(
sql.c_str(),
{
@ -67,7 +72,7 @@ void PlayerMgr::_CMCharEnum(f8::MsgHdr& hdr, const cs::CMCharEnum& msg)
char_info->set_z(DBEngine::Instance()->GetValue(12).GetDouble());
char_info->set_guild_id(DBEngine::Instance()->GetValue(13));
char_info->set_char_flags(DBEngine::Instance()->GetValue(14));
//first_login
char_info->set_first_login(0);
//pet_display_id
//pet_level
//pet_family
@ -78,7 +83,7 @@ void PlayerMgr::_CMCharEnum(f8::MsgHdr& hdr, const cs::CMCharEnum& msg)
DBEngine::Instance()->Next();
}
}
GCListener::Instance()->SendMsg(hdr.socket_handle, respmsg);
GCListener::Instance()->SendMsg(hdr.socket_handle, respmsg, 100);
}
int PlayerMgr::OnlineNum()