This commit is contained in:
aozhiwei 2024-03-25 20:19:35 +08:00
parent ebd147bb42
commit 70302e90ab
6 changed files with 48 additions and 38 deletions

View File

@ -13,6 +13,7 @@
#include "app.h"
#include "jsondatamgr.h"
#include "handlermgr.h"
#include "playermgr.h"
class SocketDisconnectHandler : public std::enable_shared_from_this<SocketDisconnectHandler>
{
@ -136,14 +137,17 @@ void GGListener::Init()
[this] (const a8::Args& args)
{
int gg_socket = args.Get<int>(0);
auto itr = disconnect_listener_hash_.find(gg_socket);
if (itr != disconnect_listener_hash_.end()) {
PlayerMgr::Instance()->OnGateDisconnect(gg_socket);
{
std::vector<std::weak_ptr<SocketDisconnectHandler>> del_handlers;
{
SocketDisconnectHandler *handle = nullptr, *tmp = nullptr;
list_for_each_entry_safe(handle, tmp, &itr->second, entry) {
del_handlers.push_back(handle->holder);
handle->cb(a8::Args({}));
for (auto& pair : disconnect_listener_hash_) {
unsigned short parent_socket_handle = (pair.first >> 16) & 0xFFFF;
if (parent_socket_handle == gg_socket) {
SocketDisconnectHandler *handle = nullptr, *tmp = nullptr;
list_for_each_entry_safe(handle, tmp, &pair.second, entry) {
del_handlers.push_back(handle->holder);
handle->cb(a8::Args({}));
}
}
}
for (auto handler : del_handlers) {
@ -224,3 +228,8 @@ void GGListener::RemoveSocketDisconnectHandler(std::weak_ptr<SocketDisconnectHan
list_del_init(&p->entry);
}
}
void GGListener::OnClientDisconnect(int socket_handle)
{
PlayerMgr::Instance()->OnClientDisconnect(socket_handle);
}

View File

@ -6,6 +6,11 @@
#include <f8/protoutils.h>
#include <f8/utils.h>
namespace ss
{
class SS_WSP_SocketDisconnect;
}
//game client listener
namespace a8
{
@ -69,9 +74,11 @@ public:
std::weak_ptr<SocketDisconnectHandler> AddSocketDisconnectListener(int socket_handle, a8::CommonCbProc cb);
void RemoveSocketDisconnectHandler(std::weak_ptr<SocketDisconnectHandler> handler);
bool DebugNetMsg(int msg_id);
void _SS_WSP_SocketDisconnect(f8::MsgHdr* hdr, const ss::SS_WSP_SocketDisconnect& msg);
private:
void OnListenError(int errorid);
void OnClientDisconnect(int socket_handle);
private:
std::shared_ptr<a8::TcpListener> tcp_listener_;

View File

@ -101,7 +101,8 @@ void HandlerMgr::UnInit()
void HandlerMgr::RegisterNetMsgHandlers()
{
RegisterNetMsgHandler(&ggmsghandler, &PlayerMgr::_SS_WSP_SocketDisconnect);
RegisterNetMsgHandler(&ggmsghandler, &GGListener::_SS_WSP_SocketDisconnect);
RegisterNetMsgHandler(&ggmsghandler, &PlayerMgr::_SS_Ping);
RegisterNetMsgHandler(&ggmsghandler, &RoomMgr::_CMJoin);
RegisterNetMsgHandler(&ggmsghandler, &RoomMgr::_CMReconnect);

View File

@ -51,6 +51,7 @@
#include "custom_battle.h"
#include "custom_team.h"
#include "custom_member.h"
#include "GGListener.h"
#include "mt/Param.h"
#include "mt/Buff.h"
@ -2448,24 +2449,17 @@ Player* PlayerMgr::CreatePlayerByCMJoin(Player* hum,
return hum;
}
void PlayerMgr::_SS_WSP_SocketDisconnect(f8::MsgHdr* hdr, const ss::SS_WSP_SocketDisconnect& msg)
{
Player* hum = GetPlayerBySocket(hdr->socket_handle);
if (hum) {
RemovePlayerBySocket(hdr->socket_handle);
hum->room->OnPlayerOffline(hum);
}
#if MYDEBUG
a8::XPrintf("remove socket1 %d\n", {hdr->socket_handle});
#endif
}
void PlayerMgr::_SS_Ping(f8::MsgHdr* hdr, const ss::SS_Ping& msg)
{
ss::SS_Pong respmsg;
GGListener::Instance()->SendToClient(hdr->socket_handle, 0, respmsg);
}
void GGListener::_SS_WSP_SocketDisconnect(f8::MsgHdr* hdr, const ss::SS_WSP_SocketDisconnect& msg)
{
OnClientDisconnect(hdr->socket_handle);
}
void Team::FillSMGameOver(cs::SMGameOver& msg)
{
auto p = msg.mutable_settlement_new();

View File

@ -14,14 +14,6 @@
void PlayerMgr::Init()
{
f8::MsgQueue::Instance()->RegisterCallBack
(
IM_ClientSocketDisconnect,
[this] (const a8::Args& args)
{
int gg_socket = args.Get<int>(0);
OnClientDisconnect(gg_socket);
});
}
void PlayerMgr::UnInit()
@ -39,7 +31,7 @@ Player* PlayerMgr::GetPlayerBySocket(int socket)
return itr != socket_hash_.end() ? itr->second : nullptr;
}
void PlayerMgr::OnClientDisconnect(int gg_socket)
void PlayerMgr::OnGateDisconnect(int gg_socket)
{
std::vector<int> socket_list;
@ -50,11 +42,19 @@ void PlayerMgr::OnClientDisconnect(int gg_socket)
}
}
for (int socket_handle : socket_list) {
Player* hum = GetPlayerBySocket(socket_handle);
if (hum) {
RemovePlayerBySocket(socket_handle);
hum->room->OnPlayerOffline(hum);
}
OnClientDisconnect(socket_handle);
}
}
void PlayerMgr::OnClientDisconnect(int socket_handle)
{
Player* hum = GetPlayerBySocket(socket_handle);
if (hum) {
RemovePlayerBySocket(socket_handle);
hum->room->OnPlayerOffline(hum);
#if MYDEBUG
a8::XPrintf("remove socket1 %d\n", {socket_handle});
#endif
}
}

View File

@ -27,20 +27,19 @@ class PlayerMgr : public a8::Singleton<PlayerMgr>
void Init();
void UnInit();
void _SS_WSP_SocketDisconnect(f8::MsgHdr* hdr, const ss::SS_WSP_SocketDisconnect& msg);
void _SS_Ping(f8::MsgHdr* hdr, const ss::SS_Ping& msg);
int OnlineNum();
Player* GetPlayerBySocket(int socket);
Player* CreatePlayerByCMJoin(Player* hum, long ip_saddr, int socket, const cs::CMJoin& msg);
void RemovePlayerBySocket(int socket_handle);
size_t GetAccountNum() { return account_num_hash_.size(); }
void IncAccountNum(const std::string& account_id);
void DecAccountNum(const std::string& account_id);
void ReBindSocket(Player* hum);
void RemovePlayerBySocket(int socket_handle);
void OnGateDisconnect(int gg_socket);
void OnClientDisconnect(int socket_handle);
private:
void OnClientDisconnect(int gg_socket);
private:
std::map<int, Player*> socket_hash_;
std::map<std::string, int> account_num_hash_;