Added support for tracking extra dependencies in Corruption areas (necessary to avoid crashes)

This commit is contained in:
Aruki
2017-07-26 01:30:52 -06:00
parent 95d0279027
commit f980bc7536
9 changed files with 122 additions and 25 deletions

View File

@@ -48,9 +48,18 @@ CDependencyTree* CGameArea::BuildDependencyTree() const
pTree->AddDependency(mpPoiToWorldMap);
}
// Extra deps
for (u32 iDep = 0; iDep < mExtraAreaDeps.size(); iDep++)
pTree->AddDependency(mExtraAreaDeps[iDep]);
// Layer dependencies
std::vector<CAssetID> DummyDeps;
for (u32 iLayer = 0; iLayer < mScriptLayers.size(); iLayer++)
pTree->AddScriptLayer(mScriptLayers[iLayer]);
{
const std::vector<CAssetID>& rkExtras = (mExtraLayerDeps.size() > iLayer ? mExtraLayerDeps[iLayer] : DummyDeps);
pTree->AddScriptLayer(mScriptLayers[iLayer], rkExtras);
}
return pTree;
}
@@ -242,3 +251,13 @@ void CGameArea::DeleteInstance(CScriptObject *pInstance)
delete pInstance;
}
void CGameArea::ClearExtraDependencies()
{
if (mExtraAreaDeps.empty() || !mExtraLayerDeps.empty())
{
mExtraAreaDeps.clear();
mExtraLayerDeps.clear();
Entry()->UpdateDependencies();
}
}

View File

@@ -60,6 +60,9 @@ class CGameArea : public CResource
CAssetID mPortalAreaID;
// Object to Static Geometry Map
TResPtr<CPoiToWorld> mpPoiToWorldMap;
// Dependencies
std::vector<CAssetID> mExtraAreaDeps;
std::vector< std::vector<CAssetID> > mExtraLayerDeps;
public:
CGameArea(CResourceEntry *pEntry = 0);
@@ -80,6 +83,7 @@ public:
u32 SuggestedID = -1, u32 SuggestedLayerIndex = -1);
void AddInstanceToArea(CScriptObject *pInstance);
void DeleteInstance(CScriptObject *pInstance);
void ClearExtraDependencies();
// Inline Accessors
inline u32 WorldIndex() const { return mWorldIndex; }