diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Cell.h | 1 | ||||
-rw-r--r-- | src/game/CellImpl.h | 48 | ||||
-rw-r--r-- | src/game/GridDefines.h | 12 | ||||
-rw-r--r-- | src/game/Spell.cpp | 7 |
4 files changed, 65 insertions, 3 deletions
diff --git a/src/game/Cell.h b/src/game/Cell.h index 719bfc3aaa5..35bcdbeea8a 100644 --- a/src/game/Cell.h +++ b/src/game/Cell.h @@ -142,6 +142,7 @@ struct TRINITY_DLL_DECL Cell } data; template<class LOCK_TYPE, class T, class CONTAINER> void Visit(const CellLock<LOCK_TYPE> &, TypeContainerVisitor<T, CONTAINER> &visitor, Map &) const; + template<class LOCK_TYPE, class T, class CONTAINER> void Visit(const CellLock<LOCK_TYPE> &, TypeContainerVisitor<T, CONTAINER> &visitor, Map &, float radius, float x_off, float y_off) const; }; template<class T> diff --git a/src/game/CellImpl.h b/src/game/CellImpl.h index ce5f6ed2ece..08182068af9 100644 --- a/src/game/CellImpl.h +++ b/src/game/CellImpl.h @@ -129,4 +129,52 @@ Cell::Visit(const CellLock<LOCK_TYPE> &l, TypeContainerVisitor<T, CONTAINER> &vi } } } + +template<class LOCK_TYPE,class T, class CONTAINER> +inline void +Cell::Visit(const CellLock<LOCK_TYPE> &l, TypeContainerVisitor<T, CONTAINER> &visitor, Map &m, float radius, float x_off, float y_off) const +{ + const CellPair &standing_cell = l.i_cellPair; + if (standing_cell.x_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP || standing_cell.y_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP) + return; + + int left = 0, right = 0, upper = 0, lower = 0; + + // Origin = (CENTER_GRID_CELL_OFFSET, CENTER_GRID_CELL_OFFSET) + if(CENTER_GRID_CELL_OFFSET - x_off < radius) + ++right; + if(CENTER_GRID_CELL_OFFSET + x_off < radius) + ++left; + if(CENTER_GRID_CELL_OFFSET - y_off < radius) + ++upper; + if(CENTER_GRID_CELL_OFFSET + y_off < radius) + ++lower; + + if(!left && !right && !upper && !lower) + { + m.Visit(l, visitor); + return; + } + + CellPair begin_cell = standing_cell; + CellPair end_cell = standing_cell; + + begin_cell << left; //note: need change << if left > 1 + begin_cell -= lower; + end_cell >> right; + end_cell += upper; + + // loop the cell range + for(uint32 x = begin_cell.x_coord; x <= end_cell.x_coord; x++) + { + for(uint32 y = begin_cell.y_coord; y <= end_cell.y_coord; y++) + { + CellPair cell_pair(x,y); + Cell r_zone(cell_pair); + r_zone.data.Part.nocreate = l->data.Part.nocreate; + CellLock<LOCK_TYPE> lock(r_zone, cell_pair); + m.Visit(lock, visitor); + } + } +} #endif diff --git a/src/game/GridDefines.h b/src/game/GridDefines.h index 6001e366212..26168651d8a 100644 --- a/src/game/GridDefines.h +++ b/src/game/GridDefines.h @@ -150,6 +150,18 @@ namespace Trinity return Compute<CellPair, CENTER_GRID_CELL_ID>(x, y, CENTER_GRID_CELL_OFFSET, SIZE_OF_GRID_CELL); } + inline CellPair ComputeCellPair(float x, float y, float &x_off, float &y_off) + { + double x_offset = (double(x) - CENTER_GRID_CELL_OFFSET)/SIZE_OF_GRID_CELL; + double y_offset = (double(y) - CENTER_GRID_CELL_OFFSET)/SIZE_OF_GRID_CELL; + + int x_val = int(x_offset + 0.5); + int y_val = int(y_offset + 0.5); + x_off = (float(x_offset) - x_val) * SIZE_OF_GRID_CELL; + y_off = (float(y_offset) - y_val) * SIZE_OF_GRID_CELL; + return CellPair(x_val + CENTER_GRID_CELL_ID, y_val + CENTER_GRID_CELL_ID); + } + inline void NormalizeMapCoord(float &c) { if(c > MAP_HALFSIZE - 0.5) diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 53009674d9d..78809841e3a 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -1470,7 +1470,8 @@ void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, const u y = m_caster->GetPositionY(); } - CellPair p(Trinity::ComputeCellPair(x, y)); + float x_off, y_off; + CellPair p(Trinity::ComputeCellPair(x, y, x_off, y_off)); Cell cell(p); cell.data.Part.reserved = ALL_DISTRICT; cell.SetNoCreate(); @@ -1481,12 +1482,12 @@ void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, const u //if(TargetType != SPELL_TARGETS_ENTRY) { TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, WorldTypeMapContainer > world_object_notifier(notifier); - cell_lock->Visit(cell_lock, world_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster)); + cell_lock->Visit(cell_lock, world_object_notifier, *m_caster->GetMap(), radius, x_off, y_off); } if(!(m_spellInfo->AttributesEx3 & SPELL_ATTR_EX3_PLAYERS_ONLY)) { TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, GridTypeMapContainer > grid_object_notifier(notifier); - cell_lock->Visit(cell_lock, grid_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster)); + cell_lock->Visit(cell_lock, grid_object_notifier, *m_caster->GetMap(), radius, x_off, y_off); } } |