From 3ce6642a26d43fd368c24cdfc5460557258fb44f Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Fri, 30 Oct 2015 20:38:22 -0400 Subject: [PATCH] Add AreaStore custom ID API --- builtin/game/features.lua | 1 + doc/lua_api.txt | 2 +- src/script/lua_api/l_areastore.cpp | 5 ++++- src/util/areastore.cpp | 6 ++++-- src/util/areastore.h | 7 ++++--- 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/builtin/game/features.lua b/builtin/game/features.lua index a5f17e540..2aad458da 100644 --- a/builtin/game/features.lua +++ b/builtin/game/features.lua @@ -8,6 +8,7 @@ core.features = { use_texture_alpha = true, no_legacy_abms = true, texture_names_parens = true, + area_store_custom_ids = true, } function core.has_feature(arg) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 50fa25273..65af51578 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2727,7 +2727,7 @@ If you chose the parameter-less constructor, a fast implementation will be autom * `get_area(id, include_borders, include_data)`: returns the area with the id `id`. (optional) Boolean values `include_borders` and `include_data` control what's copied. * `get_areas_for_pos(pos, include_borders, include_data)`: returns all areas that contain the position `pos`. (optional) Boolean values `include_borders` and `include_data` control what's copied. * `get_areas_in_area(edge1, edge2, accept_overlap, include_borders, include_data)`: returns all areas that contain all nodes inside the area specified by `edge1` and `edge2` (inclusive). If `accept_overlap` is true, also areas are returned that have nodes in common with the specified area. (optional) Boolean values `include_borders` and `include_data` control what's copied. -* `insert_area(edge1, edge2, data)`: inserts an area into the store. Returns the new area's ID, or nil if the insertion failed. The (inclusive) positions `edge1` and `edge2` describe the area, `data` is a string stored with the area. +* `insert_area(edge1, edge2, data, [id])`: inserts an area into the store. Returns the new area's ID, or nil if the insertion failed. The (inclusive) positions `edge1` and `edge2` describe the area. `data` is a string stored with the area. If passed, `id` will be used as the internal area ID, it must be a unique number between 0 and 2^32-2. If you use the `id` parameter you must always use it, or insertions are likely to fail due to conflicts. * `reserve(count)`: reserves resources for at most `count` many contained areas. Only needed for efficiency, and only some implementations profit. * `remove_area(id)`: removes the area with the given id from the store, returns success. * `set_cache_params(params)`: sets params for the included prefiltering cache. Calling invalidates the cache, so that its elements have to be newly generated. diff --git a/src/script/lua_api/l_areastore.cpp b/src/script/lua_api/l_areastore.cpp index 261baf6c9..20e7875c7 100644 --- a/src/script/lua_api/l_areastore.cpp +++ b/src/script/lua_api/l_areastore.cpp @@ -164,7 +164,7 @@ int LuaAreaStore::l_get_areas_in_area(lua_State *L) return 1; } -// insert_area(edge1, edge2, data) +// insert_area(edge1, edge2, data, id) int LuaAreaStore::l_insert_area(lua_State *L) { NO_MAP_LOCK_REQUIRED; @@ -179,6 +179,9 @@ int LuaAreaStore::l_insert_area(lua_State *L) a.data = std::string(data, d_len); + if (lua_isnumber(L, 5)) + a.id = lua_tonumber(L, 5); + if (!ast->insertArea(&a)) return 0; diff --git a/src/util/areastore.cpp b/src/util/areastore.cpp index 17addb3af..58f08a8c2 100644 --- a/src/util/areastore.cpp +++ b/src/util/areastore.cpp @@ -160,7 +160,8 @@ void AreaStore::getAreasForPos(std::vector *result, v3s16 pos) bool VectorAreaStore::insertArea(Area *a) { - a->id = getNextId(); + if (a->id == U32_MAX) + a->id = getNextId(); std::pair res = areas_map.insert(std::make_pair(a->id, *a)); if (!res.second) @@ -232,7 +233,8 @@ static inline SpatialIndex::Point get_spatial_point(const v3s16 pos) bool SpatialAreaStore::insertArea(Area *a) { - a->id = getNextId(); + if (a->id == U32_MAX) + a->id = getNextId(); if (!areas_map.insert(std::make_pair(a->id, *a)).second) // ID is not unique return false; diff --git a/src/util/areastore.h b/src/util/areastore.h index ab6bd76a3..bebecfd78 100644 --- a/src/util/areastore.h +++ b/src/util/areastore.h @@ -38,9 +38,9 @@ with this program; if not, write to the Free Software Foundation, Inc., struct Area { - Area() {} + Area() : id(U32_MAX) {} Area(const v3s16 &mine, const v3s16 &maxe) : - minedge(mine), maxedge(maxe) + id(U32_MAX), minedge(mine), maxedge(maxe) { sortBoxVerticies(minedge, maxedge); } @@ -68,7 +68,8 @@ public: size_t size() const { return areas_map.size(); } /// Add an area to the store. - /// Updates the area's ID. + /// Updates the area's ID if it hasn't already been set. + /// @return Whether the area insertion was successful. virtual bool insertArea(Area *a) = 0; /// Removes an area from the store by ID. -- 2.25.1