*Move object's field\visibility update functions to object from accessor

removed useless SendUpdateObjectToAllExcept - anyway fields will be updated, there is no sense to force update them

--HG--
branch : trunk
This commit is contained in:
silver1ce
2010-02-03 16:53:40 +02:00
parent 23bdbf1ad3
commit a307ba784c
16 changed files with 114 additions and 183 deletions
+1 -1
View File
@@ -246,7 +246,7 @@ void Creature::RemoveCorpse()
m_deathTimer = 0;
setDeathState(DEAD);
ObjectAccessor::UpdateObjectVisibility(this);
UpdateObjectVisibility();
loot.clear();
uint32 respawnDelay = m_respawnDelay;
if (IsAIEnabled)
-1
View File
@@ -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;
}
-2
View File
@@ -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
}
+2 -2
View File
@@ -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;
}
+7
View File
@@ -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);
}
+2
View File
@@ -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;
+3 -3
View File
@@ -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();
+93 -17
View File
@@ -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);
}
+4 -2
View File
@@ -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;}
+1 -125
View File
@@ -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 )
{
-17
View File
@@ -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;
-8
View File
@@ -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();
-2
View File
@@ -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
-1
View File
@@ -608,7 +608,6 @@ void OPvPCapturePointNA::ChangeState()
if(flag)
{
flag->SetGoArtKit(artkit);
flag->SendUpdateObjectToAllExcept(NULL);
}
UpdateHalaaWorldState();
-1
View File
@@ -290,7 +290,6 @@ void OPvPCapturePointTF::ChangeState()
if(flag)
{
flag->SetGoArtKit(artkit);
flag->SendUpdateObjectToAllExcept(NULL);
}
UpdateTowerState();
+1 -1
View File
@@ -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()