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).
This commit is contained in:
Aleos 2022-02-18 08:10:57 -05:00 committed by GitHub
parent fc7ed9d397
commit 47e515888c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 8 deletions

View File

@ -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<int16>(MF_NOMOBLOOT), 0) && util::umap_get(mapdata->flag, static_cast<int16>(MF_NOMVPLOOT), 0);
return mapdata->flag[MF_NOMOBLOOT] && mapdata->flag[MF_NOMVPLOOT];
case MF_NOPENALTY:
return util::umap_get(mapdata->flag, static_cast<int16>(MF_NOEXPPENALTY), 0) && util::umap_get(mapdata->flag, static_cast<int16>(MF_NOZENYPENALTY), 0);
return mapdata->flag[MF_NOEXPPENALTY] && mapdata->flag[MF_NOZENYPENALTY];
case MF_NOEXP:
return util::umap_get(mapdata->flag, static_cast<int16>(MF_NOBASEEXP), 0) && util::umap_get(mapdata->flag, static_cast<int16>(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<int16>(mapflag), 0);
return mapdata->flag[mapflag];
}
default:
return util::umap_get(mapdata->flag, static_cast<int16>(mapflag), 0);
return mapdata->flag[mapflag];
}
}

View File

@ -784,7 +784,7 @@ struct map_data {
int users_pvp;
int iwall_num; // Total of invisible walls in this map
std::unordered_map<int16, int> flag;
std::vector<int> flag;
struct point save;
std::vector<s_drop_list> drop_list;
uint32 zone; // zone number (for item/skill restrictions)