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; } }
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())); } }
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); }