Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * You need:
- * LCD/TextPanel named "LCD SortList"
- * LCD/TextPanel named "LCD Status Sorter"
- * ...or you choose your own name by editing the strings below.
- *
- * List the items and target containers on the public text of the LCD SortList:
- *
- * <Item Type>/<Item>:<Container1>,<Container2>
- *
- * "Ingot/Iron:Large Cargo Container 1,Large Cargo Container 2"
- * "Component/Thruster:Large Cargo Container 3"
- *
- * Exclusion:
- * There are two ways to exclude containers, refineries, assemblers and connectors.
- * 1) add them in the sortlist as "Exclude:<Container1>,<Container2>"
- * 2) add a "#" in the name of the block. You can change this token below.
- *
- */
- // if you want to rename the LCDs, here are the strings
- string LCDNameDebug = "LCD Status Sorter";
- string LCDNameSortList = "LCD SortList";
- string ExcludeToken = "#";
- void Main()
- {
- NewSort();
- }
- void DebugMessage(string Message)
- {
- DisplayOnLCD(LCDNameDebug, Message);
- }
- void DisplayOnLCD(string LCDName, string Content)
- {
- var LCDPanel = GridTerminalSystem.GetBlockWithName(LCDName) as IMyTextPanel;
- if (LCDPanel == null) return;
- LCDPanel.ShowTextureOnScreen();
- LCDPanel.WritePublicText(Content);
- LCDPanel.ShowPublicTextOnScreen();
- return;
- }
- void NewSort()
- {
- string Output = " Last Moves at "
- + DateTime.Now.Hour.ToString() + ":"
- + DateTime.Now.Minute.ToString() + ":"
- + DateTime.Now.Second.ToString()
- + "\n ----------------------------------------\n";
- DebugMessage(Output);
- var LCDPanel = GridTerminalSystem.GetBlockWithName(LCDNameSortList) as IMyTextPanel;
- if (LCDPanel == null) return;
- var RawMessages = LCDPanel.GetPublicText();
- string[] Messages = RawMessages.Split(new string[] {"\n", "\r\n"}, StringSplitOptions.RemoveEmptyEntries);
- for (int i = 0; i < Messages.Length; i++)
- {
- var Message = Messages[i].Trim();
- if (Message == "") return;
- }
- List<IMyTerminalBlock> Containers = new List<IMyTerminalBlock>();
- GridTerminalSystem.GetBlocksOfType<IMyCargoContainer>(Containers);
- if (Containers.Count == 0) return;
- List<IMyTerminalBlock> Refineries = new List<IMyTerminalBlock>();
- GridTerminalSystem.GetBlocksOfType<IMyRefinery>(Refineries);
- Containers.AddList<IMyTerminalBlock>(Refineries);
- List<IMyTerminalBlock> Assembler = new List<IMyTerminalBlock>();
- GridTerminalSystem.GetBlocksOfType<IMyAssembler>(Assembler);
- Containers.AddList<IMyTerminalBlock>(Assembler);
- List<IMyTerminalBlock> Connector = new List<IMyTerminalBlock>();
- GridTerminalSystem.GetBlocksOfType<IMyShipConnector>(Connector);
- Containers.AddList<IMyTerminalBlock>(Connector);
- List<string> SortList = new List<string>(Message.Split('\n'));
- List<string> SortItemNames = new List<string>();
- List<string> SortTargets = new List<string>();
- List<string> Excludes = new List<string>();
- for (int SortIndex = 0; SortIndex < SortList.Count; SortIndex++)
- {
- var ItemName = SortList[SortIndex].Split(':')[0];
- var Targets = SortList[SortIndex].Split(':')[1];
- if (ItemName == "Exclude")
- {
- if (Targets.Contains(","))
- {
- Excludes.AddArray<string>(Targets.Split(','));
- }
- else
- {
- Excludes.Add(Targets);
- }
- continue;
- }
- SortItemNames.Add(ItemName);
- SortTargets.Add(Targets);
- }
- for (int SourceContainerIndex = 0; SourceContainerIndex < Containers.Count; SourceContainerIndex++)
- {
- var SourceContainer = Containers[SourceContainerIndex];
- if (Excludes.Contains(SourceContainer.CustomName)) continue;
- if (SourceContainer.CustomName.Contains(ExcludeToken)) continue;
- var SourceInventory = SourceContainer.GetInventory(SourceContainer.GetInventoryCount() - 1);
- var SourceItems = SourceInventory.GetItems();
- if (SourceItems.Count == 0) continue;
- int SourceItemIndex = 0;
- while (SourceItemIndex < SourceItems.Count)
- {
- var SourceItem = SourceItems[SourceItemIndex];
- var SourceItemName = GetInventoryItemName(SourceItem);
- int Index = SortItemNames.IndexOf(SourceItemName);
- if (Index == -1)
- {
- SourceItemIndex++;
- continue;
- }
- List<string> TargetContainerList = new List<string>();
- if (SortTargets[Index] == null || SortTargets[Index] == "")
- {
- SourceItemIndex++;
- continue;
- }
- if (SortTargets[Index].Contains(","))
- {
- TargetContainerList.AddArray<string>(SortTargets[Index].Split(','));
- }
- else
- {
- TargetContainerList.Add(SortTargets[Index]);
- }
- if (TargetContainerList.Contains(SourceContainer.CustomName))
- {
- SourceItemIndex++;
- continue;
- }
- bool DidMove = false;
- for (int TargetIndex = 0; TargetIndex < TargetContainerList.Count; TargetIndex++)
- {
- var TargetContainer = GridTerminalSystem.GetBlockWithName(TargetContainerList[TargetIndex]);
- if (TargetContainer == null) continue;
- if (TargetContainer == SourceContainer) continue;
- var TargetInventory = TargetContainer.GetInventory(0);
- if (!SourceInventory.IsConnectedTo(TargetInventory) || TargetInventory.IsFull) continue;
- if (!SourceInventory.TransferItemTo(TargetInventory, SourceItemIndex, null, true, null))
- {
- string FailMessage = "ITEM TRANSFER FAILURE" + "\n"
- + "SourceItemName: " + SourceItemName + "\n"
- + "SourceContainer: " + SourceContainer.CustomName + "\n"
- + "TargetContainer: " + TargetContainerList[TargetIndex] + "\n"
- + "\n" + Output;
- DebugMessage(FailMessage);
- return;
- }
- Output += " " + SourceItemName + " : " + SourceContainer.CustomName + " >>> " + TargetContainerList[TargetIndex] + "\n";
- DebugMessage(Output);
- var TestSourceItemName = GetInventoryItemName(SourceItems[SourceItemIndex]);
- if (TestSourceItemName != SourceItemName) break;
- SourceItems.RemoveAt(SourceItemIndex);
- DidMove = true;
- if (!TargetInventory.IsFull) break;
- }
- if (!DidMove) SourceItemIndex++;
- }
- }
- }
- string GetInventoryItemName(IMyInventoryItem item)
- {
- return item.Content.GetType().ToString().Split('_')[1] + "/" + item.Content.SubtypeName;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement