with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#ifndef L_NODEMETA_H_
-#define L_NODEMETA_H_
-extern "C" {
-#include <lua.h>
-#include <lauxlib.h>
-}
+#pragma once
-#include "environment.h"
+#include "lua_api/l_base.h"
+#include "lua_api/l_metadata.h"
+#include "irrlichttypes_bloated.h"
#include "nodemetadata.h"
+class ServerEnvironment;
+class NodeMetadata;
+
/*
NodeMetaRef
*/
-class NodeMetaRef
-{
+class NodeMetaRef : public MetaDataRef {
private:
v3s16 m_p;
- ServerEnvironment *m_env;
+ ServerEnvironment *m_env = nullptr;
+ Metadata *m_meta = nullptr;
+ bool m_is_local = false;
static const char className[];
- static const luaL_reg methods[];
+ static const luaL_Reg methodsServer[];
+ static const luaL_Reg methodsClient[];
static NodeMetaRef *checkobject(lua_State *L, int narg);
- static NodeMetadata* getmeta(NodeMetaRef *ref, bool auto_create);
-
- static void reportMetadataChange(NodeMetaRef *ref);
+ /**
+ * Retrieve metadata for a node.
+ * If @p auto_create is set and the specified node has no metadata information
+ * associated with it yet, the method attempts to attach a new metadata object
+ * to the node and returns a pointer to the metadata when successful.
+ *
+ * However, it is NOT guaranteed that the method will return a pointer,
+ * and @c NULL may be returned in case of an error regardless of @p auto_create.
+ *
+ * @param ref specifies the node for which the associated metadata is retrieved.
+ * @param auto_create when true, try to create metadata information for the node if it has none.
+ * @return pointer to a @c NodeMetadata object or @c NULL in case of error.
+ */
+ virtual Metadata* getmeta(bool auto_create);
+ virtual void clearMeta();
+
+ virtual void reportMetadataChange(const std::string *name = nullptr);
+
+ virtual void handleToTable(lua_State *L, Metadata *_meta);
+ virtual bool handleFromTable(lua_State *L, int table, Metadata *_meta);
// Exported functions
// garbage collector
static int gc_object(lua_State *L);
- // get_string(self, name)
- static int l_get_string(lua_State *L);
-
- // set_string(self, name, var)
- static int l_set_string(lua_State *L);
-
- // get_int(self, name)
- static int l_get_int(lua_State *L);
-
- // set_int(self, name, var)
- static int l_set_int(lua_State *L);
-
- // get_float(self, name)
- static int l_get_float(lua_State *L);
-
- // set_float(self, name, var)
- static int l_set_float(lua_State *L);
-
// get_inventory(self)
static int l_get_inventory(lua_State *L);
- // to_table(self)
- static int l_to_table(lua_State *L);
-
- // from_table(self, table)
- static int l_from_table(lua_State *L);
+ // mark_as_private(self, <string> or {<string>, <string>, ...})
+ static int l_mark_as_private(lua_State *L);
public:
NodeMetaRef(v3s16 p, ServerEnvironment *env);
+ NodeMetaRef(Metadata *meta);
- ~NodeMetaRef();
+ ~NodeMetaRef() = default;
// Creates an NodeMetaRef and leaves it on top of stack
// Not callable from Lua; all references are created on the C side.
static void create(lua_State *L, v3s16 p, ServerEnvironment *env);
+ // Client-sided version of the above
+ static void createClient(lua_State *L, Metadata *meta);
+
+ static void RegisterCommon(lua_State *L);
static void Register(lua_State *L);
+ static void RegisterClient(lua_State *L);
};
-
-#endif //L_NODEMETA_H_