]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/script/lua_api/l_nodemeta.h
Script API: Check that SAOs are still usable before attempting to use them
[dragonfireclient.git] / src / script / lua_api / l_nodemeta.h
index 23404a084d0bcaba811660dba37f759e4e61de09..fdc1766ed2073063fbf48ef8bf3f280186b30543 100644 (file)
@@ -16,78 +16,80 @@ You should have received a copy of the GNU Lesser General Public License along
 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_