summaryrefslogtreecommitdiff
path: root/src/script/common
diff options
context:
space:
mode:
authorkwolekr <kwolekr@minetest.net>2014-02-09 12:38:50 -0500
committerkwolekr <kwolekr@minetest.net>2014-02-09 12:44:31 -0500
commit2a01050a0cf0826f25240e2cb407535394ee360f (patch)
treebb6d3fd3b27be094db7e885adc5ac25dc5e45139 /src/script/common
parent57710520dca6bce175a6be48989e0a4689b1404e (diff)
downloadminetest-2a01050a0cf0826f25240e2cb407535394ee360f.tar.gz
minetest-2a01050a0cf0826f25240e2cb407535394ee360f.tar.bz2
minetest-2a01050a0cf0826f25240e2cb407535394ee360f.zip
Add capability to read table flag fields from Lua API
Diffstat (limited to 'src/script/common')
-rw-r--r--src/script/common/c_content.cpp41
-rw-r--r--src/script/common/c_content.h3
2 files changed, 42 insertions, 2 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 &params)
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);