diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index e60ab34..9d00ed8 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -347,7 +347,11 @@ void AndroidAI::UpdateAttack() } #ifdef DEBUG if (App::Instance()->HasFlag(20)) { + #if 1 + ChangeToStateNewAI(ASE_RandomWalk); + #else ChangeToStateNewAI(ASE_Thinking); + #endif return; } #endif diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h index 8b1021a..79d3f19 100644 --- a/server/gameserver/entity.h +++ b/server/gameserver/entity.h @@ -12,7 +12,7 @@ namespace cs struct ObjectSyncFlags { unsigned char flags = 0; - unsigned char last_sync_frameno = 0; + int last_sync_frameno = 0; }; #pragma pack() @@ -77,10 +77,10 @@ class Entity EntityWeakPtrChunk* GetEntityWeakPtrChunk() { return &entity_weak_ptr_chunk_; }; EntityWeakPtr AllocEntityWeakPtr(); EntityWeakPtr& GetEntityWeakPtrRef(); - -protected: bool IsClientCached(Human* hum); bool CanClientCache(Human* hum); + +protected: void AddClientCache(Human* hum); private: diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index 5d56716..e23a624 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -96,7 +96,7 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) ((Human*)e)->HasBuffEffect(kBET_Fly)){ continue; } - if (hum->IsPlayer() && e->CanSeeMe(hum)) { + if ((hum->IsPlayer() || hum->HasObserver()) && e->CanSeeMe(hum)) { e->FillMFObjectFull(room, (Human*)hum, msg->add_full_objects()); #ifdef DEBUG if (e->GetEntityType() == ET_Car) { diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 395b5a0..5ffeb47 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1412,6 +1412,11 @@ void Human::RemoveObserver(Human* observer) observers_.erase(observer); } +bool Human::HasObserver() +{ + return !observers_.empty(); +} + void Human::SendUpdateMsg() { if (!follow_target_ && !a8::HasBitFlag(status, CS_Disable)) { @@ -2804,10 +2809,16 @@ 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()); + } + } std::set view_objects; GetViewObjects(view_objects); for (Entity* entity : view_objects) { - if (new_objects.find(entity->GetUniId()) == new_objects.end()) { + if (synced_objects.find(entity->GetUniId()) == synced_objects.end()) { entity->FillMFObjectFull(room, this, msg->add_full_objects()); } } @@ -2823,6 +2834,42 @@ void Human::NotifyObservers(cs::SMUpdate* msg, cs::MFActivePlayerData* active_pl msg->clear_active_player_data(); } } + if (observer != this) { + for (int i = 0; i < msg->full_objects_size(); ++i) { + cs::MFObjectFull* full_obj = msg->mutable_full_objects(i); + if (a8::HasBitFlag(full_obj->object_flags(), kOfReadCache)) { + Entity* e = room->GetEntityByUniId(full_obj->obj_uniid()); + if (e) { + if (!e->IsClientCached(observer)) { +#ifdef DEBUG + ObjectSyncFlags old_sync_flags = *(observer->GetObjectSyncFlags(e->GetUniId())); +#endif + e->FillMFObjectFull(room, observer, full_obj); +#ifdef DEBUG + ObjectSyncFlags* new_sync_flags = observer->GetObjectSyncFlags(e->GetUniId()); + observer->SendDebugMsg(a8::Format( + "resync full frameno:%d uniid:%d net_flags:%d f2:%d " + "old_flags:%d,%d new_flags:%d,%d", + { + room->GetFrameNo(), + full_obj->obj_uniid(), + full_obj->object_flags(), + msg->full_objects(i).object_flags(), + old_sync_flags.flags, + old_sync_flags.last_sync_frameno, + new_sync_flags->flags, + new_sync_flags->last_sync_frameno, + })); +#endif + } + } else { +#ifdef DEBUG + abort(); +#endif + } + } + } + } observer->SendNotifyMsg(*msg); } } @@ -3598,6 +3645,13 @@ void Human::OnBulletHit(Bullet* bullet) HasBuffEffect(kBET_Fly)) { return; } + #ifdef DEBUG + #if 0 + if (IsPlayer()) { + return; + } + #endif + #endif RemoveBuffByEffectId(kBET_PeaceMode); if (!dead && (bullet->IsBomb() || bullet->sender.Get()->team_id != team_id)) { diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 7796bd4..1cf1b0a 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -231,6 +231,7 @@ class Human : public Creature void FillBodyState(::google::protobuf::RepeatedPtrField<::cs::MFBodyState>* states); void AddObserver(Human* observer); void RemoveObserver(Human* observer); + bool HasObserver(); void SendUpdateMsg(); template void SendNotifyMsg(T& msg) diff --git a/server/gameserver/incubator.cc b/server/gameserver/incubator.cc index bcc62c7..fbf6a77 100644 --- a/server/gameserver/incubator.cc +++ b/server/gameserver/incubator.cc @@ -44,9 +44,11 @@ void Incubator::AllocAndroid(Human* target, int num) } else { room->EnableHuman(hum); #ifdef DEBUG + #if 0 if (!target->InNewObjects(hum)) { abort(); } + #endif if (hum->dead) { abort(); }