Пример #1
0
 void AcquireBlock(GridScanArgs <IMyTerminalBlock> item)
 {
     if (item.First)
     {
         Updating = true;
         AssemblerUpdater.Dispose();
         foreach (var a in Assemblers)
         {
             a.Block = null;
         }
         Refineries.Clear();
     }
     if (Owner.PolicyCheck(Policy, item.Item))
     {
         if (item.Item is IMyRefinery)
         {
             Refineries.Add(item.Item as IMyRefinery);
         }
         if ((item.Item is IMyAssembler) && (!IgnoreSurvivalKits || (item.Item.BlockDefinition.TypeIdString != "MyObjectBuilder_SurvivalKit")))
         {
             bool found = false;
             foreach (var a in Assemblers)
             {
                 if (a.TryAttachBlock(item.Item))
                 {
                     found = true;
                     break;
                 }
             }
             if (!found)
             {
                 Assemblers.Add(new AssemblerInfo(item.Item as IMyAssembler));
             }
         }
     }
     if (item.Last)
     {
         for (int i = Assemblers.Count - 1; i >= 0; i--)
         {
             if (!Assemblers[i].HasBlock)
             {
                 Assemblers.RemoveAt(i);
             }
         }
         Assemblers.Sort((a, b) => a.Block.CustomName.CompareTo(b.Block.CustomName));
         Assemblers.Sort((a, b) => a.Block.CubeGrid.EntityId.CompareTo(b.Block.CubeGrid.EntityId));
         Refineries.Sort((a, b) => a.CustomName.CompareTo(b.CustomName));
         Refineries.Sort((a, b) => a.CubeGrid.EntityId.CompareTo(b.CubeGrid.EntityId));
         AssemblerUpdater = Assemblers.GetEnumerator();
         Updating         = false;
     }
 }
Пример #2
0
        void Load(MyIni state)
        {
            if (LoadConfig)
            {
                Policy             = state.Get(ID, "Policy").ToString();
                IgnoreSurvivalKits = state.Get(ID, "IgnoreSurvivalKits").ToBoolean(true);
                Owner.Unsubscribe(UpdateProductionState, Tick);
                Tick = Owner.Subscribe(UpdateProductionState, state.Get(ID, "Update").ToString(), "update100s");
            }
            List <MyIniKey> keys = new List <MyIniKey>();

            Assemblers.Clear();
            Refineries.Clear();
            state.GetKeys(ID + ".Assemblers", keys);
            foreach (var key in keys)
            {
                Assemblers.Add(new AssemblerInfo(key.Name, state.Get(key).ToString()));
            }
        }
Пример #3
0
        bool ProcessInventory()
        {
            // return false if there is (probably) more work to do
            var processingComplete = true;

            foreach (var item in Drills.GetItems())
            {
                //Log.Info($"{item.item.Type}:{item.item.Amount}");
                if (Trash.Contains(item.item.Type))
                {
                    if (Ejectors.Eject(item))
                    {
                        //Log.Info("Continue: Ejector success");
                        continue;
                    }
                    else
                    {
                        //Log.Info("Continue: Ejector failed");
                    }
                    processingComplete = false;
                }
                else
                {
                    if (Refineries.Refine(item))
                    {
                        //Log.Info("Continue: Refinery success");
                        continue;
                    }
                    else
                    {
                        //Log.Info("Continue: Refinery failed");
                    }
                    processingComplete = false;
                }
                if (!Containers.Store(item))
                {
                    // TODO: Everything's full and drills are backing up! Panic?
                    //Log.Info("End: Storing failed");
                    processingComplete = false;
                    break;
                }
            }

            foreach (var item in Refineries.GetItems())
            {
                if (!Containers.Store(item))
                {
                    // TODO: Can't unload refineries because containers are full. Panic?
                    processingComplete = false;
                    break;
                }
            }

            if (Ejectors.IsFull)
            {
                if (Refineries.IsFull)
                {
                    // TODO: Ejection and refineries are full. Panic?
                    processingComplete = false;
                }
                else
                {
                    foreach (var item in Containers.GetItems())
                    {
                        if (!Trash.Contains(item.item.Type))
                        {
                            if (!Refineries.Refine(item))
                            {
                                processingComplete = false;
                                break;
                            }
                        }
                    }
                }
            }
            else
            {
                if (Refineries.IsFull)
                {
                    foreach (var item in Containers.GetItems())
                    {
                        if (Trash.Contains(item.item.Type))
                        {
                            if (!Ejectors.Eject(item))
                            {
                                processingComplete = false;
                                break;
                            }
                        }
                    }
                }
                else
                {
                    foreach (var item in Containers.GetItems())
                    {
                        if (Trash.Contains(item.item.Type))
                        {
                            if (!Ejectors.Eject(item) && Refineries.IsFull)
                            {
                                processingComplete = false;
                                break;
                            }
                        }
                        else
                        {
                            if (!Refineries.Refine(item) && Ejectors.IsFull)
                            {
                                processingComplete = false;
                                break;
                            }
                        }
                    }
                }
            }

            return(processingComplete);
        }