diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index 655a057..36a8b93 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -30,6 +30,9 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(const Human* hum) for (auto& itr : hum->del_objects) { msg->add_del_objids(itr); } + for (auto& itr : hum->out_objects) { + msg->add_out_objids(itr); + } for (int idx : hum->shots_) { if (idx < room->frame_event.shots_.size()) { auto& tuple = room->frame_event.shots_[idx]; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 5761c79..2e99549 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -553,6 +553,11 @@ void Human::RemoveObjects(Entity* entity) del_objects.insert(entity->entity_uniid); } +void Human::OutObjects(Entity* entity) +{ + out_objects.insert(entity->entity_uniid); +} + bool Human::HasLiveTeammate() { if (team_members) { @@ -846,6 +851,7 @@ void Human::RefreshView() switch (entity->entity_type) { case ET_Building: case ET_Obstacle: + case ET_Hero: { AddToNewObjects(entity); } @@ -878,6 +884,7 @@ void Human::OnGridListChange(std::set& old_grid_list, switch (entity->entity_type) { case ET_Building: case ET_Obstacle: + case ET_Hero: { AddToNewObjects(entity); } @@ -892,21 +899,18 @@ void Human::OnGridListChange(std::set& old_grid_list, } for (GridCell* cell : dec_grid_list) { for (Human* entity : cell->human_list) { -#if 0 if (!room->grid_service.HumanInGridList(entity, grid_list)) { - RemoveObjects(entity); + OutObjects(entity); } -#endif } for (Entity* entity : cell->entity_list) { if (!room->grid_service.EntityInGridList(entity, grid_list)) { switch (entity->entity_type) { case ET_Building: case ET_Obstacle: + case ET_Hero: { - #if 0 - RemoveObjects(entity); - #endif + OutObjects(entity); } break; default: @@ -1310,6 +1314,15 @@ void Human::ClearFrameData() } del_objects.clear(); } + if (!out_objects.empty()) { + for (auto& itr : out_objects) { + Entity* entity = room->GetEntityByUniId(itr); + if (entity) { + part_objects.erase(entity); + } + } + del_objects.clear(); + } if (!shots_.empty()) { shots_.clear(); } diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 16bc470..a6cec0a 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -135,6 +135,7 @@ class Human : public Entity void AddToNewObjects(Entity* entity); void AddToPartObjects(Entity* entity); void RemoveObjects(Entity* entity); + void OutObjects(Entity* entity); bool HasLiveTeammate(); void Land(); void DoJump(); @@ -188,6 +189,7 @@ protected: std::set new_objects; std::set part_objects; std::set del_objects; + std::set out_objects; std::vector shots_; std::vector emotes_; std::vector bullets_; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 87d1bb8..79f9add 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -678,7 +678,8 @@ message SMPlayerInfo //帧事件 message SMUpdate { - repeated int32 del_objids = 2; //对象-待删除(移出视野) + repeated int32 out_objids = 1; //对象-移出视野 + repeated int32 del_objids = 2; //对象-待删除 repeated MFObjectFull full_objects = 3; //对象-全量(出现在视野) repeated MFObjectPart part_objects = 4; //对象-部分(用于插值更新) optional int32 active_player_id = 5; //当前活跃玩家id(如果玩家死亡后是观战对象的id)