From 47e515888c969bbbe21d275d4ac61feb67d82d4e Mon Sep 17 00:00:00 2001 From: Aleos Date: Fri, 18 Feb 2022 08:10:57 -0500 Subject: [PATCH] Changes mapflag storage type to vector (#6624) * Changes the mapflag storage type from an unordered_map to vector giving it a performance boost. * This changes all lookups and modifications to O(1) rather than a possible O(log). --- src/map/map.cpp | 14 +++++++------- src/map/map.hpp | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/map/map.cpp b/src/map/map.cpp index 139dda02b7..ad37dc96f2 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -3655,7 +3655,7 @@ void map_flags_init(void){ union u_mapflag_args args = {}; mapdata->flag.clear(); - mapdata->flag.reserve(MF_MAX); // Reserve the bucket size + mapdata->flag.resize(MF_MAX, 0); // Resize and define default values mapdata->drop_list.clear(); args.flag_val = 100; @@ -3692,7 +3692,7 @@ void map_data_copy(struct map_data *dst_map, struct map_data *src_map) { memcpy(&dst_map->save, &src_map->save, sizeof(struct point)); memcpy(&dst_map->damage_adjust, &src_map->damage_adjust, sizeof(struct s_skill_damage)); - dst_map->flag.insert(src_map->flag.begin(), src_map->flag.end()); + dst_map->flag = src_map->flag; dst_map->skill_damage.insert(src_map->skill_damage.begin(), src_map->skill_damage.end()); dst_map->skill_duration.insert(src_map->skill_duration.begin(), src_map->skill_duration.end()); @@ -4581,11 +4581,11 @@ int map_getmapflag_sub(int16 m, enum e_mapflag mapflag, union u_mapflag_args *ar case MF_RESTRICTED: return mapdata->zone; case MF_NOLOOT: - return util::umap_get(mapdata->flag, static_cast(MF_NOMOBLOOT), 0) && util::umap_get(mapdata->flag, static_cast(MF_NOMVPLOOT), 0); + return mapdata->flag[MF_NOMOBLOOT] && mapdata->flag[MF_NOMVPLOOT]; case MF_NOPENALTY: - return util::umap_get(mapdata->flag, static_cast(MF_NOEXPPENALTY), 0) && util::umap_get(mapdata->flag, static_cast(MF_NOZENYPENALTY), 0); + return mapdata->flag[MF_NOEXPPENALTY] && mapdata->flag[MF_NOZENYPENALTY]; case MF_NOEXP: - return util::umap_get(mapdata->flag, static_cast(MF_NOBASEEXP), 0) && util::umap_get(mapdata->flag, static_cast(MF_NOJOBEXP), 0); + return mapdata->flag[MF_NOBASEEXP] && mapdata->flag[MF_NOJOBEXP]; case MF_SKILL_DAMAGE: nullpo_retr(-1, args); @@ -4598,10 +4598,10 @@ int map_getmapflag_sub(int16 m, enum e_mapflag mapflag, union u_mapflag_args *ar case SKILLDMG_CASTER: return mapdata->damage_adjust.caster; default: - return util::umap_get(mapdata->flag, static_cast(mapflag), 0); + return mapdata->flag[mapflag]; } default: - return util::umap_get(mapdata->flag, static_cast(mapflag), 0); + return mapdata->flag[mapflag]; } } diff --git a/src/map/map.hpp b/src/map/map.hpp index df6d3a25dd..4481244bca 100644 --- a/src/map/map.hpp +++ b/src/map/map.hpp @@ -784,7 +784,7 @@ struct map_data { int users_pvp; int iwall_num; // Total of invisible walls in this map - std::unordered_map flag; + std::vector flag; struct point save; std::vector drop_list; uint32 zone; // zone number (for item/skill restrictions)