1
0
forked from 0ad/0ad

Fix some saved-game OOS errors

This was SVN commit r10441.
This commit is contained in:
Ykkrosh 2011-10-27 20:12:00 +00:00
parent 4c561dc3f9
commit a739b8f309
2 changed files with 42 additions and 17 deletions

View File

@ -443,8 +443,11 @@ public:
m_LosStateRevealed.clear();
m_LosStateRevealed.resize(m_TerrainVerticesPerSide*m_TerrainVerticesPerSide);
for (std::map<u32, EntityData>::iterator it = m_EntityData.begin(); it != m_EntityData.end(); ++it)
LosAdd(it->second.owner, it->second.visionRange, CFixedVector2D(it->second.x, it->second.z));
for (std::map<entity_id_t, EntityData>::const_iterator it = m_EntityData.begin(); it != m_EntityData.end(); ++it)
{
if (it->second.inWorld)
LosAdd(it->second.owner, it->second.visionRange, CFixedVector2D(it->second.x, it->second.z));
}
for (ssize_t j = 0; j < m_TerrainVerticesPerSide; ++j)
for (ssize_t i = 0; i < m_TerrainVerticesPerSide; ++i)

View File

@ -116,20 +116,30 @@ bool CComponentManager::ComputeStateHash(std::string& outHash, bool quick)
std::map<ComponentTypeId, std::map<entity_id_t, IComponent*> >::const_iterator cit = m_ComponentsByTypeId.begin();
for (; cit != m_ComponentsByTypeId.end(); ++cit)
{
// Skip component types with no components
if (cit->second.empty())
continue;
// In quick mode, only check unit positions
if (quick && !(cit->first == CID_Position))
continue;
// Only emit component types if they have a component that will be serialized
bool needsSerialization = false;
for (std::map<entity_id_t, IComponent*>::const_iterator eit = cit->second.begin(); eit != cit->second.end(); ++eit)
{
// Don't serialize local entities
if (ENTITY_IS_LOCAL(eit->first))
continue;
needsSerialization = true;
break;
}
if (!needsSerialization)
continue;
serializer.NumberI32_Unbounded("component type id", cit->first);
std::map<entity_id_t, IComponent*>::const_iterator eit = cit->second.begin();
for (; eit != cit->second.end(); ++eit)
for (std::map<entity_id_t, IComponent*>::const_iterator eit = cit->second.begin(); eit != cit->second.end(); ++eit)
{
// Don't hash local entities
// Don't serialize local entities
if (ENTITY_IS_LOCAL(eit->first))
continue;
@ -177,23 +187,37 @@ bool CComponentManager::SerializeState(std::ostream& stream)
serializer.StringASCII("rng", SerializeRNG(m_RNG), 0, 32);
serializer.NumberU32_Unbounded("next entity id", m_NextEntityId);
uint32_t numComponentTypes = 0;
std::map<ComponentTypeId, std::map<entity_id_t, IComponent*> >::const_iterator cit;
uint32_t numComponentTypes = 0;
std::set<ComponentTypeId> serializedComponentTypes;
for (cit = m_ComponentsByTypeId.begin(); cit != m_ComponentsByTypeId.end(); ++cit)
{
if (cit->second.empty())
// Only emit component types if they have a component that will be serialized
bool needsSerialization = false;
for (std::map<entity_id_t, IComponent*>::const_iterator eit = cit->second.begin(); eit != cit->second.end(); ++eit)
{
// Don't serialize local entities
if (ENTITY_IS_LOCAL(eit->first))
continue;
needsSerialization = true;
break;
}
if (!needsSerialization)
continue;
numComponentTypes++;
serializedComponentTypes.insert(cit->first);
}
serializer.NumberU32_Unbounded("num component types", numComponentTypes);
for (cit = m_ComponentsByTypeId.begin(); cit != m_ComponentsByTypeId.end(); ++cit)
{
if (cit->second.empty())
if (serializedComponentTypes.find(cit->first) == serializedComponentTypes.end())
continue;
std::map<ComponentTypeId, ComponentType>::const_iterator ctit = m_ComponentTypesById.find(cit->first);
@ -205,11 +229,9 @@ bool CComponentManager::SerializeState(std::ostream& stream)
serializer.StringASCII("name", ctit->second.name, 0, 255);
std::map<entity_id_t, IComponent*>::const_iterator eit;
// Count the components before serializing any of them
uint32_t numComponents = 0;
for (eit = cit->second.begin(); eit != cit->second.end(); ++eit)
for (std::map<entity_id_t, IComponent*>::const_iterator eit = cit->second.begin(); eit != cit->second.end(); ++eit)
{
// Don't serialize local entities
if (ENTITY_IS_LOCAL(eit->first))
@ -222,7 +244,7 @@ bool CComponentManager::SerializeState(std::ostream& stream)
serializer.NumberU32_Unbounded("num components", numComponents);
// Serialize the components now
for (eit = cit->second.begin(); eit != cit->second.end(); ++eit)
for (std::map<entity_id_t, IComponent*>::const_iterator eit = cit->second.begin(); eit != cit->second.end(); ++eit)
{
// Don't serialize local entities
if (ENTITY_IS_LOCAL(eit->first))