MetaDataRef: Add contains() and get() (#7214)
authorrubenwardy <rw@rubenwardy.com>
Mon, 30 Apr 2018 16:42:51 +0000 (17:42 +0100)
committerSmallJoker <SmallJoker@users.noreply.github.com>
Mon, 30 Apr 2018 16:42:51 +0000 (18:42 +0200)
doc/lua_api.txt
games/minimal/mods/test/init.lua
src/script/lua_api/l_itemstackmeta.cpp
src/script/lua_api/l_metadata.cpp
src/script/lua_api/l_metadata.h
src/script/lua_api/l_nodemeta.cpp
src/script/lua_api/l_playermeta.cpp
src/script/lua_api/l_storage.cpp

index 321c2abc611db3c829de4bb9518813515155fe24..5442612affe68a4caad6618ee0b05a55a8ede464 100644 (file)
@@ -3909,12 +3909,15 @@ An interface to use mod channels on client and server
 See `StorageRef`, `NodeMetaRef`, `ItemStackMetaRef`, and `PlayerMetaRef`.
 
 #### Methods
-* `set_string(name, value)`
-* `get_string(name)`
-* `set_int(name, value)`
-* `get_int(name)`
-* `set_float(name, value)`
-* `get_float(name)`
+* `contains(key)`: Returns true if key present, otherwise false.
+    * Returns `nil` when the MetaData is inexistent.
+* `get(key)`: Returns `nil` if key not present, else the stored string.
+* `set_string(key, value)`: Value of `""` will delete the key.
+* `get_string(key)`: Returns `""` if key not present.
+* `set_int(key, value)`
+* `get_int(key)`: Returns `0` if key not present.
+* `set_float(key, value)`
+* `get_float(key)`: Returns `0` if key not present.
 * `to_table()`: returns `nil` or a table with keys:
     * `fields`: key-value storage
     * `inventory`: `{list1 = {}, ...}}` (NodeMetaRef only)
index 9b826bce6986ea9e7e8cf0d3d2a71c1be13b0499..3141b4cf329d329b23d80fc8ad33148e2b9afd66 100644 (file)
@@ -43,21 +43,32 @@ end)
 local function run_player_meta_tests(player)
        local meta = player:get_meta()
        meta:set_string("foo", "bar")
+       assert(meta:contains("foo"))
        assert(meta:get_string("foo") == "bar")
+       assert(meta:get("foo") == "bar")
 
        local meta2 = player:get_meta()
        assert(meta2:get_string("foo") == "bar")
+       assert(meta2:get("foo") == "bar")
        assert(meta:equals(meta2))
        assert(player:get_attribute("foo") == "bar")
 
        meta:set_string("bob", "dillan")
        assert(meta:get_string("foo") == "bar")
        assert(meta:get_string("bob") == "dillan")
+       assert(meta:get("bob") == "dillan")
        assert(meta2:get_string("foo") == "bar")
        assert(meta2:get_string("bob") == "dillan")
+       assert(meta2:get("bob") == "dillan")
        assert(meta:equals(meta2))
        assert(player:get_attribute("foo") == "bar")
        assert(player:get_attribute("bob") == "dillan")
+
+       meta:set_string("foo", "")
+       assert(not meta:contains("foo"))
+       assert(meta:get("foo") == nil)
+       assert(meta:get_string("foo") == "")
+       assert(meta:equals(meta2))
 end
 
 local function run_player_tests(player)
index 0661ec25d5f70a1aac8acfd651ded48cc7ce4a7a..07ab864992989bf6c5b5e407415720094443e7bf 100644 (file)
@@ -123,6 +123,8 @@ void ItemStackMetaRef::Register(lua_State *L)
 
 const char ItemStackMetaRef::className[] = "ItemStackMetaRef";
 const luaL_Reg ItemStackMetaRef::methods[] = {
+       luamethod(MetaDataRef, contains),
+       luamethod(MetaDataRef, get),
        luamethod(MetaDataRef, get_string),
        luamethod(MetaDataRef, set_string),
        luamethod(MetaDataRef, get_int),
index 69f495c4aa32cd149241415642bd340fd568e80d..3901ac2cf46b091d3dd801632ac88cca0fc34145 100644 (file)
@@ -51,6 +51,42 @@ MetaDataRef* MetaDataRef::checkobject(lua_State *L, int narg)
 
 // Exported functions
 
+// contains(self, name)
+int MetaDataRef::l_contains(lua_State *L)
+{
+       MAP_LOCK_REQUIRED;
+
+       MetaDataRef *ref = checkobject(L, 1);
+       std::string name = luaL_checkstring(L, 2);
+
+       Metadata *meta = ref->getmeta(false);
+       if (meta == NULL)
+               return 0;
+
+       lua_pushboolean(L, meta->contains(name));
+       return 1;
+}
+
+// get(self, name)
+int MetaDataRef::l_get(lua_State *L)
+{
+       MAP_LOCK_REQUIRED;
+
+       MetaDataRef *ref = checkobject(L, 1);
+       std::string name = luaL_checkstring(L, 2);
+
+       Metadata *meta = ref->getmeta(false);
+       if (meta == NULL)
+               return 0;
+
+       std::string str;
+       if (meta->getStringToRef(name, str)) {
+               lua_pushlstring(L, str.c_str(), str.size());
+               return 1;
+       }
+       return 0;
+}
+
 // get_string(self, name)
 int MetaDataRef::l_get_string(lua_State *L)
 {
index 3aaf62d4a2a4d7b6f7b32df676aef31ea0b1d290..cee38ed45c90a40a0983d1d33d8ef19b6cd29e0e 100644 (file)
@@ -46,6 +46,12 @@ protected:
 
        // Exported functions
 
+       // contains(self, name)
+       static int l_contains(lua_State *L);
+
+       // get(self, name)
+       static int l_get(lua_State *L);
+
        // get_string(self, name)
        static int l_get_string(lua_State *L);
 
index 348d73ad55c4241b62d8437aface70518b9af71f..f390664a46a254383231487399d920beb0e96300 100644 (file)
@@ -242,6 +242,8 @@ void NodeMetaRef::Register(lua_State *L)
 
 
 const luaL_Reg NodeMetaRef::methodsServer[] = {
+       luamethod(MetaDataRef, contains),
+       luamethod(MetaDataRef, get),
        luamethod(MetaDataRef, get_string),
        luamethod(MetaDataRef, set_string),
        luamethod(MetaDataRef, get_int),
@@ -266,6 +268,8 @@ void NodeMetaRef::RegisterClient(lua_State *L)
 
 
 const luaL_Reg NodeMetaRef::methodsClient[] = {
+       luamethod(MetaDataRef, contains),
+       luamethod(MetaDataRef, get),
        luamethod(MetaDataRef, get_string),
        luamethod(MetaDataRef, get_int),
        luamethod(MetaDataRef, get_float),
index b8f6aabb7171b1ac5b61430e9141ea18565d1b6d..e690f6bd0263f5c6c5dba304a2c836af149ba431 100644 (file)
@@ -107,6 +107,8 @@ void PlayerMetaRef::Register(lua_State *L)
 // clang-format off
 const char PlayerMetaRef::className[] = "PlayerMetaRef";
 const luaL_Reg PlayerMetaRef::methods[] = {
+       luamethod(MetaDataRef, contains),
+       luamethod(MetaDataRef, get),
        luamethod(MetaDataRef, get_string),
        luamethod(MetaDataRef, set_string),
        luamethod(MetaDataRef, get_int),
index 01810ca8b1d79376a601510b9f5fb1a045eaaca7..280ec7266f6a55ba04dc75ef04570814c5d1d0c2 100644 (file)
@@ -134,6 +134,8 @@ void StorageRef::clearMeta()
 
 const char StorageRef::className[] = "StorageRef";
 const luaL_Reg StorageRef::methods[] = {
+       luamethod(MetaDataRef, contains),
+       luamethod(MetaDataRef, get),
        luamethod(MetaDataRef, get_string),
        luamethod(MetaDataRef, set_string),
        luamethod(MetaDataRef, get_int),