diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index b676a7033..ac1a57550 100755 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -5714,16 +5714,21 @@ AreaTrigger const* ObjectMgr::GetGoBackTrigger(uint32 map_id) const if (!mapEntry || mapEntry->ghost_entrance_map < 0) return NULL; + AreaTrigger const* compareTrigger = NULL; for (AreaTriggerMap::const_iterator itr = mAreaTriggers.begin(); itr != mAreaTriggers.end(); ++itr) { if (itr->second.target_mapId == uint32(mapEntry->ghost_entrance_map)) { - AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(itr->first); - if (atEntry && atEntry->mapid == map_id) - return &itr->second; + if (!compareTrigger || itr->second.IsLessOrEqualThan(compareTrigger)) + { + if (itr->second.IsMinimal()) + return &itr->second; + + compareTrigger = &itr->second; + } } } - return NULL; + return compareTrigger; } /** @@ -5731,16 +5736,32 @@ AreaTrigger const* ObjectMgr::GetGoBackTrigger(uint32 map_id) const */ AreaTrigger const* ObjectMgr::GetMapEntranceTrigger(uint32 Map) const { + AreaTrigger const* compareTrigger = NULL; + MapEntry const* mEntry = sMapStore.LookupEntry(Map); + for (AreaTriggerMap::const_iterator itr = mAreaTriggers.begin(); itr != mAreaTriggers.end(); ++itr) { if (itr->second.target_mapId == Map) { - AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(itr->first); - if (atEntry) - return &itr->second; + if (mEntry->Instanceable()) + { + // Remark that IsLessOrEqualThan is no total order, and a->IsLeQ(b) != !b->IsLeQ(a) + if (!compareTrigger || compareTrigger->IsLessOrEqualThan(&itr->second)) + compareTrigger = &itr->second; + } + else + { + if (!compareTrigger || itr->second.IsLessOrEqualThan(compareTrigger)) + { + if (itr->second.IsMinimal()) + return &itr->second; + + compareTrigger = &itr->second; + } + } } } - return NULL; + return compareTrigger; } void ObjectMgr::PackGroupIds() diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h index 31dd68e31..22b7befa5 100755 --- a/src/game/ObjectMgr.h +++ b/src/game/ObjectMgr.h @@ -88,6 +88,17 @@ struct AreaTrigger float target_Y; float target_Z; float target_Orientation; + + // Operators + bool IsMinimal() const { return requiredLevel == 0 && requiredItem == 0 && requiredItem2 == 0 && heroicKey == 0 && + heroicKey2 == 0 && requiredQuest == 0 && requiredQuestHeroic == 0; } + + bool IsLessOrEqualThan(AreaTrigger const* l) const // Expected to have same map + { + MANGOS_ASSERT(target_mapId == l->target_mapId); + return requiredLevel <= l->requiredLevel && requiredItem <= l->requiredItem && requiredItem2 <= l->requiredItem2 + && heroicKey <= l->heroicKey&& heroicKey2 <= l->heroicKey2 && requiredQuest <= l->requiredQuest && requiredQuestHeroic <= l->requiredQuestHeroic; + } }; typedef std::map < uint32/*player guid*/, uint32/*instance*/ > CellCorpseSet; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 017633892..aca5cff1c 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "12205" + #define REVISION_NR "12206" #endif // __REVISION_NR_H__