Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@PilzAdam
Created June 28, 2013 13:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PilzAdam/5884807 to your computer and use it in GitHub Desktop.
Save PilzAdam/5884807 to your computer and use it in GitHub Desktop.
diff --git a/src/environment.cpp b/src/environment.cpp
index 4b78599..355882c 100644
--- a/src/environment.cpp
+++ b/src/environment.cpp
@@ -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->isModified())
{
// 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);
}
}
diff --git a/src/inventory.cpp b/src/inventory.cpp
index d6815d3..928021c 100644
--- a/src/inventory.cpp
+++ b/src/inventory.cpp
@@ -562,6 +562,26 @@ void InventoryList::deSerialize(std::istream &is)
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 @@ void Inventory::clearContents()
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++)
diff --git a/src/inventory.h b/src/inventory.h
index 676088b..1a66a13 100644
--- a/src/inventory.h
+++ b/src/inventory.h
@@ -183,6 +183,7 @@ class InventoryList
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 @@ class Inventory
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);
diff --git a/src/player.cpp b/src/player.cpp
index ec1e3af..9173f6f 100644
--- a/src/player.cpp
+++ b/src/player.cpp
@@ -44,7 +44,12 @@
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 @@
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]"
diff --git a/src/player.h b/src/player.h
index 89e4667..246a90f 100644
--- a/src/player.h
+++ b/src/player.h
@@ -199,6 +199,23 @@ class Player
void serialize(std::ostream &os);
void deSerialize(std::istream &is, std::string playername);
+ bool isModified()
+ {
+ 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 @@ class Player
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;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment