diff options
| author | Shauren <shauren.trinity@gmail.com> | 2017-05-13 19:37:33 +0200 |
|---|---|---|
| committer | ariel- <ariel-@users.noreply.github.com> | 2017-06-19 13:16:13 -0300 |
| commit | d6201e5dbb7fa7ca8b47ffa6c0d30fa38dceada5 (patch) | |
| tree | 24f77462be2079c892dd604b4a1979f476e56e3c /src/server/game/Entities | |
| parent | 7874bee7bfb70e0e039f91173cff212e9572de09 (diff) | |
Core/Grids: Ported cmangos/mangos-wotlk@ea99457e50790acde8928aa0f3dc4a9c096b4a8c
(cherry picked from commit 9299e9bde087af7e5d777d5a55a3b79d2b63c48e)
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 86 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 12 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 42 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.h | 4 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 8 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 8 |
6 files changed, 41 insertions, 119 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 7e006d98d35..ed98f7d70be 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -880,16 +880,9 @@ void Creature::DoFleeToGetAssistance() if (radius >0) { Creature* creature = nullptr; - - CellCoord p(Trinity::ComputeCellCoord(GetPositionX(), GetPositionY())); - Cell cell(p); - cell.SetNoCreate(); Trinity::NearestAssistCreatureInCreatureRangeCheck u_check(this, GetVictim(), radius); Trinity::CreatureLastSearcher<Trinity::NearestAssistCreatureInCreatureRangeCheck> searcher(this, creature, u_check); - - TypeContainerVisitor<Trinity::CreatureLastSearcher<Trinity::NearestAssistCreatureInCreatureRangeCheck>, GridTypeMapContainer > grid_creature_searcher(searcher); - - cell.Visit(p, grid_creature_searcher, *GetMap(), *this, radius); + Cell::VisitGridObjects(this, searcher, radius); SetNoSearchAssistance(true); UpdateSpeed(MOVE_RUN); @@ -2091,55 +2084,29 @@ SpellInfo const* Creature::reachWithSpellCure(Unit* victim) // select nearest hostile unit within the given distance (regardless of threat list). Unit* Creature::SelectNearestTarget(float dist, bool playerOnly /* = false */) const { - CellCoord p(Trinity::ComputeCellCoord(GetPositionX(), GetPositionY())); - Cell cell(p); - cell.SetNoCreate(); + if (dist == 0.0f) + dist = MAX_VISIBILITY_DISTANCE; Unit* target = nullptr; - - { - if (dist == 0.0f) - dist = MAX_VISIBILITY_DISTANCE; - - Trinity::NearestHostileUnitCheck u_check(this, dist, playerOnly); - Trinity::UnitLastSearcher<Trinity::NearestHostileUnitCheck> searcher(this, target, u_check); - - TypeContainerVisitor<Trinity::UnitLastSearcher<Trinity::NearestHostileUnitCheck>, WorldTypeMapContainer > world_unit_searcher(searcher); - TypeContainerVisitor<Trinity::UnitLastSearcher<Trinity::NearestHostileUnitCheck>, GridTypeMapContainer > grid_unit_searcher(searcher); - - cell.Visit(p, world_unit_searcher, *GetMap(), *this, dist); - cell.Visit(p, grid_unit_searcher, *GetMap(), *this, dist); - } - + Trinity::NearestHostileUnitCheck u_check(this, dist, playerOnly); + Trinity::UnitLastSearcher<Trinity::NearestHostileUnitCheck> searcher(this, target, u_check); + Cell::VisitAllObjects(this, searcher, dist); return target; } // select nearest hostile unit within the given attack distance (i.e. distance is ignored if > than ATTACK_DISTANCE), regardless of threat list. Unit* Creature::SelectNearestTargetInAttackDistance(float dist) const { - CellCoord p(Trinity::ComputeCellCoord(GetPositionX(), GetPositionY())); - Cell cell(p); - cell.SetNoCreate(); - - Unit* target = nullptr; - if (dist > MAX_VISIBILITY_DISTANCE) { TC_LOG_ERROR("entities.unit", "Creature (GUID: %u Entry: %u) SelectNearestTargetInAttackDistance called with dist > MAX_VISIBILITY_DISTANCE. Distance set to ATTACK_DISTANCE.", GetGUID().GetCounter(), GetEntry()); dist = ATTACK_DISTANCE; } - { - Trinity::NearestHostileUnitInAttackDistanceCheck u_check(this, dist); - Trinity::UnitLastSearcher<Trinity::NearestHostileUnitInAttackDistanceCheck> searcher(this, target, u_check); - - TypeContainerVisitor<Trinity::UnitLastSearcher<Trinity::NearestHostileUnitInAttackDistanceCheck>, WorldTypeMapContainer > world_unit_searcher(searcher); - TypeContainerVisitor<Trinity::UnitLastSearcher<Trinity::NearestHostileUnitInAttackDistanceCheck>, GridTypeMapContainer > grid_unit_searcher(searcher); - - cell.Visit(p, world_unit_searcher, *GetMap(), *this, ATTACK_DISTANCE > dist ? ATTACK_DISTANCE : dist); - cell.Visit(p, grid_unit_searcher, *GetMap(), *this, ATTACK_DISTANCE > dist ? ATTACK_DISTANCE : dist); - } - + Unit* target = nullptr; + Trinity::NearestHostileUnitInAttackDistanceCheck u_check(this, dist); + Trinity::UnitLastSearcher<Trinity::NearestHostileUnitInAttackDistanceCheck> searcher(this, target, u_check); + Cell::VisitAllObjects(this, searcher, std::max(dist, ATTACK_DISTANCE)); return target; } @@ -2166,19 +2133,9 @@ void Creature::CallAssistance() if (radius > 0) { std::list<Creature*> assistList; - - { - CellCoord p(Trinity::ComputeCellCoord(GetPositionX(), GetPositionY())); - Cell cell(p); - cell.SetNoCreate(); - - Trinity::AnyAssistCreatureInRangeCheck u_check(this, GetVictim(), radius); - Trinity::CreatureListSearcher<Trinity::AnyAssistCreatureInRangeCheck> searcher(this, assistList, u_check); - - TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AnyAssistCreatureInRangeCheck>, GridTypeMapContainer > grid_creature_searcher(searcher); - - cell.Visit(p, grid_creature_searcher, *GetMap(), *this, radius); - } + Trinity::AnyAssistCreatureInRangeCheck u_check(this, GetVictim(), radius); + Trinity::CreatureListSearcher<Trinity::AnyAssistCreatureInRangeCheck> searcher(this, assistList, u_check); + Cell::VisitGridObjects(this, searcher, radius); if (!assistList.empty()) { @@ -2200,16 +2157,9 @@ void Creature::CallForHelp(float radius) if (radius <= 0.0f || !GetVictim() || IsPet() || IsCharmed()) return; - CellCoord p(Trinity::ComputeCellCoord(GetPositionX(), GetPositionY())); - Cell cell(p); - cell.SetNoCreate(); - Trinity::CallOfHelpCreatureInRangeDo u_do(this, GetVictim(), radius); Trinity::CreatureWorker<Trinity::CallOfHelpCreatureInRangeDo> worker(this, u_do); - - TypeContainerVisitor<Trinity::CreatureWorker<Trinity::CallOfHelpCreatureInRangeDo>, GridTypeMapContainer > grid_creature_searcher(worker); - - cell.Visit(p, grid_creature_searcher, *GetMap(), *this, radius); + Cell::VisitGridObjects(this, worker, radius); } bool Creature::CanAssistTo(const Unit* u, const Unit* enemy, bool checkfaction /*= true*/) const @@ -2893,12 +2843,10 @@ Unit* Creature::SelectNearestHostileUnitInAggroRange(bool useLOS) const Unit* target = NULL; - { - Trinity::NearestHostileUnitInAggroRangeCheck u_check(this, useLOS); - Trinity::UnitSearcher<Trinity::NearestHostileUnitInAggroRangeCheck> searcher(this, target, u_check); + Trinity::NearestHostileUnitInAggroRangeCheck u_check(this, useLOS); + Trinity::UnitSearcher<Trinity::NearestHostileUnitInAggroRangeCheck> searcher(this, target, u_check); - VisitNearbyGridObject(MAX_AGGRO_RADIUS, searcher); - } + Cell::VisitGridObjects(this, searcher, MAX_AGGRO_RADIUS); return target; } diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index b82ca03f48b..58d2ce513c6 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -582,7 +582,7 @@ void GameObject::Update(uint32 diff) // Hunter trap: Search units which are unfriendly to the trap's owner Trinity::NearestAttackableNoTotemUnitInObjectRangeCheck checker(this, owner, radius); Trinity::UnitLastSearcher<Trinity::NearestAttackableNoTotemUnitInObjectRangeCheck> searcher(this, target, checker); - VisitNearbyObject(radius, searcher); + Cell::VisitAllObjects(this, searcher, radius); } else { @@ -590,7 +590,7 @@ void GameObject::Update(uint32 diff) Player* player = nullptr; Trinity::AnyPlayerInObjectRangeCheck checker(this, radius); Trinity::PlayerSearcher<Trinity::AnyPlayerInObjectRangeCheck> searcher(this, player, checker); - VisitNearbyWorldObject(radius, searcher); + Cell::VisitWorldObjects(this, searcher, radius); target = player; } @@ -1166,15 +1166,9 @@ void GameObject::TriggeringLinkedGameObject(uint32 trapEntry, Unit* target) GameObject* GameObject::LookupFishingHoleAround(float range) { GameObject* ok = nullptr; - - CellCoord p(Trinity::ComputeCellCoord(GetPositionX(), GetPositionY())); - Cell cell(p); Trinity::NearestGameObjectFishingHole u_check(*this, range); Trinity::GameObjectSearcher<Trinity::NearestGameObjectFishingHole> checker(this, ok, u_check); - - TypeContainerVisitor<Trinity::GameObjectSearcher<Trinity::NearestGameObjectFishingHole>, GridTypeMapContainer > grid_object_checker(checker); - cell.Visit(p, grid_object_checker, *GetMap(), *this, range); - + Cell::VisitGridObjects(this, checker, range); return ok; } diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 51c7273de96..a488f6523e1 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1769,13 +1769,13 @@ void WorldObject::SendMessageToSet(WorldPacket const* data, bool self) void WorldObject::SendMessageToSetInRange(WorldPacket const* data, float dist, bool /*self*/) { Trinity::MessageDistDeliverer notifier(this, data, dist); - VisitNearbyWorldObject(dist, notifier); + Cell::VisitWorldObjects(this, notifier, dist); } void WorldObject::SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr) { Trinity::MessageDistDeliverer notifier(this, data, GetVisibilityRange(), false, skipped_rcvr); - VisitNearbyWorldObject(GetVisibilityRange(), notifier); + Cell::VisitWorldObjects(this, notifier, GetVisibilityRange()); } void WorldObject::SendObjectDeSpawnAnim(ObjectGuid guid) @@ -1925,7 +1925,7 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert // call MoveInLineOfSight for nearby creatures Trinity::AIRelocationNotifier notifier(*summon); - summon->VisitNearbyObject(GetVisibilityRange(), notifier); + Cell::VisitAllObjects(summon, notifier, GetVisibilityRange()); return summon; } @@ -2086,7 +2086,7 @@ Creature* WorldObject::FindNearestCreature(uint32 entry, float range, bool alive Creature* creature = nullptr; Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck checker(*this, entry, alive, range); Trinity::CreatureLastSearcher<Trinity::NearestCreatureEntryWithLiveStateInObjectRangeCheck> searcher(this, creature, checker); - VisitNearbyObject(range, searcher); + Cell::VisitAllObjects(this, searcher, range); return creature; } @@ -2095,7 +2095,7 @@ GameObject* WorldObject::FindNearestGameObject(uint32 entry, float range) const GameObject* go = nullptr; Trinity::NearestGameObjectEntryInObjectRangeCheck checker(*this, entry, range); Trinity::GameObjectLastSearcher<Trinity::NearestGameObjectEntryInObjectRangeCheck> searcher(this, go, checker); - VisitNearbyGridObject(range, searcher); + Cell::VisitGridObjects(this, searcher, range); return go; } @@ -2104,7 +2104,7 @@ GameObject* WorldObject::FindNearestGameObjectOfType(GameobjectTypes type, float GameObject* go = nullptr; Trinity::NearestGameObjectTypeInObjectRangeCheck checker(*this, type, range); Trinity::GameObjectLastSearcher<Trinity::NearestGameObjectTypeInObjectRangeCheck> searcher(this, go, checker); - VisitNearbyGridObject(range, searcher); + Cell::VisitGridObjects(this, searcher, range); return go; } @@ -2114,7 +2114,7 @@ Player* WorldObject::SelectNearestPlayer(float distance) const Trinity::NearestPlayerInObjectRangeCheck checker(this, distance); Trinity::PlayerLastSearcher<Trinity::NearestPlayerInObjectRangeCheck> searcher(this, target, checker); - VisitNearbyObject(distance, searcher); + Cell::VisitWorldObjects(this, searcher, distance); return target; } @@ -2123,28 +2123,17 @@ template <typename Container> void WorldObject::GetGameObjectListWithEntryInGrid(Container& gameObjectContainer, uint32 entry, float maxSearchRange /*= 250.0f*/) const { CellCoord pair(Trinity::ComputeCellCoord(GetPositionX(), GetPositionY())); - Cell cell(pair); - cell.SetNoCreate(); - Trinity::AllGameObjectsWithEntryInRange check(this, entry, maxSearchRange); Trinity::GameObjectListSearcher<Trinity::AllGameObjectsWithEntryInRange> searcher(this, gameObjectContainer, check); - TypeContainerVisitor<Trinity::GameObjectListSearcher<Trinity::AllGameObjectsWithEntryInRange>, GridTypeMapContainer> visitor(searcher); - - cell.Visit(pair, visitor, *GetMap(), *this, maxSearchRange); + Cell::VisitGridObjects(this, searcher, maxSearchRange); } template <typename Container> void WorldObject::GetCreatureListWithEntryInGrid(Container& creatureContainer, uint32 entry, float maxSearchRange /*= 250.0f*/) const { - CellCoord pair(Trinity::ComputeCellCoord(GetPositionX(), GetPositionY())); - Cell cell(pair); - cell.SetNoCreate(); - Trinity::AllCreaturesOfEntryInRange check(this, entry, maxSearchRange); Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(this, creatureContainer, check); - TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> visitor(searcher); - - cell.Visit(pair, visitor, *GetMap(), *this, maxSearchRange); + Cell::VisitGridObjects(this, searcher, maxSearchRange); } template <typename Container> @@ -2152,7 +2141,7 @@ void WorldObject::GetPlayerListInGrid(Container& playerContainer, float maxSearc { Trinity::AnyPlayerInObjectRangeCheck checker(this, maxSearchRange); Trinity::PlayerListSearcher<Trinity::AnyPlayerInObjectRangeCheck> searcher(this, playerContainer, checker); - VisitNearbyWorldObject(maxSearchRange, searcher); + Cell::VisitWorldObjects(this, searcher, maxSearchRange); } void WorldObject::GetNearPoint2D(float &x, float &y, float distance2d, float absAngle) const @@ -2419,7 +2408,7 @@ void WorldObject::DestroyForNearbyPlayers() std::list<Player*> targets; Trinity::AnyPlayerInObjectRangeCheck check(this, GetVisibilityRange(), false); Trinity::PlayerListSearcher<Trinity::AnyPlayerInObjectRangeCheck> searcher(this, targets, check); - VisitNearbyWorldObject(GetVisibilityRange(), searcher); + Cell::VisitWorldObjects(this, searcher, GetVisibilityRange()); for (std::list<Player*>::const_iterator iter = targets.begin(); iter != targets.end(); ++iter) { Player* player = (*iter); @@ -2446,7 +2435,7 @@ void WorldObject::UpdateObjectVisibility(bool /*forced*/) { //updates object's visibility for nearby players Trinity::VisibleChangesNotifier notifier(*this); - VisitNearbyWorldObject(GetVisibilityRange(), notifier); + Cell::VisitWorldObjects(this, notifier, GetVisibilityRange()); } struct WorldObjectChangeAccumulator @@ -2521,14 +2510,9 @@ struct WorldObjectChangeAccumulator void WorldObject::BuildUpdate(UpdateDataMapType& data_map) { - CellCoord p = Trinity::ComputeCellCoord(GetPositionX(), GetPositionY()); - Cell cell(p); - cell.SetNoCreate(); WorldObjectChangeAccumulator notifier(*this, data_map); - TypeContainerVisitor<WorldObjectChangeAccumulator, WorldTypeMapContainer > player_notifier(notifier); - Map& map = *GetMap(); //we must build packets for all visible players - cell.Visit(p, player_notifier, map, *this, GetVisibilityRange()); + Cell::VisitWorldObjects(this, notifier, GetVisibilityRange()); ClearUpdateMask(false); } diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 03c721d59fc..3438e428a75 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -596,10 +596,6 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation bool IsPermanentWorldObject() const { return m_isWorldObject; } bool IsWorldObject() const; - template<class NOTIFIER> void VisitNearbyObject(float const& radius, NOTIFIER& notifier) const { if (IsInWorld()) GetMap()->VisitAll(GetPositionX(), GetPositionY(), radius, notifier); } - template<class NOTIFIER> void VisitNearbyGridObject(float const& radius, NOTIFIER& notifier) const { if (IsInWorld()) GetMap()->VisitGrid(GetPositionX(), GetPositionY(), radius, notifier); } - template<class NOTIFIER> void VisitNearbyWorldObject(float const& radius, NOTIFIER& notifier) const { if (IsInWorld()) GetMap()->VisitWorld(GetPositionX(), GetPositionY(), radius, notifier); } - uint32 LastUsedScriptID; // Transports diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 4a568bb85f6..2394e822efc 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6453,7 +6453,7 @@ void Player::SendMessageToSetInRange(WorldPacket const* data, float dist, bool s GetSession()->SendPacket(data); Trinity::MessageDistDeliverer notifier(this, data, dist); - VisitNearbyWorldObject(dist, notifier); + Cell::VisitWorldObjects(this, notifier, dist); } void Player::SendMessageToSetInRange(WorldPacket const* data, float dist, bool self, bool own_team_only) @@ -6462,7 +6462,7 @@ void Player::SendMessageToSetInRange(WorldPacket const* data, float dist, bool s GetSession()->SendPacket(data); Trinity::MessageDistDeliverer notifier(this, data, dist, own_team_only); - VisitNearbyWorldObject(dist, notifier); + Cell::VisitWorldObjects(this, notifier, dist); } void Player::SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr) @@ -6473,7 +6473,7 @@ void Player::SendMessageToSet(WorldPacket const* data, Player const* skipped_rcv // we use World::GetMaxVisibleDistance() because i cannot see why not use a distance // update: replaced by GetMap()->GetVisibilityDistance() Trinity::MessageDistDeliverer notifier(this, data, GetVisibilityRange(), false, skipped_rcvr); - VisitNearbyWorldObject(GetVisibilityRange(), notifier); + Cell::VisitWorldObjects(this, notifier, GetVisibilityRange()); } void Player::SendDirectMessage(WorldPacket const* data) const @@ -22315,7 +22315,7 @@ void Player::UpdateVisibilityForPlayer() { // updates visibility of all objects around point of view for current player Trinity::VisibleNotifier notifier(*this); - m_seer->VisitNearbyObject(GetSightRange(), notifier); + Cell::VisitAllObjects(m_seer, notifier, GetSightRange()); notifier.SendToSelf(); // send gathered data } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 7f5edc85eae..157b441d90a 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -11540,7 +11540,7 @@ Unit* Unit::SelectNearbyTarget(Unit* exclude, float dist) const std::list<Unit*> targets; Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, this, dist); Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(this, targets, u_check); - VisitNearbyObject(dist, searcher); + Cell::VisitAllObjects(this, searcher, dist); // remove current target if (GetVictim()) @@ -13120,7 +13120,7 @@ void Unit::UpdateObjectVisibility(bool forced) WorldObject::UpdateObjectVisibility(true); // call MoveInLineOfSight for nearby creatures Trinity::AIRelocationNotifier notifier(*this); - VisitNearbyObject(GetVisibilityRange(), notifier); + Cell::VisitAllObjects(this, notifier, GetVisibilityRange()); } } @@ -14559,7 +14559,7 @@ void Unit::Talk(std::string const& text, ChatMsg msgType, Language language, flo Trinity::CustomChatTextBuilder builder(this, msgType, text, language, target); Trinity::LocalizedPacketDo<Trinity::CustomChatTextBuilder> localizer(builder); Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::CustomChatTextBuilder> > worker(this, textRange, localizer); - VisitNearbyWorldObject(textRange, worker); + Cell::VisitWorldObjects(this, worker, textRange); } void Unit::Say(std::string const& text, Language language, WorldObject const* target /*= nullptr*/) @@ -14599,7 +14599,7 @@ void Unit::Talk(uint32 textId, ChatMsg msgType, float textRange, WorldObject con Trinity::BroadcastTextBuilder builder(this, msgType, textId, target); Trinity::LocalizedPacketDo<Trinity::BroadcastTextBuilder> localizer(builder); Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::BroadcastTextBuilder> > worker(this, textRange, localizer); - VisitNearbyWorldObject(textRange, worker); + Cell::VisitWorldObjects(this, worker, textRange); } void Unit::Say(uint32 textId, WorldObject const* target /*= nullptr*/) |
