diff options
Diffstat (limited to 'src/game/GridNotifiers.h')
| -rw-r--r-- | src/game/GridNotifiers.h | 145 | 
1 files changed, 122 insertions, 23 deletions
diff --git a/src/game/GridNotifiers.h b/src/game/GridNotifiers.h index b34eee36e7b..e0d96221d04 100644 --- a/src/game/GridNotifiers.h +++ b/src/game/GridNotifiers.h @@ -1,7 +1,7 @@  /* - * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>   * - * Copyright (C) 2008 Trinity <http://www.trinitycore.org/> + * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/>   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by @@ -108,8 +108,10 @@ namespace Trinity          std::set<uint64> plr_list;          bool i_toPossessor;          bool i_toSelf; +        uint32 i_phaseMask;          float i_dist; -        Deliverer(WorldObject &src, WorldPacket *msg, bool to_possessor, bool to_self, float dist = 0.0f) : i_source(src), i_message(msg), i_toPossessor(to_possessor), i_toSelf(to_self), i_dist(dist) {} +        Deliverer(WorldObject &src, WorldPacket *msg, bool to_possessor, bool to_self, float dist = 0.0f) +            : i_source(src), i_message(msg), i_toPossessor(to_possessor), i_toSelf(to_self), i_dist(dist), i_phaseMask(src.GetPhaseMask()) {}          void Visit(PlayerMapType &m);          void Visit(CreatureMapType &m);          void Visit(DynamicObjectMapType &m); @@ -208,10 +210,12 @@ namespace Trinity      template<class Check>          struct TRINITY_DLL_DECL WorldObjectSearcher      { +        uint32 i_phaseMask;          WorldObject* &i_object;          Check &i_check; -        WorldObjectSearcher(WorldObject* & result, Check& check) : i_object(result),i_check(check) {} +        WorldObjectSearcher(WorldObject const* searcher, WorldObject* & result, Check& check) +            : i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}          void Visit(GameObjectMapType &m);          void Visit(PlayerMapType &m); @@ -225,10 +229,12 @@ namespace Trinity      template<class Check>          struct TRINITY_DLL_DECL WorldObjectListSearcher      { +        uint32 i_phaseMask;          std::list<WorldObject*> &i_objects;          Check& i_check; -        WorldObjectListSearcher(std::list<WorldObject*> &objects, Check & check) : i_objects(objects),i_check(check) {} +        WorldObjectListSearcher(WorldObject const* searcher, std::list<WorldObject*> &objects, Check & check) +            : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects),i_check(check) {}          void Visit(PlayerMapType &m);          void Visit(CreatureMapType &m); @@ -242,37 +248,44 @@ namespace Trinity      template<class Do>          struct TRINITY_DLL_DECL WorldObjectWorker      { +        uint32 i_phaseMask;          Do const& i_do; -        explicit WorldObjectWorker(Do const& _do) : i_do(_do) {} +        WorldObjectWorker(WorldObject const* searcher, Do const& _do) +            : i_phaseMask(searcher->GetPhaseMask()), i_do(_do) {}          void Visit(GameObjectMapType &m)          {              for(GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) -                i_do(itr->getSource()); +                if(itr->getSource()->InSamePhase(i_phaseMask)) +                    i_do(itr->getSource());          }          void Visit(PlayerMapType &m)          {              for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) -                i_do(itr->getSource()); +                if(itr->getSource()->InSamePhase(i_phaseMask)) +                    i_do(itr->getSource());          }          void Visit(CreatureMapType &m)          {              for(CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) -                i_do(itr->getSource()); +                if(itr->getSource()->InSamePhase(i_phaseMask)) +                    i_do(itr->getSource());          }          void Visit(CorpseMapType &m)          {              for(CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr) -                i_do(itr->getSource()); +                if(itr->getSource()->InSamePhase(i_phaseMask)) +                    i_do(itr->getSource());          }          void Visit(DynamicObjectMapType &m)          {              for(DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) -                i_do(itr->getSource()); +                if(itr->getSource()->InSamePhase(i_phaseMask)) +                    i_do(itr->getSource());          }          template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} @@ -283,10 +296,12 @@ namespace Trinity      template<class Check>          struct TRINITY_DLL_DECL GameObjectSearcher      { +        uint32 i_phaseMask;          GameObject* &i_object;          Check &i_check; -        GameObjectSearcher(GameObject* & result, Check& check) : i_object(result),i_check(check) {} +        GameObjectSearcher(WorldObject const* searcher, GameObject* & result, Check& check) +            : i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}          void Visit(GameObjectMapType &m); @@ -297,10 +312,12 @@ namespace Trinity      template<class Check>          struct TRINITY_DLL_DECL GameObjectLastSearcher      { +        uint32 i_phaseMask;          GameObject* &i_object;          Check& i_check; -        GameObjectLastSearcher(GameObject* & result, Check& check) : i_object(result),i_check(check) {} +        GameObjectLastSearcher(WorldObject const* searcher, GameObject* & result, Check& check) +            : i_phaseMask(searcher->GetPhaseMask()), i_object(result), i_check(check) {}          void Visit(GameObjectMapType &m); @@ -310,10 +327,12 @@ namespace Trinity      template<class Check>          struct TRINITY_DLL_DECL GameObjectListSearcher      { +        uint32 i_phaseMask;          std::list<GameObject*> &i_objects;          Check& i_check; -        GameObjectListSearcher(std::list<GameObject*> &objects, Check & check) : i_objects(objects),i_check(check) {} +        GameObjectListSearcher(WorldObject const* searcher, std::list<GameObject*> &objects, Check & check) +            : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects), i_check(check) {}          void Visit(GameObjectMapType &m); @@ -326,10 +345,12 @@ namespace Trinity      template<class Check>          struct TRINITY_DLL_DECL UnitSearcher      { +        uint32 i_phaseMask;          Unit* &i_object;          Check & i_check; -        UnitSearcher(Unit* & result, Check & check) : i_object(result),i_check(check) {} +        UnitSearcher(WorldObject const* searcher, Unit* & result, Check & check) +            : i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}          void Visit(CreatureMapType &m);          void Visit(PlayerMapType &m); @@ -341,10 +362,12 @@ namespace Trinity      template<class Check>          struct TRINITY_DLL_DECL UnitLastSearcher      { +        uint32 i_phaseMask;          Unit* &i_object;          Check & i_check; -        UnitLastSearcher(Unit* & result, Check & check) : i_object(result),i_check(check) {} +        UnitLastSearcher(WorldObject const* searcher, Unit* & result, Check & check) +            : i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}          void Visit(CreatureMapType &m);          void Visit(PlayerMapType &m); @@ -356,10 +379,12 @@ namespace Trinity      template<class Check>          struct TRINITY_DLL_DECL UnitListSearcher      { +        uint32 i_phaseMask;          std::list<Unit*> &i_objects;          Check& i_check; -        UnitListSearcher(std::list<Unit*> &objects, Check & check) : i_objects(objects),i_check(check) {} +        UnitListSearcher(WorldObject const* searcher, std::list<Unit*> &objects, Check & check) +            : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects),i_check(check) {}          void Visit(PlayerMapType &m);          void Visit(CreatureMapType &m); @@ -372,10 +397,12 @@ namespace Trinity      template<class Check>          struct TRINITY_DLL_DECL CreatureSearcher      { +        uint32 i_phaseMask;          Creature* &i_object;          Check & i_check; -        CreatureSearcher(Creature* & result, Check & check) : i_object(result),i_check(check) {} +        CreatureSearcher(WorldObject const* searcher, Creature* & result, Check & check) +            : i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}          void Visit(CreatureMapType &m); @@ -386,10 +413,12 @@ namespace Trinity      template<class Check>          struct TRINITY_DLL_DECL CreatureLastSearcher      { +        uint32 i_phaseMask;          Creature* &i_object;          Check & i_check; -        CreatureLastSearcher(Creature* & result, Check & check) : i_object(result),i_check(check) {} +        CreatureLastSearcher(WorldObject const* searcher, Creature* & result, Check & check) +            : i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}          void Visit(CreatureMapType &m); @@ -399,10 +428,12 @@ namespace Trinity      template<class Check>          struct TRINITY_DLL_DECL CreatureListSearcher      { +        uint32 i_phaseMask;          std::list<Creature*> &i_objects;          Check& i_check; -        CreatureListSearcher(std::list<Creature*> &objects, Check & check) : i_objects(objects),i_check(check) {} +        CreatureListSearcher(WorldObject const* searcher, std::list<Creature*> &objects, Check & check) +            : i_phaseMask(searcher->GetPhaseMask()), i_objects(objects),i_check(check) {}          void Visit(CreatureMapType &m); @@ -414,10 +445,12 @@ namespace Trinity      template<class Check>      struct TRINITY_DLL_DECL PlayerSearcher      { +        uint32 i_phaseMask;          Player* &i_object;          Check & i_check; -        PlayerSearcher(Player* & result, Check & check) : i_object(result),i_check(check) {} +        PlayerSearcher(WorldObject const* searcher, Player* & result, Check & check) +            : i_phaseMask(searcher->GetPhaseMask()), i_object(result),i_check(check) {}          void Visit(PlayerMapType &m); @@ -427,14 +460,37 @@ namespace Trinity      template<class Do>      struct TRINITY_DLL_DECL PlayerWorker      { +        uint32 i_phaseMask;          Do& i_do; -        explicit PlayerWorker(Do& _do) : i_do(_do) {} +        PlayerWorker(WorldObject const* searcher, Do& _do) +            : i_phaseMask(searcher->GetPhaseMask()), i_do(_do) {}          void Visit(PlayerMapType &m)          {              for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) -                i_do(itr->getSource()); +                if(itr->getSource()->InSamePhase(i_phaseMask)) +                    i_do(itr->getSource()); +        } + +        template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} +    }; + +    template<class Do> +    struct TRINITY_DLL_DECL PlayerDistWorker +    { +        WorldObject const* i_searcher; +        float i_dist; +        Do& i_do; + +        PlayerDistWorker(WorldObject const* searcher, float _dist, Do& _do) +            : i_searcher(searcher), i_dist(_dist), i_do(_do) {} + +        void Visit(PlayerMapType &m) +        { +            for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) +                if(itr->getSource()->InSamePhase(i_searcher) && itr->getSource()->GetDistance(i_searcher) <= i_dist) +                    i_do(itr->getSource());          }          template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) {} @@ -963,6 +1019,49 @@ namespace Trinity          float range;      }; +    // Player checks and do + +    // Prepare using Builder localized packets with caching and send to player +    template<class Builder> +    class LocalizedPacketDo +    { +        public: +            explicit LocalizedPacketDo(Builder& builder) : i_builder(builder) {} + +            ~LocalizedPacketDo() +            { +                for(size_t i = 0; i < i_data_cache.size(); ++i) +                    delete i_data_cache[i]; +            } +            void operator()( Player* p ); + +        private: +            Builder& i_builder; +            std::vector<WorldPacket*> i_data_cache;         // 0 = default, i => i-1 locale index +    }; + +    // Prepare using Builder localized packets with caching and send to player +    template<class Builder> +    class LocalizedPacketListDo +    { +        public: +            typedef std::vector<WorldPacket*> WorldPacketList; +            explicit LocalizedPacketListDo(Builder& builder) : i_builder(builder) {} + +            ~LocalizedPacketListDo() +            { +                for(size_t i = 0; i < i_data_cache.size(); ++i) +                    for(int j = 0; j < i_data_cache[i].size(); ++j) +                        delete i_data_cache[i][j]; +            } +            void operator()( Player* p ); + +        private: +            Builder& i_builder; +            std::vector<WorldPacketList> i_data_cache; +                                                            // 0 = default, i => i-1 locale index +    }; +      #ifndef WIN32      template<> inline void PlayerRelocationNotifier::Visit<Creature>(CreatureMapType &);      template<> inline void PlayerRelocationNotifier::Visit<Player>(PlayerMapType &);  | 
