]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Fix the documentation of InvRef:get_lists() and clean up code (#12150)
authorDS <vorunbekannt75@web.de>
Tue, 29 Mar 2022 16:06:16 +0000 (18:06 +0200)
committerGitHub <noreply@github.com>
Tue, 29 Mar 2022 16:06:16 +0000 (18:06 +0200)
doc/lua_api.txt
src/database/database-postgresql.cpp
src/database/database-sqlite3.cpp
src/inventory.cpp
src/inventory.h
src/script/common/c_content.cpp
src/script/common/c_content.h
src/script/cpp_api/s_client.cpp
src/script/lua_api/l_inventory.cpp
src/script/lua_api/l_nodemeta.cpp

index 029c53616e2f20bcc095bcecf1d86b2275ec89c8..161bdd2492b93263357d857c1e25b96f68d2ff12 100644 (file)
@@ -6355,9 +6355,9 @@ An `InvRef` is a reference to an inventory.
 * `set_width(listname, width)`: set width of list; currently used for crafting
 * `get_stack(listname, i)`: get a copy of stack index `i` in list
 * `set_stack(listname, i, stack)`: copy `stack` to index `i` in list
-* `get_list(listname)`: return full list
+* `get_list(listname)`: return full list (list of `ItemStack`s)
 * `set_list(listname, list)`: set full list (size will not change)
-* `get_lists()`: returns list of inventory lists
+* `get_lists()`: returns table that maps listnames to inventory lists
 * `set_lists(lists)`: sets inventory lists (size will not change)
 * `add_item(listname, stack)`: add item somewhere in list, returns leftover
   `ItemStack`.
index 3469f424286873609379d77d621ccdb1b560d1d8..9d6501e68d66a9fac29017995ea053f7ba182afd 100644 (file)
@@ -495,7 +495,7 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player)
        execPrepared("remove_player_inventories", 1, rmvalues);
        execPrepared("remove_player_inventory_items", 1, rmvalues);
 
-       std::vector<const InventoryList*> inventory_lists = sao->getInventory()->getLists();
+       const auto &inventory_lists = sao->getInventory()->getLists();
        std::ostringstream oss;
        for (u16 i = 0; i < inventory_lists.size(); i++) {
                const InventoryList* list = inventory_lists[i];
index 1e63ae9d85c1ba7990f6a0aa42396b7d1f2f0804..9521085e93a5352f2db38d976233c54292235bb7 100644 (file)
@@ -476,10 +476,10 @@ void PlayerDatabaseSQLite3::savePlayer(RemotePlayer *player)
        sqlite3_vrfy(sqlite3_step(m_stmt_player_remove_inventory_items), SQLITE_DONE);
        sqlite3_reset(m_stmt_player_remove_inventory_items);
 
-       std::vector<const InventoryList*> inventory_lists = sao->getInventory()->getLists();
+       const auto &inventory_lists = sao->getInventory()->getLists();
        std::ostringstream oss;
        for (u16 i = 0; i < inventory_lists.size(); i++) {
-               const InventoryListlist = inventory_lists[i];
+               const InventoryList *list = inventory_lists[i];
 
                str_to_sqlite(m_stmt_player_add_inventory, 1, player->getName());
                int_to_sqlite(m_stmt_player_add_inventory, 2, i);
index d14b12f9dae90371db2210ca851fd2d7ed781804..6d2b7fba3530b49846954fb8353c5cab807604dc 100644 (file)
@@ -503,11 +503,6 @@ void InventoryList::deSerialize(std::istream &is)
        throw SerializationError(ss.str());
 }
 
-InventoryList::InventoryList(const InventoryList &other)
-{
-       *this = other;
-}
-
 InventoryList & InventoryList::operator = (const InventoryList &other)
 {
        m_items = other.m_items;
@@ -535,21 +530,6 @@ bool InventoryList::operator == (const InventoryList &other) const
        return true;
 }
 
-const std::string &InventoryList::getName() const
-{
-       return m_name;
-}
-
-u32 InventoryList::getSize() const
-{
-       return m_items.size();
-}
-
-u32 InventoryList::getWidth() const
-{
-       return m_width;
-}
-
 u32 InventoryList::getUsedSlots() const
 {
        u32 num = 0;
@@ -560,18 +540,6 @@ u32 InventoryList::getUsedSlots() const
        return num;
 }
 
-const ItemStack& InventoryList::getItem(u32 i) const
-{
-       assert(i < m_size); // Pre-condition
-       return m_items[i];
-}
-
-ItemStack& InventoryList::getItem(u32 i)
-{
-       assert(i < m_size); // Pre-condition
-       return m_items[i];
-}
-
 ItemStack InventoryList::changeItem(u32 i, const ItemStack &newitem)
 {
        if(i >= m_items.size())
@@ -960,16 +928,6 @@ InventoryList * Inventory::getList(const std::string &name)
        return m_lists[i];
 }
 
-std::vector<const InventoryList*> Inventory::getLists()
-{
-       std::vector<const InventoryList*> lists;
-       lists.reserve(m_lists.size());
-       for (auto list : m_lists) {
-               lists.push_back(list);
-       }
-       return lists;
-}
-
 bool Inventory::deleteList(const std::string &name)
 {
        s32 i = getListIndex(name);
index eb063d4ad89bac4621ddfe1e5f25b316d6095f04..8b31de3a8ae39ee563764fd09991e89ef11fad51 100644 (file)
@@ -198,7 +198,7 @@ class InventoryList
        void serialize(std::ostream &os, bool incremental) const;
        void deSerialize(std::istream &is);
 
-       InventoryList(const InventoryList &other);
+       InventoryList(const InventoryList &other) { *this = other; }
        InventoryList & operator = (const InventoryList &other);
        bool operator == (const InventoryList &other) const;
        bool operator != (const InventoryList &other) const
@@ -206,15 +206,25 @@ class InventoryList
                return !(*this == other);
        }
 
-       const std::string &getName() const;
-       u32 getSize() const;
-       u32 getWidth() const;
+       const std::string &getName() const { return m_name; }
+       u32 getSize() const { return static_cast<u32>(m_items.size()); }
+       u32 getWidth() const { return m_width; }
        // Count used slots
        u32 getUsedSlots() const;
 
        // Get reference to item
-       const ItemStack& getItem(u32 i) const;
-       ItemStack& getItem(u32 i);
+       const ItemStack &getItem(u32 i) const
+       {
+               assert(i < m_size); // Pre-condition
+               return m_items[i];
+       }
+       ItemStack &getItem(u32 i)
+       {
+               assert(i < m_size); // Pre-condition
+               return m_items[i];
+       }
+       // Get reference to all items
+       const std::vector<ItemStack> &getItems() const { return m_items; }
        // Returns old item. Parameter can be an empty item.
        ItemStack changeItem(u32 i, const ItemStack &newitem);
        // Delete item
@@ -271,7 +281,7 @@ class InventoryList
 private:
        std::vector<ItemStack> m_items;
        std::string m_name;
-       u32 m_size;
+       u32 m_size; // always the same as m_items.size()
        u32 m_width = 0;
        IItemDefManager *m_itemdef;
        bool m_dirty = true;
@@ -301,7 +311,7 @@ class Inventory
        InventoryList * addList(const std::string &name, u32 size);
        InventoryList * getList(const std::string &name);
        const InventoryList * getList(const std::string &name) const;
-       std::vector<const InventoryList*> getLists();
+       const std::vector<InventoryList *> &getLists() const { return m_lists; }
        bool deleteList(const std::string &name);
        // A shorthand for adding items. Returns leftover item (possibly empty).
        ItemStack addItem(const std::string &listname, const ItemStack &newitem)
index b6eaa6b13b897acbd7c8c2179a7897266a3f3aaa..36f4316ee2846f24fc5882a4a6ba57c9b6319800 100644 (file)
@@ -1351,17 +1351,22 @@ void push_tool_capabilities(lua_State *L,
 }
 
 /******************************************************************************/
-void push_inventory_list(lua_State *L, Inventory *inv, const char *name)
+void push_inventory_list(lua_State *L, const InventoryList &invlist)
 {
-       InventoryList *invlist = inv->getList(name);
-       if(invlist == NULL){
-               lua_pushnil(L);
-               return;
+       push_items(L, invlist.getItems());
+}
+
+/******************************************************************************/
+void push_inventory_lists(lua_State *L, const Inventory &inv)
+{
+       const auto &lists = inv.getLists();
+       lua_createtable(L, 0, lists.size());
+       for(const InventoryList *list : lists) {
+               const std::string &name = list->getName();
+               lua_pushlstring(L, name.c_str(), name.size());
+               push_inventory_list(L, *list);
+               lua_rawset(L, -3);
        }
-       std::vector<ItemStack> items;
-       for(u32 i=0; i<invlist->getSize(); i++)
-               items.push_back(invlist->getItem(i));
-       push_items(L, items);
 }
 
 /******************************************************************************/
index e762604a4e0131de61f51653648b6706d44dabf1..11b39364f037aeb2a7ea3857f870775a6cad75d5 100644 (file)
@@ -55,6 +55,7 @@ struct ObjectProperties;
 struct SimpleSoundSpec;
 struct ServerSoundParams;
 class Inventory;
+class InventoryList;
 struct NodeBox;
 struct ContentFeatures;
 struct TileDef;
@@ -120,8 +121,9 @@ void               push_object_properties    (lua_State *L,
                                               ObjectProperties *prop);
 
 void               push_inventory_list       (lua_State *L,
-                                              Inventory *inv,
-                                              const char *name);
+                                              const InventoryList &invlist);
+void               push_inventory_lists      (lua_State *L,
+                                              const Inventory &inv);
 void               read_inventory_list       (lua_State *L, int tableindex,
                                               Inventory *inv, const char *name,
                                               Server *srv, int forcesize=-1);
index c889fffa085ffe4dd3aef70cc7a9f5b96b8020bb..b02a0c7beae294a0407c338d2bacc826e9b3b141 100644 (file)
@@ -281,15 +281,7 @@ bool ScriptApiClient::on_inventory_open(Inventory *inventory)
        lua_getglobal(L, "core");
        lua_getfield(L, -1, "registered_on_inventory_open");
 
-       std::vector<const InventoryList*> lists = inventory->getLists();
-       std::vector<const InventoryList*>::iterator iter = lists.begin();
-       lua_createtable(L, 0, lists.size());
-       for (; iter != lists.end(); iter++) {
-               const char* name = (*iter)->getName().c_str();
-               lua_pushstring(L, name);
-               push_inventory_list(L, inventory, name);
-               lua_rawset(L, -3);
-       }
+       push_inventory_lists(L, *inventory);
 
        try {
                runCallbacks(1, RUN_CALLBACKS_MODE_OR);
index b0a4ee1943b95315469ad5bab5aa30060276e9e6..175047e58b7394ee15b501e4e6d6bb94a681ee84 100644 (file)
@@ -214,11 +214,16 @@ int InvRef::l_get_list(lua_State *L)
        InvRef *ref = checkobject(L, 1);
        const char *listname = luaL_checkstring(L, 2);
        Inventory *inv = getinv(L, ref);
-       if(inv){
-               push_inventory_list(L, inv, listname);
-       } else {
+       if (!inv) {
                lua_pushnil(L);
+               return 1;
        }
+       InventoryList *invlist = inv->getList(listname);
+       if (!invlist) {
+               lua_pushnil(L);
+               return 1;
+       }
+       push_inventory_list(L, *invlist);
        return 1;
 }
 
@@ -242,7 +247,7 @@ int InvRef::l_set_list(lua_State *L)
        return 0;
 }
 
-// get_lists(self) -> list of InventoryLists
+// get_lists(self) -> table that maps listnames to InventoryLists
 int InvRef::l_get_lists(lua_State *L)
 {
        NO_MAP_LOCK_REQUIRED;
@@ -251,15 +256,7 @@ int InvRef::l_get_lists(lua_State *L)
        if (!inv) {
                return 0;
        }
-       std::vector<const InventoryList*> lists = inv->getLists();
-       std::vector<const InventoryList*>::iterator iter = lists.begin();
-       lua_createtable(L, 0, lists.size());
-       for (; iter != lists.end(); iter++) {
-               const char* name = (*iter)->getName().c_str();
-               lua_pushstring(L, name);
-               push_inventory_list(L, inv, name);
-               lua_rawset(L, -3);
-       }
+       push_inventory_lists(L, *inv);
        return 1;
 }
 
index 34760157d5a07b25431c1d9142b65d419cad416f..1d052685e4fbc5dbae4ef632933448d5cd0bf117 100644 (file)
@@ -127,18 +127,14 @@ void NodeMetaRef::handleToTable(lua_State *L, Metadata *_meta)
        // fields
        MetaDataRef::handleToTable(L, _meta);
 
-       NodeMetadata *meta = (NodeMetadata*) _meta;
+       NodeMetadata *meta = (NodeMetadata *) _meta;
 
        // inventory
-       lua_newtable(L);
        Inventory *inv = meta->getInventory();
        if (inv) {
-               std::vector<const InventoryList *> lists = inv->getLists();
-               for(std::vector<const InventoryList *>::const_iterator
-                               i = lists.begin(); i != lists.end(); ++i) {
-                       push_inventory_list(L, inv, (*i)->getName().c_str());
-                       lua_setfield(L, -2, (*i)->getName().c_str());
-               }
+               push_inventory_lists(L, *inv);
+       } else {
+               lua_newtable(L);
        }
        lua_setfield(L, -2, "inventory");
 }