*Update of relocation notify code.

--HG--
branch : trunk
This commit is contained in:
megamage
2009-03-08 11:11:21 -06:00
parent 9720fb075f
commit 0f8dee432c
6 changed files with 133 additions and 167 deletions
+2 -39
View File
@@ -30,23 +30,6 @@
using namespace Trinity; using namespace Trinity;
/*void
Trinity::PlayerNotifier::Visit(PlayerMapType &m)
{
for(PlayerMapType::iterator iter=m.begin(); iter != m.end(); ++iter)
{
if( iter->getSource() == &i_player )
continue;
iter->getSource()->UpdateVisibilityOf(&i_player);
i_player.UpdateVisibilityOf(iter->getSource());
if (!i_player.GetSharedVisionList().empty())
for (SharedVisionList::const_iterator it = i_player.GetSharedVisionList().begin(); it != i_player.GetSharedVisionList().end(); ++it)
(*it)->UpdateVisibilityOf(iter->getSource());
}
}*/
void void
VisibleChangesNotifier::Visit(PlayerMapType &m) VisibleChangesNotifier::Visit(PlayerMapType &m)
{ {
@@ -60,27 +43,7 @@ VisibleChangesNotifier::Visit(PlayerMapType &m)
} }
void void
VisibleNotifier::Visit(PlayerMapType &m) PlayerRelocationNotifier::Notify()
{
for(PlayerMapType::iterator iter=m.begin(); iter != m.end(); ++iter)
{
if( iter->getSource() == &i_player )
continue;
iter->getSource()->UpdateVisibilityOf(&i_player);
//i_player.UpdateVisibilityOf(iter->getSource());
//if (!i_player.GetSharedVisionList().empty())
// for (SharedVisionList::const_iterator it = i_player.GetSharedVisionList().begin(); it != i_player.GetSharedVisionList().end(); ++it)
// (*it)->UpdateVisibilityOf(iter->getSource());
i_player.UpdateVisibilityOf(iter->getSource(),i_data,i_data_updates,i_visibleNow);
i_clientGUIDs.erase(iter->getSource()->GetGUID());
}
}
void
VisibleNotifier::Notify()
{ {
// at this moment i_clientGUIDs have guids that not iterate at grid level checks // at this moment i_clientGUIDs have guids that not iterate at grid level checks
// but exist one case when this possible and object not out of range: transports // but exist one case when this possible and object not out of range: transports
@@ -146,7 +109,7 @@ VisibleNotifier::Notify()
// send data at target visibility change (adding to client) // send data at target visibility change (adding to client)
for(std::set<WorldObject*>::const_iterator vItr = i_visibleNow.begin(); vItr != i_visibleNow.end(); ++vItr) for(std::set<WorldObject*>::const_iterator vItr = i_visibleNow.begin(); vItr != i_visibleNow.end(); ++vItr)
if((*vItr)!=&i_player && (*vItr)->isType(TYPEMASK_UNIT)) if((*vItr)!=&i_player && (*vItr)->isType(TYPEMASK_UNIT))
i_player.SendAuraDurationsForTarget((Unit*)(*vItr)); i_player.SendInitialVisiblePackets((Unit*)(*vItr));
} }
void void
+25 -36
View File
@@ -38,16 +38,7 @@ class Player;
namespace Trinity namespace Trinity
{ {
struct TRINITY_DLL_DECL PlayerRelocationNotifier
/*struct TRINITY_DLL_DECL PlayerNotifier
{
explicit PlayerNotifier(Player &pl) : i_player(pl) {}
void Visit(PlayerMapType &);
template<class SKIP> void Visit(GridRefManager<SKIP> &) {}
Player &i_player;
};*/
struct TRINITY_DLL_DECL VisibleNotifier
{ {
Player &i_player; Player &i_player;
UpdateData i_data; UpdateData i_data;
@@ -55,12 +46,28 @@ namespace Trinity
Player::ClientGUIDs i_clientGUIDs; Player::ClientGUIDs i_clientGUIDs;
std::set<WorldObject*> i_visibleNow; std::set<WorldObject*> i_visibleNow;
explicit VisibleNotifier(Player &player) : i_player(player),i_clientGUIDs(player.m_clientGUIDs) {} PlayerRelocationNotifier(Player &player) : i_player(player),i_clientGUIDs(player.m_clientGUIDs) {}
template<class T> void Visit(GridRefManager<T> &m);
void Visit(PlayerMapType &); #ifdef WIN32
template<class T> inline void Visit(GridRefManager<T> &);
template<> inline void Visit(PlayerMapType &);
template<> inline void Visit(CreatureMapType &);
#endif
void Notify(void); void Notify(void);
}; };
struct TRINITY_DLL_DECL CreatureRelocationNotifier
{
Creature &i_creature;
CreatureRelocationNotifier(Creature &c) : i_creature(c) {}
template<class T> void Visit(GridRefManager<T> &) {}
#ifdef WIN32
template<> inline void Visit(PlayerMapType &);
template<> inline void Visit(CreatureMapType &);
#endif
};
struct TRINITY_DLL_DECL VisibleChangesNotifier struct TRINITY_DLL_DECL VisibleChangesNotifier
{ {
WorldObject &i_object; WorldObject &i_object;
@@ -168,25 +175,6 @@ namespace Trinity
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {}
}; };
struct TRINITY_DLL_DECL PlayerRelocationNotifier
{
Player &i_player;
PlayerRelocationNotifier(Player &pl) : i_player(pl) {}
template<class T> void Visit(GridRefManager<T> &) {}
void Visit(PlayerMapType &);
void Visit(CreatureMapType &);
};
struct TRINITY_DLL_DECL CreatureRelocationNotifier
{
Creature &i_creature;
CreatureRelocationNotifier(Creature &c) : i_creature(c) {}
template<class T> void Visit(GridRefManager<T> &) {}
#ifdef WIN32
template<> void Visit(PlayerMapType &);
#endif
};
struct TRINITY_DLL_DECL DynamicObjectUpdater struct TRINITY_DLL_DECL DynamicObjectUpdater
{ {
DynamicObject &i_dynobject; DynamicObject &i_dynobject;
@@ -968,10 +956,11 @@ namespace Trinity
}; };
#ifndef WIN32 #ifndef WIN32
template<> void PlayerRelocationNotifier::Visit<Creature>(CreatureMapType &); template<class T> inline void PlayerRelocationNotifier::Visit(GridRefManager<T> &);
template<> void PlayerRelocationNotifier::Visit<Player>(PlayerMapType &); template<> inline void PlayerRelocationNotifier::Visit<Creature>(CreatureMapType &);
template<> void CreatureRelocationNotifier::Visit<Player>(PlayerMapType &); template<> inline void PlayerRelocationNotifier::Visit<Player>(PlayerMapType &);
template<> void CreatureRelocationNotifier::Visit<Creature>(CreatureMapType &); template<> inline void CreatureRelocationNotifier::Visit<Player>(PlayerMapType &);
template<> inline void CreatureRelocationNotifier::Visit<Creature>(CreatureMapType &);
template<> inline void DynamicObjectUpdater::Visit<Creature>(CreatureMapType &); template<> inline void DynamicObjectUpdater::Visit<Creature>(CreatureMapType &);
template<> inline void DynamicObjectUpdater::Visit<Player>(PlayerMapType &); template<> inline void DynamicObjectUpdater::Visit<Player>(PlayerMapType &);
#endif #endif
+64 -45
View File
@@ -29,17 +29,6 @@
#include "CreatureAI.h" #include "CreatureAI.h"
#include "SpellAuras.h" #include "SpellAuras.h"
template<class T>
inline void
Trinity::VisibleNotifier::Visit(GridRefManager<T> &m)
{
for(typename GridRefManager<T>::iterator iter = m.begin(); iter != m.end(); ++iter)
{
i_player.UpdateVisibilityOf(iter->getSource(),i_data,i_data_updates,i_visibleNow);
i_clientGUIDs.erase(iter->getSource()->GetGUID());
}
}
inline void inline void
Trinity::ObjectUpdater::Visit(CreatureMapType &m) Trinity::ObjectUpdater::Visit(CreatureMapType &m)
{ {
@@ -48,28 +37,10 @@ Trinity::ObjectUpdater::Visit(CreatureMapType &m)
iter->getSource()->Update(i_timeDiff); iter->getSource()->Update(i_timeDiff);
} }
inline void
Trinity::PlayerRelocationNotifier::Visit(PlayerMapType &m)
{
for(PlayerMapType::iterator iter=m.begin(); iter != m.end(); ++iter)
{
if(&i_player==iter->getSource())
continue;
// visibility for players updated by ObjectAccessor::UpdateVisibilityFor calls in appropriate places
// Cancel Trade
if(i_player.GetTrader()==iter->getSource())
// iteraction distance
if(!i_player.IsWithinDistInMap(iter->getSource(), 5))
i_player.GetSession()->SendCancelTrade(); // will clode both side trade windows
}
}
inline void PlayerCreatureRelocationWorker(Player* pl, Creature* c) inline void PlayerCreatureRelocationWorker(Player* pl, Creature* c)
{ {
// update creature visibility at player/creature move if(!pl->isAlive() || !c->isAlive() || pl->isInFlight())
pl->UpdateVisibilityOf(c); return;
// Creature AI reaction // Creature AI reaction
if(c->HasReactState(REACT_AGGRESSIVE) && !c->hasUnitState(UNIT_STAT_SIGHTLESS)) if(c->HasReactState(REACT_AGGRESSIVE) && !c->hasUnitState(UNIT_STAT_SIGHTLESS))
@@ -94,27 +65,71 @@ inline void CreatureCreatureRelocationWorker(Creature* c1, Creature* c2)
} }
} }
template<class T>
inline void
Trinity::PlayerRelocationNotifier::Visit(GridRefManager<T> &m)
{
for(typename GridRefManager<T>::iterator iter = m.begin(); iter != m.end(); ++iter)
{
i_player.UpdateVisibilityOf(iter->getSource(),i_data,i_data_updates,i_visibleNow);
i_clientGUIDs.erase(iter->getSource()->GetGUID());
}
}
template<>
inline void
Trinity::PlayerRelocationNotifier::Visit(PlayerMapType &m)
{
for(PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
{
if(iter->getSource()->m_Notified) //self is also skipped in this check
continue;
i_player.UpdateVisibilityOf(iter->getSource(),i_data,i_data_updates,i_visibleNow);
i_clientGUIDs.erase(iter->getSource()->GetGUID());
iter->getSource()->UpdateVisibilityOf(&i_player);
//if (!i_player.GetSharedVisionList().empty())
// for (SharedVisionList::const_iterator it = i_player.GetSharedVisionList().begin(); it != i_player.GetSharedVisionList().end(); ++it)
// (*it)->UpdateVisibilityOf(iter->getSource());
// Cancel Trade
if(i_player.GetTrader()==iter->getSource())
if(!i_player.IsWithinDistInMap(iter->getSource(), 5)) // iteraction distance
i_player.GetSession()->SendCancelTrade(); // will clode both side trade windows
}
}
template<>
inline void inline void
Trinity::PlayerRelocationNotifier::Visit(CreatureMapType &m) Trinity::PlayerRelocationNotifier::Visit(CreatureMapType &m)
{ {
if(!i_player.isAlive() || i_player.isInFlight()) for(CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
return; {
if(iter->getSource()->m_Notified)
continue;
for(CreatureMapType::iterator iter=m.begin(); iter != m.end(); ++iter) i_player.UpdateVisibilityOf(iter->getSource(),i_data,i_data_updates,i_visibleNow);
if( !iter->getSource()->m_Notified && iter->getSource()->isAlive()) i_clientGUIDs.erase(iter->getSource()->GetGUID());
PlayerCreatureRelocationWorker(&i_player,iter->getSource());
PlayerCreatureRelocationWorker(&i_player, iter->getSource());
}
} }
template<> template<>
inline void inline void
Trinity::CreatureRelocationNotifier::Visit(PlayerMapType &m) Trinity::CreatureRelocationNotifier::Visit(PlayerMapType &m)
{ {
if(!i_creature.isAlive()) for(PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
return; {
if(iter->getSource()->m_Notified)
continue;
for(PlayerMapType::iterator iter=m.begin(); iter != m.end(); ++iter) iter->getSource()->UpdateVisibilityOf(&i_creature);
if( !iter->getSource()->m_Notified && iter->getSource()->isAlive() && !iter->getSource()->isInFlight())
PlayerCreatureRelocationWorker(iter->getSource(), &i_creature); PlayerCreatureRelocationWorker(iter->getSource(), &i_creature);
}
} }
template<> template<>
@@ -124,11 +139,15 @@ Trinity::CreatureRelocationNotifier::Visit(CreatureMapType &m)
if(!i_creature.isAlive()) if(!i_creature.isAlive())
return; return;
for(CreatureMapType::iterator iter=m.begin(); iter != m.end(); ++iter) for(CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter)
{ {
Creature* c = iter->getSource(); if(iter->getSource()->m_Notified)
if( !iter->getSource()->m_Notified && c != &i_creature && c->isAlive()) continue;
CreatureCreatureRelocationWorker(c, &i_creature);
if(!iter->getSource()->isAlive())
continue;
CreatureCreatureRelocationWorker(iter->getSource(), &i_creature);
} }
} }
+23 -20
View File
@@ -624,34 +624,15 @@ void Map::RelocationNotify()
if(unit->GetTypeId() == TYPEID_PLAYER) if(unit->GetTypeId() == TYPEID_PLAYER)
{ {
//UpdatePlayerVisibility((Player*)unit, cell, val);
//Trinity::PlayerNotifier pl_notifier(*player);
//VisitWorld(unit->GetPositionX(), unit->GetPositionY(), World::GetMaxVisibleDistance(), pl_notifier);
//UpdateObjectsVisibilityFor((Player*)unit, cell, val);
Trinity::VisibleNotifier ob_notifier(*((Player*)unit));
VisitAll(unit->GetPositionX(), unit->GetPositionY(), World::GetMaxVisibleDistance(), ob_notifier);
ob_notifier.Notify();
Trinity::PlayerRelocationNotifier notifier(*((Player*)unit)); Trinity::PlayerRelocationNotifier notifier(*((Player*)unit));
VisitAll(unit->GetPositionX(), unit->GetPositionY(), World::GetMaxVisibleDistance(), notifier); VisitAll(unit->GetPositionX(), unit->GetPositionY(), World::GetMaxVisibleDistance(), notifier);
notifier.Notify();
} }
else else
{ {
Trinity::CreatureRelocationNotifier notifier(*((Creature*)unit)); Trinity::CreatureRelocationNotifier notifier(*((Creature*)unit));
VisitAll(unit->GetPositionX(), unit->GetPositionY(), World::GetMaxVisibleDistance(), notifier); VisitAll(unit->GetPositionX(), unit->GetPositionY(), World::GetMaxVisibleDistance(), notifier);
} }
// Update visibility back to player who is controlling the unit
if(unit->GetSharedVisionList().size())
{
for(SharedVisionList::const_iterator it = unit->GetSharedVisionList().begin(); it != unit->GetSharedVisionList().end(); ++it)
{
Trinity::VisibleNotifier ob_notifier(**it);
VisitAll(unit->GetPositionX(), unit->GetPositionY(), World::GetMaxVisibleDistance(), ob_notifier);
ob_notifier.Notify();
}
}
} }
//Clear list //Clear list
@@ -768,6 +749,28 @@ void Map::Update(const uint32 &t_diff)
} }
} }
} }
// Update bindsight players
if(obj->isType(TYPEMASK_UNIT))
{
if(!((Unit*)obj)->GetSharedVisionList().empty())
for(SharedVisionList::const_iterator it = ((Unit*)obj)->GetSharedVisionList().begin(); it != ((Unit*)obj)->GetSharedVisionList().end(); ++it)
{
Trinity::PlayerRelocationNotifier notifier(**it);
VisitAll(obj->GetPositionX(), obj->GetPositionY(), World::GetMaxVisibleDistance(), notifier);
notifier.Notify();
}
}
else if(obj->GetTypeId() == TYPEID_DYNAMICOBJECT)
{
if(Unit *caster = ((DynamicObject*)obj)->GetCaster())
if(caster->GetTypeId() == TYPEID_PLAYER && caster->GetUInt64Value(PLAYER_FARSIGHT) == obj->GetGUID())
{
Trinity::PlayerRelocationNotifier notifier(*((Player*)caster));
VisitAll(obj->GetPositionX(), obj->GetPositionY(), World::GetMaxVisibleDistance(), notifier);
notifier.Notify();
}
}
} }
} }
+18 -27
View File
@@ -16785,19 +16785,7 @@ void Player::HandleStealthedUnitsDetection()
sLog.outDebug("Object %u (Type: %u) is detected in stealth by player %u. Distance = %f",(*i)->GetGUIDLow(),(*i)->GetTypeId(),GetGUIDLow(),GetDistance(*i)); sLog.outDebug("Object %u (Type: %u) is detected in stealth by player %u. Distance = %f",(*i)->GetGUIDLow(),(*i)->GetTypeId(),GetGUIDLow(),GetDistance(*i));
#endif #endif
// target aura duration for caster show only if target exist at caster client SendInitialVisiblePackets(*i);
// send data at target visibility change (adding to client)
if((*i)!=this && (*i)->isType(TYPEMASK_UNIT))
{
SendAuraDurationsForTarget(*i);
//if(((Unit*)(*i))->isAlive()) //should be always alive
{
if((*i)->GetTypeId()==TYPEID_UNIT)
((Creature*)(*i))->SendMonsterMoveWithSpeedToCurrentDestination(this);
if(((Unit*)(*i))->getVictim())
((Unit*)(*i))->SendAttackStart(((Unit*)(*i))->getVictim());
}
}
} }
} }
} }
@@ -17781,21 +17769,24 @@ void Player::UpdateVisibilityOf(WorldObject* target)
// target aura duration for caster show only if target exist at caster client // target aura duration for caster show only if target exist at caster client
// send data at target visibility change (adding to client) // send data at target visibility change (adding to client)
if(target!=this && target->isType(TYPEMASK_UNIT)) if(target->isType(TYPEMASK_UNIT))
{ SendInitialVisiblePackets((Unit*)target);
SendAuraDurationsForTarget((Unit*)target);
if(((Unit*)target)->isAlive())
{
if(target->GetTypeId()==TYPEID_UNIT)
((Creature*)target)->SendMonsterMoveWithSpeedToCurrentDestination(this);
if(((Unit*)target)->getVictim())
((Unit*)target)->SendAttackStart(((Unit*)target)->getVictim());
}
}
} }
} }
} }
void Player::SendInitialVisiblePackets(Unit* target)
{
SendAuraDurationsForTarget(target);
if(target->isAlive())
{
if(target->GetMotionMaster()->GetCurrentMovementGeneratorType() != IDLE_MOTION_TYPE)
target->SendMonsterMoveWithSpeedToCurrentDestination(this);
if(target->hasUnitState(UNIT_STAT_MELEE_ATTACKING) && target->getVictim())
target->SendAttackStart(target->getVictim());
}
}
template<class T> template<class T>
inline void UpdateVisibilityOf_helper(std::set<uint64>& s64, T* target) inline void UpdateVisibilityOf_helper(std::set<uint64>& s64, T* target)
{ {
@@ -17842,7 +17833,7 @@ void Player::UpdateVisibilityOf(T* target, UpdateData& data, UpdateDataMapType&
} }
} }
template<> /*template<>
void Player::UpdateVisibilityOf<Creature>(Creature* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow) void Player::UpdateVisibilityOf<Creature>(Creature* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow)
{ {
if(HaveAtClient(target)) if(HaveAtClient(target))
@@ -17875,10 +17866,10 @@ void Player::UpdateVisibilityOf<Creature>(Creature* target, UpdateData& data, Up
#endif #endif
} }
} }
} }*/
template void Player::UpdateVisibilityOf(Player* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow); template void Player::UpdateVisibilityOf(Player* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow);
//template void Player::UpdateVisibilityOf(Creature* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow); template void Player::UpdateVisibilityOf(Creature* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow);
template void Player::UpdateVisibilityOf(Corpse* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow); template void Player::UpdateVisibilityOf(Corpse* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow);
template void Player::UpdateVisibilityOf(GameObject* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow); template void Player::UpdateVisibilityOf(GameObject* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow);
template void Player::UpdateVisibilityOf(DynamicObject* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow); template void Player::UpdateVisibilityOf(DynamicObject* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow);
+1
View File
@@ -2024,6 +2024,7 @@ class TRINITY_DLL_SPEC Player : public Unit
bool IsVisibleGloballyFor(Player* pl) const; bool IsVisibleGloballyFor(Player* pl) const;
void UpdateVisibilityOf(WorldObject* target); void UpdateVisibilityOf(WorldObject* target);
void SendInitialVisiblePackets(Unit* target);
template<class T> template<class T>
void UpdateVisibilityOf(T* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow); void UpdateVisibilityOf(T* target, UpdateData& data, UpdateDataMapType& data_updates, std::set<WorldObject*>& visibleNow);