108 lines
2.9 KiB
C++
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);
|
|
}
|
|
}
|