This commit is contained in:
aozhiwei 2021-08-27 09:55:46 +00:00
parent 3bad00da5c
commit 6b8ee51513
6 changed files with 66 additions and 5 deletions

View File

@ -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

View File

@ -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:

View File

@ -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) {

View File

@ -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<int> synced_objects;
{
for (auto& full_obj : msg->full_objects()) {
synced_objects.insert(full_obj.obj_uniid());
}
}
std::set<Entity*> 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)) {

View File

@ -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 <typename T>
void SendNotifyMsg(T& msg)

View File

@ -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();
}