X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fscript%2Flua_api%2Fl_areastore.cpp;h=908c766b065ca20a7dda1d354ce39926790c2662;hb=aa8df112ff42d94b6dc59a0153d989bd8c0b115e;hp=261baf6c942d3a5fa75882006c19ed91bf2237f5;hpb=821551a2669123ac9a476894d65b5efe10026040;p=dragonfireclient.git
diff --git a/src/script/lua_api/l_areastore.cpp b/src/script/lua_api/l_areastore.cpp
index 261baf6c9..908c766b0 100644
--- a/src/script/lua_api/l_areastore.cpp
+++ b/src/script/lua_api/l_areastore.cpp
@@ -74,7 +74,7 @@ static inline void push_areas(lua_State *L, const std::vector &areas,
static int deserialization_helper(lua_State *L, AreaStore *as,
std::istream &is)
{
- try {
+ try {
as->deserialize(is);
} catch (const SerializationError &e) {
lua_pushboolean(L, false);
@@ -111,6 +111,9 @@ int LuaAreaStore::l_get_area(lua_State *L)
const Area *res;
res = ast->getArea(id);
+ if (!res)
+ return 0;
+
push_area(L, res, include_borders, include_data);
return 1;
@@ -153,7 +156,7 @@ int LuaAreaStore::l_get_areas_in_area(lua_State *L)
bool include_data = false;
bool accept_overlap = false;
if (lua_isboolean(L, 4)) {
- accept_overlap = lua_toboolean(L, 4);
+ accept_overlap = readParam(L, 4);
get_data_and_border_flags(L, 5, &include_borders, &include_data);
}
std::vector res;
@@ -164,7 +167,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 +182,10 @@ 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);
+
+ // Insert & assign a new ID if necessary
if (!ast->insertArea(&a))
return 0;
@@ -257,7 +264,7 @@ int LuaAreaStore::l_to_file(lua_State *L)
AreaStore *ast = o->as;
const char *filename = luaL_checkstring(L, 2);
- CHECK_SECURE_PATH_OPTIONAL(L, filename);
+ CHECK_SECURE_PATH(L, filename, true);
std::ostringstream os(std::ios_base::binary);
ast->serialize(os);
@@ -288,26 +295,25 @@ int LuaAreaStore::l_from_file(lua_State *L)
LuaAreaStore *o = checkobject(L, 1);
const char *filename = luaL_checkstring(L, 2);
- CHECK_SECURE_PATH_OPTIONAL(L, filename);
+ CHECK_SECURE_PATH(L, filename, false);
std::ifstream is(filename, std::ios::binary);
return deserialization_helper(L, o->as, is);
}
-LuaAreaStore::LuaAreaStore()
+LuaAreaStore::LuaAreaStore() : as(AreaStore::getOptimalImplementation())
{
- this->as = AreaStore::getOptimalImplementation();
}
LuaAreaStore::LuaAreaStore(const std::string &type)
{
#if USE_SPATIAL
if (type == "LibSpatial") {
- this->as = new SpatialAreaStore();
+ as = new SpatialAreaStore();
} else
#endif
{
- this->as = new VectorAreaStore();
+ as = new VectorAreaStore();
}
}
@@ -323,7 +329,7 @@ int LuaAreaStore::create_object(lua_State *L)
NO_MAP_LOCK_REQUIRED;
LuaAreaStore *o = (lua_isstring(L, 1)) ?
- new LuaAreaStore(lua_tostring(L, 1)) :
+ new LuaAreaStore(readParam(L, 1)) :
new LuaAreaStore();
*(void **)(lua_newuserdata(L, sizeof(void *))) = o;
@@ -374,7 +380,7 @@ void LuaAreaStore::Register(lua_State *L)
}
const char LuaAreaStore::className[] = "AreaStore";
-const luaL_reg LuaAreaStore::methods[] = {
+const luaL_Reg LuaAreaStore::methods[] = {
luamethod(LuaAreaStore, get_area),
luamethod(LuaAreaStore, get_areas_for_pos),
luamethod(LuaAreaStore, get_areas_in_area),