Skip to content

Commit

Permalink
MetaDataRef: Add contains() and get() (#7214)
Browse files Browse the repository at this point in the history
  • Loading branch information
rubenwardy authored and SmallJoker committed Apr 30, 2018
1 parent 54606e1 commit 0b5b32b
Show file tree
Hide file tree
Showing 8 changed files with 72 additions and 6 deletions.
15 changes: 9 additions & 6 deletions doc/lua_api.txt
Expand Up @@ -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)
Expand Down
11 changes: 11 additions & 0 deletions games/minimal/mods/test/init.lua
Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions src/script/lua_api/l_itemstackmeta.cpp
Expand Up @@ -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),
Expand Down
36 changes: 36 additions & 0 deletions src/script/lua_api/l_metadata.cpp
Expand Up @@ -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)
{
Expand Down
6 changes: 6 additions & 0 deletions src/script/lua_api/l_metadata.h
Expand Up @@ -46,6 +46,12 @@ class MetaDataRef : public ModApiBase

// 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);

Expand Down
4 changes: 4 additions & 0 deletions src/script/lua_api/l_nodemeta.cpp
Expand Up @@ -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),
Expand All @@ -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),
Expand Down
2 changes: 2 additions & 0 deletions src/script/lua_api/l_playermeta.cpp
Expand Up @@ -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),
Expand Down
2 changes: 2 additions & 0 deletions src/script/lua_api/l_storage.cpp
Expand Up @@ -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),
Expand Down

0 comments on commit 0b5b32b

Please sign in to comment.