SEToolbox.Models.StructureCubeGridModel.InitializeAsync C# (CSharp) Method

InitializeAsync() public method

public InitializeAsync ( ) : void
return void
        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();
        }