aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game/Creature.cpp2
-rw-r--r--src/game/Debugcmds.cpp1
-rw-r--r--src/game/GameEventMgr.cpp2
-rw-r--r--src/game/GameObject.cpp4
-rw-r--r--src/game/Item.cpp7
-rw-r--r--src/game/Item.h2
-rw-r--r--src/game/Level2.cpp6
-rw-r--r--src/game/Object.cpp110
-rw-r--r--src/game/Object.h6
-rw-r--r--src/game/ObjectAccessor.cpp126
-rw-r--r--src/game/ObjectAccessor.h19
-rw-r--r--src/game/OutdoorPvPEP.cpp8
-rw-r--r--src/game/OutdoorPvPHP.cpp2
-rw-r--r--src/game/OutdoorPvPNA.cpp1
-rw-r--r--src/game/OutdoorPvPTF.cpp1
-rw-r--r--src/game/Player.cpp2
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()