Add static_save property to luaentites to not save them statically. (#5112)
authororwell96 <mono96.mml@gmail.com>
Thu, 28 Sep 2017 15:11:51 +0000 (17:11 +0200)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Thu, 28 Sep 2017 15:11:51 +0000 (17:11 +0200)
* Add no_static_save property to luaentites to not save them statically.
This allows for temporary objects that would get deleted anyway as soon as they are loaded again without the static saving overhead.

* Use positive meaning for static_save object property

* Invert meaning also for the LUA parameter
Note: getboolfield() does not change &result when field does not exist, so it defaults to the default value in the header file, which is 'true'.

* Extend push_object_properties()

doc/lua_api.txt
src/content_sao.h
src/object_properties.cpp
src/object_properties.h
src/script/common/c_content.cpp

index 812b857f71cba28c135d141cbd4c2f23d7c87aa3..cd93ffc16e9e5c1ec6d5ea4eb5ab791acb34c3da 100644 (file)
@@ -4199,6 +4199,10 @@ Definition tables
         nametag = "", -- by default empty, for players their name is shown if empty
         nametag_color = <color>, -- sets color of nametag as ColorSpec
         infotext = "", -- by default empty, text to be shown when pointed at object
+        static_save = true,
+    --  ^ If false, never save this object statically. It will simply be deleted when the block gets unloaded.
+    --  ^ The get_staticdata() callback is never called then.
+    --  ^ Defaults to 'true'
     }
 
 ### Entity definition (`register_entity`)
index b62551f51cc5c7c5c0777318c0191d0946465102..683a2fb5f6236176339a5982a1919c9d982b5a1b 100644 (file)
@@ -105,6 +105,8 @@ public:
                        const std::string &data);
        void step(float dtime, bool send_recommended);
        std::string getClientInitializationData(u16 protocol_version);
+       bool isStaticAllowed() const
+       { return m_prop.static_save; }
        void getStaticData(std::string *result) const;
        int punch(v3f dir,
                        const ToolCapabilities *toolcap=NULL,
index 9cbaadc64db36af52cfeb885a6d0d3fbd74b3f91..ae030501944570eaeddbaa7c0613c59c3f15c10e 100644 (file)
@@ -66,6 +66,7 @@ std::string ObjectProperties::dump()
        os << ", selectionbox=" << PP(selectionbox.MinEdge) << "," << PP(selectionbox.MaxEdge);
        os << ", pointable=" << pointable;
        os << ", can_zoom=" << can_zoom;
+       os << ", static_save=" << static_save;
        return os.str();
 }
 
index 7589cec3ceca3df2ce48b5bd23d4a102218df141..fcf03383c0754dc49b560aa42142b67d9dc87e6e 100644 (file)
@@ -58,6 +58,7 @@ struct ObjectProperties
        std::string infotext;
        //! For dropped items, this contains item information.
        std::string wield_item;
+       bool static_save = true;
 
        ObjectProperties();
        std::string dump();
index 5574304717aee819cbf0003db12843910301ec0e..8f08de1e5f838babd84b74bba6f93c59944d892d 100644 (file)
@@ -294,7 +294,10 @@ void read_object_properties(lua_State *L, int index,
                prop->automatic_face_movement_max_rotation_per_sec = luaL_checknumber(L, -1);
        }
        lua_pop(L, 1);
+
        getstringfield(L, -1, "infotext", prop->infotext);
+       getboolfield(L, -1, "static_save", prop->static_save);
+
        lua_getfield(L, -1, "wield_item");
        if (!lua_isnil(L, -1))
                prop->wield_item = read_item(L, -1, idef).getItemString();
@@ -376,6 +379,8 @@ void push_object_properties(lua_State *L, ObjectProperties *prop)
        lua_setfield(L, -2, "automatic_face_movement_max_rotation_per_sec");
        lua_pushlstring(L, prop->infotext.c_str(), prop->infotext.size());
        lua_setfield(L, -2, "infotext");
+       lua_pushboolean(L, prop->static_save);
+       lua_setfield(L, -2, "static_save");
        lua_pushlstring(L, prop->wield_item.c_str(), prop->wield_item.size());
        lua_setfield(L, -2, "wield_item");
 }