From f1c27767773922016b0fd75af87d458ad86f8358 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 14 Mar 2019 15:59:33 +0800 Subject: [PATCH] add type.cc --- server/gameserver/player.cc | 87 ++++++++++++++++++++++++-- server/gameserver/player.h | 11 ++++ server/gameserver/types.cc | 9 +++ server/gameserver/types.h | 7 +++ server/tools/protobuild/cs_proto.proto | 4 +- 5 files changed, 112 insertions(+), 6 deletions(-) create mode 100644 server/gameserver/types.cc diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index c8d29d3..65bfaff 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -5,23 +5,63 @@ #include "cs_proto.pb.h" #include "room.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; + void Player::Update(int delta_time) { if (updated_times % 2 == 0) { cs::SMUpdate msg; - if (updated_times == 0) { - msg.set_active_player_id(entity_uniid); + { + for (auto& itr : new_players) { + itr->FillMFObjectFull(msg.add_full_objects()); + } + for (auto& itr : part_players) { + itr->FillMFObjectPart(msg.add_part_objects()); + } + if (updated_times == 0) { + msg.set_active_player_id(entity_uniid); + FillMFPlayerData(msg.mutable_active_player_data()); + } msg.set_alive_count(room->AliveCount()); { int data_flags32 = 0; - a8::SetBitFlag(data_flags32, 5); - a8::SetBitFlag(data_flags32, 15); + if (!new_players.empty()) { + a8::SetBitFlag(data_flags32, F_full_objects); + } + if (!part_players.empty()) { + a8::SetBitFlag(data_flags32, F_part_objects); + } + + 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); msg.set_data_flags32(data_flags32); } } SendNotifyMsg(msg); + { + if (!new_players.empty()) { + new_players.clear(); + } + } } } @@ -49,3 +89,42 @@ 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::FillMFObjectPart(cs::MFObjectPart* part_data) +{ + part_data->set_object_type(ET_Player); + cs::MFPlayerPart* p = part_data->mutable_union_obj_1(); + p->set_obj_uniid(entity_uniid); + pos.ToPB(p->mutable_pos()); + dir.ToPB(p->mutable_dir()); +} + +void Player::FillMFObjectFull(cs::MFObjectFull* full_data) +{ + full_data->set_object_type(ET_Player); + cs::MFPlayerFull* p = full_data->mutable_union_obj_1(); + p->set_obj_uniid(entity_uniid); + pos.ToPB(p->mutable_pos()); + dir.ToPB(p->mutable_dir()); + + p->set_health(health); + p->set_dead(dead); + p->set_downed(downed); + p->set_disconnected(disconnected); + p->set_anim_type(anim_type); + p->set_anim_seq(anim_seq); + p->set_action_type(action_type); + p->set_skin(skin); + + p->set_helmet(helmet); + p->set_chest(chest); + p->set_weapon(weapon); + p->set_energy_shield(energy_shield); + p->set_vip(vip); + p->set_sdmg(sdmg); +} diff --git a/server/gameserver/player.h b/server/gameserver/player.h index 872573c..5f06768 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -10,6 +10,9 @@ namespace cs class CMEmote; class CMSpectate; class CMVoice; + class MFPlayerData; + class MFObjectPart; + class MFObjectFull; } class Room; @@ -43,6 +46,10 @@ class Player : public Entity int energy_shield = 0; int vip = 0; int sdmg = 0; + std::set my_seen_players; + std::set seen_me_players; + std::set new_players; + std::set part_players; template void SendNotifyMsg(T& msg) @@ -57,4 +64,8 @@ class Player : public Entity void _CMEmote(f8::MsgHdr& hdr, const cs::CMEmote& msg); void _CMSpectate(f8::MsgHdr& hdr, const cs::CMSpectate& msg); void _CMVoice(f8::MsgHdr& hdr, const cs::CMVoice& msg); + + void FillMFPlayerData(cs::MFPlayerData* player_data); + void FillMFObjectPart(cs::MFObjectPart* part_data); + void FillMFObjectFull(cs::MFObjectFull* full_data); }; diff --git a/server/gameserver/types.cc b/server/gameserver/types.cc new file mode 100644 index 0000000..c6911d1 --- /dev/null +++ b/server/gameserver/types.cc @@ -0,0 +1,9 @@ +#include "precompile.h" + +#include "cs_proto.pb.h" + +void Vector2D::ToPB(cs::MFVector2D* pb_obj) +{ + pb_obj->set_x(x); + pb_obj->set_y(y); +} diff --git a/server/gameserver/types.h b/server/gameserver/types.h index ca07750..00001ab 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -9,8 +9,15 @@ struct PerfMonitor long long read_count = 0; }; +namespace cs +{ + class MFVector2D; +} + struct Vector2D { float x = 0.0; float y = 0.0; + + void ToPB(cs::MFVector2D* pb_obj); }; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 07a1edd..c4b8fa2 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -307,7 +307,7 @@ message MFSmokeFull message MFObjectPart { //1:player 2:obstacle 3:building 4:lootspawner 5:loot 6:deadbody 7:decal 8:projectile 9:smoke - optional int32 type = 1; + optional int32 object_type = 1; optional MFPlayerPart union_obj_1 = 2; optional MFObstaclePart union_obj_2 = 3; @@ -606,7 +606,7 @@ message SMUpdate repeated MFObjectPart part_objects = 4; optional int32 active_player_id = 5; //当前活跃玩家id optional MFPlayerData active_player_data = 6; //活跃玩家数据 - optional int32 alive_count = 15; //存活数量 + optional int32 alive_count = 15; //存活数量 optional int32 gasT = 16; optional MFGasData gas_data = 17; repeated MFTeamData team_data = 18;