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),