All pastes #831476 Raw Edit

MeanMachine

public diff v1 · immutable
#831476 ·published 2007-12-24 23:57 UTC
rendered paste body
Index: src/game/Spell.cpp===================================================================--- src/game/Spell.cpp	(revision 4909)+++ src/game/Spell.cpp	(working copy)@@ -606,11 +606,14 @@             tempUnitMap.sort(TargetDistanceOrder(m_caster));              //Now to get us a random target that's in the initial range of the spell-            uint32 t = 1;+            uint32 t = 0;             std::list<Unit *>::iterator itr = tempUnitMap.begin();             while(itr!= tempUnitMap.end() && (*itr)->GetDistanceSq(m_caster) < radius * radius)                 ++t, ++itr; +            if(!t)+                break;+             itr = tempUnitMap.begin();             std::advance(itr, rand()%t);             Unit *pUnitTarget = *itr;@@ -622,19 +625,25 @@              t = unMaxTargets - 1;             Unit *prev = pUnitTarget;+            std::list<Unit*>::iterator next = tempUnitMap.begin(); -            while(t && !tempUnitMap.empty() )+            while(t && next != tempUnitMap.end() )             {-                Unit *next = *tempUnitMap.begin();--                if(prev->GetDistanceSq(next) > CHAIN_SPELL_JUMP_RADIUS * CHAIN_SPELL_JUMP_RADIUS)+                if(prev->GetDistanceSq(*next) > CHAIN_SPELL_JUMP_RADIUS * CHAIN_SPELL_JUMP_RADIUS)                     break; -                prev = next;-                TagUnitMap.push_back(next);-                tempUnitMap.erase(tempUnitMap.begin());-                tempUnitMap.sort(TargetDistanceOrder(next));+                if(!prev->IsWithinLOSInMap(*next))+                {+                    next++;+                    continue;+                } +                prev = *next;+                TagUnitMap.push_back(prev);+                tempUnitMap.erase(next);+                tempUnitMap.sort(TargetDistanceOrder(prev));+                next = tempUnitMap.begin();+                 --t;             }         }break;@@ -695,19 +704,25 @@                     TagUnitMap.push_back(pUnitTarget);                     uint32 t = unMaxTargets - 1;                     Unit *prev = pUnitTarget;+                    std::list<Unit*>::iterator next = tempUnitMap.begin(); -                    while(t && !tempUnitMap.empty() )+                    while(t && next != tempUnitMap.end() )                     {-                        Unit *next = *tempUnitMap.begin();--                        if(prev->GetDistanceSq(next) > CHAIN_SPELL_JUMP_RADIUS * CHAIN_SPELL_JUMP_RADIUS)+                        if(prev->GetDistanceSq(*next) > CHAIN_SPELL_JUMP_RADIUS * CHAIN_SPELL_JUMP_RADIUS)                             break; -                        prev = next;-                        TagUnitMap.push_back(next);-                        tempUnitMap.erase(tempUnitMap.begin());-                        tempUnitMap.sort(TargetDistanceOrder(next));+                        if(!prev->IsWithinLOSInMap(*next))+                        {+                            next++;+                            continue;+                        } +                        prev = *next;+                        TagUnitMap.push_back(prev);+                        tempUnitMap.erase(next);+                        tempUnitMap.sort(TargetDistanceOrder(prev));+                        next = tempUnitMap.begin();+                         --t;                     }                 }@@ -954,20 +969,27 @@                  std::list<Unit *> tempUnitMap; -                CellPair p(MaNGOS::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));-                Cell cell = RedZone::GetZone(p);-                cell.data.Part.reserved = ALL_DISTRICT;-                cell.SetNoCreate();+             +                {+                    CellPair p(MaNGOS::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));+                    Cell cell = RedZone::GetZone(p);+                    cell.data.Part.reserved = ALL_DISTRICT;+                    cell.SetNoCreate();+    +                    MaNGOS::SpellNotifierCreatureAndPlayer notifier(*this, tempUnitMap, max_range, PUSH_SELF_CENTER, SPELL_TARGETS_FRIENDLY);+    +                    TypeContainerVisitor<MaNGOS::SpellNotifierCreatureAndPlayer, WorldTypeMapContainer > world_object_notifier(notifier);+                    TypeContainerVisitor<MaNGOS::SpellNotifierCreatureAndPlayer, GridTypeMapContainer >  grid_object_notifier(notifier);+    +                    CellLock<GridReadGuard> cell_lock(cell, p);+                    cell_lock->Visit(cell_lock, world_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));+                    cell_lock->Visit(cell_lock, grid_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));+    +                } -                MaNGOS::SpellNotifierCreatureAndPlayer notifier(*this, tempUnitMap, max_range, PUSH_SELF_CENTER, SPELL_TARGETS_FRIENDLY);+                if(m_caster != pUnitTarget)+                    tempUnitMap.push_back(m_caster); -                TypeContainerVisitor<MaNGOS::SpellNotifierCreatureAndPlayer, WorldTypeMapContainer > world_object_notifier(notifier);-                TypeContainerVisitor<MaNGOS::SpellNotifierCreatureAndPlayer, GridTypeMapContainer >  grid_object_notifier(notifier);--                CellLock<GridReadGuard> cell_lock(cell, p);-                cell_lock->Visit(cell_lock, world_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));-                cell_lock->Visit(cell_lock, grid_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));-                 tempUnitMap.sort(TargetDistanceOrder(pUnitTarget));                  if(tempUnitMap.empty())@@ -979,19 +1001,31 @@                 TagUnitMap.push_back(pUnitTarget);                 uint32 t = unMaxTargets - 1;                 Unit *prev = pUnitTarget;+                std::list<Unit*>::iterator next = tempUnitMap.begin(); -                while(t && !tempUnitMap.empty() )+                while(t && next != tempUnitMap.end() )                 {-                    Unit *next = *tempUnitMap.begin();--                    if(prev->GetDistanceSq(next) > CHAIN_SPELL_JUMP_RADIUS * CHAIN_SPELL_JUMP_RADIUS)+                    if(prev->GetDistanceSq(*next) > CHAIN_SPELL_JUMP_RADIUS * CHAIN_SPELL_JUMP_RADIUS)                         break; -                    prev = next;-                    TagUnitMap.push_back(next);-                    tempUnitMap.erase(tempUnitMap.begin());-                    tempUnitMap.sort(TargetDistanceOrder(next));+                    if(!prev->IsWithinLOSInMap(*next))+                    {+                        next++;+                        continue;+                    } +                    if((*next)->GetHealth() == (*next)->GetMaxHealth())+                    {+                        next = tempUnitMap.erase(next);+                        continue;+                    }++                    prev = *next;+                    TagUnitMap.push_back(prev);+                    tempUnitMap.erase(next);+                    tempUnitMap.sort(TargetDistanceOrder(prev));+                    next = tempUnitMap.begin();+                      --t;                 }             }