diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index e176455..e8a426e 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -89,6 +89,9 @@ void Player::MakeUpdateMsg() { update_msg->Clear(); { + for (auto& obj_uniid : room->frame_data.deleted_objects) { + update_msg->add_del_objids(obj_uniid); + } for (auto& itr : new_players) { itr->FillMFObjectFull(update_msg->add_full_objects()); if (itr->frame_data.bullets.size() > 0) { diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 99b6641..f0fea54 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -16,10 +16,12 @@ void Room::Update(int delta_time) { elapsed_time_ += delta_time; while (elapsed_time_ >= 50) { + ResetFrameData(); for (auto& pair : moveable_hash_) { pair.second->Update(50); pair.second->updated_times++; } + ClearDeletedObjects(); elapsed_time_ -= 50; } } @@ -54,7 +56,7 @@ Entity* Room::GetEntityByUniId(unsigned short uniid) int Room::AliveCount() { - return accountid_hash_.size(); + return alive_count_; } void Room::AddPlayer(Player* hum) @@ -65,6 +67,7 @@ void Room::AddPlayer(Player* hum) uniid_hash_[hum->entity_uniid] = hum; moveable_hash_[hum->entity_uniid] = hum; accountid_hash_[hum->account_id] = hum; + ++alive_count_; } unsigned short Room::AllocUniid() @@ -91,6 +94,7 @@ void Room::ShuaAndroid() hum->Initialize(); uniid_hash_[hum->entity_uniid] = hum; moveable_hash_[hum->entity_uniid] = hum; + ++alive_count_; } } @@ -182,3 +186,24 @@ void Room::FillSMJoinedNotify(Player* self_hum, cs::SMJoinedNotify& msg) } } } + +void Room::ResetFrameData() +{ + frame_data.deleted_objects.clear(); + frame_data.explosions.Clear(); + frame_data.emotes.Clear(); +} + +void Room::ClearDeletedObjects() +{ + for (auto& obj_uniid : frame_data.deleted_objects) { + Entity* entity = GetEntityByUniId(obj_uniid); + if (entity) { + if (entity->entity_type != ET_Player) { + uniid_hash_.erase(entity->entity_uniid); + moveable_hash_.erase(entity->entity_uniid); + } + delete entity; + } + } +} diff --git a/server/gameserver/room.h b/server/gameserver/room.h index d61e37e..8d91570 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -48,11 +48,16 @@ public: void CollisionDetection(Entity* sender, int detection_flags, std::vector objects); void AddDeletedObject(unsigned short obj_uniid); void FillSMJoinedNotify(Player* self_hum, cs::SMJoinedNotify& msg); + void ResetFrameData(); - private: +private: + void ClearDeletedObjects(); + +private: unsigned short current_uniid = 0; RoomState_e state_ = RS_Inactive; int elapsed_time_ = 0; + int alive_count_ = 0; std::map accountid_hash_; std::map uniid_hash_;