diff options
Diffstat (limited to 'src/game/GridNotifiersImpl.h')
| -rw-r--r-- | src/game/GridNotifiersImpl.h | 159 | 
1 files changed, 131 insertions, 28 deletions
diff --git a/src/game/GridNotifiersImpl.h b/src/game/GridNotifiersImpl.h index 70f77b95ae8..12f3706c4e2 100644 --- a/src/game/GridNotifiersImpl.h +++ b/src/game/GridNotifiersImpl.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 @@ -128,7 +128,7 @@ Trinity::CreatureRelocationNotifier::Visit(PlayerMapType &m)              continue;          iter->getSource()->UpdateVisibilityOf(&i_creature); -         +          PlayerCreatureRelocationWorker(iter->getSource(), &i_creature);      }  } @@ -144,7 +144,7 @@ Trinity::CreatureRelocationNotifier::Visit(CreatureMapType &m)      {          if(iter->getSource()->m_Notified)              continue; -         +          if(!iter->getSource()->isAlive())              continue; @@ -178,8 +178,11 @@ inline void Trinity::DynamicObjectUpdater::VisitHelper(Unit* target)      if (i_dynobject.IsAffecting(target))          return; -    SpellEntry const *spellInfo = sSpellStore.LookupEntry(i_dynobject.GetSpellId());      uint32 eff_index  = i_dynobject.GetEffIndex(); +    if(target->HasAuraEffect(i_dynobject.GetSpellId(), eff_index, i_check->GetGUID())) +        return; + +    SpellEntry const *spellInfo = sSpellStore.LookupEntry(i_dynobject.GetSpellId());      if(spellInfo->EffectImplicitTargetB[eff_index] == TARGET_DEST_DYNOBJ_ALLY          || spellInfo->EffectImplicitTargetB[eff_index] == TARGET_UNIT_AREA_ALLY_DST)      { @@ -202,11 +205,12 @@ inline void Trinity::DynamicObjectUpdater::VisitHelper(Unit* target)      }      // Check target immune to spell or aura -    if (target->IsImmunedToSpell(spellInfo) || target->IsImmunedToSpellEffect(spellInfo->Effect[eff_index], spellInfo->EffectMechanic[eff_index])) +    if (target->IsImmunedToSpell(spellInfo) || target->IsImmunedToSpellEffect(spellInfo, eff_index))          return;      // Apply PersistentAreaAura on target -    PersistentAreaAura* Aur = new PersistentAreaAura(spellInfo, eff_index, NULL, target, i_dynobject.GetCaster()); -    target->AddAura(Aur); +    if(Aura *aur = target->AddAuraEffect(spellInfo, eff_index, i_dynobject.GetCaster())) +        aur->SetAuraDuration(i_dynobject.GetDuration()); +      i_dynobject.AddAffected(target);  } @@ -239,7 +243,10 @@ void Trinity::WorldObjectSearcher<Check>::Visit(GameObjectMapType &m)      for(GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr)      { -        if(i_check(itr->getSource())) +        if(!itr->getSource()->InSamePhase(i_phaseMask)) +            continue; + +        if (i_check(itr->getSource()))          {              i_object = itr->getSource();              return; @@ -256,6 +263,9 @@ void Trinity::WorldObjectSearcher<Check>::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(); @@ -273,6 +283,9 @@ void Trinity::WorldObjectSearcher<Check>::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(); @@ -290,6 +303,9 @@ void Trinity::WorldObjectSearcher<Check>::Visit(CorpseMapType &m)      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(); @@ -307,6 +323,9 @@ void Trinity::WorldObjectSearcher<Check>::Visit(DynamicObjectMapType &m)      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(); @@ -319,40 +338,45 @@ template<class Check>  void Trinity::WorldObjectListSearcher<Check>::Visit(PlayerMapType &m)  {      for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) -        if(i_check(itr->getSource())) -            i_objects.push_back(itr->getSource()); +        if(itr->getSource()->InSamePhase(i_phaseMask)) +            if(i_check(itr->getSource())) +                i_objects.push_back(itr->getSource());  }  template<class Check>  void Trinity::WorldObjectListSearcher<Check>::Visit(CreatureMapType &m)  {      for(CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) -        if(i_check(itr->getSource())) -            i_objects.push_back(itr->getSource()); +        if(itr->getSource()->InSamePhase(i_phaseMask)) +            if(i_check(itr->getSource())) +                i_objects.push_back(itr->getSource());  }  template<class Check>  void Trinity::WorldObjectListSearcher<Check>::Visit(CorpseMapType &m)  {      for(CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr) -        if(i_check(itr->getSource())) -            i_objects.push_back(itr->getSource()); +        if(itr->getSource()->InSamePhase(i_phaseMask)) +            if(i_check(itr->getSource())) +                i_objects.push_back(itr->getSource());  }  template<class Check>  void Trinity::WorldObjectListSearcher<Check>::Visit(GameObjectMapType &m)  {      for(GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) -        if(i_check(itr->getSource())) -            i_objects.push_back(itr->getSource()); +        if(itr->getSource()->InSamePhase(i_phaseMask)) +            if(i_check(itr->getSource())) +                i_objects.push_back(itr->getSource());  }  template<class Check>  void Trinity::WorldObjectListSearcher<Check>::Visit(DynamicObjectMapType &m)  {      for(DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) -        if(i_check(itr->getSource())) -            i_objects.push_back(itr->getSource()); +        if(itr->getSource()->InSamePhase(i_phaseMask)) +            if(i_check(itr->getSource())) +                i_objects.push_back(itr->getSource());  }  // Gameobject searchers @@ -366,6 +390,9 @@ void Trinity::GameObjectSearcher<Check>::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(); @@ -379,6 +406,9 @@ void Trinity::GameObjectLastSearcher<Check>::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();      } @@ -388,8 +418,9 @@ template<class Check>  void Trinity::GameObjectListSearcher<Check>::Visit(GameObjectMapType &m)  {      for(GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) -        if(i_check(itr->getSource())) -            i_objects.push_back(itr->getSource()); +        if(itr->getSource()->InSamePhase(i_phaseMask)) +            if(i_check(itr->getSource())) +                i_objects.push_back(itr->getSource());  }  // Unit searchers @@ -403,6 +434,9 @@ void Trinity::UnitSearcher<Check>::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(); @@ -420,6 +454,9 @@ void Trinity::UnitSearcher<Check>::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(); @@ -433,6 +470,9 @@ void Trinity::UnitLastSearcher<Check>::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();      } @@ -443,6 +483,9 @@ void Trinity::UnitLastSearcher<Check>::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();      } @@ -452,16 +495,18 @@ template<class Check>  void Trinity::UnitListSearcher<Check>::Visit(PlayerMapType &m)  {      for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) -        if(i_check(itr->getSource())) -            i_objects.push_back(itr->getSource()); +        if(itr->getSource()->InSamePhase(i_phaseMask)) +            if(i_check(itr->getSource())) +                i_objects.push_back(itr->getSource());  }  template<class Check>  void Trinity::UnitListSearcher<Check>::Visit(CreatureMapType &m)  {      for(CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) -        if(i_check(itr->getSource())) -            i_objects.push_back(itr->getSource()); +        if(itr->getSource()->InSamePhase(i_phaseMask)) +            if(i_check(itr->getSource())) +                i_objects.push_back(itr->getSource());  }  // Creature searchers @@ -475,6 +520,9 @@ void Trinity::CreatureSearcher<Check>::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(); @@ -488,6 +536,9 @@ void Trinity::CreatureLastSearcher<Check>::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();      } @@ -497,8 +548,9 @@ template<class Check>  void Trinity::CreatureListSearcher<Check>::Visit(CreatureMapType &m)  {      for(CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) -        if(i_check(itr->getSource())) -            i_objects.push_back(itr->getSource()); +        if(itr->getSource()->InSamePhase(i_phaseMask)) +            if( i_check(itr->getSource())) +                i_objects.push_back(itr->getSource());  }  template<class Check> @@ -510,6 +562,9 @@ void Trinity::PlayerSearcher<Check>::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(); @@ -518,5 +573,53 @@ void Trinity::PlayerSearcher<Check>::Visit(PlayerMapType &m)      }  } -#endif                                                      // TRINITY_GRIDNOTIFIERSIMPL_H +template<class Builder> +void MaNGOS::LocalizedPacketDo<Builder>::operator()( Player* p ) +{ +    uint32 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<class Builder> +void MaNGOS::LocalizedPacketListDo<Builder>::operator()( Player* p ) +{ +    uint32 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]); +} +#endif                                                      // MANGOS_GRIDNOTIFIERSIMPL_H  | 
