743 lines
25 KiB
C++
743 lines
25 KiB
C++
#include "precompile.h"
|
|
|
|
#include <float.h>
|
|
|
|
#include "playermgr.h"
|
|
#include "player.h"
|
|
#include "cs_proto.pb.h"
|
|
#include "room.h"
|
|
#include "metamgr.h"
|
|
#include "movement.h"
|
|
#include "bullet.h"
|
|
#include "obstacle.h"
|
|
#include "building.h"
|
|
#include "loot.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_type = ET_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();
|
|
#if 0
|
|
weapons[GUN_SLOT1].weapon_idx = GUN_SLOT1;
|
|
weapons[GUN_SLOT1].weapon_id = DEF_WEAPON_ID;
|
|
weapons[GUN_SLOT1].weapon_lv = 1;
|
|
weapons[GUN_SLOT1].meta = MetaMgr::Instance()->GetEquip(DEF_WEAPON_ID);;
|
|
curr_weapon = &weapons[GUN_SLOT1];
|
|
#endif
|
|
RecalcSelfCollider();
|
|
}
|
|
|
|
void Player::Update(int delta_time)
|
|
{
|
|
if (poisoning) {
|
|
poisoning_time += delta_time;
|
|
}
|
|
movement->Update(delta_time);
|
|
if (moving) {
|
|
UpdateMove();
|
|
}
|
|
if (room->frame_no % 2 == 0) {
|
|
if (shot_start || shot_hold) {
|
|
UpdateShot();
|
|
}
|
|
if (interaction_objids.size() > 0) {
|
|
ProcInteraction();
|
|
}
|
|
if (poisoning) {
|
|
UpdatePoisoning();
|
|
}
|
|
if (select_weapon) {
|
|
UpdateSelectWeapon();
|
|
}
|
|
if (drop_weapon) {
|
|
UpdateDropWeapon();
|
|
}
|
|
if (use_scope) {
|
|
UpdateUseScope();
|
|
}
|
|
MakeUpdateMsg();
|
|
SendNotifyMsg(*update_msg);
|
|
{
|
|
if (!new_objects.empty()) {
|
|
new_objects.clear();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void Player::UpdateMove()
|
|
{
|
|
++moved_frames;
|
|
if (moved_frames > 4) {
|
|
moving = false;
|
|
moved_frames = 0;
|
|
return;
|
|
}
|
|
int speed = std::max(1, (int)GetSpeed());
|
|
for (int i = 0; i < speed; ++i) {
|
|
Vector2D old_pos = pos;
|
|
pos = pos + move_dir;
|
|
if (IsCollision()) {
|
|
pos = old_pos;
|
|
if (i == 0) {
|
|
FindPath();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if (last_collision_door && !TestCollision(last_collision_door)) {
|
|
last_collision_door = nullptr;
|
|
}
|
|
}
|
|
|
|
void Player::UpdateShot()
|
|
{
|
|
if (shot_start) {
|
|
shot_start = false;
|
|
Shot();
|
|
return;
|
|
}
|
|
if (shot_hold) {
|
|
++series_shot_frames;
|
|
if (series_shot_frames > 4) {
|
|
shot_hold = false;
|
|
series_shot_frames = 0;
|
|
Shot();
|
|
}
|
|
}
|
|
}
|
|
|
|
void Player::UpdateSelectWeapon()
|
|
{
|
|
if (selected_weapon_idx >= 0 && selected_weapon_idx < weapons.size()) {
|
|
Weapon* weapon = &weapons[selected_weapon_idx];
|
|
if (weapon->weapon_id != 0) {
|
|
curr_weapon = weapon;
|
|
need_sync_active_player = true;
|
|
for (auto& pair : room->human_hash_) {
|
|
pair.second->new_objects.insert(this);
|
|
}
|
|
}
|
|
}
|
|
select_weapon = false;
|
|
selected_weapon_idx = 0;
|
|
}
|
|
|
|
void Player::Shot()
|
|
{
|
|
if (!curr_weapon->meta) {
|
|
return;
|
|
}
|
|
|
|
{
|
|
cs::MFShot* shot = room->frame_data.shots.Add();
|
|
shot->set_player_id(entity_uniid);
|
|
curr_weapon->ToPB(shot->mutable_weapon());
|
|
shot->set_offhand(true);
|
|
shot->set_bullskin(10001);
|
|
}
|
|
{
|
|
cs::MFBullet* bullet = room->frame_data.bullets.Add();
|
|
bullet->set_player_id(entity_uniid);
|
|
bullet->set_bullet_id(curr_weapon->meta->i->use_bullet());
|
|
pos.ToPB(bullet->mutable_pos());
|
|
attack_dir.ToPB(bullet->mutable_dir());
|
|
bullet->set_bulletskin(10001);
|
|
bullet->set_gun_id(curr_weapon->meta->i->id());
|
|
bullet->set_fly_distance(fly_distance);
|
|
}
|
|
{
|
|
Bullet* bullet = new Bullet();
|
|
bullet->player = this;
|
|
bullet->room = room;
|
|
bullet->gun_meta = curr_weapon->meta;
|
|
bullet->meta = MetaMgr::Instance()->GetEquip(curr_weapon->meta->i->use_bullet());
|
|
bullet->pos = pos;
|
|
bullet->dir = attack_dir;
|
|
bullet->born_pos = pos;
|
|
bullet->born_dir = attack_dir;
|
|
bullet->fly_distance = fly_distance;
|
|
bullet->entity_uniid = bullet->room->AllocUniid();
|
|
bullet->Initialize();
|
|
room->AddBullet(bullet);
|
|
}
|
|
int slot_id = curr_weapon->meta->i->_inventory_slot();
|
|
switch (slot_id) {
|
|
case 5:
|
|
{
|
|
//手雷
|
|
if (inventory[slot_id] > 0) {
|
|
--inventory[slot_id];
|
|
} else {
|
|
int weapon_idx = curr_weapon->weapon_idx;
|
|
*curr_weapon = Weapon();
|
|
curr_weapon->weapon_idx = weapon_idx;
|
|
if (weapons[SMOKE_SLOT].weapon_id != 0) {
|
|
curr_weapon = &weapons[SMOKE_SLOT];
|
|
} else {
|
|
curr_weapon = &weapons[0];
|
|
}
|
|
}
|
|
need_sync_active_player = true;
|
|
SyncAroundPlayers();
|
|
}
|
|
break;
|
|
case 6:
|
|
{
|
|
//烟雾弹
|
|
if (inventory[slot_id] > 0) {
|
|
--inventory[slot_id];
|
|
} else {
|
|
int weapon_idx = curr_weapon->weapon_idx;
|
|
*curr_weapon = Weapon();
|
|
curr_weapon->weapon_idx = weapon_idx;
|
|
if (weapons[FRAG_SLOT].weapon_id != 0) {
|
|
curr_weapon = &weapons[FRAG_SLOT];
|
|
} else {
|
|
curr_weapon = &weapons[0];
|
|
}
|
|
}
|
|
need_sync_active_player = true;
|
|
SyncAroundPlayers();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Player::ProcInteraction()
|
|
{
|
|
for (auto obj_id : interaction_objids) {
|
|
Entity* entity = room->GetEntityByUniId(obj_id);
|
|
if (entity) {
|
|
switch (entity->entity_type) {
|
|
case ET_Obstacle:
|
|
{
|
|
ObstacleInteraction((Obstacle*)entity);
|
|
}
|
|
break;
|
|
case ET_Loot:
|
|
{
|
|
LootInteraction((Loot*)entity);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
interaction_objids.Clear();
|
|
}
|
|
|
|
void Player::ObstacleInteraction(Obstacle* entity)
|
|
{
|
|
if (entity->is_door) {
|
|
if (entity->door_state == DoorStateClose) {
|
|
entity->door_state = DoorStateOpen;
|
|
entity->pos = Vector2D(entity->building->pos.x + entity->door_state1->x() - entity->building->meta->i->tilewidth() / 2.0,
|
|
entity->building->pos.y + entity->door_state1->y() - entity->building->meta->i->tileheight() / 2.0);
|
|
} else {
|
|
entity->door_state = DoorStateClose;
|
|
entity->pos = Vector2D(entity->building->pos.x + entity->door_state0->x() - entity->building->meta->i->tilewidth() / 2.0,
|
|
entity->building->pos.y + entity->door_state0->y() - entity->building->meta->i->tileheight() / 2.0);
|
|
}
|
|
entity->RecalcSelfCollider();
|
|
for (auto& pair : room->human_hash_) {
|
|
pair.second->new_objects.insert(entity);
|
|
pair.second->part_objects.insert(entity);
|
|
if (entity->TestCollision(pair.second)) {
|
|
pair.second->last_collision_door = entity;
|
|
} else if (pair.second->last_collision_door == entity) {
|
|
pair.second->last_collision_door = nullptr;
|
|
}
|
|
}
|
|
} else {
|
|
}
|
|
}
|
|
|
|
void Player::LootInteraction(Loot* entity)
|
|
{
|
|
if (entity->pickuped) {
|
|
return;
|
|
}
|
|
MetaData::Equip* item_meta = MetaMgr::Instance()->GetEquip(entity->item_id);
|
|
if (!item_meta) {
|
|
return;
|
|
}
|
|
switch (item_meta->i->equip_type()) {
|
|
case 1:
|
|
{
|
|
//装备
|
|
if (item_meta->i->equip_subtype() == 1) {
|
|
//近战
|
|
if (default_weapon.weapon_id != weapons[0].weapon_id) {
|
|
cs::SMPickup notifymsg;
|
|
notifymsg.set_error_code(2);
|
|
SendNotifyMsg(notifymsg);
|
|
return;
|
|
} else {
|
|
weapons[0].weapon_idx = 0;
|
|
weapons[0].weapon_id = entity->item_id;
|
|
weapons[0].weapon_lv = 1;
|
|
weapons[0].num = 0;
|
|
need_sync_active_player = true;
|
|
}
|
|
need_sync_active_player = true;
|
|
for (auto& pair : room->human_hash_) {
|
|
pair.second->new_objects.insert(this);
|
|
}
|
|
} else {
|
|
Weapon* weapon = nullptr;
|
|
if (weapons[GUN_SLOT1].weapon_id == 0) {
|
|
weapon = &weapons[GUN_SLOT1];
|
|
weapon->weapon_idx = GUN_SLOT1;
|
|
if (curr_weapon != &weapons[GUN_SLOT2]) {
|
|
curr_weapon = &weapons[GUN_SLOT1];
|
|
}
|
|
} else if (weapons[GUN_SLOT2].weapon_id == 0) {
|
|
weapon = &weapons[GUN_SLOT2];
|
|
weapon->weapon_idx = GUN_SLOT2;
|
|
if (curr_weapon != &weapons[GUN_SLOT1]) {
|
|
curr_weapon = &weapons[GUN_SLOT2];
|
|
}
|
|
}
|
|
if (!weapon) {
|
|
cs::SMPickup notifymsg;
|
|
notifymsg.set_error_code(2);
|
|
SendNotifyMsg(notifymsg);
|
|
return;
|
|
}
|
|
weapon->weapon_id = entity->item_id;
|
|
weapon->weapon_lv = 1;
|
|
weapon->num = 0;
|
|
weapon->meta = item_meta;
|
|
need_sync_active_player = true;
|
|
for (auto& pair : room->human_hash_) {
|
|
pair.second->new_objects.insert(this);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
{
|
|
if (item_meta->i->_inventory_slot() >= 0 &&
|
|
item_meta->i->_inventory_slot() < MAX_INVENTORY_NUM) {
|
|
inventory[item_meta->i->_inventory_slot()] += entity->count;
|
|
if (item_meta->i->_inventory_slot() == 5 ||
|
|
item_meta->i->_inventory_slot() == 6) {
|
|
Weapon* weapon = &weapons[3 + (item_meta->i->_inventory_slot() - 5)];
|
|
if (weapon->weapon_id == 0) {
|
|
weapon->weapon_id = entity->item_id;
|
|
weapon->weapon_lv = 1;
|
|
weapon->num = 0;
|
|
weapon->meta = item_meta;
|
|
inventory[item_meta->i->_inventory_slot()] -= entity->count;
|
|
}
|
|
}
|
|
if (item_meta->i->_inventory_slot() > 12) {
|
|
if (item_meta->i->_inventory_slot() - 12 > curr_scope_idx) {
|
|
curr_scope_idx = item_meta->i->_inventory_slot() - 12;
|
|
}
|
|
}
|
|
} else {
|
|
switch (item_meta->i->equip_type()) {
|
|
case 7:
|
|
{
|
|
//背包
|
|
MetaData::Equip* old_item_meta = MetaMgr::Instance()->GetEquip(backpack);
|
|
if (old_item_meta) {
|
|
if (old_item_meta->i->equip_lv() <= item_meta->i->equip_lv()) {
|
|
return;
|
|
}
|
|
DropItem(old_item_meta->i->id());
|
|
}
|
|
backpack = item_meta->i->id();
|
|
}
|
|
break;
|
|
case 4:
|
|
{
|
|
//防具
|
|
if (item_meta->i->equip_subtype() == 1) {
|
|
//盔甲
|
|
MetaData::Equip* old_item_meta = MetaMgr::Instance()->GetEquip(chest);
|
|
if (old_item_meta) {
|
|
if (old_item_meta->i->equip_lv() <= item_meta->i->equip_lv()) {
|
|
return;
|
|
}
|
|
DropItem(old_item_meta->i->id());
|
|
}
|
|
chest = item_meta->i->id();
|
|
} else if (item_meta->i->equip_subtype() == 2) {
|
|
//头盔
|
|
MetaData::Equip* old_item_meta = MetaMgr::Instance()->GetEquip(helmet);
|
|
if (old_item_meta) {
|
|
if (old_item_meta->i->equip_lv() <= item_meta->i->equip_lv()) {
|
|
return;
|
|
}
|
|
DropItem(old_item_meta->i->id());
|
|
}
|
|
helmet = item_meta->i->id();
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
need_sync_active_player = true;
|
|
SyncAroundPlayers();
|
|
}
|
|
break;
|
|
}
|
|
entity->pickuped = true;
|
|
room->AddDeletedObject(entity->entity_uniid);
|
|
}
|
|
|
|
void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg)
|
|
{
|
|
bool has_move_dir = msg.has_move_dir();
|
|
moving = false;
|
|
if (msg.has_move_dir()) {
|
|
if (std::abs(msg.move_dir().x()) > FLT_EPSILON ||
|
|
std::abs(msg.move_dir().y()) > FLT_EPSILON
|
|
) {
|
|
move_dir.FromPB(&msg.move_dir());
|
|
move_dir.Normalize();
|
|
moving = true;
|
|
}
|
|
}
|
|
assert(!isnan(move_dir.x) && !isnan(move_dir.y));
|
|
#if 0
|
|
moving = msg.has_move_dir();
|
|
#endif
|
|
if (msg.has_attack_dir()) {
|
|
attack_dir.FromPB(&msg.attack_dir());
|
|
attack_dir.Normalize();
|
|
} else {
|
|
if (moving) {
|
|
attack_dir = move_dir;
|
|
}
|
|
}
|
|
if (moving) {
|
|
moved_frames = 0;
|
|
}
|
|
shot_start = msg.shot_start();
|
|
shot_hold = msg.shot_hold();
|
|
fly_distance = std::min(200.0f, msg.fly_distance());
|
|
if (!shot_hold) {
|
|
series_shot_frames = 0;
|
|
}
|
|
if (msg.has_interaction()) {
|
|
interaction_objids = msg.interaction_objids();
|
|
}
|
|
last_seq_id = msg.seq();
|
|
if (msg.has_select_weapon()) {
|
|
select_weapon = true;
|
|
selected_weapon_idx = msg.select_weapon();
|
|
}
|
|
if (msg.has_drop_weapon()) {
|
|
drop_weapon = true;
|
|
drop_weapon_idx = msg.drop_weapon();
|
|
}
|
|
if (msg.has_use_scope()) {
|
|
use_scope = true;
|
|
use_scope_idx = msg.use_scope();
|
|
}
|
|
}
|
|
|
|
void Player::UpdateDropWeapon()
|
|
{
|
|
if (drop_weapon_idx >= 0 && drop_weapon_idx < weapons.size()) {
|
|
bool drop_ok = false;
|
|
Weapon* weapon = &weapons[drop_weapon_idx];
|
|
int weapon_id = weapon->weapon_id;
|
|
if (weapon->weapon_id != 0) {
|
|
if (weapon->weapon_idx == 0) {
|
|
if (weapon->weapon_id != default_weapon.weapon_id) {
|
|
drop_ok = true;
|
|
*weapon = default_weapon;
|
|
}
|
|
} else if (weapon->weapon_idx == GUN_SLOT1) {
|
|
drop_ok = true;
|
|
*weapon = Weapon();
|
|
weapon->weapon_idx = drop_weapon_idx;
|
|
if (curr_weapon == weapon) {
|
|
if (weapons[GUN_SLOT2].weapon_id != 0) {
|
|
curr_weapon = &weapons[GUN_SLOT2];
|
|
} else {
|
|
curr_weapon = &weapons[0];
|
|
}
|
|
}
|
|
} else if (weapon->weapon_idx == GUN_SLOT2) {
|
|
drop_ok = true;
|
|
*weapon = Weapon();
|
|
weapon->weapon_idx = drop_weapon_idx;
|
|
if (curr_weapon == weapon) {
|
|
if (weapons[GUN_SLOT1].weapon_id != 0) {
|
|
curr_weapon = &weapons[GUN_SLOT1];
|
|
} else {
|
|
curr_weapon = &weapons[0];
|
|
}
|
|
}
|
|
} else if (weapon->weapon_idx == FRAG_SLOT) {
|
|
drop_ok = true;
|
|
*weapon = Weapon();
|
|
weapon->weapon_idx = drop_weapon_idx;
|
|
if (curr_weapon == weapon) {
|
|
if (weapons[GUN_SLOT1].weapon_id != 0) {
|
|
curr_weapon = &weapons[GUN_SLOT1];
|
|
} else if (weapons[GUN_SLOT2].weapon_id != 0) {
|
|
curr_weapon = &weapons[GUN_SLOT2];
|
|
} else {
|
|
curr_weapon = &weapons[0];
|
|
}
|
|
}
|
|
} else if (weapon->weapon_idx == SMOKE_SLOT) {
|
|
drop_ok = true;
|
|
*weapon = Weapon();
|
|
weapon->weapon_idx = drop_weapon_idx;
|
|
if (curr_weapon == weapon) {
|
|
if (weapons[GUN_SLOT1].weapon_id != 0) {
|
|
curr_weapon = &weapons[GUN_SLOT1];
|
|
} else if (weapons[GUN_SLOT2].weapon_id != 0) {
|
|
curr_weapon = &weapons[GUN_SLOT2];
|
|
} else {
|
|
curr_weapon = &weapons[0];
|
|
}
|
|
}
|
|
}
|
|
if (drop_ok) {
|
|
#if 1
|
|
{
|
|
MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(weapon_id);
|
|
if (equip_meta) {
|
|
Loot* entity = new Loot();
|
|
entity->room = room;
|
|
entity->meta = equip_meta;
|
|
entity->entity_uniid = room->AllocUniid();
|
|
{
|
|
Vector2D dir = Vector2D::UP;
|
|
dir.Rotate(a8::RandAngle());
|
|
entity->pos = pos + dir * (25 + rand() % 50);
|
|
}
|
|
entity->item_id = weapon_id;
|
|
entity->count = 1;
|
|
entity->Initialize();
|
|
room->uniid_hash_[entity->entity_uniid] = entity;
|
|
for (auto& pair : room->human_hash_) {
|
|
pair.second->new_objects.insert(entity);
|
|
pair.second->part_objects.insert(entity);
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
need_sync_active_player = true;
|
|
for (auto& pair : room->human_hash_) {
|
|
pair.second->new_objects.insert(this);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
drop_weapon = false;
|
|
drop_weapon_idx = 0;
|
|
}
|
|
|
|
void Player::UpdateUseScope()
|
|
{
|
|
if (12 + use_scope_idx >= 12 && 12 + use_scope_idx < 16) {
|
|
if (inventory[12 + use_scope_idx] > 0) {
|
|
curr_scope_idx = use_scope_idx;
|
|
need_sync_active_player = true;
|
|
}
|
|
}
|
|
use_scope = false;
|
|
use_scope_idx = 0;
|
|
}
|
|
|
|
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)
|
|
{
|
|
cs::SMVoiceNotify notifymsg;
|
|
notifymsg.set_mode(msg.mode());
|
|
notifymsg.set_account_id(account_id);
|
|
notifymsg.set_msg(msg.msg());
|
|
auto send_func = [] (Player* hum, a8::XParams& param)
|
|
{
|
|
cs::SMVoiceNotify* msg = (cs::SMVoiceNotify*)param.sender.GetUserData();
|
|
hum->SendNotifyMsg(*msg);
|
|
};
|
|
room->TouchPlayerList(a8::XParams()
|
|
.SetSender(¬ifymsg),
|
|
send_func);
|
|
}
|
|
|
|
void Player::FillMFActivePlayerData(cs::MFActivePlayerData* player_data)
|
|
{
|
|
player_data->set_has_action(false);
|
|
player_data->set_skin(skin);
|
|
player_data->set_backpack(backpack);
|
|
player_data->set_helmet(helmet);
|
|
player_data->set_chest(chest);
|
|
player_data->set_cur_weapon_idx(curr_weapon->weapon_idx);
|
|
player_data->set_cur_scope(curr_scope_idx);
|
|
for (auto& weapon : weapons) {
|
|
auto p = player_data->add_weapons();
|
|
weapon.ToPB(p);
|
|
}
|
|
for (auto& num : inventory) {
|
|
player_data->add_inventory(num);
|
|
}
|
|
}
|
|
|
|
void Player::FillMFGasData(cs::MFGasData* gas_data)
|
|
{
|
|
gas_data->set_mode(room->gas_data.gas_mode);
|
|
if (room->gas_data.gas_mode == GasInactive) {
|
|
long long duration = GAS_INACTIVE_TIME * 20 - (room->frame_no - room->gas_data.gas_start_frameno);
|
|
gas_data->set_duration(std::max(duration * 50, (long long)1000) / 1000);
|
|
} else {
|
|
if (room->gas_data.old_area_meta->i->wait_time() <= 0) {
|
|
gas_data->set_duration(0);
|
|
} else {
|
|
long long duration = room->gas_data.old_area_meta->i->wait_time() * 20 -
|
|
(room->frame_no - room->gas_data.gas_start_frameno);
|
|
gas_data->set_duration(std::max(duration * 50, (long long)1000) / 1000);
|
|
}
|
|
}
|
|
room->gas_data.pos_old.ToPB(gas_data->mutable_pos_old());
|
|
room->gas_data.pos_new.ToPB(gas_data->mutable_pos_new());
|
|
gas_data->set_rad_old(room->gas_data.rad_old);
|
|
gas_data->set_rad_new(room->gas_data.rad_new);
|
|
}
|
|
|
|
void Player::MakeUpdateMsg()
|
|
{
|
|
update_msg->Clear();
|
|
{
|
|
update_msg->set_ack(last_seq_id);
|
|
for (auto& obj_uniid : room->frame_data.deleted_objects) {
|
|
update_msg->add_del_objids(obj_uniid);
|
|
}
|
|
*update_msg->mutable_shots() = room->frame_data.shots;
|
|
*update_msg->mutable_bullets() = room->frame_data.bullets;
|
|
//*update_msg->mutable_explosions() = room->frame_data.explosions;
|
|
//*update_msg->mutable_smokes() = room->frame_data.smokes;
|
|
{
|
|
for (auto& pair : room->frame_data.explosions_hash) {
|
|
if (pair.first <= room->frame_no) {
|
|
for (auto& itr : pair.second) {
|
|
*update_msg->add_explosions() = itr;
|
|
}
|
|
}
|
|
}
|
|
for (auto& pair : room->frame_data.smokes_hash) {
|
|
if (pair.first <= room->frame_no) {
|
|
for (auto& itr : pair.second) {
|
|
*update_msg->add_smokes() = itr;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (update_msg->mutable_smokes()->size() > 0) {
|
|
int i = 0;
|
|
}
|
|
for (auto& itr : new_objects) {
|
|
itr->FillMFObjectFull(update_msg->add_full_objects());
|
|
#if 0
|
|
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);
|
|
}
|
|
#endif
|
|
}
|
|
for (auto& itr : part_objects) {
|
|
itr->FillMFObjectPart(update_msg->add_part_objects());
|
|
#if 0
|
|
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);
|
|
}
|
|
#endif
|
|
}
|
|
if (updated_times == 0 || need_sync_active_player) {
|
|
update_msg->set_active_player_id(entity_uniid);
|
|
FillMFActivePlayerData(update_msg->mutable_active_player_data());
|
|
need_sync_active_player = false;
|
|
}
|
|
if (updated_times == 0 || last_sync_gas_frameno < room->gas_data.gas_start_frameno) {
|
|
last_sync_gas_frameno = room->gas_data.gas_start_frameno;
|
|
FillMFGasData(update_msg->mutable_gas_data());
|
|
}
|
|
if (room->gas_data.gas_mode == GasMoving) {
|
|
update_msg->set_gas_progress(room->gas_data.gas_progress);
|
|
room->gas_data.pos_old.ToPB(update_msg->mutable_gas_pos_old());
|
|
}
|
|
update_msg->set_alive_count(room->AliveCount());
|
|
|
|
{
|
|
int data_flags32 = 0;
|
|
if (!update_msg->del_objids_size() > 0) {
|
|
a8::SetBitFlag(data_flags32, F_del_objids);
|
|
}
|
|
if (!new_objects.empty()) {
|
|
a8::SetBitFlag(data_flags32, F_full_objects);
|
|
}
|
|
if (!part_objects.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);
|
|
}
|
|
}
|
|
}
|