diff options
author | n0n4m3 <none@none> | 2009-12-19 10:12:40 +0100 |
---|---|---|
committer | n0n4m3 <none@none> | 2009-12-19 10:12:40 +0100 |
commit | 243f33b5eae4e5dc96e8134c650ea74daa07ee35 (patch) | |
tree | 39d943868b1bbe0116000f748bd72b7b76087683 /src/game/GridNotifiersImpl.h | |
parent | 7a3e524df2c57cb8625f08f3b8bef5befe641142 (diff) |
Implement new visibility system, based on Silverice patch for mangos
--HG--
branch : trunk
Diffstat (limited to 'src/game/GridNotifiersImpl.h')
-rw-r--r-- | src/game/GridNotifiersImpl.h | 98 |
1 files changed, 61 insertions, 37 deletions
diff --git a/src/game/GridNotifiersImpl.h b/src/game/GridNotifiersImpl.h index fd73119f0d3..e1738af4324 100644 --- a/src/game/GridNotifiersImpl.h +++ b/src/game/GridNotifiersImpl.h @@ -29,6 +29,32 @@ #include "CreatureAI.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) + { + vis_guids.erase(iter->getSource()->GetGUID()); + + if(force/* || iter->getSource()->isNeedNotify(NOTIFY_VISIBILITY_CHANGED)*/) + i_player.UpdateVisibilityOf(iter->getSource(),i_data,i_visibleNow); + } +} + +inline void +Trinity::VisibleNotifier::Visit(CreatureMapType &m) +{ + for(CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter) + { + vis_guids.erase(iter->getSource()->GetGUID()); + + if(force || iter->getSource()->isNeedNotify(NOTIFY_VISIBILITY_CHANGED)) + i_player.UpdateVisibilityOf(iter->getSource(),i_data,i_visibleNow); + } +} + inline void Trinity::ObjectUpdater::Visit(CreatureMapType &m) { @@ -70,45 +96,47 @@ Trinity::PlayerVisibilityNotifier::Visit(GridRefManager<T> &m) } } -template<> +template<class T, class VISITOR> inline void -Trinity::PlayerRelocationNotifier::Visit(PlayerMapType &m) +MaNGOS::DelayedUnitRelocation::Notify(GridRefManager<T> &m) { - for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter) + for(typename GridRefManager<T>::iterator iter = m.begin(); iter != m.end(); ++iter) { - i_clientGUIDs.erase(iter->getSource()->GetGUID()); - - if(iter->getSource()->m_Notified) //self is also skipped in this check + T * unit = iter->getSource(); + if(!unit->isAlive() || !unit->isNeedNotify(NOTIFY_AI_RELOCATION)) continue; - i_player.UpdateVisibilityOf(iter->getSource(),i_data,i_visibleNow); - iter->getSource()->UpdateVisibilityOf(&i_player); + VISITOR relocate(*unit); + TypeContainerVisitor<VISITOR, WorldTypeMapContainer > c2world_relocation(relocate); + TypeContainerVisitor<VISITOR, GridTypeMapContainer > c2grid_relocation(relocate); - //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_lock->Visit(i_lock, c2world_relocation, i_map, *unit, i_radius); + i_lock->Visit(i_lock, c2grid_relocation, i_map, *unit, i_radius); - // 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 + unit->SetNotified(NOTIFY_AI_RELOCATION); } } +template<class T> +inline void +MaNGOS::ResetNotifier::resetNotify(GridRefManager<T> &m) +{ + for(typename GridRefManager<T>::iterator iter=m.begin(); iter != m.end(); ++iter) + iter->getSource()->ResetAllNotifiesbyMask(reset_mask); +} + template<> inline void Trinity::PlayerRelocationNotifier::Visit(CreatureMapType &m) { + if(!i_player.isAlive() || i_player.isInFlight()) + return; + for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter) { - i_clientGUIDs.erase(iter->getSource()->GetGUID()); - - if(iter->getSource()->m_Notified) - continue; - - i_player.UpdateVisibilityOf(iter->getSource(),i_data,i_visibleNow); - - PlayerCreatureRelocationWorker(&i_player, iter->getSource()); + Creature * c = iter->getSource(); + if(c->isAlive() && !c->NotifyExecuted(NOTIFY_AI_RELOCATION)) + PlayerCreatureRelocationWorker(&i_player, c); } } @@ -116,14 +144,14 @@ template<> inline void Trinity::CreatureRelocationNotifier::Visit(PlayerMapType &m) { - for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter) - { - if(iter->getSource()->m_Notified) - continue; - - iter->getSource()->UpdateVisibilityOf(&i_creature); + if(!i_creature.isAlive()) + return; - PlayerCreatureRelocationWorker(iter->getSource(), &i_creature); + for(PlayerMapType::iterator iter=m.begin(); iter != m.end(); ++iter) + { + Player * pl = iter->getSource(); + if( pl->isAlive() && !pl->isInFlight() && !pl->NotifyExecuted(NOTIFY_AI_RELOCATION)) + PlayerCreatureRelocationWorker(pl, &i_creature); } } @@ -136,13 +164,9 @@ Trinity::CreatureRelocationNotifier::Visit(CreatureMapType &m) for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter) { - if(iter->getSource()->m_Notified) - continue; - - if(!iter->getSource()->isAlive()) - continue; - - CreatureCreatureRelocationWorker(iter->getSource(), &i_creature); + Creature* c = iter->getSource(); + if( c != &i_creature && c->isAlive() && !c->NotifyExecuted(NOTIFY_AI_RELOCATION)) + CreatureCreatureRelocationWorker(c, &i_creature); } } |