房间内所有玩家下线后自动释放房间对象

This commit is contained in:
aozhiwei 2019-06-04 10:37:46 +08:00
parent 87ac55c041
commit 027a3de2ea
4 changed files with 33 additions and 9 deletions

View File

@ -1867,9 +1867,10 @@ void Human::InternalSendGameOver()
};
auto on_error = [] (a8::XParams& param, const std::string& response)
{
a8::UdpLog::Instance()->Error("battleReport params: ",
a8::UdpLog::Instance()->Error("battleReport params: %s response: %s",
{
param.param2
param.param2,
response
});
long long room_uuid = param.sender;
int hum_uniid = param.param1;
@ -1901,7 +1902,7 @@ void Human::InternalSendGameOver()
f8::HttpClientPool::Instance()->HttpGet(
a8::XParams()
.SetSender(room->room_uuid)
.SetParam1(entity_uniid),
.SetParam1(entity_uniid)
.SetParam2(data),
on_ok,
on_error,

View File

@ -3,6 +3,7 @@
#include "playermgr.h"
#include "player.h"
#include "cs_proto.pb.h"
#include "room.h"
void PlayerMgr::Init()
{
@ -14,10 +15,10 @@ void PlayerMgr::UnInit()
void PlayerMgr::_SS_WSP_SocketDisconnect(f8::MsgHdr& hdr, const ss::SS_WSP_SocketDisconnect& msg)
{
auto itr = socket_hash_.find(hdr.socket_handle);
if (itr != socket_hash_.end()) {
itr->second->socket_handle = 0;
socket_hash_.erase(itr);
Player* hum = GetPlayerBySocket(hdr.socket_handle);
if (hum) {
RemovePlayerBySocket(hdr.socket_handle);
hum->room->OnPlayerOffline(hum);
}
}
@ -78,11 +79,19 @@ void PlayerMgr::OnClientDisconnect(a8::XParams& param)
}
}
for (int socket_handle : socket_list) {
socket_hash_.erase(socket_handle);
Player* hum = GetPlayerBySocket(socket_handle);
if (hum) {
RemovePlayerBySocket(socket_handle);
hum->room->OnPlayerOffline(hum);
}
}
}
void PlayerMgr::RemovePlayerBySocket(int socket_handle)
{
socket_hash_.erase(socket_handle);
auto itr = socket_hash_.find(socket_handle);
if (itr != socket_hash_.end()) {
itr->second->socket_handle = 0;
socket_hash_.erase(itr);
}
}

View File

@ -713,6 +713,19 @@ bool Room::CanJoin(const std::string& accountid)
}
}
void Room::OnPlayerOffline(Player* hum)
{
bool has_player = false;
for (auto& pair : accountid_hash_) {
if (pair.second->socket_handle != 0) {
has_player = true;
}
}
if (!has_player) {
RoomMgr::Instance()->AddOverRoom(room_uuid);
}
}
std::set<Human*>* Room::GetAliveTeam()
{
for (auto& pair : team_hash_) {

View File

@ -88,6 +88,7 @@ public:
int GetAliveTeamNum();
std::set<Human*>* GetAliveTeam();
bool CanJoin(const std::string& accountid);
void OnPlayerOffline(Player* hum);
private:
unsigned short AllocUniid();