game2009/server/gameserver/playermgr.cc
aozhiwei a36859194e 1
2019-11-20 16:01:12 +08:00

108 lines
2.9 KiB
C++

#include "precompile.h"
#include "playermgr.h"
#include "player.h"
#include "cs_proto.pb.h"
#include "room.h"
#include "framework/cpp/utils.h"
void PlayerMgr::Init()
{
}
void PlayerMgr::UnInit()
{
}
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);
}
}
int PlayerMgr::OnlineNum()
{
return socket_hash_.size();
}
Player* PlayerMgr::GetPlayerBySocket(int socket)
{
auto itr = socket_hash_.find(socket);
return itr != socket_hash_.end() ? itr->second : nullptr;
}
Player* PlayerMgr::CreatePlayerByCMJoin(long ip_saddr, int socket, const cs::CMJoin& msg)
{
Player* hum = new Player();
hum->socket_handle = socket;
hum->ip_saddr = ip_saddr;
hum->account_id = msg.account_id();
hum->session_id = msg.session_id();
hum->from_appid = msg.from_appid();
hum->name = msg.name();
hum->health = 0;
hum->team_uuid = msg.team_uuid();
hum->team_mode = msg.team_mode();
hum->auto_fill = msg.auto_fill();
hum->avatar_url = msg.avatar_url();
hum->energy_shield = msg.energy_shield();
hum->today_enter_times = msg.today_enter_times();
hum->create_tick = a8::XGetTickCount();
hum->account_registertime = f8::ExtractRegisterTimeFromSessionId(msg.session_id());
hum->atk_add = msg.atk_add();
hum->emoji1 = msg.emoji1();
hum->emoji2 = msg.emoji2();
hum->parachute = msg.parachute();
hum->has_pass = msg.has_pass();
if (hum->atk_add > 0.9999f) {
hum->atk_add = hum->atk_add / 100.0f;
a8::SetBitFlag(hum->status, HS_AtkAdd);
}
for (auto& weapon : msg.weapons()) {
if (weapon.weapon_id() != 0 && weapon.weapon_lv() > 0) {
hum->weapon_configs[weapon.weapon_id()] = weapon.weapon_lv();
}
}
for (auto& skin : msg.skins()) {
if (skin.skin_id() != 0 && skin.skin_lv() > 0) {
hum->skin_configs[skin.skin_id()] = skin.skin_lv();
}
}
hum->SetSkinInfo(msg.baseskin());
socket_hash_[socket] = hum;
return hum;
}
void PlayerMgr::OnClientDisconnect(a8::XParams& param)
{
int gg_socket = param.sender;
std::vector<int> socket_list;
for (auto& pair : socket_hash_) {
unsigned short parent_socket_handle = (pair.first >> 16) & 0xFFFF;
if (parent_socket_handle == gg_socket) {
socket_list.push_back(pair.first);
}
}
for (int socket_handle : socket_list) {
Player* hum = GetPlayerBySocket(socket_handle);
if (hum) {
RemovePlayerBySocket(socket_handle);
hum->room->OnPlayerOffline(hum);
}
}
}
void PlayerMgr::RemovePlayerBySocket(int socket_handle)
{
auto itr = socket_hash_.find(socket_handle);
if (itr != socket_hash_.end()) {
itr->second->socket_handle = 0;
socket_hash_.erase(itr);
}
}