观战ok
This commit is contained in:
parent
3bad00da5c
commit
6b8ee51513
@ -347,7 +347,11 @@ void AndroidAI::UpdateAttack()
|
|||||||
}
|
}
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (App::Instance()->HasFlag(20)) {
|
if (App::Instance()->HasFlag(20)) {
|
||||||
|
#if 1
|
||||||
|
ChangeToStateNewAI(ASE_RandomWalk);
|
||||||
|
#else
|
||||||
ChangeToStateNewAI(ASE_Thinking);
|
ChangeToStateNewAI(ASE_Thinking);
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -12,7 +12,7 @@ namespace cs
|
|||||||
struct ObjectSyncFlags
|
struct ObjectSyncFlags
|
||||||
{
|
{
|
||||||
unsigned char flags = 0;
|
unsigned char flags = 0;
|
||||||
unsigned char last_sync_frameno = 0;
|
int last_sync_frameno = 0;
|
||||||
};
|
};
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
@ -77,10 +77,10 @@ class Entity
|
|||||||
EntityWeakPtrChunk* GetEntityWeakPtrChunk() { return &entity_weak_ptr_chunk_; };
|
EntityWeakPtrChunk* GetEntityWeakPtrChunk() { return &entity_weak_ptr_chunk_; };
|
||||||
EntityWeakPtr AllocEntityWeakPtr();
|
EntityWeakPtr AllocEntityWeakPtr();
|
||||||
EntityWeakPtr& GetEntityWeakPtrRef();
|
EntityWeakPtr& GetEntityWeakPtrRef();
|
||||||
|
|
||||||
protected:
|
|
||||||
bool IsClientCached(Human* hum);
|
bool IsClientCached(Human* hum);
|
||||||
bool CanClientCache(Human* hum);
|
bool CanClientCache(Human* hum);
|
||||||
|
|
||||||
|
protected:
|
||||||
void AddClientCache(Human* hum);
|
void AddClientCache(Human* hum);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -96,7 +96,7 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum)
|
|||||||
((Human*)e)->HasBuffEffect(kBET_Fly)){
|
((Human*)e)->HasBuffEffect(kBET_Fly)){
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (hum->IsPlayer() && e->CanSeeMe(hum)) {
|
if ((hum->IsPlayer() || hum->HasObserver()) && e->CanSeeMe(hum)) {
|
||||||
e->FillMFObjectFull(room, (Human*)hum, msg->add_full_objects());
|
e->FillMFObjectFull(room, (Human*)hum, msg->add_full_objects());
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (e->GetEntityType() == ET_Car) {
|
if (e->GetEntityType() == ET_Car) {
|
||||||
|
@ -1412,6 +1412,11 @@ void Human::RemoveObserver(Human* observer)
|
|||||||
observers_.erase(observer);
|
observers_.erase(observer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Human::HasObserver()
|
||||||
|
{
|
||||||
|
return !observers_.empty();
|
||||||
|
}
|
||||||
|
|
||||||
void Human::SendUpdateMsg()
|
void Human::SendUpdateMsg()
|
||||||
{
|
{
|
||||||
if (!follow_target_ && !a8::HasBitFlag(status, CS_Disable)) {
|
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());
|
msg->set_active_player_id(GetUniId());
|
||||||
FillMFActivePlayerData(msg->mutable_active_player_data());
|
FillMFActivePlayerData(msg->mutable_active_player_data());
|
||||||
if (!refreshed_view) {
|
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;
|
std::set<Entity*> view_objects;
|
||||||
GetViewObjects(view_objects);
|
GetViewObjects(view_objects);
|
||||||
for (Entity* entity : 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());
|
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();
|
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);
|
observer->SendNotifyMsg(*msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3598,6 +3645,13 @@ void Human::OnBulletHit(Bullet* bullet)
|
|||||||
HasBuffEffect(kBET_Fly)) {
|
HasBuffEffect(kBET_Fly)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
#if 0
|
||||||
|
if (IsPlayer()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
RemoveBuffByEffectId(kBET_PeaceMode);
|
RemoveBuffByEffectId(kBET_PeaceMode);
|
||||||
if (!dead && (bullet->IsBomb() || bullet->sender.Get()->team_id != team_id)) {
|
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 FillBodyState(::google::protobuf::RepeatedPtrField<::cs::MFBodyState>* states);
|
||||||
void AddObserver(Human* observer);
|
void AddObserver(Human* observer);
|
||||||
void RemoveObserver(Human* observer);
|
void RemoveObserver(Human* observer);
|
||||||
|
bool HasObserver();
|
||||||
void SendUpdateMsg();
|
void SendUpdateMsg();
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void SendNotifyMsg(T& msg)
|
void SendNotifyMsg(T& msg)
|
||||||
|
@ -44,9 +44,11 @@ void Incubator::AllocAndroid(Human* target, int num)
|
|||||||
} else {
|
} else {
|
||||||
room->EnableHuman(hum);
|
room->EnableHuman(hum);
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
#if 0
|
||||||
if (!target->InNewObjects(hum)) {
|
if (!target->InNewObjects(hum)) {
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (hum->dead) {
|
if (hum->dead) {
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user