Advertisement
LtTwinkie

Tool Operation Script v2.5

Jun 26th, 2020
2,455
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.73 KB | None | 0 0
  1. /* Twinkie Industries™ Automation Presents  
  2.     * Tool Operation Script v2.5*/  
  3.  
  4. // PLEASE EDIT THIS SECTION ONLY------------------------------------------------------------------------------------------------------------------------------
  5.  
  6.  
  7. // Must be present in the title of all blocks that are to be controlled  
  8. private const string NAME_OF_GRID = "[NAME]";
  9.  
  10.  
  11. // PLEASE DO NOT EDIT BELOW-----------------------------------------------------------------------------------------------------------------------------------
  12.  
  13. // Off must be at the beginning and Warnings must be at the end.
  14. private enum ToolTypes
  15. {
  16.     Off,
  17.     Welders,
  18.     Grinders,
  19.     Drills,
  20.     Warnings
  21. }
  22.  
  23. Dictionary<ToolTypes,List<IMyTerminalBlock>> _availableTools = new Dictionary<ToolTypes, List<IMyTerminalBlock>>();
  24.  
  25. private const string ACTION_TURN_ON  = "OnOff_On";
  26. private const string ACTION_TURN_OFF = "OnOff_Off";
  27. private const string ACTION_PLAY     = "PlaySound";
  28.  
  29. public void Main()
  30. {
  31.     // Find the blocks
  32.     FillLists();
  33.  
  34.     // Make sure things aren't mixed up
  35.     if (CheckForMixedState())
  36.     {
  37.         SetPower(ToolTypes.Off);
  38.         return;
  39.     }
  40.  
  41.     // Find the current mode
  42.     ToolTypes currentMode = GetCurrentMode();
  43.     Echo($"Old state: {currentMode}");
  44.  
  45.     // This is dumb but something weird was going on with listing modes.
  46.     switch (currentMode)
  47.     {
  48.         case ToolTypes.Off:
  49.             if (_availableTools.ContainsKey(ToolTypes.Drills))
  50.             {
  51.                 SetPower(ToolTypes.Drills);
  52.                 break;
  53.             }
  54.             goto case ToolTypes.Drills;
  55.  
  56.         case ToolTypes.Drills:
  57.             if (_availableTools.ContainsKey(ToolTypes.Welders))
  58.             {
  59.                 SetPower(ToolTypes.Welders);
  60.                 break;
  61.             }
  62.             goto case ToolTypes.Welders;
  63.  
  64.         case ToolTypes.Welders:
  65.             if (_availableTools.ContainsKey(ToolTypes.Grinders))
  66.             {
  67.                 SetPower(ToolTypes.Grinders);
  68.                 break;
  69.             }
  70.  
  71.             goto case ToolTypes.Grinders;
  72.         case ToolTypes.Grinders:
  73.             SetPower(ToolTypes.Off);
  74.             break;
  75.     }
  76. }
  77.  
  78. private bool CheckForMixedState()
  79. {
  80.     short poweredStates = 0;
  81.  
  82.     foreach (KeyValuePair<ToolTypes, List<IMyTerminalBlock>> mode in _availableTools)
  83.     {
  84.         if (mode.Key != ToolTypes.Warnings && CheckListForPower(mode.Value))
  85.         {
  86.             ++poweredStates;
  87.         }
  88.     }
  89.  
  90.     if (poweredStates > 1)
  91.         return true;
  92.  
  93.     return false;  
  94. }
  95.  
  96. private void FillLists()  
  97. {
  98.     var allBlocks = new List<IMyTerminalBlock>();
  99.     GridTerminalSystem.GetBlocks(allBlocks);
  100.  
  101.     // Create the block lists
  102.     _availableTools[ToolTypes.Welders]  = new List<IMyTerminalBlock>();
  103.     _availableTools[ToolTypes.Grinders] = new List<IMyTerminalBlock>();
  104.     _availableTools[ToolTypes.Drills]   = new List<IMyTerminalBlock>();
  105.     _availableTools[ToolTypes.Warnings] = new List<IMyTerminalBlock>();
  106.  
  107.     // Add the blocks to the lists if they are the correct type and if they have the grid name
  108.     GridTerminalSystem.GetBlocksOfType<IMyShipWelder>(_availableTools[ToolTypes.Welders], NameCheck);
  109.     GridTerminalSystem.GetBlocksOfType<IMyShipGrinder>(_availableTools[ToolTypes.Grinders], NameCheck);
  110.     GridTerminalSystem.GetBlocksOfType<IMyShipDrill>(_availableTools[ToolTypes.Drills], NameCheck);
  111.  
  112.     // Check all the blocks for lights and sound blocks that we can use to flash and beep!
  113.     for (int i = 0; i < allBlocks.Count; i++)
  114.     {  
  115.         // Add only lights and sound blocks
  116.         if (!(allBlocks[i] is IMyLightingBlock) && !(allBlocks[i] is IMySoundBlock))
  117.             continue;
  118.  
  119.         // Add only blocks that have the grid name and are also marked with "TOOL"
  120.         if (!NameCheck(allBlocks[i]) || !CheckCustomNameForTool(allBlocks[i]))
  121.             continue;
  122.  
  123.         _availableTools[ToolTypes.Warnings].Add(allBlocks[i]);
  124.     }
  125. }  
  126.  
  127. /// <summary>Check to see if any of the blocks in the list are powered on.</summary>  
  128. private bool CheckListForPower(List<IMyTerminalBlock> list)
  129. {
  130.     foreach (IMyTerminalBlock block in list)
  131.     {
  132.         if ((block as IMyFunctionalBlock).Enabled)
  133.             return true;
  134.     }
  135.  
  136.     return false;  
  137. }
  138.  
  139. private ToolTypes GetCurrentMode()
  140. {
  141.     foreach (KeyValuePair<ToolTypes, List<IMyTerminalBlock>> tool in _availableTools)
  142.     {
  143.         if (tool.Key != ToolTypes.Warnings && CheckListForPower(tool.Value))
  144.             return tool.Key;
  145.     }
  146.  
  147.     return ToolTypes.Off;
  148. }
  149.  
  150. private void SetPower(ToolTypes type)
  151. {
  152.     Echo($"New state: {type}");
  153.     switch (type)
  154.     {
  155.         case ToolTypes.Drills:
  156.             SetPower(_availableTools[ToolTypes.Drills], ACTION_TURN_ON);
  157.             SetPower(_availableTools[ToolTypes.Welders], ACTION_TURN_OFF);
  158.             SetPower(_availableTools[ToolTypes.Grinders], ACTION_TURN_OFF);
  159.             SetPower(_availableTools[ToolTypes.Warnings], ACTION_TURN_ON);
  160.             TryToPlaySound();
  161.             break;
  162.         case ToolTypes.Grinders:
  163.             SetPower(_availableTools[ToolTypes.Drills], ACTION_TURN_OFF);
  164.             SetPower(_availableTools[ToolTypes.Welders], ACTION_TURN_OFF);
  165.             SetPower(_availableTools[ToolTypes.Grinders], ACTION_TURN_ON);
  166.             SetPower(_availableTools[ToolTypes.Warnings], ACTION_TURN_ON);
  167.             TryToPlaySound();
  168.             break;
  169.         case ToolTypes.Welders:
  170.             SetPower(_availableTools[ToolTypes.Drills], ACTION_TURN_OFF);
  171.             SetPower(_availableTools[ToolTypes.Welders], ACTION_TURN_ON);
  172.             SetPower(_availableTools[ToolTypes.Grinders], ACTION_TURN_OFF);
  173.             SetPower(_availableTools[ToolTypes.Warnings], ACTION_TURN_ON);
  174.             TryToPlaySound();
  175.             break;
  176.         case ToolTypes.Off:
  177.             SetPower(_availableTools[ToolTypes.Drills], ACTION_TURN_OFF);
  178.             SetPower(_availableTools[ToolTypes.Welders], ACTION_TURN_OFF);
  179.             SetPower(_availableTools[ToolTypes.Grinders], ACTION_TURN_OFF);
  180.             SetPower(_availableTools[ToolTypes.Warnings], ACTION_TURN_OFF);
  181.             break;
  182.     }
  183. }
  184.  
  185. /// <summary>Fill the lists with appropriately named and typed blocks.  Check to see if any lists are empty.</summary>  
  186. /// <summary>Turn all of the blocks on a list on or off.</summary>  
  187. private void SetPower(List<IMyTerminalBlock> list, string setting)
  188. {  
  189.     try  
  190.     {
  191.         foreach (IMyTerminalBlock block in list)
  192.             block.GetActionWithName(setting).Apply(block);
  193.     }  
  194.     catch { }  
  195. }  
  196.  
  197. /// <summary>This attempts to make a sound block play its sound.  Future: choose the sound based on conditions.</summary>  
  198. private void TryToPlaySound()
  199. {
  200.     if (_availableTools[ToolTypes.Warnings].Count == 0)
  201.         return;
  202.  
  203.     foreach (IMyTerminalBlock block in _availableTools[ToolTypes.Warnings])
  204.     {
  205.         if (block is IMySoundBlock && CheckCustomNameForTool(block))  
  206.         {
  207.             try  
  208.             {  
  209.                 (block as IMySoundBlock).Play();//.GetActionWithName(ACTION_PLAY)?.Apply(block);  
  210.             }  
  211.             catch { }  
  212.         }
  213.     }
  214. }  
  215.  
  216. ///<summary>TI™ NameCheck Filter v2.0 - Returns true if the block contains the string NAME_OF_GRID in its name.</summary>  
  217. private bool NameCheck(IMyTerminalBlock block)  
  218. {  
  219.     return block?.CustomName?.Contains(NAME_OF_GRID) ?? false;  
  220. }  
  221.  
  222. /// <summary>Returns true if the block contains the string tool.</summary>  
  223. private bool CheckCustomNameForTool(IMyTerminalBlock block)  
  224. {  
  225.     string name = block?.CustomName?.ToUpper();  
  226.  
  227.     if (name != null && name.IndexOf("TOOL", StringComparison.OrdinalIgnoreCase) >= 0)
  228.         return true;  
  229.  
  230.     return false;  
  231. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement