diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index 653f005..5d56716 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -14,12 +14,22 @@ void FrameMaker::Debug_FullObject(Human* hum) { if (!hum->new_objects.empty()) { a8::MutableXObject* out_data = a8::MutableXObject::NewArray(); - for (auto& itr : hum->new_objects) { - int uniid = itr->GetUniId(); + for (auto& pair : hum->new_objects) { a8::MutableXObject* xobj = a8::MutableXObject::NewObject(); - xobj->SetVal("uniid", uniid); - xobj->SetVal("", itr->GetEntityType()); - xobj->SetVal("pos", a8::Format("%d,%d", {itr->GetPos().x, itr->GetPos().y})); + xobj->SetVal("uniid", pair.first); + if (pair.second.Get()) { + xobj->SetVal("matched", 1); + xobj->SetVal("type", pair.second.Get()->GetEntityType()); + xobj->SetVal("pos", a8::Format("%d,%d", + {pair.second.Get()->GetPos().x, + pair.second.Get()->GetPos().y})); + } else { + xobj->SetVal("matched", 0); + xobj->SetVal("type", 0); + xobj->SetVal("pos", a8::Format("%d,%d", + {0, + 0})); + } out_data->Push(*xobj); } hum->SendDebugMsg(a8::Format("view_debug frameno:%d server_full_obj:%s", @@ -71,55 +81,72 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) #ifdef DEBUG Debug_FullObject(hum); #endif - for (auto& itr : hum->new_objects) { + for (auto& pair : hum->new_objects) { + Entity* e = pair.second.Get(); + if (!e) { + continue; + } #ifdef DEBUG - if (hum->del_objects.find(itr->GetUniId()) != hum->del_objects.end()) { + if (hum->del_objects.find(e->GetUniId()) != hum->del_objects.end()) { abort(); } #endif - if (itr != hum && - itr->GetEntityType() == ET_Player && - ((Human*)itr)->HasBuffEffect(kBET_Fly)){ + if (e != hum && + e->GetEntityType() == ET_Player && + ((Human*)e)->HasBuffEffect(kBET_Fly)){ continue; } - if (hum->IsPlayer() && itr->CanSeeMe(hum)) { - itr->FillMFObjectFull(room, (Human*)hum, msg->add_full_objects()); + if (hum->IsPlayer() && e->CanSeeMe(hum)) { + e->FillMFObjectFull(room, (Human*)hum, msg->add_full_objects()); #ifdef DEBUG - if (itr->GetEntityType() == ET_Car) { + if (e->GetEntityType() == ET_Car) { hum->SendDebugMsg(a8::Format("载具出现", {})); } #endif } #ifdef DEBUG - if (App::Instance()->HasFlag(2) && itr->GetEntityType() == ET_Player) { + if (App::Instance()->HasFlag(2) && e->GetEntityType() == ET_Player) { room->BroadcastDebugMsg(a8::Format("投放 %d pos:%d,%d 出现", { - itr->GetUniId(), - itr->GetPos().x, - itr->GetPos().y, + e->GetUniId(), + e->GetPos().x, + e->GetPos().y, })); } #endif } - for (auto& itr : hum->part_objects) { - Entity* entity = itr.first; - if (entity->IsDead(room) && - hum->room->GetFrameNo() - entity->GetDeadFrameNo(room) > 10) { - continue; - } else { - if (room->GetGasData().gas_mode == GasJump && - entity != hum && - entity->GetEntityType() == ET_Player && - ((Human*)entity)->HasBuffEffect(kBET_Fly)) { + { + int deleted_uniid = 0; + for (auto& pair : hum->part_objects) { + Entity* entity = pair.second.object.Get(); + if (!entity) { +#ifdef DEBUG + abort(); +#endif + deleted_uniid = pair.first; continue; } + if (entity->IsDead(room) && + hum->room->GetFrameNo() - entity->GetDeadFrameNo(room) > 10) { + continue; + } else { + if (room->GetGasData().gas_mode == GasJump && + entity != hum && + entity->GetEntityType() == ET_Player && + ((Human*)entity)->HasBuffEffect(kBET_Fly)) { + continue; + } + } +#if 0 + if (((Human*)hum)->GetPos().ManhattanDistance(entity->GetPos()) > VIEW_RANGE + 300) { + continue; + } +#endif + entity->FillMFObjectPart(room, (Human*)hum, msg->add_part_objects()); } - #if 0 - if (((Human*)hum)->GetPos().ManhattanDistance(entity->GetPos()) > VIEW_RANGE + 300) { - continue; + if (deleted_uniid > 0) { + hum->part_objects.erase(deleted_uniid); } - #endif - entity->FillMFObjectPart(room, (Human*)hum, msg->add_part_objects()); } for (auto& itr : hum->del_objects) { msg->add_del_objids(itr); diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 96a3551..a935467 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -931,7 +931,7 @@ void Human::DecHP(float dec_hp, int killer_id, const std::string& killer_name, i void Human::AddToNewObjects(Entity* entity) { - new_objects.insert(entity); + new_objects[entity->GetUniId()] = entity->GetEntityWeakPtrRef(); } void Human::AddToPartObjects(Entity* entity) @@ -941,7 +941,8 @@ void Human::AddToPartObjects(Entity* entity) part_obj.entity_type = entity->GetEntityType(); part_obj.entity_subtype = entity->GetEntitySubType(); part_obj.add_frameno = room->GetFrameNo(); - part_objects[entity] = part_obj; + part_obj.object = entity->GetEntityWeakPtrRef(); + part_objects[entity->GetUniId()] = part_obj; entity->OnAddToTargetPartObject(this); } @@ -954,7 +955,7 @@ void Human::RemovePartObjects(Entity* entity) entity->GetUniId() })); #endif - part_objects.erase(entity); + part_objects.erase(entity->GetUniId()); entity->OnRemoveFromTargetPartObject(this); } @@ -970,18 +971,18 @@ int Human::GetPartObjectsCount() bool Human::InNewObjects(Entity* target) { - return new_objects.find(target) != new_objects.end(); + return new_objects.find(target->GetUniId()) != new_objects.end(); } bool Human::InPartObjects(Entity* target) { - return part_objects.find(target) != part_objects.end(); + return part_objects.find(target->GetUniId()) != part_objects.end(); } void Human::RemoveObjects(Entity* entity) { del_objects.insert(entity->GetUniId()); - new_objects.erase(entity); + new_objects.erase(entity->GetUniId()); } void Human::AddOutObjects(Entity* entity) @@ -2805,7 +2806,7 @@ void Human::NotifyObservers(cs::SMUpdate* msg, cs::MFActivePlayerData* active_pl std::set view_objects; GetViewObjects(view_objects); for (Entity* entity : view_objects) { - if (new_objects.find(entity) == new_objects.end()) { + if (new_objects.find(entity->GetUniId()) == new_objects.end()) { entity->FillMFObjectFull(room, this, msg->add_full_objects()); } } diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 6fa8fc2..ecbf752 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -19,6 +19,7 @@ struct PartObject int entity_type = 0; int entity_subtype = 0; long long add_frameno = 0; + EntityWeakPtr object; }; struct xtimer_list; @@ -290,8 +291,8 @@ protected: long long leave_frameno_ = 0; std::array volume_ = {}; - std::set new_objects; - std::map part_objects; + std::map new_objects; + std::map part_objects; std::set del_objects; std::set out_objects; std::vector shots_;