diff options
-rw-r--r-- | src/game/Creature.cpp | 2 | ||||
-rw-r--r-- | src/game/Debugcmds.cpp | 1 | ||||
-rw-r--r-- | src/game/GameEventMgr.cpp | 2 | ||||
-rw-r--r-- | src/game/GameObject.cpp | 4 | ||||
-rw-r--r-- | src/game/Item.cpp | 7 | ||||
-rw-r--r-- | src/game/Item.h | 2 | ||||
-rw-r--r-- | src/game/Level2.cpp | 6 | ||||
-rw-r--r-- | src/game/Object.cpp | 110 | ||||
-rw-r--r-- | src/game/Object.h | 6 | ||||
-rw-r--r-- | src/game/ObjectAccessor.cpp | 126 | ||||
-rw-r--r-- | src/game/ObjectAccessor.h | 19 | ||||
-rw-r--r-- | src/game/OutdoorPvPEP.cpp | 8 | ||||
-rw-r--r-- | src/game/OutdoorPvPHP.cpp | 2 | ||||
-rw-r--r-- | src/game/OutdoorPvPNA.cpp | 1 | ||||
-rw-r--r-- | src/game/OutdoorPvPTF.cpp | 1 | ||||
-rw-r--r-- | src/game/Player.cpp | 2 |
16 files changed, 115 insertions, 184 deletions
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index 6e0eb68ef5f..433b5e1610d 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -246,7 +246,7 @@ void Creature::RemoveCorpse() m_deathTimer = 0; setDeathState(DEAD); - ObjectAccessor::UpdateObjectVisibility(this); + UpdateObjectVisibility(); loot.clear(); uint32 respawnDelay = m_respawnDelay; if (IsAIEnabled) diff --git a/src/game/Debugcmds.cpp b/src/game/Debugcmds.cpp index 753ccc70746..96c8155c9de 100644 --- a/src/game/Debugcmds.cpp +++ b/src/game/Debugcmds.cpp @@ -718,7 +718,6 @@ bool ChatHandler::HandleDebugSetVehicleId(const char *args) uint32 id = (uint32)atoi(i); //target->SetVehicleId(id); - target->SendUpdateObjectToAllExcept(NULL); PSendSysMessage("Vehicle id set to %u", id); return true; } diff --git a/src/game/GameEventMgr.cpp b/src/game/GameEventMgr.cpp index 1f4f7d251ff..8930abaccb8 100644 --- a/src/game/GameEventMgr.cpp +++ b/src/game/GameEventMgr.cpp @@ -1206,8 +1206,6 @@ void GameEventMgr::UpdateEventNPCFlags(uint16 event_id) cr->SetUInt32Value(UNIT_NPC_FLAGS,npcflag); // reset gossip options, since the flag change might have added / removed some //cr->ResetGossipOptions(); - // update to world - cr->SendUpdateObjectToAllExcept(NULL); } // if we didn't find it, then the npcflag will be updated when the creature is loaded } diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp index 07cf49f98f8..30045eb7ddf 100644 --- a/src/game/GameObject.cpp +++ b/src/game/GameObject.cpp @@ -478,7 +478,7 @@ void GameObject::Update(uint32 /*p_time*/) if(!m_spawnedByDefault) { m_respawnTime = 0; - ObjectAccessor::UpdateObjectVisibility(this); + UpdateObjectVisibility(); return; } @@ -488,7 +488,7 @@ void GameObject::Update(uint32 /*p_time*/) if(sWorld.getConfig(CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY)) SaveRespawnTime(); - ObjectAccessor::UpdateObjectVisibility(this); + UpdateObjectVisibility(); break; } diff --git a/src/game/Item.cpp b/src/game/Item.cpp index eed876082bf..61c86d389b7 100644 --- a/src/game/Item.cpp +++ b/src/game/Item.cpp @@ -1018,3 +1018,10 @@ bool ItemRequiredTarget::IsFitToRequirements( Unit* pUnitTarget ) const return false; } } + +void Item::BuildUpdate(UpdateDataMapType& data_map) +{ + if(Player *owner = GetOwner()) + BuildFieldsUpdate(owner, data_map); + ClearUpdateMask(false); +} diff --git a/src/game/Item.h b/src/game/Item.h index c9279e5e0ca..1087099b54c 100644 --- a/src/game/Item.h +++ b/src/game/Item.h @@ -332,6 +332,8 @@ class TRINITY_DLL_SPEC Item : public Object m_paidExtendedCostCount[pos] = count; } + void BuildUpdate(UpdateDataMapType& ); + private: uint8 m_slot; Bag *m_container; diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index 16fe0f48fd5..530a243794d 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -634,7 +634,7 @@ bool ChatHandler::HandleGameObjectTurnCommand(const char* args) obj->Relocate(obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), o); obj->UpdateRotationFields(); obj->DestroyForNearbyPlayers(); - ObjectAccessor::UpdateObjectVisibility(obj); + obj->UpdateObjectVisibility(); obj->SaveToDB(); obj->Refresh(); @@ -678,7 +678,7 @@ bool ChatHandler::HandleGameObjectMoveCommand(const char* args) Player *chr = m_session->GetPlayer(); obj->Relocate(chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), obj->GetOrientation()); obj->DestroyForNearbyPlayers(); - ObjectAccessor::UpdateObjectVisibility(obj); + obj->UpdateObjectVisibility(); } else { @@ -698,7 +698,7 @@ bool ChatHandler::HandleGameObjectMoveCommand(const char* args) obj->Relocate(x, y, z, obj->GetOrientation()); obj->DestroyForNearbyPlayers(); - ObjectAccessor::UpdateObjectVisibility(obj); + obj->UpdateObjectVisibility(); } obj->SaveToDB(); diff --git a/src/game/Object.cpp b/src/game/Object.cpp index c875f17fd9a..a53d4f9c48a 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -233,12 +233,6 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) c data->AddUpdateBlock(buf); } -void Object::BuildUpdate(UpdateDataMapType &update_players) -{ - ObjectAccessor::_buildUpdateObject(this,update_players); - ClearUpdateMask(true); -} - void Object::SendUpdateToPlayer(Player* player) { // send create update to player @@ -275,7 +269,7 @@ void Object::DestroyForPlayer( Player *target, bool anim ) const { ASSERT(target); - WorldPacket data(SMSG_DESTROY_OBJECT, 8); + WorldPacket data(SMSG_DESTROY_OBJECT, 8 + 1); data << uint64(GetGUID()); data << uint8(anim ? 1 : 0); // WotLK (bool), may be despawn animation target->GetSession()->SendPacket( &data ); @@ -726,18 +720,18 @@ void Object::ClearUpdateMask(bool remove) } } -// Send current value fields changes to all viewers -void Object::SendUpdateObjectToAllExcept(Player* exceptPlayer) +void Object::BuildFieldsUpdate(Player *pl, UpdateDataMapType &data_map) const { - // changes will be send in create packet - if(!IsInWorld()) - return; + UpdateDataMapType::iterator iter = data_map.find(pl); - // nothing do - if(!m_objectUpdated) - return; + if( iter == data_map.end() ) + { + std::pair<UpdateDataMapType::iterator, bool> p = data_map.insert( UpdateDataMapType::value_type(pl, UpdateData()) ); + assert(p.second); + iter = p.first; + } - ObjectAccessor::UpdateObject(this,exceptPlayer); + BuildValuesUpdateBlockForPlayer(&iter->second, iter->first); } bool Object::LoadValues(const char* data) @@ -2224,7 +2218,7 @@ void WorldObject::SetPhaseMask(uint32 newPhaseMask, bool update) m_phaseMask = newPhaseMask; if(update && IsInWorld()) - ObjectAccessor::UpdateObjectVisibility(this); + UpdateObjectVisibility(); } void WorldObject::PlayDistanceSound( uint32 sound_id, Player* target /*= NULL*/ ) @@ -2276,3 +2270,85 @@ void WorldObject::DestroyForNearbyPlayers() plr->m_clientGUIDs.erase(GetGUID()); } } + +void WorldObject::UpdateObjectVisibility() +{ + CellPair p = Trinity::ComputeCellPair(GetPositionX(), GetPositionY()); + Cell cell(p); + + GetMap()->UpdateObjectVisibility(this, cell, p); +} + +struct WorldObjectChangeAccumulator +{ + UpdateDataMapType &i_updateDatas; + WorldObject &i_object; + std::set<uint64> plr_list; + WorldObjectChangeAccumulator(WorldObject &obj, UpdateDataMapType &d) : i_updateDatas(d), i_object(obj) {} + void Visit(PlayerMapType &m) + { + for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter) + { + BuildPacket(iter->getSource()); + if (!iter->getSource()->GetSharedVisionList().empty()) + { + SharedVisionList::const_iterator it = iter->getSource()->GetSharedVisionList().begin(); + for (; it != iter->getSource()->GetSharedVisionList().end(); ++it) + BuildPacket(*it); + } + } + } + + void Visit(CreatureMapType &m) + { + for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter) + { + if (!iter->getSource()->GetSharedVisionList().empty()) + { + SharedVisionList::const_iterator it = iter->getSource()->GetSharedVisionList().begin(); + for (; it != iter->getSource()->GetSharedVisionList().end(); ++it) + BuildPacket(*it); + } + } + } + void Visit(DynamicObjectMapType &m) + { + for (DynamicObjectMapType::iterator iter = m.begin(); iter != m.end(); ++iter) + { + uint64 guid = iter->getSource()->GetCasterGUID(); + if(IS_PLAYER_GUID(guid)) + { + //Caster may be NULL if DynObj is in removelist + if(Player *caster = ObjectAccessor::FindPlayer(guid)) + if (caster->GetUInt64Value(PLAYER_FARSIGHT) == iter->getSource()->GetGUID()) + BuildPacket(caster); + } + } + } + void BuildPacket(Player* plr) + { + // Only send update once to a player + if (plr_list.find(plr->GetGUID()) == plr_list.end() && plr->HaveAtClient(&i_object)) + { + i_object.BuildFieldsUpdate(plr, i_updateDatas); + plr_list.insert(plr->GetGUID()); + } + } + + template<class SKIP> void Visit(GridRefManager<SKIP> &) {} +}; + +void WorldObject::BuildUpdate(UpdateDataMapType& data_map) +{ + CellPair p = Trinity::ComputeCellPair(GetPositionX(), GetPositionY()); + Cell cell(p); + cell.data.Part.reserved = ALL_DISTRICT; + cell.SetNoCreate(); + WorldObjectChangeAccumulator notifier(*this, data_map); + TypeContainerVisitor<WorldObjectChangeAccumulator, WorldTypeMapContainer > player_notifier(notifier); + Map& map = *GetMap(); + //we must build packets for all visible players + cell.Visit(p, player_notifier, map, *this, map.GetVisibilityDistance()); + + ClearUpdateMask(false); +} diff --git a/src/game/Object.h b/src/game/Object.h index b97fd4798ff..86de6c86e09 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -165,7 +165,6 @@ class TRINITY_DLL_SPEC Object void BuildValuesUpdateBlockForPlayer( UpdateData *data, Player *target ) const; void BuildOutOfRangeUpdateBlock( UpdateData *data ) const; void BuildMovementUpdateBlock( UpdateData * data, uint32 flags = 0 ) const; - void BuildUpdate(UpdateDataMapType &); virtual void DestroyForPlayer( Player *target, bool anim = false ) const; @@ -307,7 +306,6 @@ class TRINITY_DLL_SPEC Object } void ClearUpdateMask(bool remove); - void SendUpdateObjectToAllExcept(Player* exceptPlayer); bool LoadValues(const char* data); @@ -315,6 +313,8 @@ class TRINITY_DLL_SPEC Object virtual bool hasQuest(uint32 /* quest_id */) const { return false; } virtual bool hasInvolvedQuest(uint32 /* quest_id */) const { return false; } + virtual void BuildUpdate(UpdateDataMapType& ) {} + void BuildFieldsUpdate(Player *, UpdateDataMapType &) const; // FG: some hacky helpers void ForceValuesUpdateAtIndex(uint32); @@ -637,6 +637,8 @@ class TRINITY_DLL_SPEC WorldObject : public Object, public WorldLocation void GetCreatureListWithEntryInGrid(std::list<Creature*>& lList, uint32 uiEntry, float fMaxSearchRange); void DestroyForNearbyPlayers(); + void UpdateObjectVisibility(); + void BuildUpdate(UpdateDataMapType& ); //new relocation and visibility system functions void AddToNotify(uint16 f) { m_notifyflags |= f;} diff --git a/src/game/ObjectAccessor.cpp b/src/game/ObjectAccessor.cpp index f2be4153af6..365115fcb8f 100644 --- a/src/game/ObjectAccessor.cpp +++ b/src/game/ObjectAccessor.cpp @@ -184,65 +184,6 @@ ObjectAccessor::SaveAllPlayers() itr->second->SaveToDB(); } -void -ObjectAccessor::UpdateObject(Object* obj, Player* exceptPlayer) -{ - UpdateDataMapType update_players; - obj->BuildUpdate(update_players); - - WorldPacket packet; - for (UpdateDataMapType::iterator iter = update_players.begin(); iter != update_players.end(); ++iter) - { - if(iter->first == exceptPlayer) - continue; - - iter->second.BuildPacket(&packet); - iter->first->GetSession()->SendPacket(&packet); - packet.clear(); - } -} - -void -ObjectAccessor::_buildUpdateObject(Object *obj, UpdateDataMapType &update_players) -{ - if(obj->isType(TYPEMASK_ITEM)) - { - if(Player *owner = ((Item*)obj)->GetOwner()) - _buildPacket(owner, obj, update_players); - } - else - _buildChangeObjectForPlayer((WorldObject*)obj, update_players); -} - -void -ObjectAccessor::_buildPacket(Player *pl, Object *obj, UpdateDataMapType &update_players) -{ - UpdateDataMapType::iterator iter = update_players.find(pl); - - if( iter == update_players.end() ) - { - std::pair<UpdateDataMapType::iterator, bool> p = update_players.insert( UpdateDataValueType(pl, UpdateData()) ); - assert(p.second); - iter = p.first; - } - - obj->BuildValuesUpdateBlockForPlayer(&iter->second, iter->first); -} - -void -ObjectAccessor::_buildChangeObjectForPlayer(WorldObject *obj, UpdateDataMapType &update_players) -{ - CellPair p = Trinity::ComputeCellPair(obj->GetPositionX(), obj->GetPositionY()); - Cell cell(p); - cell.data.Part.reserved = ALL_DISTRICT; - cell.SetNoCreate(); - WorldObjectChangeAccumulator notifier(*obj, update_players); - TypeContainerVisitor<WorldObjectChangeAccumulator, WorldTypeMapContainer > player_notifier(notifier); - Map& map = *obj->GetMap(); - //we must build packets for all visible players - cell.Visit(p, player_notifier, map, *obj, map.GetVisibilityDistance()); -} - Pet* ObjectAccessor::GetPet(uint64 guid) { @@ -408,8 +349,7 @@ ObjectAccessor::Update(uint32 diff) Object* obj = *i_objects.begin(); assert(obj && obj->IsInWorld()); i_objects.erase(i_objects.begin()); - _buildUpdateObject(obj, update_players); - obj->ClearUpdateMask(false); + obj->BuildUpdate(update_players); } } @@ -422,70 +362,6 @@ ObjectAccessor::Update(uint32 diff) } } -void -ObjectAccessor::WorldObjectChangeAccumulator::Visit(PlayerMapType &m) -{ - for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter) - { - BuildPacket(iter->getSource()); - if (!iter->getSource()->GetSharedVisionList().empty()) - { - SharedVisionList::const_iterator it = iter->getSource()->GetSharedVisionList().begin(); - for (; it != iter->getSource()->GetSharedVisionList().end(); ++it) - BuildPacket(*it); - } - } -} - -void -ObjectAccessor::WorldObjectChangeAccumulator::Visit(CreatureMapType &m) -{ - for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter) - { - if (!iter->getSource()->GetSharedVisionList().empty()) - { - SharedVisionList::const_iterator it = iter->getSource()->GetSharedVisionList().begin(); - for (; it != iter->getSource()->GetSharedVisionList().end(); ++it) - BuildPacket(*it); - } - } -} - -void -ObjectAccessor::WorldObjectChangeAccumulator::Visit(DynamicObjectMapType &m) -{ - for (DynamicObjectMapType::iterator iter = m.begin(); iter != m.end(); ++iter) - { - uint64 guid = iter->getSource()->GetCasterGUID(); - if(IS_PLAYER_GUID(guid)) - { - //Caster may be NULL if DynObj is in removelist - if(Player *caster = FindPlayer(guid)) - if (caster->GetUInt64Value(PLAYER_FARSIGHT) == iter->getSource()->GetGUID()) - BuildPacket(caster); - } - } -} - -void -ObjectAccessor::WorldObjectChangeAccumulator::BuildPacket(Player* plr) -{ - // Only send update once to a player - if (plr_list.find(plr->GetGUID()) == plr_list.end() && plr->HaveAtClient(&i_object)) - { - ObjectAccessor::_buildPacket(plr, &i_object, i_updateDatas); - plr_list.insert(plr->GetGUID()); - } -} - -void -ObjectAccessor::UpdateObjectVisibility(WorldObject *obj) -{ - CellPair p = Trinity::ComputeCellPair(obj->GetPositionX(), obj->GetPositionY()); - Cell cell(p); - - obj->GetMap()->UpdateObjectVisibility(obj, cell, p); -} /*void ObjectAccessor::UpdateVisibilityForPlayer( Player* player ) { diff --git a/src/game/ObjectAccessor.h b/src/game/ObjectAccessor.h index d0684944dc3..722e40a33dd 100644 --- a/src/game/ObjectAccessor.h +++ b/src/game/ObjectAccessor.h @@ -232,26 +232,9 @@ class TRINITY_DLL_DECL ObjectAccessor : public Trinity::Singleton<ObjectAccessor void AddCorpsesToGrid(GridPair const& gridpair,GridType& grid,Map* map); Corpse* ConvertCorpseForPlayer(uint64 player_guid, bool insignia = false); - static void UpdateObject(Object* obj, Player* exceptPlayer); - static void _buildUpdateObject(Object* obj, UpdateDataMapType &); - - static void UpdateObjectVisibility(WorldObject* obj); //static void UpdateVisibilityForPlayer(Player* player); private: - struct WorldObjectChangeAccumulator - { - UpdateDataMapType &i_updateDatas; - WorldObject &i_object; - std::set<uint64> plr_list; - WorldObjectChangeAccumulator(WorldObject &obj, UpdateDataMapType &d) : i_updateDatas(d), i_object(obj) {} - void Visit(PlayerMapType &); - void Visit(CreatureMapType &); - void Visit(DynamicObjectMapType &); - void BuildPacket(Player* plr); - template<class SKIP> void Visit(GridRefManager<SKIP> &) {} - }; - - friend struct WorldObjectChangeAccumulator; + Player2CorpsesMapType i_player2corpse; typedef ACE_Thread_Mutex LockType; diff --git a/src/game/OutdoorPvPEP.cpp b/src/game/OutdoorPvPEP.cpp index dd8d1629841..856bd81075f 100644 --- a/src/game/OutdoorPvPEP.cpp +++ b/src/game/OutdoorPvPEP.cpp @@ -93,12 +93,10 @@ void OPvPCapturePointEP_EWT::ChangeState() if(flag) { flag->SetGoArtKit(artkit); - flag->SendUpdateObjectToAllExcept(NULL); } if(flag2) { flag2->SetGoArtKit(artkit); - flag2->SendUpdateObjectToAllExcept(NULL); } UpdateTowerState(); @@ -248,12 +246,10 @@ void OPvPCapturePointEP_NPT::ChangeState() if(flag) { flag->SetGoArtKit(artkit); - flag->SendUpdateObjectToAllExcept(NULL); } if(flag2) { flag2->SetGoArtKit(artkit); - flag2->SendUpdateObjectToAllExcept(NULL); } UpdateTowerState(); @@ -395,12 +391,10 @@ void OPvPCapturePointEP_CGT::ChangeState() if(flag) { flag->SetGoArtKit(artkit); - flag->SendUpdateObjectToAllExcept(NULL); } if(flag2) { flag2->SetGoArtKit(artkit); - flag2->SendUpdateObjectToAllExcept(NULL); } UpdateTowerState(); @@ -541,12 +535,10 @@ void OPvPCapturePointEP_PWT::ChangeState() if(flag) { flag->SetGoArtKit(artkit); - flag->SendUpdateObjectToAllExcept(NULL); } if(flag2) { flag2->SetGoArtKit(artkit); - flag2->SendUpdateObjectToAllExcept(NULL); } UpdateTowerState(); diff --git a/src/game/OutdoorPvPHP.cpp b/src/game/OutdoorPvPHP.cpp index a3caf5ebc77..20c30cfeda8 100644 --- a/src/game/OutdoorPvPHP.cpp +++ b/src/game/OutdoorPvPHP.cpp @@ -249,12 +249,10 @@ void OPvPCapturePointHP::ChangeState() if(flag) { flag->SetGoArtKit(artkit); - flag->SendUpdateObjectToAllExcept(NULL); } if(flag2) { flag2->SetGoArtKit(artkit2); - flag2->SendUpdateObjectToAllExcept(NULL); } // send world state update diff --git a/src/game/OutdoorPvPNA.cpp b/src/game/OutdoorPvPNA.cpp index 51bc25f41f5..7fd9f3ba118 100644 --- a/src/game/OutdoorPvPNA.cpp +++ b/src/game/OutdoorPvPNA.cpp @@ -608,7 +608,6 @@ void OPvPCapturePointNA::ChangeState() if(flag) { flag->SetGoArtKit(artkit); - flag->SendUpdateObjectToAllExcept(NULL); } UpdateHalaaWorldState(); diff --git a/src/game/OutdoorPvPTF.cpp b/src/game/OutdoorPvPTF.cpp index 41151e4b24f..16d13b6b2e6 100644 --- a/src/game/OutdoorPvPTF.cpp +++ b/src/game/OutdoorPvPTF.cpp @@ -290,7 +290,6 @@ void OPvPCapturePointTF::ChangeState() if(flag) { flag->SetGoArtKit(artkit); - flag->SendUpdateObjectToAllExcept(NULL); } UpdateTowerState(); diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 45d14e3a4d1..15d12e2cc5f 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -4528,7 +4528,7 @@ void Player::KillPlayer() // don't create corpse at this moment, player might be falling // update visibility - ObjectAccessor::UpdateObjectVisibility(this); + UpdateObjectVisibility(); } void Player::CreateCorpse() |