if (newplayer) {
addPlayer(player);
}
+ player->setModified(false);
return player;
}
void Inventory::clear()
{
+ m_dirty = true;
for(u32 i=0; i<m_lists.size(); i++)
{
delete m_lists[i];
void Inventory::clearContents()
{
+ m_dirty = true;
for(u32 i=0; i<m_lists.size(); i++)
{
InventoryList *list = m_lists[i];
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)
// 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++)
InventoryList * Inventory::addList(const std::string &name, u32 size)
{
+ m_dirty = true;
s32 i = getListIndex(name);
if(i != -1)
{
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;
// 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
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]"
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);
inventory.getList("craftresult")->changeItem(0, ItemStack());
}
}
-
- m_dirty = false;
}
u32 Player::addHud(HudElement *toadd)
if (!fs::safeWriteToFile(path, ss.str())) {
infostream << "Failed to write " << path << std::endl;
}
- m_dirty = false;
+ setModified(false);
return;
}
// Open file and deserialize
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);
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;
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);
}