观战ok
This commit is contained in:
parent
3bad00da5c
commit
6b8ee51513
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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) {
|
||||
|
@ -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)) {
|
||||
|
@ -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)
|
||||
|
@ -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();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user