1
This commit is contained in:
parent
ebd147bb42
commit
70302e90ab
@ -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);
|
||||
}
|
||||
|
@ -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_;
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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_;
|
||||
|
Loading…
x
Reference in New Issue
Block a user