Handle multiple deserialization of a block's entities

This fix consists of two parts:
- Clear the list of stored entities. This has no side-effects.
- Catch the case where active entities exist and print a message.
  Clearing the active entitiy list has side-effects that should
  be handled. (those entities are known to the environment and
  to clients).

  As avoiding those side-effects is more complex, and as this
  problem is not expected to occur (with PR #4847 merged), there
  is no real incentive to implement this ATM.

This issue was a contributing factor to bug #4217. With the other
contributing factor removed (PR #4847), this commit makes sure this
factor does not go unnoticed if it ever happens again.
This commit is contained in:
Rogier 2016-12-11 18:47:50 +01:00 committed by sfan5
parent 33fdd48a76
commit a067d40454

@ -77,6 +77,15 @@ void StaticObjectList::serialize(std::ostream &os)
} }
void StaticObjectList::deSerialize(std::istream &is) void StaticObjectList::deSerialize(std::istream &is)
{ {
if (m_active.size()) {
errorstream << "StaticObjectList::deSerialize(): "
<< "deserializing objects while " << m_active.size()
<< " active objects already exist (not cleared). "
<< m_stored.size() << " stored objects _were_ cleared"
<< std::endl;
}
m_stored.clear();
// version // version
u8 version = readU8(is); u8 version = readU8(is);
// count // count