/* * Copyright (C) 2005-2009 MaNGOS * * Copyright (C) 2008-2010 Trinity * * 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 * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef TRINITY_GRIDNOTIFIERSIMPL_H #define TRINITY_GRIDNOTIFIERSIMPL_H #include "GridNotifiers.h" #include "WorldPacket.h" #include "Corpse.h" #include "Player.h" #include "UpdateData.h" #include "CreatureAI.h" #include "SpellAuras.h" template inline void Trinity::VisibleNotifier::Visit(GridRefManager &m) { for (typename GridRefManager::iterator iter = m.begin(); iter != m.end(); ++iter) { vis_guids.erase(iter->getSource()->GetGUID()); i_player.UpdateVisibilityOf(iter->getSource(),i_data,i_visibleNow); } } inline void Trinity::ObjectUpdater::Visit(CreatureMapType &m) { for (CreatureMapType::iterator iter=m.begin(); iter != m.end(); ++iter) if (iter->getSource()->IsInWorld() && !iter->getSource()->isSpiritService()) iter->getSource()->Update(i_timeDiff); } // SEARCHERS & LIST SEARCHERS & WORKERS // WorldObject searchers & workers template void Trinity::WorldObjectSearcher::Visit(GameObjectMapType &m) { // already found if (i_object) return; for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) { if (!itr->getSource()->InSamePhase(i_phaseMask)) continue; if (i_check(itr->getSource())) { i_object = itr->getSource(); return; } } } template void Trinity::WorldObjectSearcher::Visit(PlayerMapType &m) { // already found if (i_object) return; for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) { if (!itr->getSource()->InSamePhase(i_phaseMask)) continue; if (i_check(itr->getSource())) { i_object = itr->getSource(); return; } } } template void Trinity::WorldObjectSearcher::Visit(CreatureMapType &m) { // already found if (i_object) return; for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) { if (!itr->getSource()->InSamePhase(i_phaseMask)) continue; if (i_check(itr->getSource())) { i_object = itr->getSource(); return; } } } template void Trinity::WorldObjectSearcher::Visit(CorpseMapType &m) { // already found if (i_object) return; for (CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr) { if (!itr->getSource()->InSamePhase(i_phaseMask)) continue; if (i_check(itr->getSource())) { i_object = itr->getSource(); return; } } } template void Trinity::WorldObjectSearcher::Visit(DynamicObjectMapType &m) { // already found if (i_object) return; for (DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) { if (!itr->getSource()->InSamePhase(i_phaseMask)) continue; if (i_check(itr->getSource())) { i_object = itr->getSource(); return; } } } template void Trinity::WorldObjectListSearcher::Visit(PlayerMapType &m) { for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (itr->getSource()->InSamePhase(i_phaseMask)) if (i_check(itr->getSource())) i_objects.push_back(itr->getSource()); } template void Trinity::WorldObjectListSearcher::Visit(CreatureMapType &m) { for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (itr->getSource()->InSamePhase(i_phaseMask)) if (i_check(itr->getSource())) i_objects.push_back(itr->getSource()); } template void Trinity::WorldObjectListSearcher::Visit(CorpseMapType &m) { for (CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (itr->getSource()->InSamePhase(i_phaseMask)) if (i_check(itr->getSource())) i_objects.push_back(itr->getSource()); } template void Trinity::WorldObjectListSearcher::Visit(GameObjectMapType &m) { for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (itr->getSource()->InSamePhase(i_phaseMask)) if (i_check(itr->getSource())) i_objects.push_back(itr->getSource()); } template void Trinity::WorldObjectListSearcher::Visit(DynamicObjectMapType &m) { for (DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (itr->getSource()->InSamePhase(i_phaseMask)) if (i_check(itr->getSource())) i_objects.push_back(itr->getSource()); } // Gameobject searchers template void Trinity::GameObjectSearcher::Visit(GameObjectMapType &m) { // already found if (i_object) return; for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) { if (!itr->getSource()->InSamePhase(i_phaseMask)) continue; if (i_check(itr->getSource())) { i_object = itr->getSource(); return; } } } template void Trinity::GameObjectLastSearcher::Visit(GameObjectMapType &m) { for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) { if (!itr->getSource()->InSamePhase(i_phaseMask)) continue; if (i_check(itr->getSource())) i_object = itr->getSource(); } } template void Trinity::GameObjectListSearcher::Visit(GameObjectMapType &m) { for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (itr->getSource()->InSamePhase(i_phaseMask)) if (i_check(itr->getSource())) i_objects.push_back(itr->getSource()); } // Unit searchers template void Trinity::UnitSearcher::Visit(CreatureMapType &m) { // already found if (i_object) return; for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) { if (!itr->getSource()->InSamePhase(i_phaseMask)) continue; if (i_check(itr->getSource())) { i_object = itr->getSource(); return; } } } template void Trinity::UnitSearcher::Visit(PlayerMapType &m) { // already found if (i_object) return; for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) { if (!itr->getSource()->InSamePhase(i_phaseMask)) continue; if (i_check(itr->getSource())) { i_object = itr->getSource(); return; } } } template void Trinity::UnitLastSearcher::Visit(CreatureMapType &m) { for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) { if (!itr->getSource()->InSamePhase(i_phaseMask)) continue; if (i_check(itr->getSource())) i_object = itr->getSource(); } } template void Trinity::UnitLastSearcher::Visit(PlayerMapType &m) { for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) { if (!itr->getSource()->InSamePhase(i_phaseMask)) continue; if (i_check(itr->getSource())) i_object = itr->getSource(); } } template void Trinity::UnitListSearcher::Visit(PlayerMapType &m) { for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (itr->getSource()->InSamePhase(i_phaseMask)) if (i_check(itr->getSource())) i_objects.push_back(itr->getSource()); } template void Trinity::UnitListSearcher::Visit(CreatureMapType &m) { for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (itr->getSource()->InSamePhase(i_phaseMask)) if (i_check(itr->getSource())) i_objects.push_back(itr->getSource()); } // Creature searchers template void Trinity::CreatureSearcher::Visit(CreatureMapType &m) { // already found if (i_object) return; for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) { if (!itr->getSource()->InSamePhase(i_phaseMask)) continue; if (i_check(itr->getSource())) { i_object = itr->getSource(); return; } } } template void Trinity::CreatureLastSearcher::Visit(CreatureMapType &m) { for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) { if (!itr->getSource()->InSamePhase(i_phaseMask)) continue; if (i_check(itr->getSource())) i_object = itr->getSource(); } } template void Trinity::CreatureListSearcher::Visit(CreatureMapType &m) { for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (itr->getSource()->InSamePhase(i_phaseMask)) if (i_check(itr->getSource())) i_objects.push_back(itr->getSource()); } template void Trinity::PlayerListSearcher::Visit(PlayerMapType &m) { for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) if (itr->getSource()->InSamePhase(i_phaseMask)) if (i_check(itr->getSource())) i_objects.push_back(itr->getSource()); } template void Trinity::PlayerSearcher::Visit(PlayerMapType &m) { // already found if (i_object) return; for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) { if (!itr->getSource()->InSamePhase(i_phaseMask)) continue; if (i_check(itr->getSource())) { i_object = itr->getSource(); return; } } } template void Trinity::LocalizedPacketDo::operator()(Player* p) { int32 loc_idx = p->GetSession()->GetSessionDbLocaleIndex(); uint32 cache_idx = loc_idx+1; WorldPacket* data; // create if not cached yet if (i_data_cache.size() < cache_idx+1 || !i_data_cache[cache_idx]) { if (i_data_cache.size() < cache_idx+1) i_data_cache.resize(cache_idx+1); data = new WorldPacket(SMSG_MESSAGECHAT, 200); i_builder(*data,loc_idx); i_data_cache[cache_idx] = data; } else data = i_data_cache[cache_idx]; p->SendDirectMessage(data); } template void Trinity::LocalizedPacketListDo::operator()(Player* p) { int32 loc_idx = p->GetSession()->GetSessionDbLocaleIndex(); uint32 cache_idx = loc_idx+1; WorldPacketList* data_list; // create if not cached yet if (i_data_cache.size() < cache_idx+1 || i_data_cache[cache_idx].empty()) { if (i_data_cache.size() < cache_idx+1) i_data_cache.resize(cache_idx+1); data_list = &i_data_cache[cache_idx]; i_builder(*data_list,loc_idx); } else data_list = &i_data_cache[cache_idx]; for (size_t i = 0; i < data_list->size(); ++i) p->SendDirectMessage((*data_list)[i]); } struct ObjectDistanceOrder : public std::binary_function { const Unit* m_pSource; ObjectDistanceOrder(const Unit* pSource) : m_pSource(pSource) {}; bool operator()(const WorldObject* pLeft, const WorldObject* pRight) const { return m_pSource->GetDistanceOrder(pLeft, pRight); } }; struct ObjectDistanceOrderReversed : public std::binary_function { const Unit* m_pSource; ObjectDistanceOrderReversed(const Unit* pSource) : m_pSource(pSource) {}; bool operator()(const WorldObject* pLeft, const WorldObject* pRight) const { return !m_pSource->GetDistanceOrder(pLeft, pRight); } }; #endif // TRINITY_GRIDNOTIFIERSIMPL_H