mirror of
https://github.com/mangosfour/server.git
synced 2025-12-17 16:37:00 +00:00
[12206] Let GetMapEntranceTrigger and GetGoBackTrigger work in a better defined order
Actually as this is still no total order (and it is basicly impossible to define a reasonable total order for areatrigger_teleport) it is not well defined, but probably good enough for all cases
This commit is contained in:
parent
e27c72311a
commit
824aa5429e
3 changed files with 41 additions and 9 deletions
|
|
@ -5714,16 +5714,21 @@ AreaTrigger const* ObjectMgr::GetGoBackTrigger(uint32 map_id) const
|
||||||
if (!mapEntry || mapEntry->ghost_entrance_map < 0)
|
if (!mapEntry || mapEntry->ghost_entrance_map < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
AreaTrigger const* compareTrigger = NULL;
|
||||||
for (AreaTriggerMap::const_iterator itr = mAreaTriggers.begin(); itr != mAreaTriggers.end(); ++itr)
|
for (AreaTriggerMap::const_iterator itr = mAreaTriggers.begin(); itr != mAreaTriggers.end(); ++itr)
|
||||||
{
|
{
|
||||||
if (itr->second.target_mapId == uint32(mapEntry->ghost_entrance_map))
|
if (itr->second.target_mapId == uint32(mapEntry->ghost_entrance_map))
|
||||||
{
|
{
|
||||||
AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(itr->first);
|
if (!compareTrigger || itr->second.IsLessOrEqualThan(compareTrigger))
|
||||||
if (atEntry && atEntry->mapid == map_id)
|
{
|
||||||
return &itr->second;
|
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* 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)
|
for (AreaTriggerMap::const_iterator itr = mAreaTriggers.begin(); itr != mAreaTriggers.end(); ++itr)
|
||||||
{
|
{
|
||||||
if (itr->second.target_mapId == Map)
|
if (itr->second.target_mapId == Map)
|
||||||
{
|
{
|
||||||
AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(itr->first);
|
if (mEntry->Instanceable())
|
||||||
if (atEntry)
|
{
|
||||||
return &itr->second;
|
// 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()
|
void ObjectMgr::PackGroupIds()
|
||||||
|
|
|
||||||
|
|
@ -88,6 +88,17 @@ struct AreaTrigger
|
||||||
float target_Y;
|
float target_Y;
|
||||||
float target_Z;
|
float target_Z;
|
||||||
float target_Orientation;
|
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;
|
typedef std::map < uint32/*player guid*/, uint32/*instance*/ > CellCorpseSet;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "12205"
|
#define REVISION_NR "12206"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue