Dont write player files all the time
authorPilzAdam <pilzadam@minetest.net>
Fri, 28 Jun 2013 14:06:34 +0000 (14:06 +0000)
committerPilzAdam <pilzadam@minetest.net>
Fri, 28 Jun 2013 14:15:48 +0000 (14:15 +0000)
src/environment.cpp
src/inventory.cpp
src/inventory.h
src/player.cpp
src/player.h

index 4b785998bdc79adb48b1f54a1864c2b4cabc19ae..21a6258b795631367c7e6b6c5051fc253a2328d9 100644 (file)
@@ -434,6 +434,7 @@ void ServerEnvironment::serializePlayers(const std::string &savedir)
                //infostream<<"Found matching player, overwriting."<<std::endl;
 
                // OK, found. Save player there.
+               if(player->checkModified())
                {
                        // Open file and serialize
                        std::ofstream os(path.c_str(), std::ios_base::binary);
@@ -444,6 +445,8 @@ void ServerEnvironment::serializePlayers(const std::string &savedir)
                        }
                        player->serialize(os);
                        saved_players.insert(player);
+               } else {
+                       saved_players.insert(player);
                }
        }
 
index d6815d32903258831c0088c1c12be4117eb1fff4..928021c2ff94db349c716d92411cd648f361a24f 100644 (file)
@@ -562,6 +562,26 @@ InventoryList & InventoryList::operator = (const InventoryList &other)
        return *this;
 }
 
+bool InventoryList::operator == (const InventoryList &other)
+{
+       if(m_size != other.m_size)
+               return false;
+       if(m_width != other.m_width)
+               return false;
+       if(m_name != other.m_name)
+               return false;
+       for(u32 i=0; i<m_items.size(); i++)
+       {
+               ItemStack s1 = m_items[i];
+               ItemStack s2 = other.m_items[i];
+               if(s1.name != s2.name || s1.wear!= s2.wear || s1.count != s2.count ||
+                               s1.metadata != s2.metadata)
+                       return false;
+       }
+
+       return true;
+}
+
 const std::string &InventoryList::getName() const
 {
        return m_name;
@@ -855,6 +875,19 @@ Inventory & Inventory::operator = (const Inventory &other)
        return *this;
 }
 
+bool Inventory::operator == (const Inventory &other)
+{
+       if(m_lists.size() != other.m_lists.size())
+               return false;
+
+       for(u32 i=0; i<m_lists.size(); i++)
+       {
+               if(m_lists[i] != other.m_lists[i])
+                       return false;
+       }
+       return true;
+}
+
 void Inventory::serialize(std::ostream &os) const
 {
        for(u32 i=0; i<m_lists.size(); i++)
index 676088b94425d41a80fae40076540240285df2b0..1a66a13a4b9ceb4109890461a83e9748f65af3bb 100644 (file)
@@ -183,6 +183,7 @@ public:
 
        InventoryList(const InventoryList &other);
        InventoryList & operator = (const InventoryList &other);
+       bool operator == (const InventoryList &other);
 
        const std::string &getName() const;
        u32 getSize() const;
@@ -258,6 +259,7 @@ public:
        Inventory(IItemDefManager *itemdef);
        Inventory(const Inventory &other);
        Inventory & operator = (const Inventory &other);
+       bool operator == (const Inventory &other);
        
        void serialize(std::ostream &os) const;
        void deSerialize(std::istream &is);
index ec1e3aff71ea80c4075f21423dfd67b476ebacf2..2a7a3084c760e345dc56ad858e955a38148465c5 100644 (file)
@@ -44,7 +44,12 @@ Player::Player(IGameDef *gamedef):
        m_yaw(0),
        m_speed(0,0,0),
        m_position(0,0,0),
-       m_collisionbox(-BS*0.30,0.0,-BS*0.30,BS*0.30,BS*1.55,BS*0.30)
+       m_collisionbox(-BS*0.30,0.0,-BS*0.30,BS*0.30,BS*1.55,BS*0.30),
+       m_last_pitch(0),
+       m_last_yaw(0),
+       m_last_pos(0,0,0),
+       m_last_hp(PLAYER_MAX_HP),
+       m_last_inventory(gamedef->idef())
 {
        updateName("<not set>");
        inventory.clear();
@@ -53,6 +58,7 @@ Player::Player(IGameDef *gamedef):
        craft->setWidth(3);
        inventory.addList("craftpreview", 1);
        inventory.addList("craftresult", 1);
+       m_last_inventory = inventory;
 
        // Can be redefined via Lua
        inventory_formspec = "size[8,7.5]"
@@ -224,6 +230,9 @@ void Player::deSerialize(std::istream &is, std::string playername)
                        inventory.getList("craftresult")->changeItem(0, ItemStack());
                }
        }
+
+       // Set m_last_*
+       checkModified();
 }
 
 /*
index 89e4667c4443612503bd084ed67ec7582bc46329..60645a60f55f9a1329dc4f3b4c5e146d8638ee54 100644 (file)
@@ -199,6 +199,23 @@ public:
        void serialize(std::ostream &os);
        void deSerialize(std::istream &is, std::string playername);
 
+       bool checkModified()
+       {
+               if(m_last_hp != hp || m_last_pitch != m_pitch ||
+                               m_last_pos != m_position || m_last_yaw != m_yaw ||
+                               !(inventory == m_last_inventory))
+               {
+                       m_last_hp = hp;
+                       m_last_pitch = m_pitch;
+                       m_last_pos = m_position;
+                       m_last_yaw = m_yaw;
+                       m_last_inventory = inventory;
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+
        bool touching_ground;
        // This oscillates so that the player jumps a bit above the surface
        bool in_liquid;
@@ -262,6 +279,12 @@ protected:
        v3f m_speed;
        v3f m_position;
        core::aabbox3d<f32> m_collisionbox;
+
+       f32 m_last_pitch;
+       f32 m_last_yaw;
+       v3f m_last_pos;
+       u16 m_last_hp;
+       Inventory m_last_inventory;
 };