Make players check inventory modification properly 1535/head
authorShadowNinja <shadowninja@minetest.net>
Tue, 2 Sep 2014 16:53:20 +0000 (12:53 -0400)
committerShadowNinja <shadowninja@minetest.net>
Wed, 1 Oct 2014 22:44:36 +0000 (18:44 -0400)
src/environment.cpp
src/inventory.cpp
src/inventory.h
src/player.cpp
src/player.h
src/server.cpp

index 4106ecdf5e05cb5a7b2fef7f5a6a79e035882c52..8977ee673db074c8bbb05fbb834fc1fa9e2c32f0 100644 (file)
@@ -478,6 +478,7 @@ Player *ServerEnvironment::loadPlayer(const std::string &playername)
        if (newplayer) {
                addPlayer(player);
        }
+       player->setModified(false);
        return player;
 }
 
index 4766524dddb37a1b8c98328fb4dc3473db5de88e..cecef01a0c2dbe1b28fb88e0f4c68652cbb9a6c8 100644 (file)
@@ -831,6 +831,7 @@ Inventory::~Inventory()
 
 void Inventory::clear()
 {
+       m_dirty = true;
        for(u32 i=0; i<m_lists.size(); i++)
        {
                delete m_lists[i];
@@ -840,6 +841,7 @@ void Inventory::clear()
 
 void Inventory::clearContents()
 {
+       m_dirty = true;
        for(u32 i=0; i<m_lists.size(); i++)
        {
                InventoryList *list = m_lists[i];
@@ -852,12 +854,14 @@ void Inventory::clearContents()
 
 Inventory::Inventory(IItemDefManager *itemdef)
 {
+       m_dirty = false;
        m_itemdef = itemdef;
 }
 
 Inventory::Inventory(const Inventory &other)
 {
        *this = other;
+       m_dirty = false;
 }
 
 Inventory & Inventory::operator = (const Inventory &other)
@@ -865,6 +869,7 @@ Inventory & Inventory::operator = (const Inventory &other)
        // Gracefully handle self assignment
        if(this != &other)
        {
+               m_dirty = true;
                clear();
                m_itemdef = other.m_itemdef;
                for(u32 i=0; i<other.m_lists.size(); i++)
@@ -945,6 +950,7 @@ void Inventory::deSerialize(std::istream &is)
 
 InventoryList * Inventory::addList(const std::string &name, u32 size)
 {
+       m_dirty = true;
        s32 i = getListIndex(name);
        if(i != -1)
        {
@@ -990,6 +996,7 @@ bool Inventory::deleteList(const std::string &name)
        s32 i = getListIndex(name);
        if(i == -1)
                return false;
+       m_dirty = true;
        delete m_lists[i];
        m_lists.erase(m_lists.begin() + i);
        return true;
index 52b776db34684bd4a9dff6e7178e0eec959b446d..d21a5dedab29cf09e2abcdb5280aa416bfad1fc0 100644 (file)
@@ -279,18 +279,30 @@ public:
        // A shorthand for adding items. Returns leftover item (possibly empty).
        ItemStack addItem(const std::string &listname, const ItemStack &newitem)
        {
+               m_dirty = true;
                InventoryList *list = getList(listname);
                if(list == NULL)
                        return newitem;
                return list->addItem(newitem);
        }
-       
+
+       bool checkModified() const
+       {
+               return m_dirty;
+       }
+
+       void setModified(const bool x)
+       {
+               m_dirty = x;
+       }
+
 private:
        // -1 if not found
        const s32 getListIndex(const std::string &name) const;
 
        std::vector<InventoryList*> m_lists;
        IItemDefManager *m_itemdef;
+       bool m_dirty;
 };
 
 #endif
index a8f95bb99bb58e5095585efab884bac22c6dad9c..13866e5f55370656eaf8c2b7d09c114af6fe3a53 100644 (file)
@@ -64,6 +64,7 @@ Player::Player(IGameDef *gamedef, const char *name):
        craft->setWidth(3);
        inventory.addList("craftpreview", 1);
        inventory.addList("craftresult", 1);
+       inventory.setModified(false);
 
        // Can be redefined via Lua
        inventory_formspec = "size[8,7.5]"
@@ -203,6 +204,7 @@ void Player::deSerialize(std::istream &is, std::string playername)
                                playername + " not found!");
        }
 
+       m_dirty = true;
        //args.getS32("version"); // Version field value not used
        std::string name = args.get("name");
        strlcpy(m_name, name.c_str(), PLAYERNAME_SIZE);
@@ -235,8 +237,6 @@ void Player::deSerialize(std::istream &is, std::string playername)
                        inventory.getList("craftresult")->changeItem(0, ItemStack());
                }
        }
-
-       m_dirty = false;
 }
 
 u32 Player::addHud(HudElement *toadd)
@@ -299,7 +299,7 @@ void RemotePlayer::save(std::string savedir)
                        if (!fs::safeWriteToFile(path, ss.str())) {
                                infostream << "Failed to write " << path << std::endl;
                        }
-                       m_dirty = false;
+                       setModified(false);
                        return;
                }
                // Open file and deserialize
@@ -317,7 +317,7 @@ void RemotePlayer::save(std::string savedir)
                        if (!fs::safeWriteToFile(path, ss.str())) {
                                infostream << "Failed to write " << path << std::endl;
                        }
-                       m_dirty = false;
+                       setModified(false);
                        return;
                }
                path = savedir + m_name + itos(i);
index aa38996a54e08e15f24adddd623655e104489a6c..a5cc7123f146f96dca1374e2cdf2d8fe30de4793 100644 (file)
@@ -226,9 +226,16 @@ public:
        void serialize(std::ostream &os);
        void deSerialize(std::istream &is, std::string playername);
 
-       bool checkModified()
+       bool checkModified() const
        {
-               return m_dirty;
+               return m_dirty || inventory.checkModified();
+       }
+
+       void setModified(const bool x)
+       {
+               m_dirty = x;
+               if (x == false)
+                       inventory.setModified(x);
        }
 
        bool touching_ground;
index 4f4763ea47f056bdc53bf93980788e824a23f34e..6afe600ed052474b407a19d71b5d666fa9058ee1 100644 (file)
@@ -5039,13 +5039,16 @@ PlayerSAO* Server::emergePlayer(const char *name, u16 peer_id)
        if (!player) {
                newplayer = true;
                player = new RemotePlayer(this, name);
-               /* Set player position */
+               // Set player position
                infostream<<"Server: Finding spawn place for player \""
                                <<name<<"\""<<std::endl;
                v3f pos = findSpawnPos(m_env->getServerMap());
                player->setPosition(pos);
 
-               /* Add player to environment */
+               // Make sure the player is saved
+               player->setModified(true);
+
+               // Add player to environment
                m_env->addPlayer(player);
        }