2019-03-18 14:41:55 +08:00

140 lines
3.4 KiB
C++

#include "precompile.h"
#include "playermgr.h"
#include "player.h"
#include "cs_proto.pb.h"
#include "room.h"
#include "metamgr.h"
#include "movement.h"
const int F_del_objids = 2;
const int F_full_objects = 3;
const int F_part_objects = 4;
const int F_active_player_id = 5;
const int F_active_player_data = 6;
const int F_alive_count = 15;
const int F_gasT = 16;
const int F_gas_data = 17;
const int F_team_data = 18;
const int F_teams = 19;
const int F_bullets = 20;
const int F_shots = 21;
const int F_explosions = 22;
const int F_emotes = 23;
const int F_ack = 24;
Player::Player()
{
entity_subtype = EST_Player;
update_msg = new cs::SMUpdate();
}
Player::~Player()
{
delete update_msg;
update_msg = nullptr;
}
void Player::Initialize()
{
health = meta->i->health();
}
void Player::Update(int delta_time)
{
movement->Update(delta_time);
if (updated_times % 2 == 0) {
MakeUpdateMsg();
SendNotifyMsg(*update_msg);
{
if (!new_players.empty()) {
new_players.clear();
}
}
}
}
void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg)
{
}
void Player::_CMDropItem(f8::MsgHdr& hdr, const cs::CMDropItem& msg)
{
}
void Player::_CMEmote(f8::MsgHdr& hdr, const cs::CMEmote& msg)
{
}
void Player::_CMSpectate(f8::MsgHdr& hdr, const cs::CMSpectate& msg)
{
}
void Player::_CMVoice(f8::MsgHdr& hdr, const cs::CMVoice& msg)
{
}
void Player::FillMFPlayerData(cs::MFPlayerData* player_data)
{
player_data->set_has_action(false);
}
void Player::MakeUpdateMsg()
{
update_msg->Clear();
{
for (auto& itr : new_players) {
itr->FillMFObjectFull(update_msg->add_full_objects());
if (itr->frame_data.bullets.size() > 0) {
update_msg->mutable_bullets()->MergeFrom(itr->frame_data.bullets);
}
if (itr->frame_data.shots.size() > 0) {
update_msg->mutable_shots()->MergeFrom(itr->frame_data.shots);
}
}
for (auto& itr : part_players) {
itr->FillMFObjectPart(update_msg->add_part_objects());
if (itr->frame_data.bullets.size() > 0) {
update_msg->mutable_bullets()->MergeFrom(itr->frame_data.bullets);
}
if (itr->frame_data.shots.size() > 0) {
update_msg->mutable_shots()->MergeFrom(itr->frame_data.shots);
}
}
if (updated_times == 0) {
update_msg->set_active_player_id(entity_uniid);
FillMFPlayerData(update_msg->mutable_active_player_data());
}
update_msg->set_alive_count(room->AliveCount());
{
int data_flags32 = 0;
if (!new_players.empty()) {
a8::SetBitFlag(data_flags32, F_full_objects);
}
if (!part_players.empty()) {
a8::SetBitFlag(data_flags32, F_part_objects);
}
if (update_msg->bullets_size() > 0) {
a8::SetBitFlag(data_flags32, F_bullets);
}
if (update_msg->shots_size() > 0) {
a8::SetBitFlag(data_flags32, F_shots);
}
if (updated_times == 0) {
a8::SetBitFlag(data_flags32, F_active_player_id);
a8::SetBitFlag(data_flags32, F_active_player_data);
}
a8::SetBitFlag(data_flags32, F_alive_count);
update_msg->set_data_flags32(data_flags32);
}
}
}