public override void InitializeAsync()
{
var worker = new BackgroundWorker();
worker.DoWork += delegate(object s, DoWorkEventArgs workArgs)
{
lock (Locker)
{
// Because I've bound models to the view, this is going to get messy.
var contentPath = ToolboxUpdater.GetApplicationContentPath();
if (IsConstructionNotReady)
{
var ingotRequirements = new Dictionary<string, BlueprintRequirement>();
var oreRequirements = new Dictionary<string, BlueprintRequirement>();
var timeTaken = new TimeSpan();
var cubeAssetDict = new Dictionary<string, CubeAssetModel>();
var componentAssetDict = new Dictionary<string, CubeAssetModel>();
var cubeAssets = new List<CubeAssetModel>();
var componentAssets = new List<CubeAssetModel>();
var ingotAssets = new List<OreAssetModel>();
var oreAssets = new List<OreAssetModel>();
foreach (var block in CubeGrid.CubeBlocks)
{
var blockName = block.SubtypeName;
if (string.IsNullOrEmpty(blockName))
{
blockName = block.TypeId.ToString();
}
var cubeBlockDefinition = SpaceEngineersApi.GetCubeDefinition(block.TypeId, CubeGrid.GridSizeEnum, block.SubtypeName);
float cubeMass = 0;
TimeSpan blockTime = TimeSpan.Zero;
string blockTexture = null;
if (cubeBlockDefinition != null)
{
foreach (var component in cubeBlockDefinition.Components)
{
TimeSpan componentTime;
SpaceEngineersApi.AccumulateCubeBlueprintRequirements(component.Definition.Id.SubtypeName, component.Definition.Id.TypeId, component.Count, ingotRequirements, out componentTime);
timeTaken += componentTime;
float componentMass = component.Definition.Mass * component.Count;
float componentVolume = component.Definition.Volume * SpaceEngineersConsts.VolumeMultiplyer * component.Count;
cubeMass += componentMass;
var componentName = component.Definition.Id.SubtypeName;
if (componentAssetDict.ContainsKey(componentName))
{
componentAssetDict[componentName].Count += component.Count;
componentAssetDict[componentName].Mass += componentMass;
componentAssetDict[componentName].Volume += componentVolume;
componentAssetDict[componentName].Time += componentTime;
}
else
{
var componentTexture = SpaceEngineersCore.GetDataPathOrDefault(component.Definition.Icons.First(), Path.Combine(contentPath, component.Definition.Icons.First()));
var m = new CubeAssetModel() { Name = component.Definition.DisplayNameText, Mass = componentMass, Volume = componentVolume, Count = component.Count, Time = componentTime, TextureFile = componentTexture };
componentAssets.Add(m);
componentAssetDict.Add(componentName, m);
}
}
blockTime = TimeSpan.FromSeconds(cubeBlockDefinition.MaxIntegrity / cubeBlockDefinition.IntegrityPointsPerSec);
blockTexture = (cubeBlockDefinition.Icons == null || cubeBlockDefinition.Icons.First() == null) ? null : SpaceEngineersCore.GetDataPathOrDefault(cubeBlockDefinition.Icons.First(), Path.Combine(contentPath, cubeBlockDefinition.Icons.First()));
}
timeTaken += blockTime;
if (cubeAssetDict.ContainsKey(blockName))
{
cubeAssetDict[blockName].Count++;
cubeAssetDict[blockName].Mass += cubeMass;
cubeAssetDict[blockName].Time += blockTime;
}
else
{
var m = new CubeAssetModel() { Name = cubeBlockDefinition == null ? blockName : cubeBlockDefinition.DisplayNameText, Mass = cubeMass, Count = 1, TextureFile = blockTexture, Time = blockTime };
cubeAssets.Add(m);
cubeAssetDict.Add(blockName, m);
}
}
foreach (var kvp in ingotRequirements)
{
TimeSpan ingotTime;
SpaceEngineersApi.AccumulateCubeBlueprintRequirements(kvp.Value.SubtypeId, kvp.Value.Id.TypeId, kvp.Value.Amount, oreRequirements, out ingotTime);
var cd = (MyPhysicalItemDefinition)MyDefinitionManager.Static.GetDefinition(kvp.Value.Id);
var componentTexture = SpaceEngineersCore.GetDataPathOrDefault(cd.Icons.First(), Path.Combine(contentPath, cd.Icons.First()));
var volume = (double)kvp.Value.Amount * cd.Volume * SpaceEngineersConsts.VolumeMultiplyer;
var ingotAsset = new OreAssetModel { Name = cd.DisplayNameText, Amount = kvp.Value.Amount, Mass = (double)kvp.Value.Amount * cd.Mass, Volume = volume, Time = ingotTime, TextureFile = componentTexture };
ingotAssets.Add(ingotAsset);
timeTaken += ingotTime;
}
foreach (var kvp in oreRequirements)
{
var cd = MyDefinitionManager.Static.GetDefinition(kvp.Value.Id) as MyPhysicalItemDefinition;
if (cd != null)
{
var componentTexture = SpaceEngineersCore.GetDataPathOrDefault(cd.Icons.First(), Path.Combine(contentPath, cd.Icons.First()));
var volume = (double)kvp.Value.Amount * cd.Volume * SpaceEngineersConsts.VolumeMultiplyer;
var oreAsset = new OreAssetModel() { Name = cd.DisplayNameText, Amount = kvp.Value.Amount, Mass = (double)kvp.Value.Amount * cd.Mass, Volume = volume, TextureFile = componentTexture };
oreAssets.Add(oreAsset);
}
}
_dispatcher.Invoke(DispatcherPriority.Input, (Action)delegate
{
CubeAssets = cubeAssets;
ComponentAssets = componentAssets;
IngotAssets = ingotAssets;
OreAssets = oreAssets;
TimeToProduce = timeTaken;
});
IsConstructionNotReady = false;
}
if (IsSubsSystemNotReady)
{
var cubeList = new List<CubeItemModel>();
foreach (var block in CubeGrid.CubeBlocks)
{
var cubeDefinition = SpaceEngineersApi.GetCubeDefinition(block.TypeId, CubeGrid.GridSizeEnum, block.SubtypeName);
_dispatcher.Invoke(DispatcherPriority.Input, (Action)delegate
{
cubeList.Add(new CubeItemModel(block, cubeDefinition)
{
TextureFile = (cubeDefinition == null || cubeDefinition.Icons == null || cubeDefinition.Icons.First() == null) ? null : SpaceEngineersCore.GetDataPathOrDefault(cubeDefinition.Icons.First(), Path.Combine(contentPath, cubeDefinition.Icons.First()))
});
});
}
_dispatcher.Invoke(DispatcherPriority.Input, (Action)delegate
{
CubeList = new ObservableCollection<CubeItemModel>(cubeList);
});
IsSubsSystemNotReady = false;
}
}
};
worker.RunWorkerAsync();
}