@@ -664,6 +664,12 @@ AreaTableEntry const* GetAreaEntryByAreaID(uint32 area_id)
664664AreaTableEntry const * GetAreaEntryByAreaFlagAndMap (uint32 area_flag, uint32 map_id)
665665{
666666 // 1.12.1 areatable have duplicates for areaflag
667+ static std::map<uint64, AreaTableEntry const *> cache;
668+ uint64 cacheKey = (static_cast <uint64>(area_flag) << 32 ) | static_cast <uint64>(map_id);
669+ auto it = cache.find (cacheKey);
670+ if (it != cache.end ())
671+ return it->second ;
672+
667673 AreaTableEntry const * aEntry = NULL ;
668674 for (uint32 i = 0 ; i <= sAreaStore .GetNumRows () ; i++)
669675 {
@@ -676,6 +682,7 @@ AreaTableEntry const* GetAreaEntryByAreaFlagAndMap(uint32 area_flag, uint32 map_
676682 // area_flag found but it lets test map_id too
677683 if (AreaEntry->mapid == map_id)
678684 {
685+ cache[cacheKey] = AreaEntry;
679686 return AreaEntry; // area_flag and map_id are ok so we can return value
680687 }
681688 // not same map_id so we store this entry and continue searching another better one
@@ -687,14 +694,18 @@ AreaTableEntry const* GetAreaEntryByAreaFlagAndMap(uint32 area_flag, uint32 map_
687694
688695 if (aEntry)
689696 {
697+ cache[cacheKey] = aEntry;
690698 return aEntry; // return last entry found if exist (not same map_id but it seem ok in some places)
691699 }
692700
693701 if (MapEntry const * mapEntry = sMapStore .LookupEntry (map_id))
694702 {
695- return GetAreaEntryByAreaID (mapEntry->linked_zone );
703+ AreaTableEntry const * result = GetAreaEntryByAreaID (mapEntry->linked_zone );
704+ cache[cacheKey] = result;
705+ return result;
696706 }
697707
708+ cache[cacheKey] = NULL ;
698709 return NULL ;
699710}
700711
0 commit comments