diff options
Diffstat (limited to 'src/script')
-rw-r--r-- | src/script/common/c_content.cpp | 41 | ||||
-rw-r--r-- | src/script/common/c_content.h | 3 | ||||
-rw-r--r-- | src/script/lua_api/l_mapgen.cpp | 1 |
3 files changed, 42 insertions, 3 deletions
diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp index d1e182f9f..4e26dc245 100644 --- a/src/script/common/c_content.cpp +++ b/src/script/common/c_content.cpp @@ -842,8 +842,45 @@ void push_hit_params(lua_State *L,const HitParams ¶ms) u32 getflagsfield(lua_State *L, int table, const char *fieldname, FlagDesc *flagdesc, u32 *flagmask) { - std::string flagstring = getstringfield_default(L, table, fieldname, ""); - return readFlagString(flagstring, flagdesc, flagmask); + u32 flags = 0; + + lua_getfield(L, table, fieldname); + + if (lua_isstring(L, -1)) { + std::string flagstr = lua_tostring(L, -1); + flags = readFlagString(flagstr, flagdesc, flagmask); + } else if (lua_istable(L, -1)) { + flags = read_flags_table(L, -1, flagdesc, flagmask); + } + + lua_pop(L, 1); + + return flags; +} + +u32 read_flags_table(lua_State *L, int table, FlagDesc *flagdesc, u32 *flagmask) +{ + u32 flags = 0, mask = 0; + char fnamebuf[64] = "no"; + + for (int i = 0; flagdesc[i].name; i++) { + bool result; + + if (getboolfield(L, table, flagdesc[i].name, result)) { + mask |= flagdesc[i].flag; + if (result) + flags |= flagdesc[i].flag; + } + + strlcpy(fnamebuf + 2, flagdesc[i].name, sizeof(fnamebuf) - 2); + if (getboolfield(L, table, fnamebuf, result)) + mask |= flagdesc[i].flag; + } + + if (flagmask) + *flagmask = mask; + + return flags; } /******************************************************************************/ diff --git a/src/script/common/c_content.h b/src/script/common/c_content.h index a89de1aad..61617d7ab 100644 --- a/src/script/common/c_content.h +++ b/src/script/common/c_content.h @@ -123,6 +123,9 @@ u32 getflagsfield (lua_State *L, int table, const char *fieldname, FlagDesc *flagdesc, u32 *flagmask); +u32 read_flags_table (lua_State *L, int table, + FlagDesc *flagdesc, u32 *flagmask); + void push_items (lua_State *L, const std::vector<ItemStack> &items); diff --git a/src/script/lua_api/l_mapgen.cpp b/src/script/lua_api/l_mapgen.cpp index 4c6bca74e..2e6d848b3 100644 --- a/src/script/lua_api/l_mapgen.cpp +++ b/src/script/lua_api/l_mapgen.cpp @@ -456,7 +456,6 @@ int ModApiMapgen::l_register_ore(lua_State *L) ore->height_max = getintfield_default(L, index, "height_max", 0); ore->flags = getflagsfield(L, index, "flags", flagdesc_ore, NULL); ore->nthresh = getfloatfield_default(L, index, "noise_threshhold", 0.); - lua_getfield(L, index, "wherein"); if (lua_istable(L, -1)) { int i = lua_gettop(L); |