1
This commit is contained in:
parent
ebd147bb42
commit
70302e90ab
@ -13,6 +13,7 @@
|
|||||||
#include "app.h"
|
#include "app.h"
|
||||||
#include "jsondatamgr.h"
|
#include "jsondatamgr.h"
|
||||||
#include "handlermgr.h"
|
#include "handlermgr.h"
|
||||||
|
#include "playermgr.h"
|
||||||
|
|
||||||
class SocketDisconnectHandler : public std::enable_shared_from_this<SocketDisconnectHandler>
|
class SocketDisconnectHandler : public std::enable_shared_from_this<SocketDisconnectHandler>
|
||||||
{
|
{
|
||||||
@ -136,14 +137,17 @@ void GGListener::Init()
|
|||||||
[this] (const a8::Args& args)
|
[this] (const a8::Args& args)
|
||||||
{
|
{
|
||||||
int gg_socket = args.Get<int>(0);
|
int gg_socket = args.Get<int>(0);
|
||||||
auto itr = disconnect_listener_hash_.find(gg_socket);
|
PlayerMgr::Instance()->OnGateDisconnect(gg_socket);
|
||||||
if (itr != disconnect_listener_hash_.end()) {
|
{
|
||||||
std::vector<std::weak_ptr<SocketDisconnectHandler>> del_handlers;
|
std::vector<std::weak_ptr<SocketDisconnectHandler>> del_handlers;
|
||||||
{
|
for (auto& pair : disconnect_listener_hash_) {
|
||||||
SocketDisconnectHandler *handle = nullptr, *tmp = nullptr;
|
unsigned short parent_socket_handle = (pair.first >> 16) & 0xFFFF;
|
||||||
list_for_each_entry_safe(handle, tmp, &itr->second, entry) {
|
if (parent_socket_handle == gg_socket) {
|
||||||
del_handlers.push_back(handle->holder);
|
SocketDisconnectHandler *handle = nullptr, *tmp = nullptr;
|
||||||
handle->cb(a8::Args({}));
|
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) {
|
for (auto handler : del_handlers) {
|
||||||
@ -224,3 +228,8 @@ void GGListener::RemoveSocketDisconnectHandler(std::weak_ptr<SocketDisconnectHan
|
|||||||
list_del_init(&p->entry);
|
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/protoutils.h>
|
||||||
#include <f8/utils.h>
|
#include <f8/utils.h>
|
||||||
|
|
||||||
|
namespace ss
|
||||||
|
{
|
||||||
|
class SS_WSP_SocketDisconnect;
|
||||||
|
}
|
||||||
|
|
||||||
//game client listener
|
//game client listener
|
||||||
namespace a8
|
namespace a8
|
||||||
{
|
{
|
||||||
@ -69,9 +74,11 @@ public:
|
|||||||
std::weak_ptr<SocketDisconnectHandler> AddSocketDisconnectListener(int socket_handle, a8::CommonCbProc cb);
|
std::weak_ptr<SocketDisconnectHandler> AddSocketDisconnectListener(int socket_handle, a8::CommonCbProc cb);
|
||||||
void RemoveSocketDisconnectHandler(std::weak_ptr<SocketDisconnectHandler> handler);
|
void RemoveSocketDisconnectHandler(std::weak_ptr<SocketDisconnectHandler> handler);
|
||||||
bool DebugNetMsg(int msg_id);
|
bool DebugNetMsg(int msg_id);
|
||||||
|
void _SS_WSP_SocketDisconnect(f8::MsgHdr* hdr, const ss::SS_WSP_SocketDisconnect& msg);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void OnListenError(int errorid);
|
void OnListenError(int errorid);
|
||||||
|
void OnClientDisconnect(int socket_handle);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<a8::TcpListener> tcp_listener_;
|
std::shared_ptr<a8::TcpListener> tcp_listener_;
|
||||||
|
@ -101,7 +101,8 @@ void HandlerMgr::UnInit()
|
|||||||
|
|
||||||
void HandlerMgr::RegisterNetMsgHandlers()
|
void HandlerMgr::RegisterNetMsgHandlers()
|
||||||
{
|
{
|
||||||
RegisterNetMsgHandler(&ggmsghandler, &PlayerMgr::_SS_WSP_SocketDisconnect);
|
RegisterNetMsgHandler(&ggmsghandler, &GGListener::_SS_WSP_SocketDisconnect);
|
||||||
|
|
||||||
RegisterNetMsgHandler(&ggmsghandler, &PlayerMgr::_SS_Ping);
|
RegisterNetMsgHandler(&ggmsghandler, &PlayerMgr::_SS_Ping);
|
||||||
RegisterNetMsgHandler(&ggmsghandler, &RoomMgr::_CMJoin);
|
RegisterNetMsgHandler(&ggmsghandler, &RoomMgr::_CMJoin);
|
||||||
RegisterNetMsgHandler(&ggmsghandler, &RoomMgr::_CMReconnect);
|
RegisterNetMsgHandler(&ggmsghandler, &RoomMgr::_CMReconnect);
|
||||||
|
@ -51,6 +51,7 @@
|
|||||||
#include "custom_battle.h"
|
#include "custom_battle.h"
|
||||||
#include "custom_team.h"
|
#include "custom_team.h"
|
||||||
#include "custom_member.h"
|
#include "custom_member.h"
|
||||||
|
#include "GGListener.h"
|
||||||
|
|
||||||
#include "mt/Param.h"
|
#include "mt/Param.h"
|
||||||
#include "mt/Buff.h"
|
#include "mt/Buff.h"
|
||||||
@ -2448,24 +2449,17 @@ Player* PlayerMgr::CreatePlayerByCMJoin(Player* hum,
|
|||||||
return 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)
|
void PlayerMgr::_SS_Ping(f8::MsgHdr* hdr, const ss::SS_Ping& msg)
|
||||||
{
|
{
|
||||||
ss::SS_Pong respmsg;
|
ss::SS_Pong respmsg;
|
||||||
GGListener::Instance()->SendToClient(hdr->socket_handle, 0, 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)
|
void Team::FillSMGameOver(cs::SMGameOver& msg)
|
||||||
{
|
{
|
||||||
auto p = msg.mutable_settlement_new();
|
auto p = msg.mutable_settlement_new();
|
||||||
|
@ -14,14 +14,6 @@
|
|||||||
|
|
||||||
void PlayerMgr::Init()
|
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()
|
void PlayerMgr::UnInit()
|
||||||
@ -39,7 +31,7 @@ Player* PlayerMgr::GetPlayerBySocket(int socket)
|
|||||||
return itr != socket_hash_.end() ? itr->second : nullptr;
|
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;
|
std::vector<int> socket_list;
|
||||||
@ -50,11 +42,19 @@ void PlayerMgr::OnClientDisconnect(int gg_socket)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int socket_handle : socket_list) {
|
for (int socket_handle : socket_list) {
|
||||||
Player* hum = GetPlayerBySocket(socket_handle);
|
OnClientDisconnect(socket_handle);
|
||||||
if (hum) {
|
}
|
||||||
RemovePlayerBySocket(socket_handle);
|
}
|
||||||
hum->room->OnPlayerOffline(hum);
|
|
||||||
}
|
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 Init();
|
||||||
void UnInit();
|
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);
|
void _SS_Ping(f8::MsgHdr* hdr, const ss::SS_Ping& msg);
|
||||||
|
|
||||||
int OnlineNum();
|
int OnlineNum();
|
||||||
Player* GetPlayerBySocket(int socket);
|
Player* GetPlayerBySocket(int socket);
|
||||||
Player* CreatePlayerByCMJoin(Player* hum, long ip_saddr, int socket, const cs::CMJoin& msg);
|
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(); }
|
size_t GetAccountNum() { return account_num_hash_.size(); }
|
||||||
void IncAccountNum(const std::string& account_id);
|
void IncAccountNum(const std::string& account_id);
|
||||||
void DecAccountNum(const std::string& account_id);
|
void DecAccountNum(const std::string& account_id);
|
||||||
void ReBindSocket(Player* hum);
|
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:
|
private:
|
||||||
std::map<int, Player*> socket_hash_;
|
std::map<int, Player*> socket_hash_;
|
||||||
std::map<std::string, int> account_num_hash_;
|
std::map<std::string, int> account_num_hash_;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user