/*
Minetest
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2017-8 rubenwardy <rw@rubenwardy.com>
+Copyright (C) 2017 raymoo
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
/*
NodeMetaRef
*/
-ItemStackMetaRef* ItemStackMetaRef::checkobject(lua_State *L, int narg)
+ItemStackMetaRef *ItemStackMetaRef::checkobject(lua_State *L, int narg)
{
luaL_checktype(L, narg, LUA_TUSERDATA);
void *ud = luaL_checkudata(L, narg, className);
if (!ud)
luaL_typerror(L, narg, className);
- return *(ItemStackMetaRef**)ud; // unbox pointer
+ return *(ItemStackMetaRef **)ud; // unbox pointer
}
-Metadata* ItemStackMetaRef::getmeta(bool auto_create)
+Metadata *ItemStackMetaRef::getmeta(bool auto_create)
{
return &istack->metadata;
}
istack->metadata.clear();
}
-void ItemStackMetaRef::reportMetadataChange()
+void ItemStackMetaRef::reportMetadataChange(const std::string *name)
{
// TODO
}
// Exported functions
+int ItemStackMetaRef::l_set_tool_capabilities(lua_State *L)
+{
+ ItemStackMetaRef *metaref = checkobject(L, 1);
+ if (lua_isnoneornil(L, 2)) {
+ metaref->clearToolCapabilities();
+ } else if (lua_istable(L, 2)) {
+ ToolCapabilities caps = read_tool_capabilities(L, 2);
+ metaref->setToolCapabilities(caps);
+ } else {
+ luaL_typerror(L, 2, "table or nil");
+ }
+
+ return 0;
+}
// garbage collector
-int ItemStackMetaRef::gc_object(lua_State *L) {
+int ItemStackMetaRef::gc_object(lua_State *L)
+{
ItemStackMetaRef *o = *(ItemStackMetaRef **)(lua_touserdata(L, 1));
delete o;
return 0;
void ItemStackMetaRef::create(lua_State *L, ItemStack *istack)
{
ItemStackMetaRef *o = new ItemStackMetaRef(istack);
- //infostream<<"NodeMetaRef::create: o="<<o<<std::endl;
+ // infostream<<"NodeMetaRef::create: o="<<o<<std::endl;
*(void **)(lua_newuserdata(L, sizeof(void *))) = o;
luaL_getmetatable(L, className);
lua_setmetatable(L, -2);
lua_pushliteral(L, "__metatable");
lua_pushvalue(L, methodtable);
- lua_settable(L, metatable); // hide metatable from Lua getmetatable()
+ lua_settable(L, metatable); // hide metatable from Lua getmetatable()
lua_pushliteral(L, "metadata_class");
lua_pushlstring(L, className, strlen(className));
lua_pushcfunction(L, l_equals);
lua_settable(L, metatable);
- lua_pop(L, 1); // drop metatable
+ lua_pop(L, 1); // drop metatable
- luaL_openlib(L, 0, methods, 0); // fill methodtable
- lua_pop(L, 1); // drop methodtable
+ luaL_openlib(L, 0, methods, 0); // fill methodtable
+ lua_pop(L, 1); // drop methodtable
// Cannot be created from Lua
- //lua_register(L, className, create_object);
+ // lua_register(L, className, create_object);
}
const char ItemStackMetaRef::className[] = "ItemStackMetaRef";
-const luaL_Reg ItemStackMetaRef::methods[] = {
- luamethod(MetaDataRef, get_string),
- luamethod(MetaDataRef, set_string),
- luamethod(MetaDataRef, get_int),
- luamethod(MetaDataRef, set_int),
- luamethod(MetaDataRef, get_float),
- luamethod(MetaDataRef, set_float),
- luamethod(MetaDataRef, to_table),
- luamethod(MetaDataRef, from_table),
- luamethod(MetaDataRef, equals),
- {0,0}
-};
+const luaL_Reg ItemStackMetaRef::methods[] = {luamethod(MetaDataRef, contains),
+ luamethod(MetaDataRef, get), luamethod(MetaDataRef, get_string),
+ luamethod(MetaDataRef, set_string), luamethod(MetaDataRef, get_int),
+ luamethod(MetaDataRef, set_int), luamethod(MetaDataRef, get_float),
+ luamethod(MetaDataRef, set_float), luamethod(MetaDataRef, to_table),
+ luamethod(MetaDataRef, from_table), luamethod(MetaDataRef, equals),
+ luamethod(ItemStackMetaRef, set_tool_capabilities), {0, 0}};