diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index dfabf5f..c568b43 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -32,11 +32,18 @@ void FrameMaker::Debug_FullObject(Human* hum) } out_data->Push(*xobj); } - hum->SendDebugMsg(a8::Format("view_debug frameno:%d server_full_obj:%s", - { - hum->room->GetFrameNo(), - out_data->ToJsonStr() - })); + hum->TraverseObservers + ( + [&out_data] (Human* hum, bool& stop) + { + if (hum->IsPlayer()) { + hum->SendDebugMsg(a8::Format("view_debug frameno:%d server_full_obj:%s", + { + hum->room->GetFrameNo() / 2, + out_data->ToJsonStr() + })); + } + }); } } @@ -58,11 +65,18 @@ void FrameMaker::Debug_OutObject(Human* hum) } out_data->Push(*xobj); } - hum->SendDebugMsg(a8::Format("view_debug frameno:%d server_out_obj:%s", - { - hum->room->GetFrameNo(), - out_data->ToJsonStr() - })); + hum->TraverseObservers + ( + [&out_data] (Human* hum, bool& stop) + { + if (hum->IsPlayer()) { + hum->SendDebugMsg(a8::Format("view_debug frameno:%d server_out_obj:%s", + { + hum->room->GetFrameNo() / 2, + out_data->ToJsonStr() + })); + } + }); } } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 3fd5709..c16f6c9 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -2350,6 +2350,7 @@ void Human::GetViewObjects(std::set& view_objects) void Human::NotifyObservers(cs::SMUpdate* msg, cs::MFActivePlayerData* active_player_data_pb) { bool refreshed_view = false; + std::set synced_objects; for (Human* observer : observers_) { msg->clear_team_data(); if (observer->GetTeam()) { @@ -2367,10 +2368,9 @@ void Human::NotifyObservers(cs::SMUpdate* msg, cs::MFActivePlayerData* active_pl msg->set_active_player_id(GetUniId()); FillMFActivePlayerData(msg->mutable_active_player_data()); if (!refreshed_view) { - std::set synced_objects; { - for (auto& full_obj : msg->full_objects()) { - synced_objects.insert(full_obj.obj_uniid()); + for (auto& pair : framedata_.new_objects) { + synced_objects.insert(pair.first); } } std::set view_objects; @@ -2378,6 +2378,7 @@ void Human::NotifyObservers(cs::SMUpdate* msg, cs::MFActivePlayerData* active_pl for (Entity* entity : view_objects) { if (synced_objects.find(entity->GetUniId()) == synced_objects.end()) { entity->FillMFObjectFull(room, this, msg->add_full_objects()); + synced_objects.insert(entity->GetUniId()); } } refreshed_view = true; @@ -3672,3 +3673,14 @@ void Human::OnWatcherDie(Human* watcher) #endif } } + +void Human::TraverseObservers(std::function func) +{ + bool stop; + for (auto& observer : observers_) { + func(observer, stop); + if (stop) { + break; + } + } +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 4503be3..4112c47 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -211,6 +211,7 @@ class Human : public Creature void AddObserver(Human* observer); void RemoveObserver(Human* observer); bool HasObserver(); + void TraverseObservers(std::function func); void SendUpdateMsg(); template void SendNotifyMsg(T& msg)